@seniorsistemas/angular-components 19.9.0 → 19.9.2
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/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +7 -1
- package/control-errors/lib/control-errors/control-errors.component.d.ts +11 -2
- package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +8 -2
- package/esm2022/control-errors/lib/control-errors/control-errors.component.mjs +21 -1
- package/esm2022/drawer/lib/drawer/drawer.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +2 -2
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
- package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +62 -6
- package/esm2022/sidebar/public-api.mjs +12 -1
- package/esm2022/spotlight/lib/spotlight/spotlight-overlay/rect-stability.mjs +61 -0
- package/esm2022/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.mjs +91 -21
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +7 -1
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs +20 -0
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +61 -5
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +12 -1
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs +150 -20
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs.map +1 -1
- package/numeric-mask/README.md +164 -60
- package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +29 -2
- package/package.json +13 -13
- package/sidebar/README.md +3 -3
- package/sidebar/public-api.d.ts +10 -0
- package/spotlight/README.md +28 -0
- package/spotlight/lib/spotlight/spotlight-overlay/rect-stability.d.ts +32 -0
- package/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.d.ts +33 -0
|
@@ -7,6 +7,7 @@ import { ComponentPortal } from '@angular/cdk/portal';
|
|
|
7
7
|
import { combineLatest, debounceTime, fromEvent } from 'rxjs';
|
|
8
8
|
import { SpotlightComponent } from '../spotlight.component';
|
|
9
9
|
import { SpotlightTourService } from '../spotlight-tour.service';
|
|
10
|
+
import { waitForStableRect } from './rect-stability';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
const POPOVER_WIDTH = 342;
|
|
12
13
|
const SPOTLIGHT_PADDING = 8;
|
|
@@ -17,6 +18,8 @@ const MASK_BG = 'rgba(0,0,0,0.5)';
|
|
|
17
18
|
const MASK_TRANSITION = 'all 0.2s ease';
|
|
18
19
|
const OVERLAY_Z = '10000';
|
|
19
20
|
const POPOVER_Z = '10001';
|
|
21
|
+
/** Tempo máximo de espera pelo registro do elemento-alvo (ex: criado dinamicamente dentro de `beforeNext`) antes de recorrer ao popover centralizado. */
|
|
22
|
+
const ELEMENT_WAIT_TIMEOUT_MS = 500;
|
|
20
23
|
function toConnectedPositions(position) {
|
|
21
24
|
const [direction, alignment] = position.split('-');
|
|
22
25
|
const p = SPOTLIGHT_PADDING + 2;
|
|
@@ -68,6 +71,13 @@ export class SpotlightOverlayComponent {
|
|
|
68
71
|
totalSteps = this.tourService.totalSteps;
|
|
69
72
|
/** @internal*/
|
|
70
73
|
targetRect = signal(null);
|
|
74
|
+
/**
|
|
75
|
+
* Controla se a máscara deve animar a transição entre retângulos (reposicionamento
|
|
76
|
+
* em vivo, ex: scroll/resize) ou saltar instantaneamente (chegada/saída de um passo).
|
|
77
|
+
* Ver `setTargetRectImmediate`.
|
|
78
|
+
*/
|
|
79
|
+
maskTransitionEnabled = signal(true);
|
|
80
|
+
maskTransitionStyle = computed(() => this.maskTransitionEnabled() ? MASK_TRANSITION : 'none');
|
|
71
81
|
/** @internal */
|
|
72
82
|
topMaskStyle = computed(() => {
|
|
73
83
|
const rect = this.targetRect();
|
|
@@ -75,7 +85,7 @@ export class SpotlightOverlayComponent {
|
|
|
75
85
|
position: 'fixed',
|
|
76
86
|
'z-index': OVERLAY_Z,
|
|
77
87
|
background: MASK_BG,
|
|
78
|
-
transition:
|
|
88
|
+
transition: this.maskTransitionStyle(),
|
|
79
89
|
cursor: 'default',
|
|
80
90
|
};
|
|
81
91
|
if (!rect) {
|
|
@@ -98,7 +108,7 @@ export class SpotlightOverlayComponent {
|
|
|
98
108
|
position: 'fixed',
|
|
99
109
|
'z-index': OVERLAY_Z,
|
|
100
110
|
background: MASK_BG,
|
|
101
|
-
transition:
|
|
111
|
+
transition: this.maskTransitionStyle(),
|
|
102
112
|
cursor: 'default',
|
|
103
113
|
top: `${top}px`,
|
|
104
114
|
left: '0',
|
|
@@ -120,7 +130,7 @@ export class SpotlightOverlayComponent {
|
|
|
120
130
|
position: 'fixed',
|
|
121
131
|
'z-index': OVERLAY_Z,
|
|
122
132
|
background: MASK_BG,
|
|
123
|
-
transition:
|
|
133
|
+
transition: this.maskTransitionStyle(),
|
|
124
134
|
cursor: 'default',
|
|
125
135
|
top: `${top}px`,
|
|
126
136
|
left: `${right}px`,
|
|
@@ -140,7 +150,7 @@ export class SpotlightOverlayComponent {
|
|
|
140
150
|
position: 'fixed',
|
|
141
151
|
'z-index': OVERLAY_Z,
|
|
142
152
|
background: MASK_BG,
|
|
143
|
-
transition:
|
|
153
|
+
transition: this.maskTransitionStyle(),
|
|
144
154
|
cursor: 'default',
|
|
145
155
|
top: `${bottom}px`,
|
|
146
156
|
left: '0',
|
|
@@ -164,6 +174,9 @@ export class SpotlightOverlayComponent {
|
|
|
164
174
|
popoverSubs = [];
|
|
165
175
|
focusTrap = null;
|
|
166
176
|
previouslyFocusedElement = null;
|
|
177
|
+
pendingArrival = null;
|
|
178
|
+
elementWaitTimerId = null;
|
|
179
|
+
stabilizeGeneration = 0;
|
|
167
180
|
constructor() {
|
|
168
181
|
combineLatest([
|
|
169
182
|
toObservable(this.currentStep),
|
|
@@ -173,34 +186,74 @@ export class SpotlightOverlayComponent {
|
|
|
173
186
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
174
187
|
.subscribe(([step, active]) => {
|
|
175
188
|
this.disconnectResizeObserver();
|
|
189
|
+
this.cancelPendingArrival();
|
|
190
|
+
const generation = ++this.stabilizeGeneration;
|
|
176
191
|
if (!step || !active) {
|
|
177
|
-
this.
|
|
192
|
+
this.setTargetRectImmediate(null);
|
|
178
193
|
this.destroyPopoverOverlay();
|
|
179
194
|
return;
|
|
180
195
|
}
|
|
181
196
|
const el = this.tourService.getElement(step.stepId);
|
|
182
197
|
if (el?.nativeElement) {
|
|
183
198
|
el.nativeElement.scrollIntoView({ block: 'nearest' });
|
|
184
|
-
|
|
185
|
-
this.zone.runOutsideAngular(() => {
|
|
186
|
-
requestAnimationFrame(() => {
|
|
187
|
-
this.zone.run(() => {
|
|
188
|
-
if (!this.isActive()) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
this.updateTargetRect(target);
|
|
192
|
-
this.observeElement(target);
|
|
193
|
-
this.updatePopoverOverlay(target, step);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
});
|
|
199
|
+
this.beginArrivalSequence(el.nativeElement, step, generation);
|
|
197
200
|
}
|
|
198
201
|
else {
|
|
199
|
-
this.
|
|
200
|
-
this.updatePopoverOverlay(null, step);
|
|
202
|
+
this.awaitElementRegistration(step, generation);
|
|
201
203
|
}
|
|
202
204
|
});
|
|
203
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Aguarda o layout do elemento-alvo estabilizar (ex: animação de abertura de um menu
|
|
208
|
+
* disparada pelo `beforeNext` do passo anterior) antes de medir sua posição definitiva
|
|
209
|
+
* e posicionar a máscara/popover. Substitui a antiga espera de um único frame, que
|
|
210
|
+
* capturava o retângulo no meio de animações de terceiros na tela.
|
|
211
|
+
*/
|
|
212
|
+
beginArrivalSequence(target, step, generation) {
|
|
213
|
+
this.zone.runOutsideAngular(() => {
|
|
214
|
+
const handle = waitForStableRect(target);
|
|
215
|
+
this.pendingArrival = handle;
|
|
216
|
+
handle.promise.then(({ rect, timedOut }) => {
|
|
217
|
+
this.zone.run(() => {
|
|
218
|
+
if (generation !== this.stabilizeGeneration || !this.isActive()) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (timedOut) {
|
|
222
|
+
console.warn(`[Spotlight] O layout do elemento do passo "${step.stepId}" não estabilizou a tempo; usando a última posição medida.`);
|
|
223
|
+
}
|
|
224
|
+
this.setTargetRectImmediate(rect);
|
|
225
|
+
this.observeElement(target);
|
|
226
|
+
this.updatePopoverOverlay(target, step);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Aguarda até `ELEMENT_WAIT_TIMEOUT_MS` pelo registro do elemento-alvo via
|
|
233
|
+
* `[sSpotlightStep]` (útil quando o `beforeNext` do passo anterior cria o elemento
|
|
234
|
+
* dinamicamente, ex: abrindo uma aba) antes de recorrer ao popover centralizado.
|
|
235
|
+
* Mantém o último quadro renderizado durante a espera para evitar um flash.
|
|
236
|
+
*/
|
|
237
|
+
awaitElementRegistration(step, generation) {
|
|
238
|
+
this.elementWaitTimerId = setTimeout(() => {
|
|
239
|
+
this.zone.run(() => {
|
|
240
|
+
if (generation !== this.stabilizeGeneration) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
console.warn(`[Spotlight] Elemento do passo "${step.stepId}" não foi registrado a tempo; exibindo popover centralizado sem destaque.`);
|
|
244
|
+
this.setTargetRectImmediate(null);
|
|
245
|
+
this.updatePopoverOverlay(null, step);
|
|
246
|
+
});
|
|
247
|
+
}, ELEMENT_WAIT_TIMEOUT_MS);
|
|
248
|
+
}
|
|
249
|
+
cancelPendingArrival() {
|
|
250
|
+
this.pendingArrival?.cancel();
|
|
251
|
+
this.pendingArrival = null;
|
|
252
|
+
if (this.elementWaitTimerId !== null) {
|
|
253
|
+
clearTimeout(this.elementWaitTimerId);
|
|
254
|
+
this.elementWaitTimerId = null;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
204
257
|
ngOnInit() {
|
|
205
258
|
this.zone.runOutsideAngular(() => {
|
|
206
259
|
const scrollOpts = { capture: true, passive: true };
|
|
@@ -228,6 +281,7 @@ export class SpotlightOverlayComponent {
|
|
|
228
281
|
});
|
|
229
282
|
}
|
|
230
283
|
ngOnDestroy() {
|
|
284
|
+
this.cancelPendingArrival();
|
|
231
285
|
this.destroyPopoverOverlay();
|
|
232
286
|
}
|
|
233
287
|
/** @internal */
|
|
@@ -442,6 +496,22 @@ export class SpotlightOverlayComponent {
|
|
|
442
496
|
updateTargetRect(el) {
|
|
443
497
|
this.targetRect.set(el.getBoundingClientRect());
|
|
444
498
|
}
|
|
499
|
+
/**
|
|
500
|
+
* Aplica um novo `targetRect` sem animação de transição na máscara — usado ao
|
|
501
|
+
* chegar/saltar para um alvo novo, onde animar a partir da posição do passo
|
|
502
|
+
* anterior criaria a falsa impressão de "apontou errado e corrigiu depois".
|
|
503
|
+
* A transição é reabilitada no frame seguinte para reposicionamentos legítimos
|
|
504
|
+
* (scroll/resize de um alvo já visível).
|
|
505
|
+
*/
|
|
506
|
+
setTargetRectImmediate(rect) {
|
|
507
|
+
this.maskTransitionEnabled.set(false);
|
|
508
|
+
this.targetRect.set(rect);
|
|
509
|
+
this.zone.runOutsideAngular(() => {
|
|
510
|
+
requestAnimationFrame(() => {
|
|
511
|
+
this.zone.run(() => this.maskTransitionEnabled.set(true));
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
}
|
|
445
515
|
refreshRect() {
|
|
446
516
|
const step = this.currentStep();
|
|
447
517
|
if (!step || !this.isActive()) {
|
|
@@ -471,4 +541,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
471
541
|
type: Component,
|
|
472
542
|
args: [{ selector: 's-spotlight-overlay', standalone: true, imports: [NgStyle], template: "@if (isActive() && currentStep(); as step) {\n @if (step.showBackdrop !== false) {\n <div\n [ngStyle]=\"topMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n\n @if (targetRect()) {\n <div\n [ngStyle]=\"leftMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n <div\n [ngStyle]=\"rightMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n <div\n [ngStyle]=\"bottomMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n }\n }\n\n @if (step.showBackdrop === false) {\n @if (step.dismissible === false) {\n <div [ngStyle]=\"transparentBlockerStyle()\"></div>\n } @else {\n <div\n [ngStyle]=\"transparentBlockerStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n }\n }\n}\n\n" }]
|
|
473
543
|
}], ctorParameters: () => [] });
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Nwb3RsaWdodC9zcmMvbGliL3Nwb3RsaWdodC9zcG90bGlnaHQtb3ZlcmxheS9zcG90bGlnaHQtb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3Nwb3RsaWdodC1vdmVybGF5L3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0gsU0FBUyxFQUVULFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLE1BQU0sRUFDTixNQUFNLEVBR04sTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQXFCLE9BQU8sRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBSWpFLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDMUIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoRCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQztBQUNsQyxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDeEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQzFCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQztBQUUxQixTQUFTLG9CQUFvQixDQUFDLFFBQTJCO0lBQ3JELE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxNQUFNLENBQUMsR0FBRyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsU0FBdUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBZ0QsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ2pILE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxRQUFRLENBQUM7SUFFaEQsSUFBSSxPQUEwQixDQUFDO0lBQy9CLElBQUksUUFBMkIsQ0FBQztJQUVoQyxRQUFRLFNBQVMsRUFBRSxDQUFDO1FBQ2hCLEtBQUssS0FBSztZQUNOLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakcsUUFBUSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakcsTUFBTTtRQUNWLEtBQUssT0FBTztZQUNSLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9GLFFBQVEsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakcsTUFBTTtRQUNWLEtBQUssTUFBTTtZQUNQLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsUUFBUSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEcsTUFBTTtRQUNWLFNBQVMsV0FBVztZQUNoQixPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNoRyxRQUFRLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFHLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTztRQUNQLFFBQVE7UUFDUixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUN6RixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQzFGLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQ3hGLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7S0FDNUYsQ0FBQztBQUNOLENBQUM7QUFRRCxNQUFNLE9BQU8seUJBQXlCO0lBQ2pCLFdBQVcsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMzQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixtQkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRCxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3RCxnQkFBZ0I7SUFDUCxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ1AsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO0lBQ3BELGdCQUFnQjtJQUNQLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztJQUN0RCxnQkFBZ0I7SUFDUCxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7SUFFbEQsZUFBZTtJQUNOLFVBQVUsR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBRW5ELGdCQUFnQjtJQUNQLFlBQVksR0FBRyxRQUFRLENBQXlCLEdBQUcsRUFBRTtRQUMxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUc7WUFDVCxRQUFRLEVBQUUsT0FBTztZQUNqQixTQUFTLEVBQUUsU0FBUztZQUNwQixVQUFVLEVBQUUsT0FBTztZQUNuQixVQUFVLEVBQUUsZUFBZTtZQUMzQixNQUFNLEVBQUUsU0FBUztTQUNwQixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzVFLENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCO0lBQ1AsYUFBYSxHQUFHLFFBQVEsQ0FBeUIsR0FBRyxFQUFFO1FBQzNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixPQUFPLEVBQTRCLENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV4QyxPQUFPO1lBQ0gsUUFBUSxFQUFFLE9BQU87WUFDakIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsVUFBVSxFQUFFLE9BQU87WUFDbkIsVUFBVSxFQUFFLGVBQWU7WUFDM0IsTUFBTSxFQUFFLFNBQVM7WUFDakIsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLLEVBQUUsR0FBRyxJQUFJLElBQUk7WUFDbEIsTUFBTSxFQUFFLEdBQUcsTUFBTSxHQUFHLEdBQUcsSUFBSTtTQUM5QixDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBZ0I7SUFDUCxjQUFjLEdBQUcsUUFBUSxDQUF5QixHQUFHLEVBQUU7UUFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBNEIsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUxRCxPQUFPO1lBQ0gsUUFBUSxFQUFFLE9BQU87WUFDakIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsVUFBVSxFQUFFLE9BQU87WUFDbkIsVUFBVSxFQUFFLGVBQWU7WUFDM0IsTUFBTSxFQUFFLFNBQVM7WUFDakIsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJO1lBQ2YsSUFBSSxFQUFFLEdBQUcsS0FBSyxJQUFJO1lBQ2xCLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUcsTUFBTSxHQUFHLEdBQUcsSUFBSTtTQUM5QixDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBZ0I7SUFDUCxlQUFlLEdBQUcsUUFBUSxDQUF5QixHQUFHLEVBQUU7UUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBNEIsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFN0QsT0FBTztZQUNILFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxPQUFPO1lBQ25CLFVBQVUsRUFBRSxlQUFlO1lBQzNCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLEdBQUcsRUFBRSxHQUFHLE1BQU0sSUFBSTtZQUNsQixJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUc7U0FDZCxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBZ0I7SUFDUCx1QkFBdUIsR0FBRyxRQUFRLENBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkUsUUFBUSxFQUFFLE9BQU87UUFDakIsR0FBRyxFQUFFLEdBQUc7UUFDUixJQUFJLEVBQUUsR0FBRztRQUNULEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLEdBQUc7UUFDWCxTQUFTLEVBQUUsU0FBUztRQUNwQixNQUFNLEVBQUUsU0FBUztLQUNwQixDQUFDLENBQUMsQ0FBQztJQUVJLGNBQWMsR0FBMEIsSUFBSSxDQUFDO0lBQzdDLGlCQUFpQixHQUFzQixJQUFJLENBQUM7SUFDNUMsbUJBQW1CLEdBQTRDLElBQUksQ0FBQztJQUNwRSxXQUFXLEdBQW1DLEVBQUUsQ0FBQztJQUNqRCxTQUFTLEdBQXFCLElBQUksQ0FBQztJQUNuQyx3QkFBd0IsR0FBdUIsSUFBSSxDQUFDO0lBRTVEO1FBQ0ksYUFBYSxDQUFDO1lBQ1YsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDOUIsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDM0IsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUM7U0FDckQsQ0FBQzthQUNHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUMxQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUVoQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsT0FBTztZQUNYLENBQUM7WUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsSUFBSSxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQ3BCLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBRXRELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7Z0JBRWhDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO29CQUM3QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7d0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTs0QkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7Z0NBQ25CLE9BQU87NEJBQ1gsQ0FBQzs0QkFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQzVDLENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsTUFBTSxVQUFVLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQTZCLENBQUM7WUFFL0UsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2lCQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDM0QsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUNMLENBQUM7WUFFTixTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQTZCLENBQUM7aUJBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUMzRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztZQUVOLFNBQVMsQ0FBZ0IsUUFBUSxFQUFFLFNBQVMsQ0FBQztpQkFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDekMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE1BQU07UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixPQUFPO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQVM7UUFDTCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUM3RCxjQUFjLEVBQUUsS0FBSztTQUN4QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsUUFBNEIsRUFBRSxJQUFtQjtRQUMxRSxNQUFNLFFBQVEsR0FBRyxRQUFRO1lBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVTtpQkFDVixRQUFRLEVBQUU7aUJBQ1YsbUJBQW1CLENBQUMsUUFBUSxDQUFDO2lCQUM3QixhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxlQUFlLENBQUMsQ0FBQztpQkFDckUsc0JBQXNCLENBQUMsS0FBSyxDQUFDO2lCQUM3QixRQUFRLENBQUMsSUFBSSxDQUFDO2lCQUNkLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDNUMsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLGNBQWMsRUFBRSxRQUFRO29CQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUU7b0JBQy9DLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRTtnQkFDN0MsZ0JBQWdCLEVBQUUsUUFBUTtnQkFDMUIsS0FBSyxFQUFFLGFBQWE7YUFDdkIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsQ0FBQztZQUNELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3BDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFFL0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztRQUVoRCxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsSUFBbUI7UUFDM0MsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxhQUE0QixDQUFDO1FBRXRFLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGlCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDakIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNsRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLHVCQUF1QixFQUFFLElBQUksS0FBSyxDQUFDO1lBQzdGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxFQUNGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQ3ZGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUM3RCxjQUFjLEVBQUUsS0FBSztTQUN4QixDQUFDLENBQ0wsRUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxLQUFLLENBQUM7WUFDN0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxJQUFzRDtRQUM5RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFFckMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1AsT0FBTztRQUNYLENBQUM7UUFFRCxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksZUFBZSxDQUFDLENBQUM7UUFDM0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNwRSxHQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sWUFBWTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUM3QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDN0IscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsQ0FBQztvQkFDdEQsSUFBSSxNQUFNLEVBQUUsQ0FBQzt3QkFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3RELElBQUksQ0FBQyxTQUFTLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztvQkFDbEQsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHdCQUF3QjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQzdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSxDQUFDLENBQUM7WUFDckUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUM7UUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQixHQUFHLEVBQUUsUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyQyxPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzVDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQXdDLENBQUM7UUFFN0MsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDaEMsR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUNuQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdkMsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdkMsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDdkMsR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9FLEdBQUc7Z0JBQ0MsRUFBRSxJQUFJLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ3JELENBQUMsQ0FBQyxLQUFLO3dCQUNQLENBQUMsQ0FBQyxRQUFRO29CQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO3dCQUN2RCxDQUFDLENBQUMsTUFBTTt3QkFDUixDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsSUFBSSxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0YsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLElBQUksa0JBQWtCLEVBQXVCLENBQUMsQ0FBQztRQUU5RSxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxNQUFjLENBQUM7UUFFbkIsSUFBSSxrQkFBa0IsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBQzFCLENBQUM7YUFBTSxJQUFJLGtCQUFrQixLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3RDLE1BQU0sZUFBZSxHQUFHLEdBQUcsS0FBSyxNQUFNLElBQUksR0FBRyxLQUFLLE9BQU8sQ0FBQztZQUMxRCwyRUFBMkU7WUFDM0UsTUFBTSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDL0YsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDeEMsTUFBTSxTQUFTLEdBQ1gsR0FBRyxLQUFLLEtBQUssSUFBSSxHQUFHLEtBQUssUUFBUTtnQkFDN0IsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWU7Z0JBQ3BDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUM7WUFDNUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxHQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU8scUJBQXFCO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDMUIsQ0FBQztRQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxFQUFlO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLFdBQVc7UUFDZixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBELElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsRUFBZTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyx3QkFBd0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQzt3R0FyZVEseUJBQXlCOzRGQUF6Qix5QkFBeUIsK0VDOUV0QyxvOEJBbUNBLDRDRHlDYyxPQUFPOzs0RkFFUix5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0kscUJBQXFCLGNBRW5CLElBQUksV0FDUCxDQUFDLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIGNvbXB1dGVkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICBpbmplY3QsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9jdXNUcmFwLCBGb2N1c1RyYXBGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGRlYm91bmNlVGltZSwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNwb3RsaWdodENvbXBvbmVudCB9IGZyb20gJy4uL3Nwb3RsaWdodC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3BvdGxpZ2h0VG91clNlcnZpY2UgfSBmcm9tICcuLi9zcG90bGlnaHQtdG91ci5zZXJ2aWNlJztcbmltcG9ydCB7IFNwb3RsaWdodFBvc2l0aW9uIH0gZnJvbSAnLi4vdHlwZXMvc3BvdGxpZ2h0LXBvc2l0aW9uJztcbmltcG9ydCB7IFNwb3RsaWdodFN0ZXAgfSBmcm9tICcuLi90eXBlcy9zcG90bGlnaHQtc3RlcCc7XG5cbmNvbnN0IFBPUE9WRVJfV0lEVEggPSAzNDI7XG5jb25zdCBTUE9UTElHSFRfUEFERElORyA9IDg7XG5jb25zdCBBUlJPV19IQUxGX1NJWkUgPSA4O1xuY29uc3QgQVJST1dfT0ZGU0VUX01JTiA9IDQ7XG5jb25zdCBBUlJPV19PRkZTRVRfTUFYID0gUE9QT1ZFUl9XSURUSCAtIDQgLSAxNjtcbmNvbnN0IE1BU0tfQkcgPSAncmdiYSgwLDAsMCwwLjUpJztcbmNvbnN0IE1BU0tfVFJBTlNJVElPTiA9ICdhbGwgMC4ycyBlYXNlJztcbmNvbnN0IE9WRVJMQVlfWiA9ICcxMDAwMCc7XG5jb25zdCBQT1BPVkVSX1ogPSAnMTAwMDEnO1xuXG5mdW5jdGlvbiB0b0Nvbm5lY3RlZFBvc2l0aW9ucyhwb3NpdGlvbjogU3BvdGxpZ2h0UG9zaXRpb24pOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBbZGlyZWN0aW9uLCBhbGlnbm1lbnRdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgICBjb25zdCBwID0gU1BPVExJR0hUX1BBRERJTkcgKyAyO1xuICAgIGNvbnN0IGhBbGlnbiA9IGFsaWdubWVudCBhcyAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgICBjb25zdCB2QWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJz4gPSB7IHN0YXJ0OiAndG9wJywgY2VudGVyOiAnY2VudGVyJywgZW5kOiAnYm90dG9tJyB9O1xuICAgIGNvbnN0IHZBbGlnbiA9IHZBbGlnbk1hcFthbGlnbm1lbnRdID8/ICdjZW50ZXInO1xuXG4gICAgbGV0IHByaW1hcnk6IENvbm5lY3RlZFBvc2l0aW9uO1xuICAgIGxldCBvcHBvc2l0ZTogQ29ubmVjdGVkUG9zaXRpb247XG5cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgcHJpbWFyeSA9IHsgb3JpZ2luWDogaEFsaWduLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6IGhBbGlnbiwgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtcCB9O1xuICAgICAgICAgICAgb3Bwb3NpdGUgPSB7IG9yaWdpblg6IGhBbGlnbiwgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiBoQWxpZ24sIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHByaW1hcnkgPSB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogdkFsaWduLCBvZmZzZXRYOiBwIH07XG4gICAgICAgICAgICBvcHBvc2l0ZSA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiB2QWxpZ24sIG9mZnNldFg6IC1wIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogLXAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vICdib3R0b20nXG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IHAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHJpbWFyeSxcbiAgICAgICAgb3Bwb3NpdGUsXG4gICAgICAgIHsgb3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiBwIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiAtcCB9LFxuICAgIF07XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zcG90bGlnaHQtb3ZlcmxheScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ1N0eWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvdXJTZXJ2aWNlID0gaW5qZWN0KFNwb3RsaWdodFRvdXJTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjZGtPdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvY3VzVHJhcEZhY3RvcnkgPSBpbmplY3QoRm9jdXNUcmFwRmFjdG9yeSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgaXNBY3RpdmUgPSB0aGlzLnRvdXJTZXJ2aWNlLmlzQWN0aXZlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBjdXJyZW50U3RlcCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudFN0ZXA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGN1cnJlbnRJbmRleCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudEluZGV4O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSB0b3RhbFN0ZXBzID0gdGhpcy50b3VyU2VydmljZS50b3RhbFN0ZXBzO1xuXG4gICAgLyoqIEBpbnRlcm5hbCovXG4gICAgcmVhZG9ubHkgdGFyZ2V0UmVjdCA9IHNpZ25hbDxET01SZWN0IHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgdG9wTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGJvdHRvbTogJzAnIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBTUE9UTElHSFRfUEFERElORyk7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGhlaWdodDogYCR7dG9wfXB4YCB9O1xuICAgIH0pO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGxlZnRNYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcCA9IFNQT1RMSUdIVF9QQURESU5HO1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCAtIHApO1xuICAgICAgICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgcCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heCgwLCByZWN0LmxlZnQgLSBwKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IE1BU0tfQkcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBNQVNLX1RSQU5TSVRJT04sXG4gICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgICAgIHdpZHRoOiBgJHtsZWZ0fXB4YCxcbiAgICAgICAgICAgIGhlaWdodDogYCR7Ym90dG9tIC0gdG9wfXB4YCxcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSByaWdodE1hc2tTdHlsZSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuXG4gICAgICAgIGlmICghcmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwID0gU1BPVExJR0hUX1BBRERJTkc7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wIC0gcCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20gKyBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCwgcmVjdC5yaWdodCArIHApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgICAgICAgbGVmdDogYCR7cmlnaHR9cHhgLFxuICAgICAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgICAgIGhlaWdodDogYCR7Ym90dG9tIC0gdG9wfXB4YCxcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBib3R0b21NYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcCA9IFNQT1RMSUdIVF9QQURESU5HO1xuICAgICAgICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgcCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgJ3otaW5kZXgnOiBPVkVSTEFZX1osXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogTUFTS19UUkFOU0lUSU9OLFxuICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0b3A6IGAke2JvdHRvbX1weGAsXG4gICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICByaWdodDogJzAnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgdHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiAoe1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICB9KSk7XG5cbiAgICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcG9wb3Zlck92ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHBvcG92ZXJDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTcG90bGlnaHRDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwb3BvdmVyU3ViczogQXJyYXk8eyB1bnN1YnNjcmliZSgpOiB2b2lkIH0+ID0gW107XG4gICAgcHJpdmF0ZSBmb2N1c1RyYXA6IEZvY3VzVHJhcCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuY3VycmVudFN0ZXApLFxuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuaXNBY3RpdmUpLFxuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMudG91clNlcnZpY2UucmVnaXN0cmF0aW9uVmVyc2lvbiksXG4gICAgICAgIF0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKFtzdGVwLCBhY3RpdmVdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIoKTtcblxuICAgICAgICAgICAgICAgIGlmICghc3RlcCB8fCAhYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMudG91clNlcnZpY2UuZ2V0RWxlbWVudChzdGVwLnN0ZXBJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlRWxlbWVudCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvcG92ZXJPdmVybGF5KHRhcmdldCwgc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRSZWN0LnNldChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheShudWxsLCBzdGVwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbE9wdHMgPSB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucztcblxuICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgc2Nyb2xsT3B0cylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnLCB7IHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25EaXNtaXNzKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvbk5leHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2UubmV4dCgpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvblByZXZpb3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnByZXZpb3VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCgpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvbkRpc21pc3MoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICAgICAgaWYgKCFzdGVwIHx8IHN0ZXAuZGlzbWlzc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnN0b3Aoe1xuICAgICAgICAgICAgcmVhc29uOiB0aGlzLnRvdGFsU3RlcHMoKSA9PT0gMSA/ICdkaXNtaXNzZWQnIDogJ2ludGVycnVwdGVkJyxcbiAgICAgICAgICAgIGRvTm90U2hvd0FnYWluOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQb3BvdmVyT3ZlcmxheSh0YXJnZXRFbDogSFRNTEVsZW1lbnQgfCBudWxsLCBzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGFyZ2V0RWxcbiAgICAgICAgICAgID8gdGhpcy5jZGtPdmVybGF5XG4gICAgICAgICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGFyZ2V0RWwpXG4gICAgICAgICAgICAgICAgICAud2l0aFBvc2l0aW9ucyh0b0Nvbm5lY3RlZFBvc2l0aW9ucyhzdGVwLnBvc2l0aW9uID8/ICdib3R0b20tY2VudGVyJykpXG4gICAgICAgICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgICAgICAgICAgICAgIC53aXRoUHVzaCh0cnVlKVxuICAgICAgICAgICAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KVxuICAgICAgICAgICAgOiB0aGlzLmNka092ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5jZW50ZXJWZXJ0aWNhbGx5KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPdmVybGF5UmVmKSB7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmID0gdGhpcy5jZGtPdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0YXJnZXRFbFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2RrT3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY2RrT3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgICAgICAgICAgICB3aWR0aDogUE9QT1ZFUl9XSURUSCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNldFBvcG92ZXJaSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoUG9wb3ZlclBvcnRhbChzdGVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb25TdHJhdGVneShzdHJhdGVneSk7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvcG92ZXJJbnB1dHMoc3RlcCk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0RWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlU3luYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZvY3VzVHJhcFJlZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UG9wb3ZlclpJbmRleCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPdmVybGF5UmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlLnpJbmRleCA9IFBPUE9WRVJfWjtcblxuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi5ob3N0RWxlbWVudDtcblxuICAgICAgICBpZiAoaG9zdCAhPT0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudCkge1xuICAgICAgICAgICAgaG9zdC5zdHlsZS56SW5kZXggPSBQT1BPVkVSX1o7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaFBvcG92ZXJQb3J0YWwoc3RlcDogU3BvdGxpZ2h0U3RlcCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChTcG90bGlnaHRDb21wb25lbnQsIG51bGwsIHRoaXMuZW52aXJvbm1lbnRJbmplY3Rvcik7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IHRoaXMucG9wb3Zlck92ZXJsYXlSZWYhLmF0dGFjaChwb3J0YWwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBvcG92ZXJJbnB1dHMoc3RlcCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudG90YWxTdGVwcygpID4gMSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVRvdXJNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3BvdmVyU3Vicy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLm5leHQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb05vdFNob3dBZ2FpbiA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZj8uaW5zdGFuY2UuaXNEb05vdFNob3dBZ2FpbkNoZWNrZWQoKSA/PyBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLm5leHQoZG9Ob3RTaG93QWdhaW4pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UucHJldmlvdXMuc3Vic2NyaWJlKCgpID0+IHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKSksXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UuY2xvc2VkLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogdGhpcy50b3RhbFN0ZXBzKCkgPT09IDEgPyAnZGlzbWlzc2VkJyA6ICdpbnRlcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRvTm90U2hvd0FnYWluOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UudW5kZXJzdGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvTm90U2hvd0FnYWluID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5pc0RvTm90U2hvd0FnYWluQ2hlY2tlZCgpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7IHJlYXNvbjogJ2NvbXBsZXRlZCcsIGRvTm90U2hvd0FnYWluIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXA6IFNwb3RsaWdodFN0ZXAgJiB7IHNob3dEb05vdFNob3dBZ2Fpbj86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWY7XG5cbiAgICAgICAgaWYgKCFyZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZi5zZXRJbnB1dCgndGl0bGUnLCBzdGVwLnRpdGxlKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdtZXNzYWdlJywgc3RlcC5tZXNzYWdlKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdwb3NpdGlvbicsIHN0ZXAucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdjdXJyZW50U3RlcCcsIHRoaXMuY3VycmVudEluZGV4KCkgKyAxKTtcbiAgICAgICAgcmVmLnNldElucHV0KCd0b3RhbFN0ZXBzJywgdGhpcy50b3RhbFN0ZXBzKCkpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ2NvbnRlbnQnLCBzdGVwLmNvbnRlbnQgPz8gbnVsbCk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnYWN0aW9ucycsIHN0ZXAuYWN0aW9ucyA/PyBbXSk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnc2hvd0RvTm90U2hvd0FnYWluJywgc3RlcC5zaG93RG9Ob3RTaG93QWdhaW4gPz8gdHJ1ZSk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnYXJyb3dPZmZzZXRQeCcsIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGVTeW5jKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5zeW5jRGlyZWN0aW9uQW5kQXJyb3coKSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlVG91ck1vZGUoKTogdm9pZCB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVFbCA9IHRoaXMucG9wb3Zlck92ZXJsYXlSZWY/Lm92ZXJsYXlFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzVHJhcCA9IHRoaXMuZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUocGFuZUVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGEgc3RlcCBjaGFuZ2UsIG1vdmVzIGZvY3VzIGJhY2sgdG8gdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnQgaW5zaWRlIHRoZVxuICAgICAqIHBvcG92ZXIgc28gdGhlIHVzZXIgZG9lcyBub3QgbG9zZSBrZXlib2FyZCBwb3NpdGlvbi5cbiAgICAgKiBOby1vcCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBmb2N1cyB0cmFwIChzaW1wbGUgc3BvdGxpZ2h0IG1vZGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2NoZWR1bGVGb2N1c1RyYXBSZWZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSByZXR1cm47XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c1RyYXA/LmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jRGlyZWN0aW9uQW5kQXJyb3coKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZjtcbiAgICAgICAgY29uc3QgcGFuZUVsID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlZiB8fCAhcGFuZUVsIHx8ICFyZWN0KSB7XG4gICAgICAgICAgICByZWY/LnNldElucHV0KCdhcnJvd09mZnNldFB4JywgbnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYW5lID0gcGFuZUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB0b2wgPSBTUE9UTElHSFRfUEFERElORyArIDQ7XG5cbiAgICAgICAgbGV0IGRpcjogJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCc7XG5cbiAgICAgICAgaWYgKHBhbmUudG9wID49IHJlY3QuYm90dG9tIC0gdG9sKSB7XG4gICAgICAgICAgICBkaXIgPSAnYm90dG9tJztcbiAgICAgICAgfSBlbHNlIGlmIChwYW5lLmJvdHRvbSA8PSByZWN0LnRvcCArIHRvbCkge1xuICAgICAgICAgICAgZGlyID0gJ3RvcCc7XG4gICAgICAgIH0gZWxzZSBpZiAocGFuZS5sZWZ0ID49IHJlY3QucmlnaHQgLSB0b2wpIHtcbiAgICAgICAgICAgIGRpciA9ICdyaWdodCc7XG4gICAgICAgIH0gZWxzZSBpZiAocGFuZS5yaWdodCA8PSByZWN0LmxlZnQgKyB0b2wpIHtcbiAgICAgICAgICAgIGRpciA9ICdsZWZ0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGR5ID0gTWF0aC5hYnMocGFuZS50b3AgKyBwYW5lLmhlaWdodCAvIDIgLSAocmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDIpKTtcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gTWF0aC5hYnMocGFuZS5sZWZ0ICsgcGFuZS53aWR0aCAvIDIgLSAocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDIpKTtcbiAgICAgICAgICAgIGRpciA9XG4gICAgICAgICAgICAgICAgZHkgPj0gZHhcbiAgICAgICAgICAgICAgICAgICAgPyBwYW5lLnRvcCArIHBhbmUuaGVpZ2h0IC8gMiA8IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0b3AnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdib3R0b20nXG4gICAgICAgICAgICAgICAgICAgIDogcGFuZS5sZWZ0ICsgcGFuZS53aWR0aCAvIDIgPCByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMlxuICAgICAgICAgICAgICAgICAgICAgID8gJ2xlZnQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAncmlnaHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVkQWxpZ25tZW50ID0gKHRoaXMuY3VycmVudFN0ZXAoKT8ucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKS5zcGxpdCgnLScpWzFdO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ3Bvc2l0aW9uJywgYCR7ZGlyfS0ke3JlcXVlc3RlZEFsaWdubWVudH1gIGFzIFNwb3RsaWdodFBvc2l0aW9uKTtcblxuICAgICAgICBjb25zdCBBUlJPV19NQVJHSU4gPSAxMjtcbiAgICAgICAgbGV0IG9mZnNldDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRBbGlnbm1lbnQgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IEFSUk9XX01BUkdJTjtcbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRBbGlnbm1lbnQgPT09ICdlbmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZlcnRpY2FsQXJyb3cgPSBkaXIgPT09ICdsZWZ0JyB8fCBkaXIgPT09ICdyaWdodCc7XG4gICAgICAgICAgICAvLyBTVkcgaGVpZ2h0IGluIGZsZXgtY29sIGxheW91dCA9IDhweDsgU1ZHIHdpZHRoIGluIGZsZXgtcm93IGxheW91dCA9IDE2cHhcbiAgICAgICAgICAgIG9mZnNldCA9IGlzVmVydGljYWxBcnJvdyA/IHBhbmUuaGVpZ2h0IC0gQVJST1dfTUFSR0lOIC0gOCA6IHBhbmUud2lkdGggLSBBUlJPV19NQVJHSU4gLSAxNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRndFggPSByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IHRndFkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGNvbnN0IHJhd09mZnNldCA9XG4gICAgICAgICAgICAgICAgZGlyID09PSAndG9wJyB8fCBkaXIgPT09ICdib3R0b20nXG4gICAgICAgICAgICAgICAgICAgID8gdGd0WCAtIHBhbmUubGVmdCAtIEFSUk9XX0hBTEZfU0laRVxuICAgICAgICAgICAgICAgICAgICA6IHRndFkgLSBwYW5lLnRvcCAtIEFSUk9XX0hBTEZfU0laRTtcbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWF4KEFSUk9XX09GRlNFVF9NSU4sIE1hdGgubWluKEFSUk9XX09GRlNFVF9NQVgsIHJhd09mZnNldCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVmLnNldElucHV0KCdhcnJvd09mZnNldFB4Jywgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyU3Vicy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLnBvcG92ZXJTdWJzID0gW107XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVHJhcCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUYXJnZXRSZWN0KGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhcmdldFJlY3Quc2V0KGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hSZWN0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGVwID0gdGhpcy5jdXJyZW50U3RlcCgpO1xuXG4gICAgICAgIGlmICghc3RlcCB8fCAhdGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnRvdXJTZXJ2aWNlLmdldEVsZW1lbnQoc3RlcC5zdGVwSWQpO1xuXG4gICAgICAgIGlmIChlbD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYXJnZXRSZWN0KGVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudXBkYXRlVGFyZ2V0UmVjdChlbCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiIsIkBpZiAoaXNBY3RpdmUoKSAmJiBjdXJyZW50U3RlcCgpOyBhcyBzdGVwKSB7XG4gICAgQGlmIChzdGVwLnNob3dCYWNrZHJvcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgW25nU3R5bGVdPVwidG9wTWFza1N0eWxlKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgPjwvZGl2PlxuXG4gICAgICAgIEBpZiAodGFyZ2V0UmVjdCgpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwibGVmdE1hc2tTdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EaXNtaXNzKClcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInJpZ2h0TWFza1N0eWxlKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYm90dG9tTWFza1N0eWxlKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAaWYgKHN0ZXAuc2hvd0JhY2tkcm9wID09PSBmYWxzZSkge1xuICAgICAgICBAaWYgKHN0ZXAuZGlzbWlzc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInRyYW5zcGFyZW50QmxvY2tlclN0eWxlKClcIj48L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwidHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgfVxuICAgIH1cbn1cblxuIl19
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Nwb3RsaWdodC9zcmMvbGliL3Nwb3RsaWdodC9zcG90bGlnaHQtb3ZlcmxheS9zcG90bGlnaHQtb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3Nwb3RsaWdodC1vdmVybGF5L3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0gsU0FBUyxFQUVULFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLE1BQU0sRUFDTixNQUFNLEVBR04sTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQXFCLE9BQU8sRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHakUsT0FBTyxFQUFtQixpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUV0RSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDNUIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUM7QUFDbEMsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDO0FBQ3hDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQztBQUMxQixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUM7QUFDMUIseUpBQXlKO0FBQ3pKLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRXBDLFNBQVMsb0JBQW9CLENBQUMsUUFBMkI7SUFDckQsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxTQUF1QyxDQUFDO0lBQ3ZELE1BQU0sU0FBUyxHQUFnRCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDakgsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUVoRCxJQUFJLE9BQTBCLENBQUM7SUFDL0IsSUFBSSxRQUEyQixDQUFDO0lBRWhDLFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDaEIsS0FBSyxLQUFLO1lBQ04sT0FBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRyxRQUFRLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNqRyxNQUFNO1FBQ1YsS0FBSyxPQUFPO1lBQ1IsT0FBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDL0YsUUFBUSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRyxNQUFNO1FBQ1YsS0FBSyxNQUFNO1lBQ1AsT0FBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRyxRQUFRLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNoRyxNQUFNO1FBQ1YsU0FBUyxXQUFXO1lBQ2hCLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hHLFFBQVEsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUcsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPO1FBQ1AsUUFBUTtRQUNSLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQ3pGLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDMUYsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7UUFDeEYsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRTtLQUM1RixDQUFDO0FBQ04sQ0FBQztBQVFELE1BQU0sT0FBTyx5QkFBeUI7SUFDakIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzNDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xELGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTdELGdCQUFnQjtJQUNQLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUM5QyxnQkFBZ0I7SUFDUCxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDcEQsZ0JBQWdCO0lBQ1AsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQ3RELGdCQUFnQjtJQUNQLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztJQUVsRCxlQUFlO0lBQ04sVUFBVSxHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUM7SUFFbkQ7Ozs7T0FJRztJQUNjLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVyQyxtQkFBbUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ2pELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDMUQsQ0FBQztJQUVGLGdCQUFnQjtJQUNQLFlBQVksR0FBRyxRQUFRLENBQXlCLEdBQUcsRUFBRTtRQUMxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUc7WUFDVCxRQUFRLEVBQUUsT0FBTztZQUNqQixTQUFTLEVBQUUsU0FBUztZQUNwQixVQUFVLEVBQUUsT0FBTztZQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3RDLE1BQU0sRUFBRSxTQUFTO1NBQ3BCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDNUUsQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBZ0I7SUFDUCxhQUFhLEdBQUcsUUFBUSxDQUF5QixHQUFHLEVBQUU7UUFDM0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBNEIsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXhDLE9BQU87WUFDSCxRQUFRLEVBQUUsT0FBTztZQUNqQixTQUFTLEVBQUUsU0FBUztZQUNwQixVQUFVLEVBQUUsT0FBTztZQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3RDLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSTtZQUNmLElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLEdBQUcsSUFBSSxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLE1BQU0sR0FBRyxHQUFHLElBQUk7U0FDOUIsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCO0lBQ1AsY0FBYyxHQUFHLFFBQVEsQ0FBeUIsR0FBRyxFQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixPQUFPLEVBQTRCLENBQUM7UUFDeEMsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUQsT0FBTztZQUNILFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxPQUFPO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDdEMsTUFBTSxFQUFFLFNBQVM7WUFDakIsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJO1lBQ2YsSUFBSSxFQUFFLEdBQUcsS0FBSyxJQUFJO1lBQ2xCLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUcsTUFBTSxHQUFHLEdBQUcsSUFBSTtTQUM5QixDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBZ0I7SUFDUCxlQUFlLEdBQUcsUUFBUSxDQUF5QixHQUFHLEVBQUU7UUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBNEIsQ0FBQztRQUN4QyxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFN0QsT0FBTztZQUNILFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxPQUFPO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDdEMsTUFBTSxFQUFFLFNBQVM7WUFDakIsR0FBRyxFQUFFLEdBQUcsTUFBTSxJQUFJO1lBQ2xCLElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLEdBQUc7WUFDVixNQUFNLEVBQUUsR0FBRztTQUNkLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztJQUVILGdCQUFnQjtJQUNQLHVCQUF1QixHQUFHLFFBQVEsQ0FBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2RSxRQUFRLEVBQUUsT0FBTztRQUNqQixHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxHQUFHO1FBQ1QsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLE1BQU0sRUFBRSxTQUFTO0tBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUksY0FBYyxHQUEwQixJQUFJLENBQUM7SUFDN0MsaUJBQWlCLEdBQXNCLElBQUksQ0FBQztJQUM1QyxtQkFBbUIsR0FBNEMsSUFBSSxDQUFDO0lBQ3BFLFdBQVcsR0FBbUMsRUFBRSxDQUFDO0lBQ2pELFNBQVMsR0FBcUIsSUFBSSxDQUFDO0lBQ25DLHdCQUF3QixHQUF1QixJQUFJLENBQUM7SUFDcEQsY0FBYyxHQUEyQixJQUFJLENBQUM7SUFDOUMsa0JBQWtCLEdBQXlDLElBQUksQ0FBQztJQUNoRSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFFaEM7UUFDSSxhQUFhLENBQUM7WUFDVixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM5QixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztTQUNyRCxDQUFDO2FBQ0csSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFO1lBQzFCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sVUFBVSxHQUFHLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBRTlDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsT0FBTztZQUNYLENBQUM7WUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsSUFBSSxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQ3BCLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNsRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxvQkFBb0IsQ0FBQyxNQUFtQixFQUFFLElBQW1CLEVBQUUsVUFBa0I7UUFDckYsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7WUFFN0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2YsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7d0JBQzlELE9BQU87b0JBQ1gsQ0FBQztvQkFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUNYLE9BQU8sQ0FBQyxJQUFJLENBQ1IsOENBQThDLElBQUksQ0FBQyxNQUFNLDREQUE0RCxDQUN4SCxDQUFDO29CQUNOLENBQUM7b0JBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx3QkFBd0IsQ0FBQyxJQUFtQixFQUFFLFVBQWtCO1FBQ3BFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDMUMsT0FBTztnQkFDWCxDQUFDO2dCQUVELE9BQU8sQ0FBQyxJQUFJLENBQ1Isa0NBQWtDLElBQUksQ0FBQyxNQUFNLDJFQUEyRSxDQUMzSCxDQUFDO2dCQUNGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUUzQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUM3QixNQUFNLFVBQVUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBNkIsQ0FBQztZQUUvRSxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUM7aUJBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUMzRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztZQUVOLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBNkIsQ0FBQztpQkFDcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzNELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDWixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FDTCxDQUFDO1lBRU4sU0FBUyxDQUFnQixRQUFRLEVBQUUsU0FBUyxDQUFDO2lCQUN4QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN6QyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsTUFBTTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixVQUFVO1FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE9BQU87UUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBUztRQUNMLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVoQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBQzdELGNBQWMsRUFBRSxLQUFLO1NBQ3hCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxRQUE0QixFQUFFLElBQW1CO1FBQzFFLE1BQU0sUUFBUSxHQUFHLFFBQVE7WUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVO2lCQUNWLFFBQVEsRUFBRTtpQkFDVixtQkFBbUIsQ0FBQyxRQUFRLENBQUM7aUJBQzdCLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLGVBQWUsQ0FBQyxDQUFDO2lCQUNyRSxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7aUJBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUM7aUJBQ2Qsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVsRixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUM1QyxXQUFXLEVBQUUsS0FBSztnQkFDbEIsY0FBYyxFQUFFLFFBQVE7b0JBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRTtvQkFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO2dCQUM3QyxnQkFBZ0IsRUFBRSxRQUFRO2dCQUMxQixLQUFLLEVBQUUsYUFBYTthQUN2QixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixDQUFDO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUUvRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1FBRWhELElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxJQUFtQjtRQUMzQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLGFBQTRCLENBQUM7UUFFdEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWtCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNqQixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxLQUFLLENBQUM7WUFDN0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDdkYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBQzdELGNBQWMsRUFBRSxLQUFLO1NBQ3hCLENBQUMsQ0FDTCxFQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLEtBQUssQ0FBQztZQUM3RixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQXNEO1FBQzlFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUVyQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDUCxPQUFPO1FBQ1gsQ0FBQztRQUVELEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxlQUFlLENBQUMsQ0FBQztRQUMzRCxHQUFHLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUM5QyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3BFLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxZQUFZO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQzdCLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUM3QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDO29CQUN0RCxJQUFJLE1BQU0sRUFBRSxDQUFDO3dCQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO29CQUNsRCxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssd0JBQXdCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDN0IscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHFCQUFxQjtRQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsQ0FBQztRQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLEdBQUcsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JDLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDNUMsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBRWxDLElBQUksR0FBd0MsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNoQyxHQUFHLEdBQUcsUUFBUSxDQUFDO1FBQ25CLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxHQUFHLEdBQUcsT0FBTyxDQUFDO1FBQ2xCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0UsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0UsR0FBRztnQkFDQyxFQUFFLElBQUksRUFBRTtvQkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDckQsQ0FBQyxDQUFDLEtBQUs7d0JBQ1AsQ0FBQyxDQUFDLFFBQVE7b0JBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7d0JBQ3ZELENBQUMsQ0FBQyxNQUFNO3dCQUNSLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDeEIsQ0FBQztRQUVELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxJQUFJLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsSUFBSSxrQkFBa0IsRUFBdUIsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLE1BQWMsQ0FBQztRQUVuQixJQUFJLGtCQUFrQixLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sR0FBRyxZQUFZLENBQUM7UUFDMUIsQ0FBQzthQUFNLElBQUksa0JBQWtCLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDdEMsTUFBTSxlQUFlLEdBQUcsR0FBRyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxDQUFDO1lBQzFELDJFQUEyRTtZQUMzRSxNQUFNLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUMvRixDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUN4QyxNQUFNLFNBQVMsR0FDWCxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxRQUFRO2dCQUM3QixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZTtnQkFDcEMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQztZQUM1QyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFFaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO1FBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEVBQWU7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssc0JBQXNCLENBQUMsSUFBb0I7UUFDL0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUM3QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFdBQVc7UUFDZixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBELElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsRUFBZTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyx3QkFBd0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQzt3R0F2akJRLHlCQUF5Qjs0RkFBekIseUJBQXlCLCtFQ2pGdEMsbzhCQW1DQSw0Q0Q0Q2MsT0FBTzs7NEZBRVIseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNJLHFCQUFxQixjQUVuQixJQUFJLFdBQ1AsQ0FBQyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIENvbXBvbmVudFJlZixcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgaW5qZWN0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvY3VzVHJhcCwgRm9jdXNUcmFwRmFjdG9yeSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uLCBPdmVybGF5LCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTcG90bGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi9zcG90bGlnaHQuY29tcG9uZW50JztcbmltcG9ydCB7IFNwb3RsaWdodFRvdXJTZXJ2aWNlIH0gZnJvbSAnLi4vc3BvdGxpZ2h0LXRvdXIuc2VydmljZSc7XG5pbXBvcnQgeyBTcG90bGlnaHRQb3NpdGlvbiB9IGZyb20gJy4uL3R5cGVzL3Nwb3RsaWdodC1wb3NpdGlvbic7XG5pbXBvcnQgeyBTcG90bGlnaHRTdGVwIH0gZnJvbSAnLi4vdHlwZXMvc3BvdGxpZ2h0LXN0ZXAnO1xuaW1wb3J0IHsgU3RhYmlsaXplSGFuZGxlLCB3YWl0Rm9yU3RhYmxlUmVjdCB9IGZyb20gJy4vcmVjdC1zdGFiaWxpdHknO1xuXG5jb25zdCBQT1BPVkVSX1dJRFRIID0gMzQyO1xuY29uc3QgU1BPVExJR0hUX1BBRERJTkcgPSA4O1xuY29uc3QgQVJST1dfSEFMRl9TSVpFID0gODtcbmNvbnN0IEFSUk9XX09GRlNFVF9NSU4gPSA0O1xuY29uc3QgQVJST1dfT0ZGU0VUX01BWCA9IFBPUE9WRVJfV0lEVEggLSA0IC0gMTY7XG5jb25zdCBNQVNLX0JHID0gJ3JnYmEoMCwwLDAsMC41KSc7XG5jb25zdCBNQVNLX1RSQU5TSVRJT04gPSAnYWxsIDAuMnMgZWFzZSc7XG5jb25zdCBPVkVSTEFZX1ogPSAnMTAwMDAnO1xuY29uc3QgUE9QT1ZFUl9aID0gJzEwMDAxJztcbi8qKiBUZW1wbyBtw6F4aW1vIGRlIGVzcGVyYSBwZWxvIHJlZ2lzdHJvIGRvIGVsZW1lbnRvLWFsdm8gKGV4OiBjcmlhZG8gZGluYW1pY2FtZW50ZSBkZW50cm8gZGUgYGJlZm9yZU5leHRgKSBhbnRlcyBkZSByZWNvcnJlciBhbyBwb3BvdmVyIGNlbnRyYWxpemFkby4gKi9cbmNvbnN0IEVMRU1FTlRfV0FJVF9USU1FT1VUX01TID0gNTAwO1xuXG5mdW5jdGlvbiB0b0Nvbm5lY3RlZFBvc2l0aW9ucyhwb3NpdGlvbjogU3BvdGxpZ2h0UG9zaXRpb24pOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBbZGlyZWN0aW9uLCBhbGlnbm1lbnRdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgICBjb25zdCBwID0gU1BPVExJR0hUX1BBRERJTkcgKyAyO1xuICAgIGNvbnN0IGhBbGlnbiA9IGFsaWdubWVudCBhcyAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgICBjb25zdCB2QWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJz4gPSB7IHN0YXJ0OiAndG9wJywgY2VudGVyOiAnY2VudGVyJywgZW5kOiAnYm90dG9tJyB9O1xuICAgIGNvbnN0IHZBbGlnbiA9IHZBbGlnbk1hcFthbGlnbm1lbnRdID8/ICdjZW50ZXInO1xuXG4gICAgbGV0IHByaW1hcnk6IENvbm5lY3RlZFBvc2l0aW9uO1xuICAgIGxldCBvcHBvc2l0ZTogQ29ubmVjdGVkUG9zaXRpb247XG5cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgcHJpbWFyeSA9IHsgb3JpZ2luWDogaEFsaWduLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6IGhBbGlnbiwgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtcCB9O1xuICAgICAgICAgICAgb3Bwb3NpdGUgPSB7IG9yaWdpblg6IGhBbGlnbiwgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiBoQWxpZ24sIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHByaW1hcnkgPSB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogdkFsaWduLCBvZmZzZXRYOiBwIH07XG4gICAgICAgICAgICBvcHBvc2l0ZSA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiB2QWxpZ24sIG9mZnNldFg6IC1wIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogLXAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vICdib3R0b20nXG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IHAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHJpbWFyeSxcbiAgICAgICAgb3Bwb3NpdGUsXG4gICAgICAgIHsgb3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiBwIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiAtcCB9LFxuICAgIF07XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zcG90bGlnaHQtb3ZlcmxheScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ1N0eWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvdXJTZXJ2aWNlID0gaW5qZWN0KFNwb3RsaWdodFRvdXJTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjZGtPdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvY3VzVHJhcEZhY3RvcnkgPSBpbmplY3QoRm9jdXNUcmFwRmFjdG9yeSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgaXNBY3RpdmUgPSB0aGlzLnRvdXJTZXJ2aWNlLmlzQWN0aXZlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBjdXJyZW50U3RlcCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudFN0ZXA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGN1cnJlbnRJbmRleCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudEluZGV4O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSB0b3RhbFN0ZXBzID0gdGhpcy50b3VyU2VydmljZS50b3RhbFN0ZXBzO1xuXG4gICAgLyoqIEBpbnRlcm5hbCovXG4gICAgcmVhZG9ubHkgdGFyZ2V0UmVjdCA9IHNpZ25hbDxET01SZWN0IHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sYSBzZSBhIG3DoXNjYXJhIGRldmUgYW5pbWFyIGEgdHJhbnNpw6fDo28gZW50cmUgcmV0w6JuZ3Vsb3MgKHJlcG9zaWNpb25hbWVudG9cbiAgICAgKiBlbSB2aXZvLCBleDogc2Nyb2xsL3Jlc2l6ZSkgb3Ugc2FsdGFyIGluc3RhbnRhbmVhbWVudGUgKGNoZWdhZGEvc2HDrWRhIGRlIHVtIHBhc3NvKS5cbiAgICAgKiBWZXIgYHNldFRhcmdldFJlY3RJbW1lZGlhdGVgLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFza1RyYW5zaXRpb25FbmFibGVkID0gc2lnbmFsKHRydWUpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXNrVHJhbnNpdGlvblN0eWxlID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbkVuYWJsZWQoKSA/IE1BU0tfVFJBTlNJVElPTiA6ICdub25lJyxcbiAgICApO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IHRvcE1hc2tTdHlsZSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuICAgICAgICBjb25zdCBiYXNlID0ge1xuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IE1BU0tfQkcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLm1hc2tUcmFuc2l0aW9uU3R5bGUoKSxcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGJvdHRvbTogJzAnIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBTUE9UTElHSFRfUEFERElORyk7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGhlaWdodDogYCR7dG9wfXB4YCB9O1xuICAgIH0pO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGxlZnRNYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcCA9IFNQT1RMSUdIVF9QQURESU5HO1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCAtIHApO1xuICAgICAgICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgcCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heCgwLCByZWN0LmxlZnQgLSBwKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IE1BU0tfQkcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLm1hc2tUcmFuc2l0aW9uU3R5bGUoKSxcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgd2lkdGg6IGAke2xlZnR9cHhgLFxuICAgICAgICAgICAgaGVpZ2h0OiBgJHtib3R0b20gLSB0b3B9cHhgLFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IHJpZ2h0TWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG5cbiAgICAgICAgaWYgKCFyZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHAgPSBTUE9UTElHSFRfUEFERElORztcbiAgICAgICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBwKTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSArIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCByZWN0LnJpZ2h0ICsgcCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgJ3otaW5kZXgnOiBPVkVSTEFZX1osXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5tYXNrVHJhbnNpdGlvblN0eWxlKCksXG4gICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgICAgICAgIGxlZnQ6IGAke3JpZ2h0fXB4YCxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICAgICAgICBoZWlnaHQ6IGAke2JvdHRvbSAtIHRvcH1weGAsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgYm90dG9tTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG5cbiAgICAgICAgaWYgKCFyZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHAgPSBTUE9UTElHSFRfUEFERElORztcbiAgICAgICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSArIHApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMubWFza1RyYW5zaXRpb25TdHlsZSgpLFxuICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0b3A6IGAke2JvdHRvbX1weGAsXG4gICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICByaWdodDogJzAnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgdHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiAoe1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICB9KSk7XG5cbiAgICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcG9wb3Zlck92ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHBvcG92ZXJDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTcG90bGlnaHRDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwb3BvdmVyU3ViczogQXJyYXk8eyB1bnN1YnNjcmliZSgpOiB2b2lkIH0+ID0gW107XG4gICAgcHJpdmF0ZSBmb2N1c1RyYXA6IEZvY3VzVHJhcCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcGVuZGluZ0Fycml2YWw6IFN0YWJpbGl6ZUhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZWxlbWVudFdhaXRUaW1lcklkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgc3RhYmlsaXplR2VuZXJhdGlvbiA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5jdXJyZW50U3RlcCksXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5pc0FjdGl2ZSksXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy50b3VyU2VydmljZS5yZWdpc3RyYXRpb25WZXJzaW9uKSxcbiAgICAgICAgXSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3N0ZXAsIGFjdGl2ZV0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsUGVuZGluZ0Fycml2YWwoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLnN0YWJpbGl6ZUdlbmVyYXRpb247XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN0ZXAgfHwgIWFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRhcmdldFJlY3RJbW1lZGlhdGUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMudG91clNlcnZpY2UuZ2V0RWxlbWVudChzdGVwLnN0ZXBJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luQXJyaXZhbFNlcXVlbmNlKGVsLm5hdGl2ZUVsZW1lbnQsIHN0ZXAsIGdlbmVyYXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXdhaXRFbGVtZW50UmVnaXN0cmF0aW9uKHN0ZXAsIGdlbmVyYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFndWFyZGEgbyBsYXlvdXQgZG8gZWxlbWVudG8tYWx2byBlc3RhYmlsaXphciAoZXg6IGFuaW1hw6fDo28gZGUgYWJlcnR1cmEgZGUgdW0gbWVudVxuICAgICAqIGRpc3BhcmFkYSBwZWxvIGBiZWZvcmVOZXh0YCBkbyBwYXNzbyBhbnRlcmlvcikgYW50ZXMgZGUgbWVkaXIgc3VhIHBvc2nDp8OjbyBkZWZpbml0aXZhXG4gICAgICogZSBwb3NpY2lvbmFyIGEgbcOhc2NhcmEvcG9wb3Zlci4gU3Vic3RpdHVpIGEgYW50aWdhIGVzcGVyYSBkZSB1bSDDum5pY28gZnJhbWUsIHF1ZVxuICAgICAqIGNhcHR1cmF2YSBvIHJldMOibmd1bG8gbm8gbWVpbyBkZSBhbmltYcOnw7VlcyBkZSB0ZXJjZWlyb3MgbmEgdGVsYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJlZ2luQXJyaXZhbFNlcXVlbmNlKHRhcmdldDogSFRNTEVsZW1lbnQsIHN0ZXA6IFNwb3RsaWdodFN0ZXAsIGdlbmVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gd2FpdEZvclN0YWJsZVJlY3QodGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Fycml2YWwgPSBoYW5kbGU7XG5cbiAgICAgICAgICAgIGhhbmRsZS5wcm9taXNlLnRoZW4oKHsgcmVjdCwgdGltZWRPdXQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5zdGFiaWxpemVHZW5lcmF0aW9uIHx8ICF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lZE91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBbU3BvdGxpZ2h0XSBPIGxheW91dCBkbyBlbGVtZW50byBkbyBwYXNzbyBcIiR7c3RlcC5zdGVwSWR9XCIgbsOjbyBlc3RhYmlsaXpvdSBhIHRlbXBvOyB1c2FuZG8gYSDDumx0aW1hIHBvc2nDp8OjbyBtZWRpZGEuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRhcmdldFJlY3RJbW1lZGlhdGUocmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZUVsZW1lbnQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheSh0YXJnZXQsIHN0ZXApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFndWFyZGEgYXTDqSBgRUxFTUVOVF9XQUlUX1RJTUVPVVRfTVNgIHBlbG8gcmVnaXN0cm8gZG8gZWxlbWVudG8tYWx2byB2aWFcbiAgICAgKiBgW3NTcG90bGlnaHRTdGVwXWAgKMO6dGlsIHF1YW5kbyBvIGBiZWZvcmVOZXh0YCBkbyBwYXNzbyBhbnRlcmlvciBjcmlhIG8gZWxlbWVudG9cbiAgICAgKiBkaW5hbWljYW1lbnRlLCBleDogYWJyaW5kbyB1bWEgYWJhKSBhbnRlcyBkZSByZWNvcnJlciBhbyBwb3BvdmVyIGNlbnRyYWxpemFkby5cbiAgICAgKiBNYW50w6ltIG8gw7psdGltbyBxdWFkcm8gcmVuZGVyaXphZG8gZHVyYW50ZSBhIGVzcGVyYSBwYXJhIGV2aXRhciB1bSBmbGFzaC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGF3YWl0RWxlbWVudFJlZ2lzdHJhdGlvbihzdGVwOiBTcG90bGlnaHRTdGVwLCBnZW5lcmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbGVtZW50V2FpdFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLnN0YWJpbGl6ZUdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgYFtTcG90bGlnaHRdIEVsZW1lbnRvIGRvIHBhc3NvIFwiJHtzdGVwLnN0ZXBJZH1cIiBuw6NvIGZvaSByZWdpc3RyYWRvIGEgdGVtcG87IGV4aWJpbmRvIHBvcG92ZXIgY2VudHJhbGl6YWRvIHNlbSBkZXN0YXF1ZS5gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUYXJnZXRSZWN0SW1tZWRpYXRlKG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXkobnVsbCwgc3RlcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgRUxFTUVOVF9XQUlUX1RJTUVPVVRfTVMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuY2VsUGVuZGluZ0Fycml2YWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVuZGluZ0Fycml2YWw/LmNhbmNlbCgpO1xuICAgICAgICB0aGlzLnBlbmRpbmdBcnJpdmFsID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50V2FpdFRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVsZW1lbnRXYWl0VGltZXJJZCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRXYWl0VGltZXJJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbE9wdHMgPSB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucztcblxuICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgc2Nyb2xsT3B0cylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnLCB7IHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25EaXNtaXNzKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbmNlbFBlbmRpbmdBcnJpdmFsKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveVBvcG92ZXJPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uTmV4dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3VyU2VydmljZS5uZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uUHJldmlvdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3VyU2VydmljZS5zdG9wKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uRGlzbWlzcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcblxuICAgICAgICBpZiAoIXN0ZXAgfHwgc3RlcC5kaXNtaXNzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7XG4gICAgICAgICAgICByZWFzb246IHRoaXMudG90YWxTdGVwcygpID09PSAxID8gJ2Rpc21pc3NlZCcgOiAnaW50ZXJydXB0ZWQnLFxuICAgICAgICAgICAgZG9Ob3RTaG93QWdhaW46IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBvcG92ZXJPdmVybGF5KHRhcmdldEVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHN0ZXA6IFNwb3RsaWdodFN0ZXApOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0YXJnZXRFbFxuICAgICAgICAgICAgPyB0aGlzLmNka092ZXJsYXlcbiAgICAgICAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0YXJnZXRFbClcbiAgICAgICAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKHRvQ29ubmVjdGVkUG9zaXRpb25zKHN0ZXAucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKSlcbiAgICAgICAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgLndpdGhQdXNoKHRydWUpXG4gICAgICAgICAgICAgICAgICAud2l0aFZpZXdwb3J0TWFyZ2luKDgpXG4gICAgICAgICAgICA6IHRoaXMuY2RrT3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLmNlbnRlckhvcml6b250YWxseSgpLmNlbnRlclZlcnRpY2FsbHkoKTtcblxuICAgICAgICBpZiAoIXRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSB0aGlzLmNka092ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRhcmdldEVsXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5jZGtPdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5jZGtPdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBQT1BPVkVSX1dJRFRILFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0UG9wb3ZlclpJbmRleCgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hQb3BvdmVyUG9ydGFsKHN0ZXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wb3ZlcklucHV0cyhzdGVwKTtcbiAgICAgICAgICAgIGlmICh0YXJnZXRFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRm9jdXNUcmFwUmVmb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRQb3BvdmVyWkluZGV4KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUuekluZGV4ID0gUE9QT1ZFUl9aO1xuXG4gICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmhvc3RFbGVtZW50O1xuXG4gICAgICAgIGlmIChob3N0ICE9PSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50KSB7XG4gICAgICAgICAgICBob3N0LnN0eWxlLnpJbmRleCA9IFBPUE9WRVJfWjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoUG9wb3ZlclBvcnRhbChzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBjb25zdCBwb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFNwb3RsaWdodENvbXBvbmVudCwgbnVsbCwgdGhpcy5lbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZiEuYXR0YWNoKHBvcnRhbCk7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wb3ZlcklucHV0cyhzdGVwKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVN5bmMoKTtcblxuICAgICAgICBpZiAodGhpcy50b3RhbFN0ZXBzKCkgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlVG91ck1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcG92ZXJTdWJzLnB1c2goXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UubmV4dC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvTm90U2hvd0FnYWluID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5pc0RvTm90U2hvd0FnYWluQ2hlY2tlZCgpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudG91clNlcnZpY2UubmV4dChkb05vdFNob3dBZ2Fpbik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5wcmV2aW91cy5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b3VyU2VydmljZS5wcmV2aW91cygpKSxcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5jbG9zZWQuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyU2VydmljZS5zdG9wKHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiB0aGlzLnRvdGFsU3RlcHMoKSA9PT0gMSA/ICdkaXNtaXNzZWQnIDogJ2ludGVycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZG9Ob3RTaG93QWdhaW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS51bmRlcnN0YW5kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG9Ob3RTaG93QWdhaW4gPSB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWY/Lmluc3RhbmNlLmlzRG9Ob3RTaG93QWdhaW5DaGVja2VkKCkgPz8gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyU2VydmljZS5zdG9wKHsgcmVhc29uOiAnY29tcGxldGVkJywgZG9Ob3RTaG93QWdhaW4gfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBvcG92ZXJJbnB1dHMoc3RlcDogU3BvdGxpZ2h0U3RlcCAmIHsgc2hvd0RvTm90U2hvd0FnYWluPzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZjtcblxuICAgICAgICBpZiAoIXJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVmLnNldElucHV0KCd0aXRsZScsIHN0ZXAudGl0bGUpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ21lc3NhZ2UnLCBzdGVwLm1lc3NhZ2UpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ3Bvc2l0aW9uJywgc3RlcC5wb3NpdGlvbiA/PyAnYm90dG9tLWNlbnRlcicpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ2N1cnJlbnRTdGVwJywgdGhpcy5jdXJyZW50SW5kZXgoKSArIDEpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ3RvdGFsU3RlcHMnLCB0aGlzLnRvdGFsU3RlcHMoKSk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnY29udGVudCcsIHN0ZXAuY29udGVudCA/PyBudWxsKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdhY3Rpb25zJywgc3RlcC5hY3Rpb25zID8/IFtdKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdzaG93RG9Ob3RTaG93QWdhaW4nLCBzdGVwLnNob3dEb05vdFNob3dBZ2FpbiA/PyB0cnVlKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdhcnJvd09mZnNldFB4JywgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY2hlZHVsZVN5bmMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLnN5bmNEaXJlY3Rpb25BbmRBcnJvdygpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVUb3VyTW9kZSgpOiB2b2lkIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZUVsID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYW5lRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZShwYW5lRWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgYSBzdGVwIGNoYW5nZSwgbW92ZXMgZm9jdXMgYmFjayB0byB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudCBpbnNpZGUgdGhlXG4gICAgICogcG9wb3ZlciBzbyB0aGUgdXNlciBkb2VzIG5vdCBsb3NlIGtleWJvYXJkIHBvc2l0aW9uLlxuICAgICAqIE5vLW9wIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGZvY3VzIHRyYXAgKHNpbXBsZSBzcG90bGlnaHQgbW9kZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzY2hlZHVsZUZvY3VzVHJhcFJlZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mb2N1c1RyYXApIHJldHVybjtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmZvY3VzVHJhcD8uZm9jdXNGaXJzdFRhYmJhYmxlRWxlbWVudCgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNEaXJlY3Rpb25BbmRBcnJvdygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmO1xuICAgICAgICBjb25zdCBwYW5lRWwgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudDtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuXG4gICAgICAgIGlmICghcmVmIHx8ICFwYW5lRWwgfHwgIXJlY3QpIHtcbiAgICAgICAgICAgIHJlZj8uc2V0SW5wdXQoJ2Fycm93T2Zmc2V0UHgnLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhbmUgPSBwYW5lRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRvbCA9IFNQT1RMSUdIVF9QQURESU5HICsgNDtcblxuICAgICAgICBsZXQgZGlyOiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcblxuICAgICAgICBpZiAocGFuZS50b3AgPj0gcmVjdC5ib3R0b20gLSB0b2wpIHtcbiAgICAgICAgICAgIGRpciA9ICdib3R0b20nO1xuICAgICAgICB9IGVsc2UgaWYgKHBhbmUuYm90dG9tIDw9IHJlY3QudG9wICsgdG9sKSB7XG4gICAgICAgICAgICBkaXIgPSAndG9wJztcbiAgICAgICAgfSBlbHNlIGlmIChwYW5lLmxlZnQgPj0gcmVjdC5yaWdodCAtIHRvbCkge1xuICAgICAgICAgICAgZGlyID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIGlmIChwYW5lLnJpZ2h0IDw9IHJlY3QubGVmdCArIHRvbCkge1xuICAgICAgICAgICAgZGlyID0gJ2xlZnQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZHkgPSBNYXRoLmFicyhwYW5lLnRvcCArIHBhbmUuaGVpZ2h0IC8gMiAtIChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMikpO1xuICAgICAgICAgICAgY29uc3QgZHggPSBNYXRoLmFicyhwYW5lLmxlZnQgKyBwYW5lLndpZHRoIC8gMiAtIChyZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMikpO1xuICAgICAgICAgICAgZGlyID1cbiAgICAgICAgICAgICAgICBkeSA+PSBkeFxuICAgICAgICAgICAgICAgICAgICA/IHBhbmUudG9wICsgcGFuZS5oZWlnaHQgLyAyIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RvcCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JvdHRvbSdcbiAgICAgICAgICAgICAgICAgICAgOiBwYW5lLmxlZnQgKyBwYW5lLndpZHRoIC8gMiA8IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyXG4gICAgICAgICAgICAgICAgICAgICAgPyAnbGVmdCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdyaWdodCc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXF1ZXN0ZWRBbGlnbm1lbnQgPSAodGhpcy5jdXJyZW50U3RlcCgpPy5wb3NpdGlvbiA/PyAnYm90dG9tLWNlbnRlcicpLnNwbGl0KCctJylbMV07XG4gICAgICAgIHJlZi5zZXRJbnB1dCgncG9zaXRpb24nLCBgJHtkaXJ9LSR7cmVxdWVzdGVkQWxpZ25tZW50fWAgYXMgU3BvdGxpZ2h0UG9zaXRpb24pO1xuXG4gICAgICAgIGNvbnN0IEFSUk9XX01BUkdJTiA9IDEyO1xuICAgICAgICBsZXQgb2Zmc2V0OiBudW1iZXI7XG5cbiAgICAgICAgaWYgKHJlcXVlc3RlZEFsaWdubWVudCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgb2Zmc2V0ID0gQVJST1dfTUFSR0lOO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZEFsaWdubWVudCA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmVydGljYWxBcnJvdyA9IGRpciA9PT0gJ2xlZnQnIHx8IGRpciA9PT0gJ3JpZ2h0JztcbiAgICAgICAgICAgIC8vIFNWRyBoZWlnaHQgaW4gZmxleC1jb2wgbGF5b3V0ID0gOHB4OyBTVkcgd2lkdGggaW4gZmxleC1yb3cgbGF5b3V0ID0gMTZweFxuICAgICAgICAgICAgb2Zmc2V0ID0gaXNWZXJ0aWNhbEFycm93ID8gcGFuZS5oZWlnaHQgLSBBUlJPV19NQVJHSU4gLSA4IDogcGFuZS53aWR0aCAtIEFSUk9XX01BUkdJTiAtIDE2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGd0WCA9IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyO1xuICAgICAgICAgICAgY29uc3QgdGd0WSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICAgICAgY29uc3QgcmF3T2Zmc2V0ID1cbiAgICAgICAgICAgICAgICBkaXIgPT09ICd0b3AnIHx8IGRpciA9PT0gJ2JvdHRvbSdcbiAgICAgICAgICAgICAgICAgICAgPyB0Z3RYIC0gcGFuZS5sZWZ0IC0gQVJST1dfSEFMRl9TSVpFXG4gICAgICAgICAgICAgICAgICAgIDogdGd0WSAtIHBhbmUudG9wIC0gQVJST1dfSEFMRl9TSVpFO1xuICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoQVJST1dfT0ZGU0VUX01JTiwgTWF0aC5taW4oQVJST1dfT0ZGU0VUX01BWCwgcmF3T2Zmc2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWYuc2V0SW5wdXQoJ2Fycm93T2Zmc2V0UHgnLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVBvcG92ZXJPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvcG92ZXJTdWJzLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMucG9wb3ZlclN1YnMgPSBbXTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcblxuICAgICAgICBpZiAodGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyT3ZlcmxheVJlZikge1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRhcmdldFJlY3QoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQoZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwbGljYSB1bSBub3ZvIGB0YXJnZXRSZWN0YCBzZW0gYW5pbWHDp8OjbyBkZSB0cmFuc2nDp8OjbyBuYSBtw6FzY2FyYSDigJQgdXNhZG8gYW9cbiAgICAgKiBjaGVnYXIvc2FsdGFyIHBhcmEgdW0gYWx2byBub3ZvLCBvbmRlIGFuaW1hciBhIHBhcnRpciBkYSBwb3Npw6fDo28gZG8gcGFzc29cbiAgICAgKiBhbnRlcmlvciBjcmlhcmlhIGEgZmFsc2EgaW1wcmVzc8OjbyBkZSBcImFwb250b3UgZXJyYWRvIGUgY29ycmlnaXUgZGVwb2lzXCIuXG4gICAgICogQSB0cmFuc2nDp8OjbyDDqSByZWFiaWxpdGFkYSBubyBmcmFtZSBzZWd1aW50ZSBwYXJhIHJlcG9zaWNpb25hbWVudG9zIGxlZ8OtdGltb3NcbiAgICAgKiAoc2Nyb2xsL3Jlc2l6ZSBkZSB1bSBhbHZvIGrDoSB2aXPDrXZlbCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRUYXJnZXRSZWN0SW1tZWRpYXRlKHJlY3Q6IERPTVJlY3QgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFza1RyYW5zaXRpb25FbmFibGVkLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQocmVjdCk7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLm1hc2tUcmFuc2l0aW9uRW5hYmxlZC5zZXQodHJ1ZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaFJlY3QoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICAgICAgaWYgKCFzdGVwIHx8ICF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbCA9IHRoaXMudG91clNlcnZpY2UuZ2V0RWxlbWVudChzdGVwLnN0ZXBJZCk7XG5cbiAgICAgICAgaWYgKGVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QoZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9ic2VydmVFbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy51cGRhdGVUYXJnZXRSZWN0KGVsKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiQGlmIChpc0FjdGl2ZSgpICYmIGN1cnJlbnRTdGVwKCk7IGFzIHN0ZXApIHtcbiAgICBAaWYgKHN0ZXAuc2hvd0JhY2tkcm9wICE9PSBmYWxzZSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0b3BNYXNrU3R5bGUoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EaXNtaXNzKClcIlxuICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgQGlmICh0YXJnZXRSZWN0KCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJsZWZ0TWFza1N0eWxlKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwicmlnaHRNYXNrU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJib3R0b21NYXNrU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBpZiAoc3RlcC5zaG93QmFja2Ryb3AgPT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoc3RlcC5kaXNtaXNzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwidHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUoKVwiPjwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ0cmFuc3BhcmVudEJsb2NrZXJTdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EaXNtaXNzKClcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICB9XG4gICAgfVxufVxuXG4iXX0=
|
|
@@ -82,6 +82,12 @@ class BignumberInputDirective extends NumericMaskDirective {
|
|
|
82
82
|
* @default true
|
|
83
83
|
*/
|
|
84
84
|
allowNegative = input(true);
|
|
85
|
+
/**
|
|
86
|
+
* Preserves this deprecated directive's legacy behavior: NumericMaskDirective now
|
|
87
|
+
* defaults to blocking decimal overflow while typing/pasting, but existing
|
|
88
|
+
* sBignumberInput consumers should not have their input behavior changed silently.
|
|
89
|
+
*/
|
|
90
|
+
blockDecimalOverflow = input(false);
|
|
85
91
|
/**
|
|
86
92
|
* @description Texto de placeholder exibido quando o campo está vazio.
|
|
87
93
|
*/
|
|
@@ -218,7 +224,7 @@ class BignumberInputDirective extends NumericMaskDirective {
|
|
|
218
224
|
this._lastAutoPlaceholder = autoPlaceholder;
|
|
219
225
|
}
|
|
220
226
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BignumberInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
221
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: BignumberInputDirective, isStandalone: true, selector: "input[sBignumberInput]", inputs: { precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandsSeparator: { classPropertyName: "thousandsSeparator", publicName: "thousandsSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null }, alignTo: { classPropertyName: "alignTo", publicName: "alignTo", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { minDecimalPlaces: "minDecimalPlacesChange", maxDecimalPlaces: "maxDecimalPlacesChange", decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange", placeholder: "placeholderChange", pasteRejected: "pasteRejected" }, host: { properties: { "attr.placeholder": "placeholder()", "attr.maxLength": "maxLength" } }, providers: [
|
|
227
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: BignumberInputDirective, isStandalone: true, selector: "input[sBignumberInput]", inputs: { precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandsSeparator: { classPropertyName: "thousandsSeparator", publicName: "thousandsSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null }, alignTo: { classPropertyName: "alignTo", publicName: "alignTo", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, blockDecimalOverflow: { classPropertyName: "blockDecimalOverflow", publicName: "blockDecimalOverflow", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { minDecimalPlaces: "minDecimalPlacesChange", maxDecimalPlaces: "maxDecimalPlacesChange", decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange", placeholder: "placeholderChange", pasteRejected: "pasteRejected" }, host: { properties: { "attr.placeholder": "placeholder()", "attr.maxLength": "maxLength" } }, providers: [
|
|
222
228
|
{
|
|
223
229
|
provide: NG_VALUE_ACCESSOR,
|
|
224
230
|
// NOSONAR - 'BignumberInputDirective' is deprecated.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-bignumber-input.mjs","sources":["../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.directive.ts","../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.module.ts","../../projects/angular-components/bignumber-input/src/seniorsistemas-angular-components-bignumber-input.ts"],"sourcesContent":["import { Directive, forwardRef, input, model, OnChanges, OnInit, output, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NG_VALUE_ACCESSOR, ValidationErrors } from '@angular/forms';\r\n\r\nimport { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';\r\n\r\n/**\r\n * @deprecated Este enum não tem mais efeito. O alinhamento do campo é sempre `'right'`.\r\n */\r\nexport enum BignumberAlignmentOption {\r\n RIGHT = 'right',\r\n LEFT = 'left',\r\n}\r\n\r\n/**\r\n * @deprecated Utilize a diretiva `BigNumberInput` ao invés desta.\r\n * @description Diretiva de máscara para campos de entrada de números de grande precisão,\r\n * adaptada do `CurrencyMaskDirective`. Permite configurar precisão, escala,\r\n * separadores decimais e de milhar de acordo com o locale da aplicação.\r\n *\r\n * @example\r\n * ```html\r\n * <input sBignumberInput [precision]=\"15\" [scale]=\"2\" [allowNegative]=\"false\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Directive({\r\n selector: 'input[sBignumberInput]',\r\n host: {\r\n '[attr.placeholder]': 'placeholder()',\r\n '[attr.maxLength]': 'maxLength',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n useExisting: forwardRef(() => BignumberInputDirective),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n})\r\nexport class BignumberInputDirective extends NumericMaskDirective implements OnInit, OnChanges {\r\n /**\r\n * @description Número total de dígitos significativos aceitos pelo campo (parte inteira + parte decimal).\r\n *\r\n * Durante a digitação, o campo limita fisicamente o número de caracteres via `maxLength`.\r\n * Ao colar um valor que ultrapasse o limite, o evento `pasteRejected` é emitido e a colagem é cancelada.\r\n * Após sair do campo (blur) ou ao submeter o formulário, se o valor ultrapassar `precision`,\r\n * o campo ficará inválido com o erro `exceedsPrecision: { precision, actual }`.\r\n *\r\n * @default 15\r\n */\r\n public precision = input(15);\r\n\r\n /**\r\n * @deprecated Use `minDecimalPlaces` e `maxDecimalPlaces` ao invés deste.\r\n * @description Número de casas decimais exibidas e aceitas pelo campo.\r\n * Quando informado, repassa o valor para `minDecimalPlaces` e `maxDecimalPlaces`.\r\n *\r\n * @default 0\r\n */\r\n public scale = input(0);\r\n\r\n /**\r\n * @description Número mínimo de casas decimais exibidas.\r\n *\r\n * @default 0\r\n */\r\n public override minDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Número máximo de casas decimais aceitas.\r\n *\r\n * @default 0\r\n */\r\n public override maxDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Separador decimal personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override decimalSeparator = model(',');\r\n\r\n /**\r\n * @deprecated Use `thousandSeparator` ao invés deste.\r\n * @description Separador de milhar personalizado. Recomenda-se migrar para `thousandSeparator`.\r\n */\r\n public thousandsSeparator = input<string | undefined>(undefined);\r\n\r\n /**\r\n * @description Separador de milhar personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override thousandSeparator = model('.');\r\n\r\n /**\r\n * @deprecated Este input não tem mais efeito e pode ser removido.\r\n * O alinhamento do campo é sempre `'right'`, conforme o comportamento padrão da máscara numérica.\r\n */\r\n public alignTo = input<'left' | 'right'>('right');\r\n\r\n /**\r\n * @description Permite a entrada de valores negativos.\r\n *\r\n * @default true\r\n */\r\n public override allowNegative = input(true);\r\n\r\n /**\r\n * @description Texto de placeholder exibido quando o campo está vazio.\r\n */\r\n public placeholder = model<string | undefined>(undefined);\r\n\r\n public maxLength?: number;\r\n\r\n /**\r\n * @description Emitido quando uma colagem (paste) é rejeitada pela validação do campo.\r\n * Emite a string colada que foi recusada.\r\n */\r\n public pasteRejected = output<string>();\r\n\r\n private _decimalSeparatorExplicit = false;\r\n private _thousandSeparatorExplicit = false;\r\n private _lastAutoPlaceholder: string | undefined;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.updatePlaceholder();\r\n }\r\n\r\n // ngOnChanges handles all signal writes reactively, avoiding the need for\r\n // effect() with allowSignalWrites. The decimalSeparator/thousandSeparator inputs\r\n // have truthy defaults, so ngOnChanges is necessary to distinguish \"parent bound this\"\r\n // from \"it's just the default value\".\r\n public override ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['decimalSeparator'] && this.decimalSeparator()) {\r\n this._decimalSeparatorExplicit = true;\r\n }\r\n if (changes['thousandSeparator'] && this.thousandSeparator()) {\r\n this._thousandSeparatorExplicit = true;\r\n }\r\n if (changes['thousandsSeparator']) {\r\n const val = this.thousandsSeparator();\r\n if (val !== undefined) {\r\n this._thousandSeparatorExplicit = true;\r\n this.thousandSeparator.set(val);\r\n }\r\n }\r\n if (changes['scale']) {\r\n this.minDecimalPlaces.set(this.scale());\r\n this.maxDecimalPlaces.set(this.scale());\r\n }\r\n if (\r\n changes['scale'] ||\r\n changes['decimalSeparator'] ||\r\n changes['thousandSeparator'] ||\r\n changes['thousandsSeparator'] ||\r\n changes['precision']\r\n ) {\r\n this.calculateMaxLength();\r\n }\r\n if (changes['scale'] || changes['decimalSeparator']) {\r\n this.updatePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Overrides base paste handler to add precision validation.\r\n * If the pasted value exceeds `precision` digits, the paste is rejected.\r\n */\r\n public override onPaste(event: ClipboardEvent): void {\r\n const pastedText = event.clipboardData?.getData('text') ?? '';\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const numericText = pastedText\r\n .replace(new RegExp(`\\\\${effectiveThousandSep}`, 'g'), '')\r\n .replace(this.decimalSeparator(), '.');\r\n const [intPart, decimalPart = ''] = numericText.split('.');\r\n const totalDigits = intPart.replace(/\\D/g, '').length + decimalPart.slice(0, this.scale()).length;\r\n\r\n if (totalDigits > this.precision()) {\r\n event.preventDefault();\r\n this.pasteRejected.emit(pastedText);\r\n return;\r\n }\r\n\r\n super.onPaste(event);\r\n }\r\n\r\n /**\r\n * Overrides locale-derived separators with explicitly set inputs, if provided.\r\n * If no explicit separator is set, the locale-derived value is used.\r\n */\r\n protected override updateSeparators(): void {\r\n const explicitDecimal = this._decimalSeparatorExplicit ? this.decimalSeparator() : undefined;\r\n const explicitThousand = this._thousandSeparatorExplicit\r\n ? (this.thousandsSeparator() ?? this.thousandSeparator())\r\n : undefined;\r\n\r\n super.updateSeparators();\r\n\r\n if (explicitDecimal !== undefined) {\r\n this.decimalSeparator.set(explicitDecimal);\r\n }\r\n if (explicitThousand !== undefined) {\r\n this.thousandSeparator.set(explicitThousand);\r\n }\r\n\r\n this.calculateMaxLength();\r\n this.updatePlaceholder();\r\n }\r\n\r\n /**\r\n * Overrides base validator to add precision validation.\r\n * If the total number of significant digits exceeds `precision`, returns an `exceedsPrecision` error.\r\n */\r\n public override validate(control: AbstractControl): ValidationErrors | null {\r\n const baseErrors = super.validate(control);\r\n\r\n if (!control.value || !this.precision()) {\r\n return baseErrors ?? null;\r\n }\r\n\r\n const numericStr = String(control.value).replace('-', '');\r\n const [intPart, decimalPart = ''] = numericStr.split('.');\r\n const totalDigits = intPart.length + decimalPart.length;\r\n\r\n if (totalDigits > this.precision()) {\r\n return {\r\n ...baseErrors,\r\n exceedsPrecision: {\r\n precision: this.precision(),\r\n actual: totalDigits,\r\n },\r\n };\r\n }\r\n\r\n return baseErrors ?? null;\r\n }\r\n\r\n /**\r\n * Responsible to calculate the field maximum length considering the separators.\r\n */\r\n private calculateMaxLength(): void {\r\n const decSepLength = this.decimalSeparator()?.length ?? 0;\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const thoSepLength = effectiveThousandSep?.length ?? 0;\r\n\r\n const DIGITS_GROUP_SIZE = 3;\r\n\r\n let maxLength = this.precision() + (this.scale() ? decSepLength : 0);\r\n maxLength +=\r\n Math.ceil((this.precision() - (this.scale() ? this.scale() : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;\r\n\r\n this.maxLength = maxLength;\r\n }\r\n\r\n private updatePlaceholder(): void {\r\n const scale = this.scale();\r\n const autoPlaceholder = scale ? `0${this.decimalSeparator()}${''.padEnd(scale, '0')}` : '0';\r\n\r\n if (this.placeholder() === undefined || this.placeholder() === this._lastAutoPlaceholder) {\r\n this.placeholder.set(autoPlaceholder);\r\n }\r\n\r\n this._lastAutoPlaceholder = autoPlaceholder;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n// NOSONAR - 'BignumberInputDirective' is deprecated.\r\nimport { BignumberInputDirective } from './bignumber-input.directive';\r\n\r\n@NgModule({\r\n imports: [BignumberInputDirective],\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n exports: [BignumberInputDirective],\r\n})\r\nexport class BignumberInputModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-bignumber-input.mjs","sources":["../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.directive.ts","../../projects/angular-components/bignumber-input/src/lib/bignumber-input/bignumber-input.module.ts","../../projects/angular-components/bignumber-input/src/seniorsistemas-angular-components-bignumber-input.ts"],"sourcesContent":["import { Directive, forwardRef, input, model, OnChanges, OnInit, output, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, NG_VALUE_ACCESSOR, ValidationErrors } from '@angular/forms';\r\n\r\nimport { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';\r\n\r\n/**\r\n * @deprecated Este enum não tem mais efeito. O alinhamento do campo é sempre `'right'`.\r\n */\r\nexport enum BignumberAlignmentOption {\r\n RIGHT = 'right',\r\n LEFT = 'left',\r\n}\r\n\r\n/**\r\n * @deprecated Utilize a diretiva `BigNumberInput` ao invés desta.\r\n * @description Diretiva de máscara para campos de entrada de números de grande precisão,\r\n * adaptada do `CurrencyMaskDirective`. Permite configurar precisão, escala,\r\n * separadores decimais e de milhar de acordo com o locale da aplicação.\r\n *\r\n * @example\r\n * ```html\r\n * <input sBignumberInput [precision]=\"15\" [scale]=\"2\" [allowNegative]=\"false\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Directive({\r\n selector: 'input[sBignumberInput]',\r\n host: {\r\n '[attr.placeholder]': 'placeholder()',\r\n '[attr.maxLength]': 'maxLength',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n useExisting: forwardRef(() => BignumberInputDirective),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n})\r\nexport class BignumberInputDirective extends NumericMaskDirective implements OnInit, OnChanges {\r\n /**\r\n * @description Número total de dígitos significativos aceitos pelo campo (parte inteira + parte decimal).\r\n *\r\n * Durante a digitação, o campo limita fisicamente o número de caracteres via `maxLength`.\r\n * Ao colar um valor que ultrapasse o limite, o evento `pasteRejected` é emitido e a colagem é cancelada.\r\n * Após sair do campo (blur) ou ao submeter o formulário, se o valor ultrapassar `precision`,\r\n * o campo ficará inválido com o erro `exceedsPrecision: { precision, actual }`.\r\n *\r\n * @default 15\r\n */\r\n public precision = input(15);\r\n\r\n /**\r\n * @deprecated Use `minDecimalPlaces` e `maxDecimalPlaces` ao invés deste.\r\n * @description Número de casas decimais exibidas e aceitas pelo campo.\r\n * Quando informado, repassa o valor para `minDecimalPlaces` e `maxDecimalPlaces`.\r\n *\r\n * @default 0\r\n */\r\n public scale = input(0);\r\n\r\n /**\r\n * @description Número mínimo de casas decimais exibidas.\r\n *\r\n * @default 0\r\n */\r\n public override minDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Número máximo de casas decimais aceitas.\r\n *\r\n * @default 0\r\n */\r\n public override maxDecimalPlaces = model(0);\r\n\r\n /**\r\n * @description Separador decimal personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override decimalSeparator = model(',');\r\n\r\n /**\r\n * @deprecated Use `thousandSeparator` ao invés deste.\r\n * @description Separador de milhar personalizado. Recomenda-se migrar para `thousandSeparator`.\r\n */\r\n public thousandsSeparator = input<string | undefined>(undefined);\r\n\r\n /**\r\n * @description Separador de milhar personalizado. Quando não informado,\r\n * utiliza o separador definido pelo locale ativo da aplicação.\r\n */\r\n public override thousandSeparator = model('.');\r\n\r\n /**\r\n * @deprecated Este input não tem mais efeito e pode ser removido.\r\n * O alinhamento do campo é sempre `'right'`, conforme o comportamento padrão da máscara numérica.\r\n */\r\n public alignTo = input<'left' | 'right'>('right');\r\n\r\n /**\r\n * @description Permite a entrada de valores negativos.\r\n *\r\n * @default true\r\n */\r\n public override allowNegative = input(true);\r\n\r\n /**\r\n * Preserves this deprecated directive's legacy behavior: NumericMaskDirective now\r\n * defaults to blocking decimal overflow while typing/pasting, but existing\r\n * sBignumberInput consumers should not have their input behavior changed silently.\r\n */\r\n public override blockDecimalOverflow = input(false);\r\n\r\n /**\r\n * @description Texto de placeholder exibido quando o campo está vazio.\r\n */\r\n public placeholder = model<string | undefined>(undefined);\r\n\r\n public maxLength?: number;\r\n\r\n /**\r\n * @description Emitido quando uma colagem (paste) é rejeitada pela validação do campo.\r\n * Emite a string colada que foi recusada.\r\n */\r\n public pasteRejected = output<string>();\r\n\r\n private _decimalSeparatorExplicit = false;\r\n private _thousandSeparatorExplicit = false;\r\n private _lastAutoPlaceholder: string | undefined;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.updatePlaceholder();\r\n }\r\n\r\n // ngOnChanges handles all signal writes reactively, avoiding the need for\r\n // effect() with allowSignalWrites. The decimalSeparator/thousandSeparator inputs\r\n // have truthy defaults, so ngOnChanges is necessary to distinguish \"parent bound this\"\r\n // from \"it's just the default value\".\r\n public override ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['decimalSeparator'] && this.decimalSeparator()) {\r\n this._decimalSeparatorExplicit = true;\r\n }\r\n if (changes['thousandSeparator'] && this.thousandSeparator()) {\r\n this._thousandSeparatorExplicit = true;\r\n }\r\n if (changes['thousandsSeparator']) {\r\n const val = this.thousandsSeparator();\r\n if (val !== undefined) {\r\n this._thousandSeparatorExplicit = true;\r\n this.thousandSeparator.set(val);\r\n }\r\n }\r\n if (changes['scale']) {\r\n this.minDecimalPlaces.set(this.scale());\r\n this.maxDecimalPlaces.set(this.scale());\r\n }\r\n if (\r\n changes['scale'] ||\r\n changes['decimalSeparator'] ||\r\n changes['thousandSeparator'] ||\r\n changes['thousandsSeparator'] ||\r\n changes['precision']\r\n ) {\r\n this.calculateMaxLength();\r\n }\r\n if (changes['scale'] || changes['decimalSeparator']) {\r\n this.updatePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Overrides base paste handler to add precision validation.\r\n * If the pasted value exceeds `precision` digits, the paste is rejected.\r\n */\r\n public override onPaste(event: ClipboardEvent): void {\r\n const pastedText = event.clipboardData?.getData('text') ?? '';\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const numericText = pastedText\r\n .replace(new RegExp(`\\\\${effectiveThousandSep}`, 'g'), '')\r\n .replace(this.decimalSeparator(), '.');\r\n const [intPart, decimalPart = ''] = numericText.split('.');\r\n const totalDigits = intPart.replace(/\\D/g, '').length + decimalPart.slice(0, this.scale()).length;\r\n\r\n if (totalDigits > this.precision()) {\r\n event.preventDefault();\r\n this.pasteRejected.emit(pastedText);\r\n return;\r\n }\r\n\r\n super.onPaste(event);\r\n }\r\n\r\n /**\r\n * Overrides locale-derived separators with explicitly set inputs, if provided.\r\n * If no explicit separator is set, the locale-derived value is used.\r\n */\r\n protected override updateSeparators(): void {\r\n const explicitDecimal = this._decimalSeparatorExplicit ? this.decimalSeparator() : undefined;\r\n const explicitThousand = this._thousandSeparatorExplicit\r\n ? (this.thousandsSeparator() ?? this.thousandSeparator())\r\n : undefined;\r\n\r\n super.updateSeparators();\r\n\r\n if (explicitDecimal !== undefined) {\r\n this.decimalSeparator.set(explicitDecimal);\r\n }\r\n if (explicitThousand !== undefined) {\r\n this.thousandSeparator.set(explicitThousand);\r\n }\r\n\r\n this.calculateMaxLength();\r\n this.updatePlaceholder();\r\n }\r\n\r\n /**\r\n * Overrides base validator to add precision validation.\r\n * If the total number of significant digits exceeds `precision`, returns an `exceedsPrecision` error.\r\n */\r\n public override validate(control: AbstractControl): ValidationErrors | null {\r\n const baseErrors = super.validate(control);\r\n\r\n if (!control.value || !this.precision()) {\r\n return baseErrors ?? null;\r\n }\r\n\r\n const numericStr = String(control.value).replace('-', '');\r\n const [intPart, decimalPart = ''] = numericStr.split('.');\r\n const totalDigits = intPart.length + decimalPart.length;\r\n\r\n if (totalDigits > this.precision()) {\r\n return {\r\n ...baseErrors,\r\n exceedsPrecision: {\r\n precision: this.precision(),\r\n actual: totalDigits,\r\n },\r\n };\r\n }\r\n\r\n return baseErrors ?? null;\r\n }\r\n\r\n /**\r\n * Responsible to calculate the field maximum length considering the separators.\r\n */\r\n private calculateMaxLength(): void {\r\n const decSepLength = this.decimalSeparator()?.length ?? 0;\r\n const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();\r\n const thoSepLength = effectiveThousandSep?.length ?? 0;\r\n\r\n const DIGITS_GROUP_SIZE = 3;\r\n\r\n let maxLength = this.precision() + (this.scale() ? decSepLength : 0);\r\n maxLength +=\r\n Math.ceil((this.precision() - (this.scale() ? this.scale() : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;\r\n\r\n this.maxLength = maxLength;\r\n }\r\n\r\n private updatePlaceholder(): void {\r\n const scale = this.scale();\r\n const autoPlaceholder = scale ? `0${this.decimalSeparator()}${''.padEnd(scale, '0')}` : '0';\r\n\r\n if (this.placeholder() === undefined || this.placeholder() === this._lastAutoPlaceholder) {\r\n this.placeholder.set(autoPlaceholder);\r\n }\r\n\r\n this._lastAutoPlaceholder = autoPlaceholder;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\n// NOSONAR - 'BignumberInputDirective' is deprecated.\r\nimport { BignumberInputDirective } from './bignumber-input.directive';\r\n\r\n@NgModule({\r\n imports: [BignumberInputDirective],\r\n // NOSONAR - 'BignumberInputDirective' is deprecated.\r\n exports: [BignumberInputDirective],\r\n})\r\nexport class BignumberInputModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|