@seniorsistemas/angular-components 19.2.0 → 19.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dynamic-form/dynamic-form/dynamic-form.directive.d.ts +3 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/field.d.ts +7 -0
- package/dynamic-form/public-api.d.ts +2 -3
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.directive.mjs +17 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/field.mjs +1 -1
- package/esm2022/dynamic-form/public-api.mjs +3 -4
- package/esm2022/lib/locale/fallback.mjs +10 -2
- package/esm2022/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.mjs +460 -0
- package/esm2022/spotlight/lib/spotlight/spotlight-step.directive.mjs +50 -0
- package/esm2022/spotlight/lib/spotlight/spotlight-tour.service.mjs +251 -0
- package/esm2022/spotlight/lib/spotlight/spotlight.component.mjs +193 -0
- package/esm2022/spotlight/lib/spotlight/types/spotlight-position.mjs +2 -0
- package/esm2022/spotlight/lib/spotlight/types/spotlight-step.mjs +2 -0
- package/esm2022/spotlight/lib/spotlight/types/spotlight-stop-event.mjs +2 -0
- package/esm2022/spotlight/public-api.mjs +4 -0
- package/esm2022/spotlight/seniorsistemas-angular-components-spotlight.mjs +5 -0
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +16 -0
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs +947 -0
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components.mjs +9 -1
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/package.json +13 -7
- package/spotlight/README.md +311 -0
- package/spotlight/index.d.ts +5 -0
- package/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.d.ts +70 -0
- package/spotlight/lib/spotlight/spotlight-step.directive.d.ts +28 -0
- package/spotlight/lib/spotlight/spotlight-tour.service.d.ts +146 -0
- package/spotlight/lib/spotlight/spotlight.component.d.ts +82 -0
- package/spotlight/lib/spotlight/types/spotlight-position.d.ts +1 -0
- package/spotlight/lib/spotlight/types/spotlight-step.d.ts +21 -0
- package/spotlight/lib/spotlight/types/spotlight-stop-event.d.ts +13 -0
- package/spotlight/public-api.d.ts +6 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { Overlay } from '@angular/cdk/overlay';
|
|
2
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
3
|
+
import { computed, EnvironmentInjector, inject, Injectable, signal } from '@angular/core';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { SpotlightOverlayComponent } from './spotlight-overlay/spotlight-overlay.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* Serviço central do Spotlight Tour.
|
|
9
|
+
*
|
|
10
|
+
* Gerencia o estado do tour (passos, índice atual, ativo/inativo), a navegação entre
|
|
11
|
+
* passos e o registro de elementos do DOM associados a cada `stepId`.
|
|
12
|
+
*
|
|
13
|
+
* Use `start()` para iniciar um tour com múltiplos passos ou `spotlight()` para
|
|
14
|
+
* exibir um destaque simples em um único elemento.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Tour com múltiplos passos
|
|
19
|
+
* this.tourService.start([
|
|
20
|
+
* { stepId: 'passo-1', title: 'Título', message: 'Mensagem' },
|
|
21
|
+
* { stepId: 'passo-2', title: 'Título', message: 'Mensagem' },
|
|
22
|
+
* ]);
|
|
23
|
+
*
|
|
24
|
+
* // Destaque simples
|
|
25
|
+
* this.tourService.spotlight('meu-elemento', { title: 'Dica', message: 'Detalhes' });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export class SpotlightTourService {
|
|
29
|
+
overlay = inject(Overlay);
|
|
30
|
+
environmentInjector = inject(EnvironmentInjector);
|
|
31
|
+
overlayRef = null;
|
|
32
|
+
_steps = signal([]);
|
|
33
|
+
_currentIndex = signal(0);
|
|
34
|
+
_isActive = signal(false);
|
|
35
|
+
_registrationVersion = signal(0);
|
|
36
|
+
_registeredElements = new Map();
|
|
37
|
+
_pendingDoNotShowAgain = false;
|
|
38
|
+
_stopped$ = new Subject();
|
|
39
|
+
_stepChanged$ = new Subject();
|
|
40
|
+
/** Signal somente-leitura que indica se o tour está ativo no momento. */
|
|
41
|
+
isActive = this._isActive.asReadonly();
|
|
42
|
+
/** Signal somente-leitura com o índice (0-based) do passo exibido atualmente. */
|
|
43
|
+
currentIndex = this._currentIndex.asReadonly();
|
|
44
|
+
/** Signal computado com o total de passos do tour em andamento. */
|
|
45
|
+
totalSteps = computed(() => this._steps().length);
|
|
46
|
+
/** Signal computado com os dados do passo atualmente exibido. */
|
|
47
|
+
currentStep = computed(() => this._steps()[this._currentIndex()]);
|
|
48
|
+
/**
|
|
49
|
+
* Observable emitido quando o tour é encerrado, seja por conclusão, interrupção
|
|
50
|
+
* ou descarte. Carrega um `SpotlightStopEvent` com o motivo e o estado final.
|
|
51
|
+
*/
|
|
52
|
+
stopped$ = this._stopped$.asObservable();
|
|
53
|
+
/**
|
|
54
|
+
* Observable emitido sempre que o passo exibido muda, incluindo o início do tour.
|
|
55
|
+
* Carrega um `SpotlightStepChangedEvent` com o `stepId` e o índice do novo passo.
|
|
56
|
+
*/
|
|
57
|
+
stepChanged$ = this._stepChanged$.asObservable();
|
|
58
|
+
/**
|
|
59
|
+
* Signal somente-leitura incrementado a cada chamada de `registerElement` ou
|
|
60
|
+
* `unregisterElement`. Permite que outros componentes reajam a mudanças no
|
|
61
|
+
* registro de elementos sem polling.
|
|
62
|
+
*/
|
|
63
|
+
registrationVersion = this._registrationVersion.asReadonly();
|
|
64
|
+
/**
|
|
65
|
+
* Inicia um tour com a lista de passos fornecida.
|
|
66
|
+
*
|
|
67
|
+
* O tour começa pelo primeiro passo da lista. Emite `stepChanged$` para o passo inicial.
|
|
68
|
+
* Se `steps` for um array vazio, o método não faz nada.
|
|
69
|
+
* Se já houver um tour ativo, ele é encerrado (emitindo `stopped$` com `reason: 'interrupted'`)
|
|
70
|
+
* antes de o novo tour começar.
|
|
71
|
+
*
|
|
72
|
+
* @param steps Lista de passos a percorrer em ordem.
|
|
73
|
+
*/
|
|
74
|
+
start(steps) {
|
|
75
|
+
if (steps.length === 0)
|
|
76
|
+
return;
|
|
77
|
+
if (this._isActive()) {
|
|
78
|
+
this.stop();
|
|
79
|
+
}
|
|
80
|
+
this._steps.set(steps);
|
|
81
|
+
this._currentIndex.set(0);
|
|
82
|
+
this._isActive.set(true);
|
|
83
|
+
this.attachOverlay();
|
|
84
|
+
this._stepChanged$.next({ stepId: steps[0].stepId, stepIndex: 0, totalSteps: steps.length });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Exibe um destaque simples (passo único) no elemento identificado por `stepId`.
|
|
88
|
+
*
|
|
89
|
+
* Equivalente a chamar `start()` com um array de um único passo.
|
|
90
|
+
* O checkbox "Não mostrar novamente" é exibido por padrão (`showDoNotShowAgain: true`);
|
|
91
|
+
* passe `showDoNotShowAgain: false` em `config` para suprimi-lo.
|
|
92
|
+
*
|
|
93
|
+
* @param stepId ID do elemento registrado via `sSpotlightStep` ou `registerElement`.
|
|
94
|
+
* @param config Configuração visual e comportamental do destaque.
|
|
95
|
+
*/
|
|
96
|
+
spotlight(stepId, config) {
|
|
97
|
+
const step = { stepId, ...config };
|
|
98
|
+
this.start([step]);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Avança para o próximo passo do tour.
|
|
102
|
+
*
|
|
103
|
+
* Se o passo atual definir `beforeNext`, aguarda sua resolução antes de avançar.
|
|
104
|
+
* No último passo, encerra o tour com `reason: 'completed'`.
|
|
105
|
+
*
|
|
106
|
+
* @param doNotShowAgain Quando `true`, o evento `stopped$` será emitido com
|
|
107
|
+
* `doNotShowAgain: true` ao concluir o tour. Relevante apenas no último passo.
|
|
108
|
+
*/
|
|
109
|
+
next(doNotShowAgain = false) {
|
|
110
|
+
const current = this.currentStep();
|
|
111
|
+
this._pendingDoNotShowAgain = doNotShowAgain;
|
|
112
|
+
if (current?.beforeNext) {
|
|
113
|
+
const result = current.beforeNext();
|
|
114
|
+
if (result instanceof Promise) {
|
|
115
|
+
result.then(() => this.advance()).catch(() => { });
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.advance();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.advance();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Retorna ao passo anterior do tour.
|
|
127
|
+
*
|
|
128
|
+
* Se o passo atual definir `beforePrevious`, aguarda sua resolução antes de voltar.
|
|
129
|
+
* Não faz nada se o tour estiver no primeiro passo.
|
|
130
|
+
*/
|
|
131
|
+
previous() {
|
|
132
|
+
if (this._currentIndex() <= 0)
|
|
133
|
+
return;
|
|
134
|
+
const current = this.currentStep();
|
|
135
|
+
if (current?.beforePrevious) {
|
|
136
|
+
const result = current.beforePrevious();
|
|
137
|
+
if (result instanceof Promise) {
|
|
138
|
+
result.then(() => this.retreat()).catch(() => { });
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.retreat();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.retreat();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Encerra o tour imediatamente e emite o evento `stopped$`.
|
|
150
|
+
*
|
|
151
|
+
* @param event Dados parciais do evento de parada. Valores não fornecidos são
|
|
152
|
+
* preenchidos com os defaults: `reason: 'interrupted'`, `doNotShowAgain: false`
|
|
153
|
+
* e o `stepId`/`stepIndex`/`totalSteps` do momento atual.
|
|
154
|
+
*/
|
|
155
|
+
stop(event) {
|
|
156
|
+
const steps = this._steps();
|
|
157
|
+
const index = this._currentIndex();
|
|
158
|
+
const fullEvent = {
|
|
159
|
+
reason: 'interrupted',
|
|
160
|
+
doNotShowAgain: false,
|
|
161
|
+
stepId: steps[index]?.stepId ?? '',
|
|
162
|
+
stepIndex: index,
|
|
163
|
+
totalSteps: steps.length,
|
|
164
|
+
...event,
|
|
165
|
+
};
|
|
166
|
+
this._isActive.set(false);
|
|
167
|
+
this._steps.set([]);
|
|
168
|
+
this._currentIndex.set(0);
|
|
169
|
+
this._pendingDoNotShowAgain = false;
|
|
170
|
+
this._stopped$.next(fullEvent);
|
|
171
|
+
this.detachOverlay();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Registra um elemento do DOM como alvo do passo identificado por `stepId`.
|
|
175
|
+
*
|
|
176
|
+
* Normalmente chamado pela diretiva `sSpotlightStep`. Use diretamente apenas
|
|
177
|
+
* quando precisar registrar elementos criados programaticamente.
|
|
178
|
+
*
|
|
179
|
+
* @param stepId ID único do passo ao qual o elemento pertence.
|
|
180
|
+
* @param el Referência ao elemento do DOM.
|
|
181
|
+
*/
|
|
182
|
+
registerElement(stepId, el) {
|
|
183
|
+
this._registeredElements.set(stepId, el);
|
|
184
|
+
this._registrationVersion.update((v) => v + 1);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Remove o registro do elemento associado a `stepId`.
|
|
188
|
+
*
|
|
189
|
+
* Normalmente chamado pela diretiva `sSpotlightStep` no `ngOnDestroy`.
|
|
190
|
+
*
|
|
191
|
+
* @param stepId ID do passo cujo elemento deve ser removido.
|
|
192
|
+
*/
|
|
193
|
+
unregisterElement(stepId) {
|
|
194
|
+
this._registeredElements.delete(stepId);
|
|
195
|
+
this._registrationVersion.update((v) => v + 1);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Retorna o `ElementRef` registrado para o `stepId` informado,
|
|
199
|
+
* ou `undefined` se nenhum elemento estiver registrado.
|
|
200
|
+
*
|
|
201
|
+
* @param stepId ID do passo a buscar.
|
|
202
|
+
*/
|
|
203
|
+
getElement(stepId) {
|
|
204
|
+
return this._registeredElements.get(stepId);
|
|
205
|
+
}
|
|
206
|
+
advance() {
|
|
207
|
+
const steps = this._steps();
|
|
208
|
+
const currentIndex = this._currentIndex();
|
|
209
|
+
if (currentIndex < steps.length - 1) {
|
|
210
|
+
const newIndex = currentIndex + 1;
|
|
211
|
+
this._pendingDoNotShowAgain = false;
|
|
212
|
+
this._currentIndex.set(newIndex);
|
|
213
|
+
this._stepChanged$.next({ stepId: steps[newIndex].stepId, stepIndex: newIndex, totalSteps: steps.length });
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
this.stop({ reason: 'completed', doNotShowAgain: this._pendingDoNotShowAgain });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
retreat() {
|
|
220
|
+
const steps = this._steps();
|
|
221
|
+
const newIndex = this._currentIndex() - 1;
|
|
222
|
+
this._currentIndex.set(newIndex);
|
|
223
|
+
this._stepChanged$.next({ stepId: steps[newIndex].stepId, stepIndex: newIndex, totalSteps: steps.length });
|
|
224
|
+
}
|
|
225
|
+
attachOverlay() {
|
|
226
|
+
if (this.overlayRef) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this.overlayRef = this.overlay.create({
|
|
230
|
+
hasBackdrop: false,
|
|
231
|
+
scrollStrategy: this.overlay.scrollStrategies.noop(),
|
|
232
|
+
positionStrategy: this.overlay.position().global(),
|
|
233
|
+
});
|
|
234
|
+
const portal = new ComponentPortal(SpotlightOverlayComponent, null, this.environmentInjector);
|
|
235
|
+
this.overlayRef.attach(portal);
|
|
236
|
+
}
|
|
237
|
+
detachOverlay() {
|
|
238
|
+
if (this.overlayRef) {
|
|
239
|
+
this.overlayRef.detach();
|
|
240
|
+
this.overlayRef.dispose();
|
|
241
|
+
this.overlayRef = null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
245
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, providedIn: 'root' });
|
|
246
|
+
}
|
|
247
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, decorators: [{
|
|
248
|
+
type: Injectable,
|
|
249
|
+
args: [{ providedIn: 'root' }]
|
|
250
|
+
}] });
|
|
251
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL2xpYi9zcG90bGlnaHQvc3BvdGxpZ2h0LXRvdXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQWMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7QUFPNUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQUNaLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFM0QsVUFBVSxHQUFzQixJQUFJLENBQUM7SUFFNUIsTUFBTSxHQUFHLE1BQU0sQ0FBMEIsRUFBRSxDQUFDLENBQUM7SUFDN0MsYUFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqQyxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUU3RCxzQkFBc0IsR0FBRyxLQUFLLENBQUM7SUFFdEIsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO0lBQzlDLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBNkIsQ0FBQztJQUUxRSx5RUFBeUU7SUFDaEUsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFaEQsaUZBQWlGO0lBQ3hFLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRXhELG1FQUFtRTtJQUMxRCxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUzRCxpRUFBaUU7SUFDeEQsV0FBVyxHQUFHLFFBQVEsQ0FBb0MsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFOUc7OztPQUdHO0lBQ00sUUFBUSxHQUFtQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRWxGOzs7T0FHRztJQUNNLFlBQVksR0FBMEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVqRzs7OztPQUlHO0lBQ00sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRXRFOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxLQUFzQjtRQUN4QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQWdDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsU0FBUyxDQUFDLE1BQWMsRUFBRSxNQUF1QjtRQUM3QyxNQUFNLElBQUksR0FBMEIsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUs7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxjQUFjLENBQUM7UUFFN0MsSUFBSSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLElBQUksTUFBTSxZQUFZLE9BQU8sRUFBRSxDQUFDO2dCQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUTtRQUNKLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUM7WUFBRSxPQUFPO1FBRXRDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQyxJQUFJLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUMxQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEMsSUFBSSxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBSSxDQUFDLEtBQW1DO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQXVCO1lBQ2xDLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUU7WUFDbEMsU0FBUyxFQUFFLEtBQUs7WUFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3hCLEdBQUcsS0FBSztTQUNYLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxlQUFlLENBQUMsTUFBYyxFQUFFLEVBQWM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsQ0FBQyxNQUFjO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFVBQVUsQ0FBQyxNQUFjO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sT0FBTztRQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFFBQVEsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7WUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7SUFDTCxDQUFDO0lBRU8sT0FBTztRQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUVPLGFBQWE7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2xDLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRTtZQUNwRCxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRTtTQUNyRCxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVPLGFBQWE7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUM7SUFDTCxDQUFDO3dHQS9PUSxvQkFBb0I7NEdBQXBCLG9CQUFvQixjQURQLE1BQU07OzRGQUNuQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIEVsZW1lbnRSZWYsIEVudmlyb25tZW50SW5qZWN0b3IsIGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCB9IGZyb20gJy4vc3BvdGxpZ2h0LW92ZXJsYXkvc3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFNwb3RsaWdodENvbmZpZywgU3BvdGxpZ2h0U3RlcCB9IGZyb20gJy4vdHlwZXMvc3BvdGxpZ2h0LXN0ZXAnO1xuaW1wb3J0IHsgU3BvdGxpZ2h0U3RlcENoYW5nZWRFdmVudCwgU3BvdGxpZ2h0U3RvcEV2ZW50IH0gZnJvbSAnLi90eXBlcy9zcG90bGlnaHQtc3RvcC1ldmVudCc7XG5cbi8qKiBAaW50ZXJuYWwgKi9cbnR5cGUgU3BvdGxpZ2h0U3RlcEludGVybmFsID0gU3BvdGxpZ2h0U3RlcCAmIHsgc2hvd0RvTm90U2hvd0FnYWluPzogYm9vbGVhbiB9O1xuXG4vKipcbiAqIFNlcnZpw6dvIGNlbnRyYWwgZG8gU3BvdGxpZ2h0IFRvdXIuXG4gKlxuICogR2VyZW5jaWEgbyBlc3RhZG8gZG8gdG91ciAocGFzc29zLCDDrW5kaWNlIGF0dWFsLCBhdGl2by9pbmF0aXZvKSwgYSBuYXZlZ2HDp8OjbyBlbnRyZVxuICogcGFzc29zIGUgbyByZWdpc3RybyBkZSBlbGVtZW50b3MgZG8gRE9NIGFzc29jaWFkb3MgYSBjYWRhIGBzdGVwSWRgLlxuICpcbiAqIFVzZSBgc3RhcnQoKWAgcGFyYSBpbmljaWFyIHVtIHRvdXIgY29tIG3Dumx0aXBsb3MgcGFzc29zIG91IGBzcG90bGlnaHQoKWAgcGFyYVxuICogZXhpYmlyIHVtIGRlc3RhcXVlIHNpbXBsZXMgZW0gdW0gw7puaWNvIGVsZW1lbnRvLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBUb3VyIGNvbSBtw7psdGlwbG9zIHBhc3Nvc1xuICogdGhpcy50b3VyU2VydmljZS5zdGFydChbXG4gKiAgIHsgc3RlcElkOiAncGFzc28tMScsIHRpdGxlOiAnVMOtdHVsbycsIG1lc3NhZ2U6ICdNZW5zYWdlbScgfSxcbiAqICAgeyBzdGVwSWQ6ICdwYXNzby0yJywgdGl0bGU6ICdUw610dWxvJywgbWVzc2FnZTogJ01lbnNhZ2VtJyB9LFxuICogXSk7XG4gKlxuICogLy8gRGVzdGFxdWUgc2ltcGxlc1xuICogdGhpcy50b3VyU2VydmljZS5zcG90bGlnaHQoJ21ldS1lbGVtZW50bycsIHsgdGl0bGU6ICdEaWNhJywgbWVzc2FnZTogJ0RldGFsaGVzJyB9KTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFNwb3RsaWdodFRvdXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuXG4gICAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGVwcyA9IHNpZ25hbDxTcG90bGlnaHRTdGVwSW50ZXJuYWxbXT4oW10pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRJbmRleCA9IHNpZ25hbCgwKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pc0FjdGl2ZSA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVnaXN0cmF0aW9uVmVyc2lvbiA9IHNpZ25hbCgwKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlZ2lzdGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFbGVtZW50UmVmPigpO1xuXG4gICAgcHJpdmF0ZSBfcGVuZGluZ0RvTm90U2hvd0FnYWluID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdG9wcGVkJCA9IG5ldyBTdWJqZWN0PFNwb3RsaWdodFN0b3BFdmVudD4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGVwQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxTcG90bGlnaHRTdGVwQ2hhbmdlZEV2ZW50PigpO1xuXG4gICAgLyoqIFNpZ25hbCBzb21lbnRlLWxlaXR1cmEgcXVlIGluZGljYSBzZSBvIHRvdXIgZXN0w6EgYXRpdm8gbm8gbW9tZW50by4gKi9cbiAgICByZWFkb25seSBpc0FjdGl2ZSA9IHRoaXMuX2lzQWN0aXZlLmFzUmVhZG9ubHkoKTtcblxuICAgIC8qKiBTaWduYWwgc29tZW50ZS1sZWl0dXJhIGNvbSBvIMOtbmRpY2UgKDAtYmFzZWQpIGRvIHBhc3NvIGV4aWJpZG8gYXR1YWxtZW50ZS4gKi9cbiAgICByZWFkb25seSBjdXJyZW50SW5kZXggPSB0aGlzLl9jdXJyZW50SW5kZXguYXNSZWFkb25seSgpO1xuXG4gICAgLyoqIFNpZ25hbCBjb21wdXRhZG8gY29tIG8gdG90YWwgZGUgcGFzc29zIGRvIHRvdXIgZW0gYW5kYW1lbnRvLiAqL1xuICAgIHJlYWRvbmx5IHRvdGFsU3RlcHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9zdGVwcygpLmxlbmd0aCk7XG5cbiAgICAvKiogU2lnbmFsIGNvbXB1dGFkbyBjb20gb3MgZGFkb3MgZG8gcGFzc28gYXR1YWxtZW50ZSBleGliaWRvLiAqL1xuICAgIHJlYWRvbmx5IGN1cnJlbnRTdGVwID0gY29tcHV0ZWQ8U3BvdGxpZ2h0U3RlcEludGVybmFsIHwgdW5kZWZpbmVkPigoKSA9PiB0aGlzLl9zdGVwcygpW3RoaXMuX2N1cnJlbnRJbmRleCgpXSk7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhYmxlIGVtaXRpZG8gcXVhbmRvIG8gdG91ciDDqSBlbmNlcnJhZG8sIHNlamEgcG9yIGNvbmNsdXPDo28sIGludGVycnVww6fDo29cbiAgICAgKiBvdSBkZXNjYXJ0ZS4gQ2FycmVnYSB1bSBgU3BvdGxpZ2h0U3RvcEV2ZW50YCBjb20gbyBtb3Rpdm8gZSBvIGVzdGFkbyBmaW5hbC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdG9wcGVkJDogT2JzZXJ2YWJsZTxTcG90bGlnaHRTdG9wRXZlbnQ+ID0gdGhpcy5fc3RvcHBlZCQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhYmxlIGVtaXRpZG8gc2VtcHJlIHF1ZSBvIHBhc3NvIGV4aWJpZG8gbXVkYSwgaW5jbHVpbmRvIG8gaW7DrWNpbyBkbyB0b3VyLlxuICAgICAqIENhcnJlZ2EgdW0gYFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnRgIGNvbSBvIGBzdGVwSWRgIGUgbyDDrW5kaWNlIGRvIG5vdm8gcGFzc28uXG4gICAgICovXG4gICAgcmVhZG9ubHkgc3RlcENoYW5nZWQkOiBPYnNlcnZhYmxlPFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnQ+ID0gdGhpcy5fc3RlcENoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmFsIHNvbWVudGUtbGVpdHVyYSBpbmNyZW1lbnRhZG8gYSBjYWRhIGNoYW1hZGEgZGUgYHJlZ2lzdGVyRWxlbWVudGAgb3VcbiAgICAgKiBgdW5yZWdpc3RlckVsZW1lbnRgLiBQZXJtaXRlIHF1ZSBvdXRyb3MgY29tcG9uZW50ZXMgcmVhamFtIGEgbXVkYW7Dp2FzIG5vXG4gICAgICogcmVnaXN0cm8gZGUgZWxlbWVudG9zIHNlbSBwb2xsaW5nLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblZlcnNpb24gPSB0aGlzLl9yZWdpc3RyYXRpb25WZXJzaW9uLmFzUmVhZG9ubHkoKTtcblxuICAgIC8qKlxuICAgICAqIEluaWNpYSB1bSB0b3VyIGNvbSBhIGxpc3RhIGRlIHBhc3NvcyBmb3JuZWNpZGEuXG4gICAgICpcbiAgICAgKiBPIHRvdXIgY29tZcOnYSBwZWxvIHByaW1laXJvIHBhc3NvIGRhIGxpc3RhLiBFbWl0ZSBgc3RlcENoYW5nZWQkYCBwYXJhIG8gcGFzc28gaW5pY2lhbC5cbiAgICAgKiBTZSBgc3RlcHNgIGZvciB1bSBhcnJheSB2YXppbywgbyBtw6l0b2RvIG7Do28gZmF6IG5hZGEuXG4gICAgICogU2UgasOhIGhvdXZlciB1bSB0b3VyIGF0aXZvLCBlbGUgw6kgZW5jZXJyYWRvIChlbWl0aW5kbyBgc3RvcHBlZCRgIGNvbSBgcmVhc29uOiAnaW50ZXJydXB0ZWQnYClcbiAgICAgKiBhbnRlcyBkZSBvIG5vdm8gdG91ciBjb21lw6dhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGVwcyBMaXN0YSBkZSBwYXNzb3MgYSBwZXJjb3JyZXIgZW0gb3JkZW0uXG4gICAgICovXG4gICAgc3RhcnQoc3RlcHM6IFNwb3RsaWdodFN0ZXBbXSk6IHZvaWQge1xuICAgICAgICBpZiAoc3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RlcHMuc2V0KHN0ZXBzIGFzIFNwb3RsaWdodFN0ZXBJbnRlcm5hbFtdKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEluZGV4LnNldCgwKTtcbiAgICAgICAgdGhpcy5faXNBY3RpdmUuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmF0dGFjaE92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5fc3RlcENoYW5nZWQkLm5leHQoeyBzdGVwSWQ6IHN0ZXBzWzBdLnN0ZXBJZCwgc3RlcEluZGV4OiAwLCB0b3RhbFN0ZXBzOiBzdGVwcy5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhpYmUgdW0gZGVzdGFxdWUgc2ltcGxlcyAocGFzc28gw7puaWNvKSBubyBlbGVtZW50byBpZGVudGlmaWNhZG8gcG9yIGBzdGVwSWRgLlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudGUgYSBjaGFtYXIgYHN0YXJ0KClgIGNvbSB1bSBhcnJheSBkZSB1bSDDum5pY28gcGFzc28uXG4gICAgICogTyBjaGVja2JveCBcIk7Do28gbW9zdHJhciBub3ZhbWVudGVcIiDDqSBleGliaWRvIHBvciBwYWRyw6NvIChgc2hvd0RvTm90U2hvd0FnYWluOiB0cnVlYCk7XG4gICAgICogcGFzc2UgYHNob3dEb05vdFNob3dBZ2FpbjogZmFsc2VgIGVtIGBjb25maWdgIHBhcmEgc3VwcmltaS1sby5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGVwSWQgSUQgZG8gZWxlbWVudG8gcmVnaXN0cmFkbyB2aWEgYHNTcG90bGlnaHRTdGVwYCBvdSBgcmVnaXN0ZXJFbGVtZW50YC5cbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYcOnw6NvIHZpc3VhbCBlIGNvbXBvcnRhbWVudGFsIGRvIGRlc3RhcXVlLlxuICAgICAqL1xuICAgIHNwb3RsaWdodChzdGVwSWQ6IHN0cmluZywgY29uZmlnOiBTcG90bGlnaHRDb25maWcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RlcDogU3BvdGxpZ2h0U3RlcEludGVybmFsID0geyBzdGVwSWQsIC4uLmNvbmZpZyB9O1xuICAgICAgICB0aGlzLnN0YXJ0KFtzdGVwXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXZhbsOnYSBwYXJhIG8gcHLDs3hpbW8gcGFzc28gZG8gdG91ci5cbiAgICAgKlxuICAgICAqIFNlIG8gcGFzc28gYXR1YWwgZGVmaW5pciBgYmVmb3JlTmV4dGAsIGFndWFyZGEgc3VhIHJlc29sdcOnw6NvIGFudGVzIGRlIGF2YW7Dp2FyLlxuICAgICAqIE5vIMO6bHRpbW8gcGFzc28sIGVuY2VycmEgbyB0b3VyIGNvbSBgcmVhc29uOiAnY29tcGxldGVkJ2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9Ob3RTaG93QWdhaW4gUXVhbmRvIGB0cnVlYCwgbyBldmVudG8gYHN0b3BwZWQkYCBzZXLDoSBlbWl0aWRvIGNvbVxuICAgICAqICAgYGRvTm90U2hvd0FnYWluOiB0cnVlYCBhbyBjb25jbHVpciBvIHRvdXIuIFJlbGV2YW50ZSBhcGVuYXMgbm8gw7psdGltbyBwYXNzby5cbiAgICAgKi9cbiAgICBuZXh0KGRvTm90U2hvd0FnYWluID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0RvTm90U2hvd0FnYWluID0gZG9Ob3RTaG93QWdhaW47XG5cbiAgICAgICAgaWYgKGN1cnJlbnQ/LmJlZm9yZU5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGN1cnJlbnQuYmVmb3JlTmV4dCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudGhlbigoKSA9PiB0aGlzLmFkdmFuY2UoKSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBhbyBwYXNzbyBhbnRlcmlvciBkbyB0b3VyLlxuICAgICAqXG4gICAgICogU2UgbyBwYXNzbyBhdHVhbCBkZWZpbmlyIGBiZWZvcmVQcmV2aW91c2AsIGFndWFyZGEgc3VhIHJlc29sdcOnw6NvIGFudGVzIGRlIHZvbHRhci5cbiAgICAgKiBOw6NvIGZheiBuYWRhIHNlIG8gdG91ciBlc3RpdmVyIG5vIHByaW1laXJvIHBhc3NvLlxuICAgICAqL1xuICAgIHByZXZpb3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEluZGV4KCkgPD0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQ/LmJlZm9yZVByZXZpb3VzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjdXJyZW50LmJlZm9yZVByZXZpb3VzKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCgpID0+IHRoaXMucmV0cmVhdCgpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0cmVhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXRyZWF0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNlcnJhIG8gdG91ciBpbWVkaWF0YW1lbnRlIGUgZW1pdGUgbyBldmVudG8gYHN0b3BwZWQkYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCBEYWRvcyBwYXJjaWFpcyBkbyBldmVudG8gZGUgcGFyYWRhLiBWYWxvcmVzIG7Do28gZm9ybmVjaWRvcyBzw6NvXG4gICAgICogICBwcmVlbmNoaWRvcyBjb20gb3MgZGVmYXVsdHM6IGByZWFzb246ICdpbnRlcnJ1cHRlZCdgLCBgZG9Ob3RTaG93QWdhaW46IGZhbHNlYFxuICAgICAqICAgZSBvIGBzdGVwSWRgL2BzdGVwSW5kZXhgL2B0b3RhbFN0ZXBzYCBkbyBtb21lbnRvIGF0dWFsLlxuICAgICAqL1xuICAgIHN0b3AoZXZlbnQ/OiBQYXJ0aWFsPFNwb3RsaWdodFN0b3BFdmVudD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RlcHMgPSB0aGlzLl9zdGVwcygpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2N1cnJlbnRJbmRleCgpO1xuICAgICAgICBjb25zdCBmdWxsRXZlbnQ6IFNwb3RsaWdodFN0b3BFdmVudCA9IHtcbiAgICAgICAgICAgIHJlYXNvbjogJ2ludGVycnVwdGVkJyxcbiAgICAgICAgICAgIGRvTm90U2hvd0FnYWluOiBmYWxzZSxcbiAgICAgICAgICAgIHN0ZXBJZDogc3RlcHNbaW5kZXhdPy5zdGVwSWQgPz8gJycsXG4gICAgICAgICAgICBzdGVwSW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2lzQWN0aXZlLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuX3N0ZXBzLnNldChbXSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleC5zZXQoMCk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdEb05vdFNob3dBZ2FpbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdG9wcGVkJC5uZXh0KGZ1bGxFdmVudCk7XG4gICAgICAgIHRoaXMuZGV0YWNoT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtIGVsZW1lbnRvIGRvIERPTSBjb21vIGFsdm8gZG8gcGFzc28gaWRlbnRpZmljYWRvIHBvciBgc3RlcElkYC5cbiAgICAgKlxuICAgICAqIE5vcm1hbG1lbnRlIGNoYW1hZG8gcGVsYSBkaXJldGl2YSBgc1Nwb3RsaWdodFN0ZXBgLiBVc2UgZGlyZXRhbWVudGUgYXBlbmFzXG4gICAgICogcXVhbmRvIHByZWNpc2FyIHJlZ2lzdHJhciBlbGVtZW50b3MgY3JpYWRvcyBwcm9ncmFtYXRpY2FtZW50ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGVwSWQgSUQgw7puaWNvIGRvIHBhc3NvIGFvIHF1YWwgbyBlbGVtZW50byBwZXJ0ZW5jZS5cbiAgICAgKiBAcGFyYW0gZWwgUmVmZXLDqm5jaWEgYW8gZWxlbWVudG8gZG8gRE9NLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyRWxlbWVudChzdGVwSWQ6IHN0cmluZywgZWw6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEVsZW1lbnRzLnNldChzdGVwSWQsIGVsKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0cmF0aW9uVmVyc2lvbi51cGRhdGUoKHYpID0+IHYgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgbyByZWdpc3RybyBkbyBlbGVtZW50byBhc3NvY2lhZG8gYSBgc3RlcElkYC5cbiAgICAgKlxuICAgICAqIE5vcm1hbG1lbnRlIGNoYW1hZG8gcGVsYSBkaXJldGl2YSBgc1Nwb3RsaWdodFN0ZXBgIG5vIGBuZ09uRGVzdHJveWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RlcElkIElEIGRvIHBhc3NvIGN1am8gZWxlbWVudG8gZGV2ZSBzZXIgcmVtb3ZpZG8uXG4gICAgICovXG4gICAgdW5yZWdpc3RlckVsZW1lbnQoc3RlcElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEVsZW1lbnRzLmRlbGV0ZShzdGVwSWQpO1xuICAgICAgICB0aGlzLl9yZWdpc3RyYXRpb25WZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBgRWxlbWVudFJlZmAgcmVnaXN0cmFkbyBwYXJhIG8gYHN0ZXBJZGAgaW5mb3JtYWRvLFxuICAgICAqIG91IGB1bmRlZmluZWRgIHNlIG5lbmh1bSBlbGVtZW50byBlc3RpdmVyIHJlZ2lzdHJhZG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RlcElkIElEIGRvIHBhc3NvIGEgYnVzY2FyLlxuICAgICAqL1xuICAgIGdldEVsZW1lbnQoc3RlcElkOiBzdHJpbmcpOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRFbGVtZW50cy5nZXQoc3RlcElkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkdmFuY2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5fc3RlcHMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5fY3VycmVudEluZGV4KCk7XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBzdGVwcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nRG9Ob3RTaG93QWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc3RlcENoYW5nZWQkLm5leHQoeyBzdGVwSWQ6IHN0ZXBzW25ld0luZGV4XS5zdGVwSWQsIHN0ZXBJbmRleDogbmV3SW5kZXgsIHRvdGFsU3RlcHM6IHN0ZXBzLmxlbmd0aCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCh7IHJlYXNvbjogJ2NvbXBsZXRlZCcsIGRvTm90U2hvd0FnYWluOiB0aGlzLl9wZW5kaW5nRG9Ob3RTaG93QWdhaW4gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJldHJlYXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5fc3RlcHMoKTtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLl9jdXJyZW50SW5kZXgoKSAtIDE7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgICAgICB0aGlzLl9zdGVwQ2hhbmdlZCQubmV4dCh7IHN0ZXBJZDogc3RlcHNbbmV3SW5kZXhdLnN0ZXBJZCwgc3RlcEluZGV4OiBuZXdJbmRleCwgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCwgbnVsbCwgdGhpcy5lbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaChwb3J0YWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGV0YWNoT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, input, output, signal, TemplateRef } from '@angular/core';
|
|
3
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
4
|
+
import { ButtonModule } from '@seniorsistemas/angular-components/button';
|
|
5
|
+
import { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
import * as i2 from "@seniorsistemas/angular-components/button";
|
|
9
|
+
import * as i3 from "@ngx-translate/core";
|
|
10
|
+
/**
|
|
11
|
+
* Componente de popover do Spotlight.
|
|
12
|
+
*
|
|
13
|
+
* Exibe o card de destaque com título, mensagem, seta direcional, contador de passos,
|
|
14
|
+
* botões de navegação e, em modo simples (passo único), o checkbox "não mostrar novamente".
|
|
15
|
+
*
|
|
16
|
+
* Este componente é instanciado programaticamente pelo `SpotlightOverlayComponent`
|
|
17
|
+
* via CDK Overlay. Normalmente não é usado diretamente no template.
|
|
18
|
+
*/
|
|
19
|
+
export class SpotlightComponent {
|
|
20
|
+
/** Título do popover. Aceita string ou `TemplateRef` para conteúdo dinâmico. */
|
|
21
|
+
title = input('');
|
|
22
|
+
/** Mensagem principal do popover. Aceita string ou `TemplateRef` para conteúdo dinâmico. */
|
|
23
|
+
message = input();
|
|
24
|
+
/** Template opcional para área de mídia/conteúdo customizado acima da mensagem. */
|
|
25
|
+
content = input(null);
|
|
26
|
+
/** Posição do popover em relação ao elemento alvo. @default 'bottom-center' */
|
|
27
|
+
position = input('bottom-center');
|
|
28
|
+
/** Número do passo atual (1-based) exibido no contador. @default 1 */
|
|
29
|
+
currentStep = input(1);
|
|
30
|
+
/** Total de passos do tour, usado no contador e para controle de botões. @default 1 */
|
|
31
|
+
totalSteps = input(1);
|
|
32
|
+
/**
|
|
33
|
+
* Exibe o checkbox "não mostrar novamente" (apenas em passo único).
|
|
34
|
+
* Passe `false` para suprimir o checkbox quando não for necessário persistir a preferência.
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
37
|
+
showDoNotShowAgain = input(true);
|
|
38
|
+
/** Lista de botões de ação adicionais exibidos na área de rodapé. */
|
|
39
|
+
actions = input([]);
|
|
40
|
+
/**
|
|
41
|
+
* Deslocamento em pixels para posicionar a seta manualmente no eixo principal.
|
|
42
|
+
* Quando `null`, o alinhamento é controlado pela `position`. @default null
|
|
43
|
+
*/
|
|
44
|
+
arrowOffsetPx = input(null);
|
|
45
|
+
/** Emitido ao clicar no botão de fechar (X). */
|
|
46
|
+
closed = output();
|
|
47
|
+
/** Emitido ao clicar em "Próximo". */
|
|
48
|
+
next = output();
|
|
49
|
+
/** Emitido ao clicar em "Voltar". */
|
|
50
|
+
previous = output();
|
|
51
|
+
/** Emitido ao clicar em "Entendido" (modo simples, passo único). */
|
|
52
|
+
understand = output();
|
|
53
|
+
/** Estado atual do checkbox "não mostrar novamente". */
|
|
54
|
+
isDoNotShowAgainChecked = signal(false);
|
|
55
|
+
static instanceCount = 0;
|
|
56
|
+
/** @internal */
|
|
57
|
+
instanceId = `spotlight-${++SpotlightComponent.instanceCount}`;
|
|
58
|
+
/** @internal */
|
|
59
|
+
titleId = `${this.instanceId}-title`;
|
|
60
|
+
/** @internal */
|
|
61
|
+
descId = `${this.instanceId}-desc`;
|
|
62
|
+
get titleTemplate() {
|
|
63
|
+
const v = this.title();
|
|
64
|
+
return v instanceof TemplateRef ? v : null;
|
|
65
|
+
}
|
|
66
|
+
get titleString() {
|
|
67
|
+
const v = this.title();
|
|
68
|
+
return v instanceof TemplateRef ? '' : (v ?? '');
|
|
69
|
+
}
|
|
70
|
+
get messageTemplate() {
|
|
71
|
+
const v = this.message();
|
|
72
|
+
return v instanceof TemplateRef ? v : null;
|
|
73
|
+
}
|
|
74
|
+
get messageString() {
|
|
75
|
+
const v = this.message();
|
|
76
|
+
return v instanceof TemplateRef ? '' : (v ?? '');
|
|
77
|
+
}
|
|
78
|
+
get arrowPosition() {
|
|
79
|
+
const [direction] = this.position().split('-');
|
|
80
|
+
const [, alignment] = this.position().split('-');
|
|
81
|
+
const oppositeDirection = this.getOppositeDirection(direction);
|
|
82
|
+
return `${oppositeDirection}-${alignment}`;
|
|
83
|
+
}
|
|
84
|
+
get isArrowTop() {
|
|
85
|
+
return this.arrowPosition.startsWith('top-');
|
|
86
|
+
}
|
|
87
|
+
get isArrowBottom() {
|
|
88
|
+
return this.arrowPosition.startsWith('bottom-');
|
|
89
|
+
}
|
|
90
|
+
get isArrowLeft() {
|
|
91
|
+
return this.arrowPosition.startsWith('left-');
|
|
92
|
+
}
|
|
93
|
+
get isArrowRight() {
|
|
94
|
+
return this.arrowPosition.startsWith('right-');
|
|
95
|
+
}
|
|
96
|
+
get arrowRotation() {
|
|
97
|
+
const direction = this.arrowPosition.split('-')[0];
|
|
98
|
+
switch (direction) {
|
|
99
|
+
case 'top':
|
|
100
|
+
return '';
|
|
101
|
+
case 'bottom':
|
|
102
|
+
return 'rotate-180';
|
|
103
|
+
case 'left':
|
|
104
|
+
return '-rotate-90';
|
|
105
|
+
case 'right':
|
|
106
|
+
return 'rotate-90';
|
|
107
|
+
default:
|
|
108
|
+
return '';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
get arrowAlignmentClass() {
|
|
112
|
+
const offset = this.arrowOffsetPx();
|
|
113
|
+
if (offset !== null) {
|
|
114
|
+
return 'justify-start';
|
|
115
|
+
}
|
|
116
|
+
const alignment = this.arrowPosition.split('-')[1];
|
|
117
|
+
if (this.isArrowTop || this.isArrowBottom) {
|
|
118
|
+
switch (alignment) {
|
|
119
|
+
case 'start':
|
|
120
|
+
return 'justify-start';
|
|
121
|
+
case 'center':
|
|
122
|
+
return 'justify-center';
|
|
123
|
+
case 'end':
|
|
124
|
+
return 'justify-end';
|
|
125
|
+
default:
|
|
126
|
+
return '';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
switch (alignment) {
|
|
131
|
+
case 'start':
|
|
132
|
+
return 'items-start justify-start';
|
|
133
|
+
case 'center':
|
|
134
|
+
return 'items-center justify-center';
|
|
135
|
+
case 'end':
|
|
136
|
+
return 'items-end justify-end';
|
|
137
|
+
default:
|
|
138
|
+
return '';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
get arrowPaddingStyle() {
|
|
143
|
+
const offset = this.arrowOffsetPx();
|
|
144
|
+
if (offset === null) {
|
|
145
|
+
return {};
|
|
146
|
+
}
|
|
147
|
+
if (this.isArrowTop || this.isArrowBottom) {
|
|
148
|
+
return { 'padding-left': `${offset}px`, 'padding-right': '0' };
|
|
149
|
+
}
|
|
150
|
+
return { 'padding-top': `${offset}px`, 'padding-bottom': '0' };
|
|
151
|
+
}
|
|
152
|
+
/** Emite o evento `closed`. Chamado pelo botão de fechar no template. */
|
|
153
|
+
onClose() {
|
|
154
|
+
this.closed.emit();
|
|
155
|
+
}
|
|
156
|
+
/** Emite o evento `next`. Chamado pelo botão "Próximo" no template. */
|
|
157
|
+
onNext() {
|
|
158
|
+
this.next.emit();
|
|
159
|
+
}
|
|
160
|
+
/** Emite o evento `previous`. Chamado pelo botão "Voltar" no template. */
|
|
161
|
+
onPrevious() {
|
|
162
|
+
this.previous.emit();
|
|
163
|
+
}
|
|
164
|
+
/** Emite o evento `understand`. Chamado pelo botão "Entendido" no template. */
|
|
165
|
+
onUnderstand() {
|
|
166
|
+
this.understand.emit();
|
|
167
|
+
}
|
|
168
|
+
/** Alterna o estado de `isDoNotShowAgainChecked`. */
|
|
169
|
+
toggleDoNotShowAgain() {
|
|
170
|
+
this.isDoNotShowAgainChecked.update((v) => !v);
|
|
171
|
+
}
|
|
172
|
+
getOppositeDirection(direction) {
|
|
173
|
+
switch (direction) {
|
|
174
|
+
case 'top':
|
|
175
|
+
return 'bottom';
|
|
176
|
+
case 'bottom':
|
|
177
|
+
return 'top';
|
|
178
|
+
case 'left':
|
|
179
|
+
return 'right';
|
|
180
|
+
case 'right':
|
|
181
|
+
return 'left';
|
|
182
|
+
default:
|
|
183
|
+
return direction;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
187
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpotlightComponent, isStandalone: true, selector: "s-spotlight", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, currentStep: { classPropertyName: "currentStep", publicName: "currentStep", isSignal: true, isRequired: false, transformFunction: null }, totalSteps: { classPropertyName: "totalSteps", publicName: "totalSteps", isSignal: true, isRequired: false, transformFunction: null }, showDoNotShowAgain: { classPropertyName: "showDoNotShowAgain", publicName: "showDoNotShowAgain", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, arrowOffsetPx: { classPropertyName: "arrowOffsetPx", publicName: "arrowOffsetPx", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", next: "next", previous: "previous", understand: "understand" }, ngImport: i0, template: "<div\n [attr.role]=\"totalSteps() > 1 ? 'dialog' : 'tooltip'\"\n [attr.aria-modal]=\"totalSteps() > 1 ? 'true' : null\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"descId\"\n class=\"flex max-w-[342px]\"\n [ngClass]=\"isArrowLeft || isArrowRight ? 'flex-row' : 'flex-col'\"\n>\n @if (isArrowTop) {\n <ng-container *ngTemplateOutlet=\"arrowTopTemplate\"></ng-container>\n }\n\n @if (isArrowLeft) {\n <ng-container *ngTemplateOutlet=\"arrowLeftTemplate\"></ng-container>\n }\n\n <div\n class=\"relative flex w-full flex-col overflow-hidden rounded-[4px] bg-grayscale-0\"\n style=\"\n box-shadow:\n 0 3px 5px rgba(0, 0, 0, 0.2),\n 0 1px 18px rgba(0, 0, 0, 0.12),\n 0 6px 10px rgba(0, 0, 0, 0.14);\n \"\n >\n <!-- Regi\u00E3o aria-live para anuncia\u00E7\u00E3o de mudan\u00E7a de passo para leitores de tela -->\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n @if (totalSteps() > 1) {\n {{\n 'platform.angular_components.step_progress'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n }\n </span>\n <div class=\"flex h-[40px] w-full items-center justify-between p-[12px]\">\n <div class=\"flex min-w-0 flex-1 items-center gap-[8px]\">\n <h2\n [id]=\"titleId\"\n class=\"flex-1 overflow-hidden overflow-ellipsis whitespace-nowrap font-open-sans text-[14px] font-bold leading-[1.5] text-grayscale-90\"\n >\n @if (titleTemplate) {\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n } @else {\n {{ titleString }}\n }\n </h2>\n </div>\n <button\n (click)=\"onClose()\"\n class=\"flex h-[16px] w-[16px] flex-none items-center justify-center text-grayscale-90 transition-colors hover:text-grayscale-100\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n @if (content()) {\n <ng-container *ngTemplateOutlet=\"content()\"></ng-container>\n }\n\n <div class=\"flex w-full flex-col items-start gap-[20px] bg-grayscale-0 p-[12px]\">\n <div\n [id]=\"descId\"\n class=\"w-full whitespace-pre-wrap font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\"\n >\n @if (messageTemplate) {\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n } @else {\n {{ messageString }}\n }\n </div>\n\n <div class=\"flex w-full flex-wrap gap-3\">\n @if (totalSteps() > 1) {\n <p class=\"font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\">\n {{\n 'platform.angular_components.step_counter'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n </p>\n }\n\n @if (totalSteps() === 1 && showDoNotShowAgain()) {\n <s-checkbox\n [checked]=\"isDoNotShowAgainChecked()\"\n (checkedChange)=\"toggleDoNotShowAgain()\"\n [label]=\"'platform.angular_components.dont_show_again' | translate\"\n ></s-checkbox>\n }\n\n <div\n class=\"flex flex-wrap items-start justify-end gap-[8px]\"\n [ngClass]=\"totalSteps() > 1 ? 'w-full' : ''\"\n >\n @for (action of actions(); track action.label) {\n <s-button\n [label]=\"action.label\"\n (clicked)=\"action.handler()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n @if (totalSteps() > 1 && currentStep() > 1) {\n <s-button\n [label]=\"'platform.angular_components.back' | translate\"\n (clicked)=\"onPrevious()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n <s-button\n [label]=\"\n totalSteps() <= 1\n ? ('platform.angular_components.understood' | translate)\n : currentStep() < totalSteps()\n ? ('platform.angular_components.next' | translate)\n : ('platform.angular_components.complete' | translate)\n \"\n (clicked)=\"totalSteps() > 1 ? onNext() : onUnderstand()\"\n priority=\"secondary\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n </div>\n </div>\n </div>\n </div>\n\n @if (isArrowBottom) {\n <ng-container *ngTemplateOutlet=\"arrowBottomTemplate\"></ng-container>\n }\n\n @if (isArrowRight) {\n <ng-container *ngTemplateOutlet=\"arrowRightTemplate\"></ng-container>\n }\n</div>\n\n<!-- Arrow Templates -->\n<ng-template #arrowTopTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowBottomTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowLeftTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowRightTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel"], outputs: ["clicked"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
188
|
+
}
|
|
189
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightComponent, decorators: [{
|
|
190
|
+
type: Component,
|
|
191
|
+
args: [{ selector: 's-spotlight', standalone: true, imports: [CommonModule, ButtonModule, CheckboxComponent, TranslateModule], template: "<div\n [attr.role]=\"totalSteps() > 1 ? 'dialog' : 'tooltip'\"\n [attr.aria-modal]=\"totalSteps() > 1 ? 'true' : null\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"descId\"\n class=\"flex max-w-[342px]\"\n [ngClass]=\"isArrowLeft || isArrowRight ? 'flex-row' : 'flex-col'\"\n>\n @if (isArrowTop) {\n <ng-container *ngTemplateOutlet=\"arrowTopTemplate\"></ng-container>\n }\n\n @if (isArrowLeft) {\n <ng-container *ngTemplateOutlet=\"arrowLeftTemplate\"></ng-container>\n }\n\n <div\n class=\"relative flex w-full flex-col overflow-hidden rounded-[4px] bg-grayscale-0\"\n style=\"\n box-shadow:\n 0 3px 5px rgba(0, 0, 0, 0.2),\n 0 1px 18px rgba(0, 0, 0, 0.12),\n 0 6px 10px rgba(0, 0, 0, 0.14);\n \"\n >\n <!-- Regi\u00E3o aria-live para anuncia\u00E7\u00E3o de mudan\u00E7a de passo para leitores de tela -->\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n @if (totalSteps() > 1) {\n {{\n 'platform.angular_components.step_progress'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n }\n </span>\n <div class=\"flex h-[40px] w-full items-center justify-between p-[12px]\">\n <div class=\"flex min-w-0 flex-1 items-center gap-[8px]\">\n <h2\n [id]=\"titleId\"\n class=\"flex-1 overflow-hidden overflow-ellipsis whitespace-nowrap font-open-sans text-[14px] font-bold leading-[1.5] text-grayscale-90\"\n >\n @if (titleTemplate) {\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n } @else {\n {{ titleString }}\n }\n </h2>\n </div>\n <button\n (click)=\"onClose()\"\n class=\"flex h-[16px] w-[16px] flex-none items-center justify-center text-grayscale-90 transition-colors hover:text-grayscale-100\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n @if (content()) {\n <ng-container *ngTemplateOutlet=\"content()\"></ng-container>\n }\n\n <div class=\"flex w-full flex-col items-start gap-[20px] bg-grayscale-0 p-[12px]\">\n <div\n [id]=\"descId\"\n class=\"w-full whitespace-pre-wrap font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\"\n >\n @if (messageTemplate) {\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n } @else {\n {{ messageString }}\n }\n </div>\n\n <div class=\"flex w-full flex-wrap gap-3\">\n @if (totalSteps() > 1) {\n <p class=\"font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\">\n {{\n 'platform.angular_components.step_counter'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n </p>\n }\n\n @if (totalSteps() === 1 && showDoNotShowAgain()) {\n <s-checkbox\n [checked]=\"isDoNotShowAgainChecked()\"\n (checkedChange)=\"toggleDoNotShowAgain()\"\n [label]=\"'platform.angular_components.dont_show_again' | translate\"\n ></s-checkbox>\n }\n\n <div\n class=\"flex flex-wrap items-start justify-end gap-[8px]\"\n [ngClass]=\"totalSteps() > 1 ? 'w-full' : ''\"\n >\n @for (action of actions(); track action.label) {\n <s-button\n [label]=\"action.label\"\n (clicked)=\"action.handler()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n @if (totalSteps() > 1 && currentStep() > 1) {\n <s-button\n [label]=\"'platform.angular_components.back' | translate\"\n (clicked)=\"onPrevious()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n <s-button\n [label]=\"\n totalSteps() <= 1\n ? ('platform.angular_components.understood' | translate)\n : currentStep() < totalSteps()\n ? ('platform.angular_components.next' | translate)\n : ('platform.angular_components.complete' | translate)\n \"\n (clicked)=\"totalSteps() > 1 ? onNext() : onUnderstand()\"\n priority=\"secondary\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n </div>\n </div>\n </div>\n </div>\n\n @if (isArrowBottom) {\n <ng-container *ngTemplateOutlet=\"arrowBottomTemplate\"></ng-container>\n }\n\n @if (isArrowRight) {\n <ng-container *ngTemplateOutlet=\"arrowRightTemplate\"></ng-container>\n }\n</div>\n\n<!-- Arrow Templates -->\n<ng-template #arrowTopTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowBottomTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowLeftTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowRightTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n" }]
|
|
192
|
+
}] });
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL2xpYi9zcG90bGlnaHQvc3BvdGxpZ2h0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL2xpYi9zcG90bGlnaHQvc3BvdGxpZ2h0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7OztBQUtoRjs7Ozs7Ozs7R0FRRztBQU9ILE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsZ0ZBQWdGO0lBQ2hGLEtBQUssR0FBRyxLQUFLLENBQTRCLEVBQUUsQ0FBQyxDQUFDO0lBRTdDLDRGQUE0RjtJQUM1RixPQUFPLEdBQUcsS0FBSyxFQUE2QixDQUFDO0lBRTdDLG1GQUFtRjtJQUNuRixPQUFPLEdBQUcsS0FBSyxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUUvQywrRUFBK0U7SUFDL0UsUUFBUSxHQUFHLEtBQUssQ0FBb0IsZUFBZSxDQUFDLENBQUM7SUFFckQsc0VBQXNFO0lBQ3RFLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkIsdUZBQXVGO0lBQ3ZGLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFD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QUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUI7UUFDMUMsUUFBUSxTQUFTLEVBQUUsQ0FBQztZQUNoQixLQUFLLEtBQUs7Z0JBQ04sT0FBTyxRQUFRLENBQUM7WUFDcEIsS0FBSyxRQUFRO2dCQUNULE9BQU8sS0FBSyxDQUFDO1lBQ2pCLEtBQUssTUFBTTtnQkFDUCxPQUFPLE9BQU8sQ0FBQztZQUNuQixLQUFLLE9BQU87Z0JBQ1IsT0FBTyxNQUFNLENBQUM7WUFDbEI7Z0JBQ0ksT0FBTyxTQUFTLENBQUM7UUFDekIsQ0FBQztJQUNMLENBQUM7d0dBL01RLGtCQUFrQjs0RkFBbEIsa0JBQWtCLG0yQ0N6Qi9CLHk1UUE4T0EsMkNEdk5jLFlBQVksd1hBQUUsWUFBWSx3WEFBRSxpQkFBaUIsOExBQUUsZUFBZTs7NEZBRS9ELGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDSSxhQUFhLGNBRVgsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94JztcblxuaW1wb3J0IHsgU3BvdGxpZ2h0UG9zaXRpb24gfSBmcm9tICcuL3R5cGVzL3Nwb3RsaWdodC1wb3NpdGlvbic7XG5pbXBvcnQgeyBTcG90bGlnaHRTdGVwQWN0aW9uIH0gZnJvbSAnLi90eXBlcy9zcG90bGlnaHQtc3RlcCc7XG5cbi8qKlxuICogQ29tcG9uZW50ZSBkZSBwb3BvdmVyIGRvIFNwb3RsaWdodC5cbiAqXG4gKiBFeGliZSBvIGNhcmQgZGUgZGVzdGFxdWUgY29tIHTDrXR1bG8sIG1lbnNhZ2VtLCBzZXRhIGRpcmVjaW9uYWwsIGNvbnRhZG9yIGRlIHBhc3NvcyxcbiAqIGJvdMO1ZXMgZGUgbmF2ZWdhw6fDo28gZSwgZW0gbW9kbyBzaW1wbGVzIChwYXNzbyDDum5pY28pLCBvIGNoZWNrYm94IFwibsOjbyBtb3N0cmFyIG5vdmFtZW50ZVwiLlxuICpcbiAqIEVzdGUgY29tcG9uZW50ZSDDqSBpbnN0YW5jaWFkbyBwcm9ncmFtYXRpY2FtZW50ZSBwZWxvIGBTcG90bGlnaHRPdmVybGF5Q29tcG9uZW50YFxuICogdmlhIENESyBPdmVybGF5LiBOb3JtYWxtZW50ZSBuw6NvIMOpIHVzYWRvIGRpcmV0YW1lbnRlIG5vIHRlbXBsYXRlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc3BvdGxpZ2h0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3BvdGxpZ2h0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgQ2hlY2tib3hDb21wb25lbnQsIFRyYW5zbGF0ZU1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIFNwb3RsaWdodENvbXBvbmVudCB7XG4gICAgLyoqIFTDrXR1bG8gZG8gcG9wb3Zlci4gQWNlaXRhIHN0cmluZyBvdSBgVGVtcGxhdGVSZWZgIHBhcmEgY29udGXDumRvIGRpbsOibWljby4gKi9cbiAgICB0aXRsZSA9IGlucHV0PHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4+KCcnKTtcblxuICAgIC8qKiBNZW5zYWdlbSBwcmluY2lwYWwgZG8gcG9wb3Zlci4gQWNlaXRhIHN0cmluZyBvdSBgVGVtcGxhdGVSZWZgIHBhcmEgY29udGXDumRvIGRpbsOibWljby4gKi9cbiAgICBtZXNzYWdlID0gaW5wdXQ8c3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICAgIC8qKiBUZW1wbGF0ZSBvcGNpb25hbCBwYXJhIMOhcmVhIGRlIG3DrWRpYS9jb250ZcO6ZG8gY3VzdG9taXphZG8gYWNpbWEgZGEgbWVuc2FnZW0uICovXG4gICAgY29udGVudCA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBQb3Npw6fDo28gZG8gcG9wb3ZlciBlbSByZWxhw6fDo28gYW8gZWxlbWVudG8gYWx2by4gQGRlZmF1bHQgJ2JvdHRvbS1jZW50ZXInICovXG4gICAgcG9zaXRpb24gPSBpbnB1dDxTcG90bGlnaHRQb3NpdGlvbj4oJ2JvdHRvbS1jZW50ZXInKTtcblxuICAgIC8qKiBOw7ptZXJvIGRvIHBhc3NvIGF0dWFsICgxLWJhc2VkKSBleGliaWRvIG5vIGNvbnRhZG9yLiBAZGVmYXVsdCAxICovXG4gICAgY3VycmVudFN0ZXAgPSBpbnB1dCgxKTtcblxuICAgIC8qKiBUb3RhbCBkZSBwYXNzb3MgZG8gdG91ciwgdXNhZG8gbm8gY29udGFkb3IgZSBwYXJhIGNvbnRyb2xlIGRlIGJvdMO1ZXMuIEBkZWZhdWx0IDEgKi9cbiAgICB0b3RhbFN0ZXBzID0gaW5wdXQoMSk7XG5cbiAgICAvKipcbiAgICAgKiBFeGliZSBvIGNoZWNrYm94IFwibsOjbyBtb3N0cmFyIG5vdmFtZW50ZVwiIChhcGVuYXMgZW0gcGFzc28gw7puaWNvKS5cbiAgICAgKiBQYXNzZSBgZmFsc2VgIHBhcmEgc3VwcmltaXIgbyBjaGVja2JveCBxdWFuZG8gbsOjbyBmb3IgbmVjZXNzw6FyaW8gcGVyc2lzdGlyIGEgcHJlZmVyw6puY2lhLlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBzaG93RG9Ob3RTaG93QWdhaW4gPSBpbnB1dCh0cnVlKTtcblxuICAgIC8qKiBMaXN0YSBkZSBib3TDtWVzIGRlIGHDp8OjbyBhZGljaW9uYWlzIGV4aWJpZG9zIG5hIMOhcmVhIGRlIHJvZGFww6kuICovXG4gICAgYWN0aW9ucyA9IGlucHV0PFNwb3RsaWdodFN0ZXBBY3Rpb25bXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogRGVzbG9jYW1lbnRvIGVtIHBpeGVscyBwYXJhIHBvc2ljaW9uYXIgYSBzZXRhIG1hbnVhbG1lbnRlIG5vIGVpeG8gcHJpbmNpcGFsLlxuICAgICAqIFF1YW5kbyBgbnVsbGAsIG8gYWxpbmhhbWVudG8gw6kgY29udHJvbGFkbyBwZWxhIGBwb3NpdGlvbmAuIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBhcnJvd09mZnNldFB4ID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIGRlIGZlY2hhciAoWCkuICovXG4gICAgY2xvc2VkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgZW0gXCJQcsOzeGltb1wiLiAqL1xuICAgIG5leHQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIGNsaWNhciBlbSBcIlZvbHRhclwiLiAqL1xuICAgIHByZXZpb3VzID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgZW0gXCJFbnRlbmRpZG9cIiAobW9kbyBzaW1wbGVzLCBwYXNzbyDDum5pY28pLiAqL1xuICAgIHVuZGVyc3RhbmQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIC8qKiBFc3RhZG8gYXR1YWwgZG8gY2hlY2tib3ggXCJuw6NvIG1vc3RyYXIgbm92YW1lbnRlXCIuICovXG4gICAgaXNEb05vdFNob3dBZ2FpbkNoZWNrZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VDb3VudCA9IDA7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluc3RhbmNlSWQgPSBgc3BvdGxpZ2h0LSR7KytTcG90bGlnaHRDb21wb25lbnQuaW5zdGFuY2VDb3VudH1gO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IHRpdGxlSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LXRpdGxlYDtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBkZXNjSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LWRlc2NgO1xuXG4gICAgZ2V0IHRpdGxlVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgICAgICBjb25zdCB2ID0gdGhpcy50aXRsZSgpO1xuICAgICAgICByZXR1cm4gdiBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gdiA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHRpdGxlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnRpdGxlKCk7XG4gICAgICAgIHJldHVybiB2IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgPyAnJyA6ICh2ID8/ICcnKTtcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMubWVzc2FnZSgpO1xuICAgICAgICByZXR1cm4gdiBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gdiA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IG1lc3NhZ2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMubWVzc2FnZSgpO1xuICAgICAgICByZXR1cm4gdiBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gJycgOiAodiA/PyAnJyk7XG4gICAgfVxuXG4gICAgZ2V0IGFycm93UG9zaXRpb24oKTogU3BvdGxpZ2h0UG9zaXRpb24ge1xuICAgICAgICBjb25zdCBbZGlyZWN0aW9uXSA9IHRoaXMucG9zaXRpb24oKS5zcGxpdCgnLScpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gICAgICAgIGNvbnN0IFssIGFsaWdubWVudF0gPSB0aGlzLnBvc2l0aW9uKCkuc3BsaXQoJy0nKSBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICAgICAgICBjb25zdCBvcHBvc2l0ZURpcmVjdGlvbiA9IHRoaXMuZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uKTtcblxuICAgICAgICByZXR1cm4gYCR7b3Bwb3NpdGVEaXJlY3Rpb259LSR7YWxpZ25tZW50fWAgYXMgU3BvdGxpZ2h0UG9zaXRpb247XG4gICAgfVxuXG4gICAgZ2V0IGlzQXJyb3dUb3AoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycm93UG9zaXRpb24uc3RhcnRzV2l0aCgndG9wLScpO1xuICAgIH1cblxuICAgIGdldCBpc0Fycm93Qm90dG9tKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJvd1Bvc2l0aW9uLnN0YXJ0c1dpdGgoJ2JvdHRvbS0nKTtcbiAgICB9XG5cbiAgICBnZXQgaXNBcnJvd0xlZnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycm93UG9zaXRpb24uc3RhcnRzV2l0aCgnbGVmdC0nKTtcbiAgICB9XG5cbiAgICBnZXQgaXNBcnJvd1JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJvd1Bvc2l0aW9uLnN0YXJ0c1dpdGgoJ3JpZ2h0LScpO1xuICAgIH1cblxuICAgIGdldCBhcnJvd1JvdGF0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuYXJyb3dQb3NpdGlvbi5zcGxpdCgnLScpWzBdO1xuXG4gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyb3RhdGUtMTgwJztcbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnLXJvdGF0ZS05MCc7XG4gICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyb3RhdGUtOTAnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgYXJyb3dBbGlnbm1lbnRDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmFycm93T2Zmc2V0UHgoKTtcblxuICAgICAgICBpZiAob2Zmc2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2p1c3RpZnktc3RhcnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gdGhpcy5hcnJvd1Bvc2l0aW9uLnNwbGl0KCctJylbMV07XG5cbiAgICAgICAgaWYgKHRoaXMuaXNBcnJvd1RvcCB8fCB0aGlzLmlzQXJyb3dCb3R0b20pIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWxpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2p1c3RpZnktc3RhcnQnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnanVzdGlmeS1jZW50ZXInO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnanVzdGlmeS1lbmQnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWxpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2l0ZW1zLXN0YXJ0IGp1c3RpZnktc3RhcnQnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJztcbiAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2l0ZW1zLWVuZCBqdXN0aWZ5LWVuZCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFycm93UGFkZGluZ1N0eWxlKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmFycm93T2Zmc2V0UHgoKTtcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNBcnJvd1RvcCB8fCB0aGlzLmlzQXJyb3dCb3R0b20pIHtcbiAgICAgICAgICAgIHJldHVybiB7ICdwYWRkaW5nLWxlZnQnOiBgJHtvZmZzZXR9cHhgLCAncGFkZGluZy1yaWdodCc6ICcwJyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgJ3BhZGRpbmctdG9wJzogYCR7b2Zmc2V0fXB4YCwgJ3BhZGRpbmctYm90dG9tJzogJzAnIH07XG4gICAgfVxuXG4gICAgLyoqIEVtaXRlIG8gZXZlbnRvIGBjbG9zZWRgLiBDaGFtYWRvIHBlbG8gYm90w6NvIGRlIGZlY2hhciBubyB0ZW1wbGF0ZS4gKi9cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIEVtaXRlIG8gZXZlbnRvIGBuZXh0YC4gQ2hhbWFkbyBwZWxvIGJvdMOjbyBcIlByw7N4aW1vXCIgbm8gdGVtcGxhdGUuICovXG4gICAgb25OZXh0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5leHQuZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKiBFbWl0ZSBvIGV2ZW50byBgcHJldmlvdXNgLiBDaGFtYWRvIHBlbG8gYm90w6NvIFwiVm9sdGFyXCIgbm8gdGVtcGxhdGUuICovXG4gICAgb25QcmV2aW91cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aW91cy5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIEVtaXRlIG8gZXZlbnRvIGB1bmRlcnN0YW5kYC4gQ2hhbWFkbyBwZWxvIGJvdMOjbyBcIkVudGVuZGlkb1wiIG5vIHRlbXBsYXRlLiAqL1xuICAgIG9uVW5kZXJzdGFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51bmRlcnN0YW5kLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKiogQWx0ZXJuYSBvIGVzdGFkbyBkZSBgaXNEb05vdFNob3dBZ2FpbkNoZWNrZWRgLiAqL1xuICAgIHRvZ2dsZURvTm90U2hvd0FnYWluKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRG9Ob3RTaG93QWdhaW5DaGVja2VkLnVwZGF0ZSgodikgPT4gIXYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgIHJldHVybiAndG9wJztcbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiIsIjxkaXZcbiAgICBbYXR0ci5yb2xlXT1cInRvdGFsU3RlcHMoKSA+IDEgPyAnZGlhbG9nJyA6ICd0b29sdGlwJ1wiXG4gICAgW2F0dHIuYXJpYS1tb2RhbF09XCJ0b3RhbFN0ZXBzKCkgPiAxID8gJ3RydWUnIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlSWRcIlxuICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZGVzY0lkXCJcbiAgICBjbGFzcz1cImZsZXggbWF4LXctWzM0MnB4XVwiXG4gICAgW25nQ2xhc3NdPVwiaXNBcnJvd0xlZnQgfHwgaXNBcnJvd1JpZ2h0ID8gJ2ZsZXgtcm93JyA6ICdmbGV4LWNvbCdcIlxuPlxuICAgIEBpZiAoaXNBcnJvd1RvcCkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXJyb3dUb3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH1cblxuICAgIEBpZiAoaXNBcnJvd0xlZnQpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFycm93TGVmdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggdy1mdWxsIGZsZXgtY29sIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVs0cHhdIGJnLWdyYXlzY2FsZS0wXCJcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgIGJveC1zaGFkb3c6XG4gICAgICAgICAgICAgICAgMCAzcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSxcbiAgICAgICAgICAgICAgICAwIDFweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksXG4gICAgICAgICAgICAgICAgMCA2cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMTQpO1xuICAgICAgICBcIlxuICAgID5cbiAgICAgICAgPCEtLSBSZWdpw6NvIGFyaWEtbGl2ZSBwYXJhIGFudW5jaWHDp8OjbyBkZSBtdWRhbsOnYSBkZSBwYXNzbyBwYXJhIGxlaXRvcmVzIGRlIHRlbGEgLS0+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBpZiAodG90YWxTdGVwcygpID4gMSkge1xuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc3RlcF9wcm9ncmVzcydcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGN1cnJlbnQ6IGN1cnJlbnRTdGVwKCksIHRvdGFsOiB0b3RhbFN0ZXBzKCkgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1bNDBweF0gdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcC1bMTJweF1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1pbi13LTAgZmxleC0xIGl0ZW1zLWNlbnRlciBnYXAtWzhweF1cIj5cbiAgICAgICAgICAgICAgICA8aDJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cInRpdGxlSWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtMSBvdmVyZmxvdy1oaWRkZW4gb3ZlcmZsb3ctZWxsaXBzaXMgd2hpdGVzcGFjZS1ub3dyYXAgZm9udC1vcGVuLXNhbnMgdGV4dC1bMTRweF0gZm9udC1ib2xkIGxlYWRpbmctWzEuNV0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmICh0aXRsZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRpdGxlU3RyaW5nIH19XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtWzE2cHhdIHctWzE2cHhdIGZsZXgtbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6dGV4dC1ncmF5c2NhbGUtMTAwXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuY2xvc2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGNvbnRlbnQoKSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnQoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLXN0YXJ0IGdhcC1bMjBweF0gYmctZ3JheXNjYWxlLTAgcC1bMTJweF1cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbaWRdPVwiZGVzY0lkXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCB3aGl0ZXNwYWNlLXByZS13cmFwIGZvbnQtb3Blbi1zYW5zIHRleHQtWzE0cHhdIGZvbnQtbm9ybWFsIGxlYWRpbmctWzEuNV0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAobWVzc2FnZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAge3sgbWVzc2FnZVN0cmluZyB9fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgQGlmICh0b3RhbFN0ZXBzKCkgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1vcGVuLXNhbnMgdGV4dC1bMTRweF0gZm9udC1ub3JtYWwgbGVhZGluZy1bMS41XSB0ZXh0LWdyYXlzY2FsZS05MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnN0ZXBfY291bnRlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgY3VycmVudDogY3VycmVudFN0ZXAoKSwgdG90YWw6IHRvdGFsU3RlcHMoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmICh0b3RhbFN0ZXBzKCkgPT09IDEgJiYgc2hvd0RvTm90U2hvd0FnYWluKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRG9Ob3RTaG93QWdhaW5DaGVja2VkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlRG9Ob3RTaG93QWdhaW4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kb250X3Nob3dfYWdhaW4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtc3RhcnQganVzdGlmeS1lbmQgZ2FwLVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidG90YWxTdGVwcygpID4gMSA/ICd3LWZ1bGwnIDogJydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoYWN0aW9uIG9mIGFjdGlvbnMoKTsgdHJhY2sgYWN0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYWN0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJhY3Rpb24uaGFuZGxlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcy1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRvdGFsU3RlcHMoKSA+IDEgJiYgY3VycmVudFN0ZXAoKSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmJhY2snIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblByZXZpb3VzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RlcHMoKSA8PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudW5kZXJzdG9vZCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudFN0ZXAoKSA8IHRvdGFsU3RlcHMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMubmV4dCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jb21wbGV0ZScgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG90YWxTdGVwcygpID4gMSA/IG9uTmV4dCgpIDogb25VbmRlcnN0YW5kKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGlzQXJyb3dCb3R0b20pIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFycm93Qm90dG9tVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG5cbiAgICBAaWYgKGlzQXJyb3dSaWdodCkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXJyb3dSaWdodFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuPC9kaXY+XG5cbjwhLS0gQXJyb3cgVGVtcGxhdGVzIC0tPlxuPG5nLXRlbXBsYXRlICNhcnJvd1RvcFRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggaC1bOHB4XSB3LWZ1bGwgcHgtWzEycHhdIHB5LTBcIlxuICAgICAgICBbbmdDbGFzc109XCJhcnJvd0FsaWdubWVudENsYXNzXCJcbiAgICAgICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhcnJvd1JvdGF0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXJyb3dCb3R0b21UZW1wbGF0ZT5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicmVsYXRpdmUgei0xMCBmbGV4IGgtWzhweF0gdy1mdWxsIHB4LVsxMnB4XSBweS0wXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiYXJyb3dBbGlnbm1lbnRDbGFzc1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cImFycm93UGFkZGluZ1N0eWxlXCJcbiAgICA+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMTZcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiOFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDhcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtZ3JheXNjYWxlLTBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiYXJyb3dSb3RhdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wIDhMOCAwTDE2IDhcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Fycm93TGVmdFRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggdy1bOHB4XSBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc2VsZi1zdHJldGNoIHB4LTBcIlxuICAgICAgICBbbmdDbGFzc109XCJhcnJvd0FsaWdubWVudENsYXNzXCJcbiAgICAgICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhcnJvd1JvdGF0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXJyb3dSaWdodFRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggdy1bOHB4XSBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc2VsZi1zdHJldGNoIHB4LTBcIlxuICAgICAgICBbbmdDbGFzc109XCJhcnJvd0FsaWdubWVudENsYXNzXCJcbiAgICAgICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhcnJvd1JvdGF0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXBvc2l0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Nwb3RsaWdodC9zcmMvbGliL3Nwb3RsaWdodC90eXBlcy9zcG90bGlnaHQtcG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNwb3RsaWdodFBvc2l0aW9uID1cbiAgfCAndG9wLXN0YXJ0J1xuICB8ICd0b3AtY2VudGVyJ1xuICB8ICd0b3AtZW5kJ1xuICB8ICdyaWdodC1zdGFydCdcbiAgfCAncmlnaHQtY2VudGVyJ1xuICB8ICdyaWdodC1lbmQnXG4gIHwgJ2JvdHRvbS1zdGFydCdcbiAgfCAnYm90dG9tLWNlbnRlcidcbiAgfCAnYm90dG9tLWVuZCdcbiAgfCAnbGVmdC1zdGFydCdcbiAgfCAnbGVmdC1jZW50ZXInXG4gIHwgJ2xlZnQtZW5kJztcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3R5cGVzL3Nwb3RsaWdodC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTcG90bGlnaHRQb3NpdGlvbiB9IGZyb20gJy4vc3BvdGxpZ2h0LXBvc2l0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBTcG90bGlnaHRTdGVwQWN0aW9uIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGhhbmRsZXI6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BvdGxpZ2h0U3RlcCB7XG4gICAgc3RlcElkOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gICAgbWVzc2FnZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwb3NpdGlvbj86IFNwb3RsaWdodFBvc2l0aW9uO1xuICAgIGNvbnRlbnQ/OiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbDtcbiAgICBhY3Rpb25zPzogU3BvdGxpZ2h0U3RlcEFjdGlvbltdO1xuICAgIHNob3dCYWNrZHJvcD86IGJvb2xlYW47XG4gICAgZGlzbWlzc2libGU/OiBib29sZWFuO1xuICAgIGJlZm9yZU5leHQ/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBiZWZvcmVQcmV2aW91cz86ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgdHlwZSBTcG90bGlnaHRDb25maWcgPSBPbWl0PFNwb3RsaWdodFN0ZXAsICdzdGVwSWQnIHwgJ2JlZm9yZU5leHQnIHwgJ2JlZm9yZVByZXZpb3VzJz4gJiB7XG4gICAgc2hvd0RvTm90U2hvd0FnYWluPzogYm9vbGVhbjtcbn07XG5cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXN0b3AtZXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3R5cGVzL3Nwb3RsaWdodC1zdG9wLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTcG90bGlnaHRTdG9wUmVhc29uID0gJ2NvbXBsZXRlZCcgfCAnaW50ZXJydXB0ZWQnIHwgJ2Rpc21pc3NlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BvdGxpZ2h0U3RvcEV2ZW50IHtcbiAgICByZWFzb246IFNwb3RsaWdodFN0b3BSZWFzb247XG4gICAgZG9Ob3RTaG93QWdhaW46IGJvb2xlYW47XG4gICAgc3RlcElkOiBzdHJpbmc7XG4gICAgc3RlcEluZGV4OiBudW1iZXI7XG4gICAgdG90YWxTdGVwczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnQge1xuICAgIHN0ZXBJZDogc3RyaW5nO1xuICAgIHN0ZXBJbmRleDogbnVtYmVyO1xuICAgIHRvdGFsU3RlcHM6IG51bWJlcjtcbn1cblxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { SpotlightStepDirective } from './lib/spotlight/spotlight-step.directive';
|
|
2
|
+
export { SpotlightTourService } from './lib/spotlight/spotlight-tour.service';
|
|
3
|
+
export { SpotlightComponent } from './lib/spotlight/spotlight.component';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBTcG90bGlnaHRTdGVwRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvc3BvdGxpZ2h0L3Nwb3RsaWdodC1zdGVwLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBTcG90bGlnaHRUb3VyU2VydmljZSB9IGZyb20gJy4vbGliL3Nwb3RsaWdodC9zcG90bGlnaHQtdG91ci5zZXJ2aWNlJztcbmV4cG9ydCB7IFNwb3RsaWdodENvbXBvbmVudCB9IGZyb20gJy4vbGliL3Nwb3RsaWdodC9zcG90bGlnaHQuY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgeyBTcG90bGlnaHRQb3NpdGlvbiB9IGZyb20gJy4vbGliL3Nwb3RsaWdodC90eXBlcy9zcG90bGlnaHQtcG9zaXRpb24nO1xuZXhwb3J0IHR5cGUgeyBTcG90bGlnaHRDb25maWcsIFNwb3RsaWdodFN0ZXAsIFNwb3RsaWdodFN0ZXBBY3Rpb24gfSBmcm9tICcuL2xpYi9zcG90bGlnaHQvdHlwZXMvc3BvdGxpZ2h0LXN0ZXAnO1xuZXhwb3J0IHR5cGUge1xuICAgIFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnQsXG4gICAgU3BvdGxpZ2h0U3RvcEV2ZW50LFxuICAgIFNwb3RsaWdodFN0b3BSZWFzb24sXG59IGZyb20gJy4vbGliL3Nwb3RsaWdodC90eXBlcy9zcG90bGlnaHQtc3RvcC1ldmVudCc7XG5cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuaW9yc2lzdGVtYXMtYW5ndWxhci1jb21wb25lbnRzLXNwb3RsaWdodC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL3NlbmlvcnNpc3RlbWFzLWFuZ3VsYXItY29tcG9uZW50cy1zcG90bGlnaHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|