@seniorsistemas/angular-components 19.3.4 → 19.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,13 +1,19 @@
1
- import { ChangeDetectorRef, Component, ContentChildren, EventEmitter, Input, Output, inject } from '@angular/core';
2
- import { pipe } from 'rxjs';
3
- import { randomHash } from '@seniorsistemas/angular-components/utils';
1
+ import { DragDropModule } from '@angular/cdk/drag-drop';
2
+ import { NgTemplateOutlet } from '@angular/common';
3
+ import { ChangeDetectorRef, Component, ContentChildren, DestroyRef, EventEmitter, inject, input, Input, output, Output, signal, } from '@angular/core';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { FormsModule } from '@angular/forms';
6
+ import { TranslateModule } from '@ngx-translate/core';
7
+ import { ButtonComponent } from '@seniorsistemas/angular-components/button';
8
+ import { LoadingStateIndicators, LoadingStateModule } from '@seniorsistemas/angular-components/loading-state';
4
9
  import { TemplateDirective } from '@seniorsistemas/angular-components/template';
10
+ import { randomHash } from '@seniorsistemas/angular-components/utils';
11
+ import { debounceTime, distinctUntilChanged, pipe, Subject, switchMap, tap } from 'rxjs';
5
12
  import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
13
+ import * as i1 from "@ngx-translate/core";
7
14
  import * as i2 from "@angular/cdk/drag-drop";
8
15
  import * as i3 from "@angular/forms";
9
- import * as i4 from "@seniorsistemas/angular-components/button";
10
- import * as i5 from "@ngx-translate/core";
16
+ import * as i4 from "@seniorsistemas/angular-components/loading-state";
11
17
  /**
12
18
  * @description Componente de lista de dupla seleção (picklist) com suporte a
13
19
  * arrastar e soltar, filtro, checkboxes e template customizável para cada item.
@@ -49,6 +55,18 @@ export class PicklistComponent {
49
55
  showCheckbox = false;
50
56
  /** @description Propriedade usada para filtrar os itens das listas. @default '' */
51
57
  filterBy = '';
58
+ /** @description Habilita o carregamento preguiçoso (lazy load) para as listas. @default false */
59
+ lazyLoad = input(false);
60
+ /** @description Número de linhas a serem exibidas por página caso o lazyLoad esteja habilitado. @default 10 */
61
+ rows = input(10);
62
+ /** @description Função loader para a lista de disponíveis (to-select). Quando fornecida, o componente gerencia internamente paginação, loading e race conditions. */
63
+ sourceLoader = input();
64
+ /** @description Função loader para a lista de selecionados (selected). Quando fornecida, o componente gerencia internamente paginação, loading e race conditions. */
65
+ targetLoader = input();
66
+ _loadingTarget = signal(false);
67
+ _loadingSource = signal(false);
68
+ /** @description Emitido quando um item é movido entre as listas e o lazy load está habilitado. */
69
+ nodeMoved = output();
52
70
  /** @description Emitido quando a lista de selecionados muda. */
53
71
  selectedItensChange = new EventEmitter();
54
72
  /** @description Emitido quando a lista de disponíveis muda. */
@@ -57,17 +75,29 @@ export class PicklistComponent {
57
75
  selectedItensFilter = '';
58
76
  itemToSelectTemplate = null;
59
77
  itemSelectedTemplate = null;
78
+ logoIndicator = LoadingStateIndicators.Logo;
60
79
  itensToSelectFilterUtil = {
80
+ allItensSelected: false,
61
81
  rawItensToSelect: [],
62
82
  filteredItensToSelect: [],
63
83
  };
64
84
  selectedItensFilterUtil = {
85
+ allItensSelected: false,
65
86
  rawSelectedItens: [],
66
87
  filteredSelectedItens: [],
67
88
  };
68
89
  selectedItensMap = new Set();
69
90
  itensToSelectId = randomHash('itensToSelect');
70
91
  selectedItensId = randomHash('selectedItens');
92
+ destroyRef = inject(DestroyRef);
93
+ sourceFilterSubject = new Subject();
94
+ targetFilterSubject = new Subject();
95
+ sourceLoadSubject = new Subject();
96
+ targetLoadSubject = new Subject();
97
+ _internalTotalSource = 0;
98
+ _internalTotalTarget = 0;
99
+ sourceCurrentPage = 0;
100
+ targetCurrentPage = 0;
71
101
  _logErrorTemplate = true;
72
102
  templates = null;
73
103
  ngAfterViewInit() {
@@ -83,19 +113,48 @@ export class PicklistComponent {
83
113
  }
84
114
  this.cdr.detectChanges();
85
115
  }
116
+ ngOnInit() {
117
+ this.setupLoaderPipelines();
118
+ this.setupLazyLoadEvents();
119
+ this.setupFilterDebounce();
120
+ }
86
121
  ngOnChanges(changes) {
87
- if (changes['itensToSelect']?.firstChange) {
122
+ const changedItensToSelect = changes['itensToSelect'];
123
+ const changedSelectedItens = changes['selectedItens'];
124
+ if (changedItensToSelect && !this.lazyLoad()) {
88
125
  this.itensToSelectFilterUtil = {
126
+ allItensSelected: this.itensToSelectFilterUtil.allItensSelected || false,
89
127
  rawItensToSelect: this.itensToSelect,
90
128
  filteredItensToSelect: this.itensToSelect,
91
129
  };
92
130
  }
93
- if (changes['selectedItens']?.firstChange) {
131
+ else if (changedItensToSelect && this.lazyLoad()) {
132
+ this.itensToSelectFilterUtil.rawItensToSelect = [
133
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
134
+ ...this.itensToSelect,
135
+ ];
136
+ if (this.itensToSelectFilterUtil.allItensSelected) {
137
+ this._checkAllSelectedItensChange(this.itensToSelectFilterUtil.allItensSelected, this.itensToSelectFilterUtil.rawItensToSelect, this.itensToSelectId);
138
+ }
139
+ this.itensToSelectFilterUtil.filteredItensToSelect = [...this.itensToSelectFilterUtil.rawItensToSelect];
140
+ }
141
+ if (changedSelectedItens && !this.lazyLoad()) {
94
142
  this.selectedItensFilterUtil = {
143
+ allItensSelected: this.selectedItensFilterUtil.allItensSelected || false,
95
144
  filteredSelectedItens: this.selectedItens,
96
145
  rawSelectedItens: this.selectedItens,
97
146
  };
98
147
  }
148
+ else if (changedSelectedItens && this.lazyLoad()) {
149
+ this.selectedItensFilterUtil.rawSelectedItens = [
150
+ ...this.selectedItensFilterUtil.rawSelectedItens,
151
+ ...this.selectedItens,
152
+ ];
153
+ if (this.selectedItensFilterUtil.allItensSelected) {
154
+ this._checkAllSelectedItensChange(this.selectedItensFilterUtil.allItensSelected, this.selectedItensFilterUtil.rawSelectedItens, this.selectedItensId);
155
+ }
156
+ this.selectedItensFilterUtil.filteredSelectedItens = [...this.selectedItensFilterUtil.rawSelectedItens];
157
+ }
99
158
  }
100
159
  toggleSelected(internalPicklistItem, containerListId) {
101
160
  if (internalPicklistItem.disabled) {
@@ -109,6 +168,16 @@ export class PicklistComponent {
109
168
  else {
110
169
  this.selectedItensMap.delete(internalPicklistItem);
111
170
  }
171
+ const containerFilterUtil = containerListId === this.selectedItensId ? this.selectedItensFilterUtil : this.itensToSelectFilterUtil;
172
+ const isAllSelected = this._checkAllSelectedByList(containerListId === this.selectedItensId
173
+ ? this.selectedItensFilterUtil.filteredSelectedItens
174
+ : this.itensToSelectFilterUtil.filteredItensToSelect);
175
+ if (this.lazyLoad() && !internalPicklistItem.selected && containerFilterUtil.allItensSelected) {
176
+ containerFilterUtil.allItensSelected = false;
177
+ }
178
+ else if (this.lazyLoad() && isAllSelected && containerFilterUtil.allItensSelected !== isAllSelected) {
179
+ containerFilterUtil.allItensSelected = isAllSelected;
180
+ }
112
181
  this.cdr.detectChanges();
113
182
  }
114
183
  remove(all = false) {
@@ -116,16 +185,57 @@ export class PicklistComponent {
116
185
  if (!itens.length) {
117
186
  return;
118
187
  }
119
- itens.forEach((itemRemove) => {
120
- this.itensToSelect.push(itemRemove);
121
- itemRemove.selected = false;
122
- this.selectedItensMap.delete(itemRemove);
188
+ const allElements = this.lazyLoad() ? [] : this.selectedItensFilterUtil.rawSelectedItens;
189
+ const revertAction = () => {
190
+ this.selectedItensFilterUtil.rawSelectedItens = [
191
+ ...this.selectedItensFilterUtil.rawSelectedItens,
192
+ ...itens.map((i) => {
193
+ i.selected = false;
194
+ return i;
195
+ }),
196
+ ];
197
+ this.itensToSelectFilterUtil.rawItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect.filter((x) => !itens.includes(x));
198
+ this.selectedItensFilterUtil.allItensSelected = false;
199
+ if (this.lazyLoad()) {
200
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
201
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
202
+ }
203
+ else {
204
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
205
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
206
+ this.filterSelectedItens();
207
+ this.filterItensToSelect();
208
+ this.emitData();
209
+ }
210
+ this.cdr.detectChanges();
211
+ };
212
+ this.nodeMoved.emit({
213
+ direction: 'to-select',
214
+ items: all ? allElements : parseValueEmit(Array.from(this.selectedItensMap)),
215
+ moveAll: all,
216
+ revertAction,
123
217
  });
124
- this.selectedItens = this.selectedItens.filter((x) => !itens.includes(x));
125
- this.selectedItensFilterUtil.rawSelectedItens = this.selectedItens;
126
- this.filterSelectedItens();
127
- this.filterItensToSelect();
128
- this.emitData();
218
+ this.itensToSelectFilterUtil.rawItensToSelect = [
219
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
220
+ ...itens.map((itemRemove) => {
221
+ itemRemove.selected = false;
222
+ this.selectedItensMap.delete(itemRemove);
223
+ return itemRemove;
224
+ }),
225
+ ];
226
+ this.selectedItensFilterUtil.rawSelectedItens = this.selectedItensFilterUtil.rawSelectedItens.filter((x) => !itens.includes(x));
227
+ this.selectedItensFilterUtil.allItensSelected = false;
228
+ if (this.lazyLoad()) {
229
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
230
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
231
+ }
232
+ else {
233
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
234
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
235
+ this.filterSelectedItens();
236
+ this.filterItensToSelect();
237
+ this.emitData();
238
+ }
129
239
  this.cdr.detectChanges();
130
240
  }
131
241
  add(all = false) {
@@ -133,21 +243,67 @@ export class PicklistComponent {
133
243
  if (!itens.length) {
134
244
  return;
135
245
  }
136
- itens.forEach((itemRemove) => {
137
- this.selectedItens.push(itemRemove);
138
- itemRemove.selected = false;
139
- this.selectedItensMap.delete(itemRemove);
246
+ const allElements = this.lazyLoad() ? [] : this.itensToSelectFilterUtil.rawItensToSelect;
247
+ const revertAction = () => {
248
+ this.itensToSelectFilterUtil.rawItensToSelect = [
249
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
250
+ ...itens.map((i) => {
251
+ i.selected = false;
252
+ this.selectedItensMap.delete(i);
253
+ return i;
254
+ }),
255
+ ];
256
+ this.selectedItensFilterUtil.rawSelectedItens = this.selectedItensFilterUtil.rawSelectedItens.filter((x) => !itens.includes(x));
257
+ this.itensToSelectFilterUtil.allItensSelected = false;
258
+ if (this.lazyLoad()) {
259
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
260
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
261
+ }
262
+ else {
263
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
264
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
265
+ this.filterSelectedItens();
266
+ this.filterItensToSelect();
267
+ this.emitData();
268
+ }
269
+ this.cdr.detectChanges();
270
+ };
271
+ this.nodeMoved.emit({
272
+ direction: 'selected',
273
+ items: all ? allElements : parseValueEmit(Array.from(this.selectedItensMap)),
274
+ moveAll: all,
275
+ revertAction,
140
276
  });
141
- this.itensToSelect = this.itensToSelect.filter((x) => !itens.includes(x));
142
- this.itensToSelectFilterUtil.rawItensToSelect = this.itensToSelect;
143
- this.filterSelectedItens();
144
- this.filterItensToSelect();
145
- this.emitData();
277
+ this.selectedItensFilterUtil.rawSelectedItens = [
278
+ ...this.selectedItensFilterUtil.rawSelectedItens,
279
+ ...itens.map((itemRemove) => {
280
+ itemRemove.selected = false;
281
+ this.selectedItensMap.delete(itemRemove);
282
+ return itemRemove;
283
+ }),
284
+ ];
285
+ this.itensToSelectFilterUtil.rawItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect.filter((x) => !itens.includes(x));
286
+ this.itensToSelectFilterUtil.allItensSelected = false;
287
+ if (this.lazyLoad()) {
288
+ this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens;
289
+ this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
290
+ }
291
+ else {
292
+ this.selectedItens = this.selectedItensFilterUtil.rawSelectedItens;
293
+ this.itensToSelect = this.itensToSelectFilterUtil.rawItensToSelect;
294
+ this.filterSelectedItens();
295
+ this.filterItensToSelect();
296
+ this.emitData();
297
+ }
146
298
  this.cdr.detectChanges();
147
299
  }
148
300
  filterItensToSelect() {
149
- let searchTerm = this.availableItensFilter;
150
- searchTerm = searchTerm.trim();
301
+ if (this.lazyLoad()) {
302
+ this._loadingSource.set(true);
303
+ this.sourceFilterSubject.next(this.availableItensFilter);
304
+ return;
305
+ }
306
+ let searchTerm = this.availableItensFilter.trim();
151
307
  if (searchTerm) {
152
308
  this.itensToSelectFilterUtil.filteredItensToSelect = this.itensToSelectFilterUtil.rawItensToSelect.filter((item) => compareStrings(item.data[this.filterBy], searchTerm));
153
309
  }
@@ -157,8 +313,12 @@ export class PicklistComponent {
157
313
  this.cdr.detectChanges();
158
314
  }
159
315
  filterSelectedItens() {
160
- let searchTerm = this.selectedItensFilter;
161
- searchTerm = searchTerm.trim();
316
+ if (this.lazyLoad()) {
317
+ this._loadingTarget.set(true);
318
+ this.targetFilterSubject.next(this.selectedItensFilter);
319
+ return;
320
+ }
321
+ let searchTerm = this.selectedItensFilter.trim();
162
322
  if (searchTerm) {
163
323
  this.selectedItensFilterUtil.filteredSelectedItens = this.selectedItensFilterUtil.rawSelectedItens.filter((item) => compareStrings(item.data[this.filterBy], searchTerm));
164
324
  }
@@ -190,14 +350,30 @@ export class PicklistComponent {
190
350
  onDragRelease() {
191
351
  this.selectedItensMap.forEach((item) => (item.invisible = false));
192
352
  }
193
- checkAllAvailableItensChange(target) {
194
- const checked = target.checked;
353
+ checkAllAvailableItensChange(checked) {
195
354
  this._checkAllSelectedItensChange(checked, this.itensToSelectFilterUtil.filteredItensToSelect, this.itensToSelectId);
196
355
  }
197
- checkAllSelectedItensChange(target) {
198
- const checked = target.checked;
356
+ checkAllSelectedItensChange(checked) {
199
357
  this._checkAllSelectedItensChange(checked, this.selectedItensFilterUtil.filteredSelectedItens, this.selectedItensId);
200
358
  }
359
+ onScroll(event, listId) {
360
+ if (!this.lazyLoad()) {
361
+ return;
362
+ }
363
+ const element = event.target;
364
+ const reachLimit = element.offsetHeight + element.scrollTop >= element.scrollHeight;
365
+ if (!reachLimit) {
366
+ return;
367
+ }
368
+ const target = listId === this.selectedItensId ? 'selected' : 'to-select';
369
+ const targetReachLimit = target === 'selected'
370
+ ? this.selectedItensFilterUtil.filteredSelectedItens.length >= this._internalTotalTarget
371
+ : this.itensToSelectFilterUtil.filteredItensToSelect.length >= this._internalTotalSource;
372
+ if (targetReachLimit) {
373
+ return;
374
+ }
375
+ this.loadNextPage(target);
376
+ }
201
377
  get disableSelectedItensCheckbox() {
202
378
  return filterEnabled(this.selectedItensFilterUtil.filteredSelectedItens).length === 0;
203
379
  }
@@ -210,11 +386,69 @@ export class PicklistComponent {
210
386
  get selectedItensAllSelected() {
211
387
  return this._checkAllSelectedByList(this.selectedItensFilterUtil.filteredSelectedItens);
212
388
  }
213
- get canAddItens() {
214
- return this.itensToSelect.filter((x) => x?.selected).length > 0;
389
+ get hasSelectedItens() {
390
+ return this.selectedItensMap.size > 0;
391
+ }
392
+ /**
393
+ * @description Recarrega as listas após a confirmação de uma movimentação pelo backend.
394
+ *
395
+ * **Por que usar?**
396
+ * Ao mover itens, o componente atualiza a UI de forma otimista — os itens são movidos
397
+ * imediatamente antes da confirmação do servidor. Após o backend confirmar a operação,
398
+ * chame `resetList` para limpar e recarregar as listas afetadas do zero, garantindo que
399
+ * o estado da UI reflita os dados reais persistidos.
400
+ *
401
+ * **O que espera?**
402
+ * Recebe o objeto `PicklistItemMove<T>` emitido pelo output `(nodeMoved)`. O componente
403
+ * utiliza `node.direction` para determinar qual lista recarregar (a lista de destino da
404
+ * movimentação) e `node.moveAll` para verificar se a origem também deve ser recarregada
405
+ * (por exemplo, ao mover todos os itens de uma lista para outra, ambas ficam com estado
406
+ * alterado no backend).
407
+ *
408
+ * **O que faz?**
409
+ * - Reseta o contador de página da lista de destino para `0` (primeira página).
410
+ * - Limpa todos os itens carregados na lista de destino.
411
+ * - Dispara imediatamente o carregamento da primeira página via `sourceLoader`/`targetLoader`.
412
+ * - Se `node.moveAll === true`, repete o processo para a lista de origem.
413
+ *
414
+ * **Exemplo de uso:**
415
+ * ```typescript
416
+ * nodeMoved(node: PicklistItemMove<MyItem>): void {
417
+ * this.service.moveItems(node).subscribe({
418
+ * next: () => this.myPicklist().resetList(node),
419
+ * error: () => node.revertAction(),
420
+ * });
421
+ * }
422
+ * ```
423
+ *
424
+ * @param node - O objeto de movimentação emitido pelo output `(nodeMoved)`.
425
+ */
426
+ resetList(node) {
427
+ if (!this.lazyLoad()) {
428
+ return;
429
+ }
430
+ this._resetListByTarget(node.direction);
431
+ if (node.moveAll) {
432
+ this._resetListByTarget(node.direction === 'selected' ? 'to-select' : 'selected');
433
+ }
215
434
  }
216
- get canRemoveItens() {
217
- return this.selectedItens.filter((x) => x?.selected).length > 0;
435
+ _resetListByTarget(target) {
436
+ if (target === 'selected') {
437
+ this.targetCurrentPage = -1;
438
+ this._internalTotalTarget = 0;
439
+ this.selectedItens = [];
440
+ this.selectedItensFilterUtil.rawSelectedItens = [];
441
+ this.selectedItensFilterUtil.filteredSelectedItens = [];
442
+ }
443
+ else {
444
+ this.sourceCurrentPage = -1;
445
+ this._internalTotalSource = 0;
446
+ this.itensToSelect = [];
447
+ this.itensToSelectFilterUtil.rawItensToSelect = [];
448
+ this.itensToSelectFilterUtil.filteredItensToSelect = [];
449
+ }
450
+ this.cdr.detectChanges();
451
+ Promise.resolve().then(() => this.loadNextPage(target));
218
452
  }
219
453
  _checkAllSelectedByList(list) {
220
454
  const _listItens = filterEnabled(list);
@@ -225,12 +459,135 @@ export class PicklistComponent {
225
459
  return _listItens.every((x) => x.selected);
226
460
  }
227
461
  }
462
+ setupLoaderPipelines() {
463
+ if (!this.lazyLoad()) {
464
+ return;
465
+ }
466
+ if (!this.sourceLoader && !this.targetLoader && this._logErrorTemplate) {
467
+ console.error(`Lazy load is enabled but no loader function was provided. Please provide at least one loader function using 'sourceLoader' or 'targetLoader' input.`);
468
+ }
469
+ if (this.sourceLoader()) {
470
+ this.sourceLoadSubject
471
+ .pipe(switchMap((event) => {
472
+ this._loadingSource.set(true);
473
+ return this.sourceLoader()(event);
474
+ }), takeUntilDestroyed(this.destroyRef))
475
+ .subscribe(({ items, totalRecords }) => {
476
+ this._internalTotalSource = totalRecords;
477
+ this.itensToSelectFilterUtil.rawItensToSelect = [
478
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
479
+ ...items,
480
+ ];
481
+ if (this.itensToSelectFilterUtil.allItensSelected) {
482
+ this._checkAllSelectedItensChange(true, this.itensToSelectFilterUtil.rawItensToSelect, this.itensToSelectId);
483
+ }
484
+ this.itensToSelectFilterUtil.filteredItensToSelect = [
485
+ ...this.itensToSelectFilterUtil.rawItensToSelect,
486
+ ];
487
+ this._loadingSource.set(false);
488
+ this.cdr.detectChanges();
489
+ });
490
+ }
491
+ if (this.targetLoader()) {
492
+ this.targetLoadSubject
493
+ .pipe(switchMap((event) => {
494
+ this._loadingTarget.set(true);
495
+ return this.targetLoader()(event);
496
+ }), takeUntilDestroyed(this.destroyRef))
497
+ .subscribe(({ items, totalRecords }) => {
498
+ this._internalTotalTarget = totalRecords;
499
+ this.selectedItensFilterUtil.rawSelectedItens = [
500
+ ...this.selectedItensFilterUtil.rawSelectedItens,
501
+ ...items,
502
+ ];
503
+ if (this.selectedItensFilterUtil.allItensSelected) {
504
+ this._checkAllSelectedItensChange(true, this.selectedItensFilterUtil.rawSelectedItens, this.selectedItensId);
505
+ }
506
+ this.selectedItensFilterUtil.filteredSelectedItens = [
507
+ ...this.selectedItensFilterUtil.rawSelectedItens,
508
+ ];
509
+ this._loadingTarget.set(false);
510
+ this.cdr.detectChanges();
511
+ });
512
+ }
513
+ }
514
+ setupFilterDebounce() {
515
+ if (!this.lazyLoad()) {
516
+ return;
517
+ }
518
+ this.sourceFilterSubject
519
+ .pipe(distinctUntilChanged(), debounceTime(300), tap(() => {
520
+ this.sourceCurrentPage = -1;
521
+ this.itensToSelect = [];
522
+ this.itensToSelectFilterUtil.rawItensToSelect = [];
523
+ this.itensToSelectFilterUtil.filteredItensToSelect = [];
524
+ this.cdr.detectChanges();
525
+ }), switchMap(() => {
526
+ this.loadNextPage('to-select');
527
+ return [];
528
+ }), takeUntilDestroyed(this.destroyRef))
529
+ .subscribe();
530
+ this.targetFilterSubject
531
+ .pipe(distinctUntilChanged(), debounceTime(300), tap(() => {
532
+ this.targetCurrentPage = -1;
533
+ this.selectedItens = [];
534
+ this.selectedItensFilterUtil.rawSelectedItens = [];
535
+ this.selectedItensFilterUtil.filteredSelectedItens = [];
536
+ this.cdr.detectChanges();
537
+ }), switchMap(() => {
538
+ this.loadNextPage('selected');
539
+ return [];
540
+ }), takeUntilDestroyed(this.destroyRef))
541
+ .subscribe();
542
+ }
543
+ setupLazyLoadEvents() {
544
+ if (!this.lazyLoad()) {
545
+ return;
546
+ }
547
+ Promise.resolve().then(() => {
548
+ this.loadNextPage('to-select');
549
+ this.loadNextPage('selected');
550
+ });
551
+ }
552
+ loadNextPage(target) {
553
+ const totalRegisters = target === 'selected' ? this._internalTotalTarget : this._internalTotalSource;
554
+ const lastPage = Math.ceil(totalRegisters / this.rows());
555
+ if (target === 'selected' && this.targetCurrentPage < lastPage) {
556
+ this.targetCurrentPage++;
557
+ }
558
+ else if (target === 'to-select' && this.sourceCurrentPage < lastPage) {
559
+ this.sourceCurrentPage++;
560
+ }
561
+ this.emitCurrentPage(target);
562
+ }
563
+ emitCurrentPage(target) {
564
+ const filter = target === 'selected' ? this.selectedItensFilter : this.availableItensFilter;
565
+ const page = target === 'selected' ? this.targetCurrentPage : this.sourceCurrentPage;
566
+ const event = { target, page, filter, pageSize: this.rows() };
567
+ if (target === 'selected') {
568
+ this.targetLoadSubject.next(event);
569
+ }
570
+ else {
571
+ this.sourceLoadSubject.next(event);
572
+ }
573
+ }
228
574
  _checkAllSelectedItensChange(checked, list, listId) {
229
575
  this.unselectedItensByListId(listId === this.selectedItensId ? this.itensToSelectId : this.selectedItensId);
230
576
  filterEnabled(list).forEach((item) => {
231
577
  item.selected = checked;
232
- this.selectedItensMap.add(item);
578
+ if (checked) {
579
+ this.selectedItensMap.add(item);
580
+ }
581
+ else {
582
+ this.selectedItensMap.delete(item);
583
+ }
233
584
  });
585
+ if (listId === this.selectedItensId) {
586
+ this.selectedItensFilterUtil.allItensSelected = checked;
587
+ }
588
+ else {
589
+ this.itensToSelectFilterUtil.allItensSelected = checked;
590
+ }
234
591
  this.cdr.detectChanges();
235
592
  }
236
593
  unselectedItensByListId(listId) {
@@ -254,11 +611,11 @@ export class PicklistComponent {
254
611
  this.selectedItensChange.emit(parseValueEmit(this.selectedItens));
255
612
  }
256
613
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
257
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PicklistComponent, selector: "s-picklist", inputs: { itensToSelect: "itensToSelect", selectedItens: "selectedItens", availableItensLabel: "availableItensLabel", availableItensPlaceholder: "availableItensPlaceholder", addSelectedItensLabel: "addSelectedItensLabel", addAllItensLabel: "addAllItensLabel", selectedItensLabel: "selectedItensLabel", selectedItensPlaceholder: "selectedItensPlaceholder", removeSelectedItemsLabel: "removeSelectedItemsLabel", removeAllItemsLabel: "removeAllItemsLabel", showCheckbox: "showCheckbox", filterBy: "filterBy" }, outputs: { selectedItensChange: "selectedItensChange", itensToSelectChange: "itensToSelectChange" }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data, selected: item.selected, disabled: item.disabled }\"></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n>\n @if (showCheckbox) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($event.target)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy && showCheckbox) {\n <div class=\"picklist-filter\">\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!canAddItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n }\n \"\n ></ng-container>\n </ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n <div\n class=\"picklist-filter\"\n *ngIf=\"filterBy && showCheckbox\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: { disabled: disableSelectedItensCheckbox, checked: selectedItensAllSelected, changeFn: checkAllSelectedItensChange.bind(this) }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!canRemoveItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:55px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel"], outputs: ["clicked"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] });
614
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PicklistComponent, isStandalone: true, selector: "s-picklist", inputs: { itensToSelect: { classPropertyName: "itensToSelect", publicName: "itensToSelect", isSignal: false, isRequired: false, transformFunction: null }, selectedItens: { classPropertyName: "selectedItens", publicName: "selectedItens", isSignal: false, isRequired: false, transformFunction: null }, availableItensLabel: { classPropertyName: "availableItensLabel", publicName: "availableItensLabel", isSignal: false, isRequired: false, transformFunction: null }, availableItensPlaceholder: { classPropertyName: "availableItensPlaceholder", publicName: "availableItensPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, addSelectedItensLabel: { classPropertyName: "addSelectedItensLabel", publicName: "addSelectedItensLabel", isSignal: false, isRequired: false, transformFunction: null }, addAllItensLabel: { classPropertyName: "addAllItensLabel", publicName: "addAllItensLabel", isSignal: false, isRequired: false, transformFunction: null }, selectedItensLabel: { classPropertyName: "selectedItensLabel", publicName: "selectedItensLabel", isSignal: false, isRequired: false, transformFunction: null }, selectedItensPlaceholder: { classPropertyName: "selectedItensPlaceholder", publicName: "selectedItensPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, removeSelectedItemsLabel: { classPropertyName: "removeSelectedItemsLabel", publicName: "removeSelectedItemsLabel", isSignal: false, isRequired: false, transformFunction: null }, removeAllItemsLabel: { classPropertyName: "removeAllItemsLabel", publicName: "removeAllItemsLabel", isSignal: false, isRequired: false, transformFunction: null }, showCheckbox: { classPropertyName: "showCheckbox", publicName: "showCheckbox", isSignal: false, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: false, isRequired: false, transformFunction: null }, lazyLoad: { classPropertyName: "lazyLoad", publicName: "lazyLoad", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, sourceLoader: { classPropertyName: "sourceLoader", publicName: "sourceLoader", isSignal: true, isRequired: false, transformFunction: null }, targetLoader: { classPropertyName: "targetLoader", publicName: "targetLoader", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeMoved: "nodeMoved", selectedItensChange: "selectedItensChange", itensToSelectChange: "itensToSelectChange" }, queries: [{ propertyName: "templates", predicate: TemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n let-isLoading=\"isLoading\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n *sLoadingState=\"{ loading: isLoading, indicator: logoIndicator }\"\n (scroll)=\"onScroll($event, id)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: { item: item.data, selected: item.selected, disabled: item.disabled }\n \"\n ></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container\n *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"\n ></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n let-id=\"id\"\n>\n @if (showCheckbox && !lazyLoad()) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === itensToSelectId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"itensToSelectFilterUtil.allItensSelected\"\n (change)=\"checkAllAvailableItensChange($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === selectedItensId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"selectedItensFilterUtil.allItensSelected\"\n (change)=\"checkAllSelectedItensChange($any($event.target).checked)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"\n availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n isLoading: _loadingSource(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!hasSelectedItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"\n selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n isLoading: _loadingTarget(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!hasSelectedItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:100px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel"], outputs: ["clicked"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: LoadingStateModule }, { kind: "directive", type: i4.LoadingStateDirective, selector: "[sLoadingState]", inputs: ["sLoadingState"] }] });
258
615
  }
259
616
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PicklistComponent, decorators: [{
260
617
  type: Component,
261
- args: [{ selector: 's-picklist', template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data, selected: item.selected, disabled: item.disabled }\"></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n>\n @if (showCheckbox) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($event.target)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy && showCheckbox) {\n <div class=\"picklist-filter\">\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!canAddItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy) {\n <ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n }\n \"\n ></ng-container>\n </ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n <div\n class=\"picklist-filter\"\n *ngIf=\"filterBy && showCheckbox\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: { disabled: disableSelectedItensCheckbox, checked: selectedItensAllSelected, changeFn: checkAllSelectedItensChange.bind(this) }\n \"\n ></ng-container>\n @if (filterBy) {\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\"\n />\n }\n </div>\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!canRemoveItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:55px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"] }]
618
+ args: [{ standalone: true, imports: [TranslateModule, DragDropModule, FormsModule, ButtonComponent, NgTemplateOutlet, LoadingStateModule], selector: 's-picklist', template: "<ng-template\n #previewRender\n let-itens=\"itens\"\n let-template=\"template\"\n>\n <section class=\"picklist-items\">\n @for (item of itens; track $index) {\n <ng-container *ngTemplateOutlet=\"template; context: { item: item.data }\"></ng-container>\n }\n </section>\n</ng-template>\n\n<ng-template\n #picklistItensRender\n let-id=\"id\"\n let-itens=\"itens\"\n let-template=\"template\"\n let-listConnectedTo=\"listConnectedTo\"\n let-isLoading=\"isLoading\"\n>\n <div\n class=\"picklist-items\"\n cdkDropList\n [id]=\"id\"\n [cdkDropListSortingDisabled]=\"true\"\n [cdkDropListData]=\"itens\"\n [cdkDropListConnectedTo]=\"listConnectedTo\"\n (cdkDropListDropped)=\"drop($event)\"\n *sLoadingState=\"{ loading: isLoading, indicator: logoIndicator }\"\n (scroll)=\"onScroll($event, id)\"\n >\n @for (item of itens; track $index) {\n <div\n cdkDrag\n [cdkDragDisabled]=\"item.disabled\"\n [cdkDragData]=\"item\"\n (click)=\"toggleSelected(item, id)\"\n (cdkDragStarted)=\"onDragStart($event, id)\"\n (cdkDragReleased)=\"onDragRelease()\"\n class=\"picklist-item\"\n [class.picklist-disabled]=\"item.disabled\"\n [class.picklist-item-invisible]=\"item.invisible\"\n [class.picklist-item-active]=\"item.selected\"\n >\n @if (showCheckbox) {\n <input\n type=\"checkbox\"\n class=\"input-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"item.disabled\"\n />\n }\n <div class=\"picklist-content\">\n <ng-container\n *ngTemplateOutlet=\"\n template;\n context: { item: item.data, selected: item.selected, disabled: item.disabled }\n \"\n ></ng-container>\n </div>\n <ng-container *cdkDragPreview>\n <ng-container\n *ngTemplateOutlet=\"previewRender; context: { itens: selectedItensMap, template: template }\"\n ></ng-container>\n </ng-container>\n </div>\n }\n </div>\n</ng-template>\n\n<ng-template\n #checkboxTitleRender\n let-disabled=\"disabled\"\n let-checked=\"checked\"\n let-changeFn=\"changeFn\"\n let-id=\"id\"\n>\n @if (showCheckbox && !lazyLoad()) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n (change)=\"changeFn($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === itensToSelectId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"itensToSelectFilterUtil.allItensSelected\"\n (change)=\"checkAllAvailableItensChange($any($event.target).checked)\"\n />\n } @else if (showCheckbox && lazyLoad() && id === selectedItensId) {\n <input\n class=\"input-checkbox\"\n type=\"checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"selectedItensFilterUtil.allItensSelected\"\n (change)=\"checkAllSelectedItensChange($any($event.target).checked)\"\n />\n }\n</ng-template>\n\n<div class=\"picklist-container\">\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ availableItensLabel || 'platform.angular_components.available-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableItensToSelectCheckbox,\n checked: itensToSelectAllSelected,\n changeFn: checkAllAvailableItensChange.bind(this),\n id: itensToSelectId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"availableItensFilter\"\n (ngModelChange)=\"filterItensToSelect()\"\n [placeholder]=\"\n availableItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: itensToSelectId,\n itens: itensToSelectFilterUtil.filteredItensToSelect,\n template: itemToSelectTemplate,\n listConnectedTo: selectedItensId,\n isLoading: _loadingSource(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"addSelectedItensLabel || 'platform.angular_components.add' | translate\"\n priority=\"primary\"\n rightIconClass=\"fa fa-fw fa-arrow-right\"\n [disabled]=\"!hasSelectedItens\"\n (clicked)=\"add()\"\n [auxiliary]=\"false\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"addAllItensLabel || 'platform.angular_components.add_all' | translate\"\n priority=\"link\"\n (clicked)=\"add(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"picklist-item-container\">\n <div class=\"picklist-box\">\n <div class=\"picklist-title-container\">\n @if (!filterBy && !lazyLoad()) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <span class=\"picklist-title\">\n {{ selectedItensLabel || 'platform.angular_components.selected-items' | translate }}\n </span>\n </div>\n @if (filterBy || lazyLoad()) {\n <div class=\"picklist-filter\">\n @if (showCheckbox) {\n <ng-container\n *ngTemplateOutlet=\"\n checkboxTitleRender;\n context: {\n disabled: disableSelectedItensCheckbox,\n checked: selectedItensAllSelected,\n changeFn: checkAllSelectedItensChange.bind(this),\n id: selectedItensId,\n }\n \"\n ></ng-container>\n }\n <input\n type=\"text\"\n class=\"input-search\"\n [(ngModel)]=\"selectedItensFilter\"\n (ngModelChange)=\"filterSelectedItens()\"\n [placeholder]=\"\n selectedItensPlaceholder || 'platform.angular_components.picklist-placeholder' | translate\n \"\n />\n </div>\n }\n <ng-container\n *ngTemplateOutlet=\"\n picklistItensRender;\n context: {\n id: selectedItensId,\n itens: selectedItensFilterUtil.filteredSelectedItens,\n template: itemSelectedTemplate,\n listConnectedTo: itensToSelectId,\n isLoading: _loadingTarget(),\n }\n \"\n >\n </ng-container>\n </div>\n <div class=\"buttons-container\">\n <s-button\n [label]=\"removeSelectedItemsLabel || 'platform.angular_components.remove' | translate\"\n priority=\"primary\"\n iconClass=\"fa fa-fw fa-arrow-left\"\n [disabled]=\"!hasSelectedItens\"\n [auxiliary]=\"false\"\n (clicked)=\"remove()\"\n [caret]=\"false\"\n >\n </s-button>\n <s-button\n [label]=\"removeAllItemsLabel || 'platform.angular_components.remove_all' | translate\"\n priority=\"link\"\n (clicked)=\"remove(true)\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n </div>\n</div>\n\n", styles: [".picklist-container{display:flex;flex-wrap:wrap;border-radius:4px solid #dedce5;width:100%;background-color:#fff;gap:20px;padding:8px}.picklist-container .picklist-item-container{display:flex;flex-direction:column;flex:1}.picklist-container .picklist-item-container .picklist-box{border:1px solid #dedce5;padding:8px;height:100%;min-width:200px}.picklist-container .picklist-item-container .picklist-box .picklist-filter{display:flex;width:100%}.picklist-container .picklist-item-container .picklist-box .picklist-filter .input-search{border:1px solid #dedce5;min-height:35px;width:100%;border-radius:3px;margin-bottom:10px;margin-top:10px;padding:0 8px;flex:1}.picklist-container .picklist-item-container .picklist-box .picklist-title-container{width:100%;display:flex;align-items:center}.picklist-container .picklist-item-container .picklist-box .picklist-title-container .picklist-title{font-family:Open Sans;font-size:14px;font-weight:700;line-height:21px;text-underline-position:from-font;text-decoration-skip-ink:none}.picklist-container .picklist-item-container .picklist-box .picklist-items{max-height:23em;overflow:auto;height:100%;min-height:100px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-content{width:100%;height:100%;padding-right:8px;border-radius:3px;margin-bottom:8px}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item{height:55px;border:3px;display:flex}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:not(.picklist-disabled){cursor:pointer}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item:hover:not(.picklist-disabled,.picklist-item-active,.picklist-item-invisible){background-color:#f1f7f8}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-active:not(.picklist-item-invisible){background-color:#d5e8ec}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-disabled{opacity:.5;background-color:#fbfafc}.picklist-container .picklist-item-container .picklist-box .picklist-items .picklist-item-invisible{display:none!important}.picklist-container .picklist-item-container .buttons-container{padding-top:10px;display:flex}.picklist-container .picklist-item-container .input-checkbox{margin:12px}\n"] }]
262
619
  }], propDecorators: { itensToSelect: [{
263
620
  type: Input
264
621
  }], selectedItens: [{
@@ -316,12 +673,13 @@ const mapData = (list) => {
316
673
  return list.map((x) => x.data);
317
674
  };
318
675
  const parseValueEmit = pipe(filterEnabled, mapData);
319
- export const parseItensPickList = (array, disabledFn) => {
676
+ export const parseItensPickList = (array, disabledFn, idKey) => {
320
677
  return array.map((x) => {
321
678
  return {
322
679
  data: x,
323
680
  disabled: disabledFn ? disabledFn(x) : false,
681
+ id: idKey ? String(x[idKey]) : crypto.randomUUID(),
324
682
  };
325
683
  });
326
684
  };
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2xpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3BpY2tsaXN0L3NyYy9saWIvcGlja2xpc3QvcGlja2xpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3BpY2tsaXN0L3NyYy9saWIvcGlja2xpc3QvcGlja2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUF5QyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEwsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7Ozs7QUFTaEY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFNSCxNQUFNLE9BQU8saUJBQWlCO0lBQ2xCLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUV4QywwRkFBMEY7SUFFbkYsYUFBYSxHQUF3QixFQUFFLENBQUM7SUFFL0MsZ0ZBQWdGO0lBRXpFLGFBQWEsR0FBd0IsRUFBRSxDQUFDO0lBRS9DLDZEQUE2RDtJQUV0RCxtQkFBbUIsQ0FBVTtJQUVwQyxpRUFBaUU7SUFFMUQseUJBQXlCLENBQVU7SUFFMUMsb0VBQW9FO0lBRTdELHFCQUFxQixDQUFVO0lBRXRDLGdFQUFnRTtJQUV6RCxnQkFBZ0IsQ0FBVTtJQUVqQyw4REFBOEQ7SUFFdkQsa0JBQWtCLENBQVU7SUFFbkMsa0VBQWtFO0lBRTNELHdCQUF3QixDQUFVO0lBRXpDLGtFQUFrRTtJQUUzRCx3QkFB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Q0FBQyxDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUksS0FBVSxFQUFFLFVBQWlDLEVBQXFCLEVBQUU7SUFDdEcsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbkIsT0FBTztZQUNILElBQUksRUFBRSxDQUFDO1lBQ1AsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO1NBQy9DLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBRdWVyeUxpc3QsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHBpcGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBpY2tMaXN0SXRlbSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmFuZG9tSGFzaCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdXRpbHMnO1xuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3RlbXBsYXRlJztcblxuaW50ZXJmYWNlIEludGVybmFsUGlja2xpc3RJdGVtPFQgPSBhbnk+IGV4dGVuZHMgUGlja0xpc3RJdGVtPFQ+IHtcbiAgICBpbnZpc2libGU/OiBib29sZWFuO1xuICAgIHNlbGVjdGVkPzogYm9vbGVhbjtcbn1cblxudHlwZSBDZGtEcmFnRXZlbnQgPSB7IHNvdXJjZTogQ2RrRHJhZzxJbnRlcm5hbFBpY2tsaXN0SXRlbTxhbnk+PiB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnRlIGRlIGxpc3RhIGRlIGR1cGxhIHNlbGXDp8OjbyAocGlja2xpc3QpIGNvbSBzdXBvcnRlIGFcbiAqIGFycmFzdGFyIGUgc29sdGFyLCBmaWx0cm8sIGNoZWNrYm94ZXMgZSB0ZW1wbGF0ZSBjdXN0b21pesOhdmVsIHBhcmEgY2FkYSBpdGVtLlxuICogRW1pdGUgZXZlbnRvcyBhbyBtb3ZlciBpdGVucyBlbnRyZSBhcyBsaXN0YXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxzLXBpY2tsaXN0XG4gKiAgIFtpdGVuc1RvU2VsZWN0XT1cIml0ZW5zRGlzcG9uaXZlaXNcIlxuICogICBbc2VsZWN0ZWRJdGVuc109XCJpdGVuc1NlbGVjaW9uYWRvc1wiXG4gKiAgIChzZWxlY3RlZEl0ZW5zQ2hhbmdlKT1cIm9uU2VsZWNhb011ZG91KCRldmVudClcIiAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IERhdGFcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLXBpY2tsaXN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcGlja2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3BpY2tsaXN0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBpY2tsaXN0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIGl0ZW5zIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8OjbyAoY29sdW5hIGVzcXVlcmRhKS4gQGRlZmF1bHQgW10gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpdGVuc1RvU2VsZWN0OiBQaWNrTGlzdEl0ZW08YW55PltdID0gW107XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIGl0ZW5zIGrDoSBzZWxlY2lvbmFkb3MgKGNvbHVuYSBkaXJlaXRhKS4gQGRlZmF1bHQgW10gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW5zOiBQaWNrTGlzdEl0ZW08YW55PltdID0gW107XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFLDs3R1bG8gZG8gdMOtdHVsbyBkYSBsaXN0YSBkZSBkaXNwb27DrXZlaXMuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXZhaWxhYmxlSXRlbnNMYWJlbD86IHN0cmluZztcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUGxhY2Vob2xkZXIgZGEgYnVzY2EgbmEgbGlzdGEgZGUgZGlzcG9uw612ZWlzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF2YWlsYWJsZUl0ZW5zUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFLDs3R1bG8gZG8gYm90w6NvIGRlIGFkaWNpb25hciBpdGVucyBzZWxlY2lvbmFkb3MuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWRkU2VsZWN0ZWRJdGVuc0xhYmVsPzogc3RyaW5nO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBSw7N0dWxvIGRvIGJvdMOjbyBkZSBhZGljaW9uYXIgdG9kb3Mgb3MgaXRlbnMuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWRkQWxsSXRlbnNMYWJlbD86IHN0cmluZztcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUsOzdHVsbyBkbyB0w610dWxvIGRhIGxpc3RhIGRlIHNlbGVjaW9uYWRvcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW5zTGFiZWw/OiBzdHJpbmc7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFBsYWNlaG9sZGVyIGRhIGJ1c2NhIG5hIGxpc3RhIGRlIHNlbGVjaW9uYWRvcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW5zUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFLDs3R1bG8gZG8gYm90w6NvIGRlIHJlbW92ZXIgaXRlbnMgc2VsZWNpb25hZG9zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlbW92ZVNlbGVjdGVkSXRlbXNMYWJlbD86IHN0cmluZztcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUsOzdHVsbyBkbyBib3TDo28gZGUgcmVtb3ZlciB0b2RvcyBvcyBpdGVucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZW1vdmVBbGxJdGVtc0xhYmVsPzogc3RyaW5nO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSBjaGVja2JveCBub3MgaXRlbnMgZGFzIGxpc3Rhcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93Q2hlY2tib3ggPSBmYWxzZTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUHJvcHJpZWRhZGUgdXNhZGEgcGFyYSBmaWx0cmFyIG9zIGl0ZW5zIGRhcyBsaXN0YXMuIEBkZWZhdWx0ICcnICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZmlsdGVyQnkgPSAnJztcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gYSBsaXN0YSBkZSBzZWxlY2lvbmFkb3MgbXVkYS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVuc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIGEgbGlzdGEgZGUgZGlzcG9uw612ZWlzIG11ZGEuICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGl0ZW5zVG9TZWxlY3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gICAgcHVibGljIGF2YWlsYWJsZUl0ZW5zRmlsdGVyID0gJyc7XG5cbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVuc0ZpbHRlciA9ICcnO1xuXG4gICAgcHVibGljIGl0ZW1Ub1NlbGVjdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgaXRlbVNlbGVjdGVkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBpdGVuc1RvU2VsZWN0RmlsdGVyVXRpbDoge1xuICAgICAgICByYXdJdGVuc1RvU2VsZWN0OiBJbnRlcm5hbFBpY2tsaXN0SXRlbVtdO1xuICAgICAgICBmaWx0ZXJlZEl0ZW5zVG9TZWxlY3Q6IEludGVybmFsUGlja2xpc3RJdGVtW107XG4gICAgfSA9IHtcbiAgICAgICAgcmF3SXRlbnNUb1NlbGVjdDogW10sXG4gICAgICAgIGZpbHRlcmVkSXRlbnNUb1NlbGVjdDogW10sXG4gICAgfTtcblxuICAgIHNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsOiB7XG4gICAgICAgIHJhd1NlbGVjdGVkSXRlbnM6IEludGVybmFsUGlja2xpc3RJdGVtW107XG4gICAgICAgIGZpbHRlcmVkU2VsZWN0ZWRJdGVuczogSW50ZXJuYWxQaWNrbGlzdEl0ZW1bXTtcbiAgICB9ID0ge1xuICAgICAgICByYXdTZWxlY3RlZEl0ZW5zOiBbXSxcbiAgICAgICAgZmlsdGVyZWRTZWxlY3RlZEl0ZW5zOiBbXSxcbiAgICB9O1xuXG4gICAgcHVibGljIHNlbGVjdGVkSXRlbnNNYXA6IFNldDxJbnRlcm5hbFBpY2tsaXN0SXRlbT4gPSBuZXcgU2V0KCk7XG4gICAgcHVibGljIGl0ZW5zVG9TZWxlY3RJZCA9IHJhbmRvbUhhc2goJ2l0ZW5zVG9TZWxlY3QnKTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVuc0lkID0gcmFuZG9tSGFzaCgnc2VsZWN0ZWRJdGVucycpO1xuXG4gICAgcHJpdmF0ZSBfbG9nRXJyb3JUZW1wbGF0ZSA9IHRydWU7XG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBwcml2YXRlIHRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlRGlyZWN0aXZlPiB8IG51bGwgPSBudWxsO1xuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1Ub1NlbGVjdFRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZXM/LmZpbmQoKHgpID0+IHgudHlwZSA9PT0gJ2l0ZW0tdG8tc2VsZWN0Jyk/LnRlbXBsYXRlID8/IG51bGw7XG4gICAgICAgIHRoaXMuaXRlbVNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlcz8uZmluZCgoeCkgPT4geC50eXBlID09PSAnc2VsZWN0ZWQtaXRlbScpPy50ZW1wbGF0ZSA/PyBudWxsO1xuICAgICAgICBpZiAodGhpcy5fbG9nRXJyb3JUZW1wbGF0ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1Ub1NlbGVjdFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTWlzc2luZyB0ZW1wbGF0ZSBmb3IgJ2l0ZW0tdG8tc2VsZWN0JyBhZGQgdGhpcyB0ZW1wbGF0ZSB1c2luZyBzVGVtcGxhdGUgZGlyZWN0aXZlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1TZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTWlzc2luZyB0ZW1wbGF0ZSBmb3IgJ3NlbGVjdGVkLWl0ZW0nIGFkZCB0aGlzIHRlbXBsYXRlIHVzaW5nIHNUZW1wbGF0ZSBkaXJlY3RpdmUuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydpdGVuc1RvU2VsZWN0J10/LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsID0ge1xuICAgICAgICAgICAgICAgIHJhd0l0ZW5zVG9TZWxlY3Q6IHRoaXMuaXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZEl0ZW5zVG9TZWxlY3Q6IHRoaXMuaXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRJdGVucyddPy5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbCA9IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFNlbGVjdGVkSXRlbnM6IHRoaXMuc2VsZWN0ZWRJdGVucyxcbiAgICAgICAgICAgICAgICByYXdTZWxlY3RlZEl0ZW5zOiB0aGlzLnNlbGVjdGVkSXRlbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9nZ2xlU2VsZWN0ZWQoaW50ZXJuYWxQaWNrbGlzdEl0ZW06IEludGVybmFsUGlja2xpc3RJdGVtLCBjb250YWluZXJMaXN0SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoaW50ZXJuYWxQaWNrbGlzdEl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuc2VsZWN0ZWRJdGVuc0J5TGlzdElkKHRoaXMuZ2V0T3Bwb3NpdGl2ZUlkKGNvbnRhaW5lckxpc3RJZCkpO1xuICAgICAgICBpbnRlcm5hbFBpY2tsaXN0SXRlbS5zZWxlY3RlZCA9ICFpbnRlcm5hbFBpY2tsaXN0SXRlbS5zZWxlY3RlZDtcbiAgICAgICAgaWYgKGludGVybmFsUGlja2xpc3RJdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuYWRkKGludGVybmFsUGlja2xpc3RJdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc01hcC5kZWxldGUoaW50ZXJuYWxQaWNrbGlzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICByZW1vdmUoYWxsID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgaXRlbnMgPSBmaWx0ZXJFbmFibGVkKGFsbCA/IHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucyA6IHRoaXMuc2VsZWN0ZWRJdGVuc01hcCk7XG4gICAgICAgIGlmICghaXRlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaXRlbnMuZm9yRWFjaCgoaXRlbVJlbW92ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0LnB1c2goaXRlbVJlbW92ZSk7XG4gICAgICAgICAgICBpdGVtUmVtb3ZlLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuZGVsZXRlKGl0ZW1SZW1vdmUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zID0gdGhpcy5zZWxlY3RlZEl0ZW5zLmZpbHRlcigoeCkgPT4gIWl0ZW5zLmluY2x1ZGVzKHgpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zID0gdGhpcy5zZWxlY3RlZEl0ZW5zO1xuICAgICAgICB0aGlzLmZpbHRlclNlbGVjdGVkSXRlbnMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJJdGVuc1RvU2VsZWN0KCk7XG4gICAgICAgIHRoaXMuZW1pdERhdGEoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGFkZChhbGwgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBpdGVucyA9IGZpbHRlckVuYWJsZWQoYWxsID8gdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0IDogdGhpcy5zZWxlY3RlZEl0ZW5zTWFwKTtcbiAgICAgICAgaWYgKCFpdGVucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpdGVucy5mb3JFYWNoKChpdGVtUmVtb3ZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnMucHVzaChpdGVtUmVtb3ZlKTtcbiAgICAgICAgICAgIGl0ZW1SZW1vdmUuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc01hcC5kZWxldGUoaXRlbVJlbW92ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3QuZmlsdGVyKCh4KSA9PiAhaXRlbnMuaW5jbHVkZXMoeCkpO1xuICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3Q7XG4gICAgICAgIHRoaXMuZmlsdGVyU2VsZWN0ZWRJdGVucygpO1xuICAgICAgICB0aGlzLmZpbHRlckl0ZW5zVG9TZWxlY3QoKTtcbiAgICAgICAgdGhpcy5lbWl0RGF0YSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgZmlsdGVySXRlbnNUb1NlbGVjdCgpIHtcbiAgICAgICAgbGV0IHNlYXJjaFRlcm0gPSB0aGlzLmF2YWlsYWJsZUl0ZW5zRmlsdGVyO1xuICAgICAgICBzZWFyY2hUZXJtID0gc2VhcmNoVGVybS50cmltKCk7XG4gICAgICAgIGlmIChzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCA9IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IGNvbXBhcmVTdHJpbmdzKGl0ZW0uZGF0YVt0aGlzLmZpbHRlckJ5XSwgc2VhcmNoVGVybSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGZpbHRlclNlbGVjdGVkSXRlbnMoKSB7XG4gICAgICAgIGxldCBzZWFyY2hUZXJtID0gdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyO1xuICAgICAgICBzZWFyY2hUZXJtID0gc2VhcmNoVGVybS50cmltKCk7XG4gICAgICAgIGlmIChzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLmZpbHRlcmVkU2VsZWN0ZWRJdGVucyA9IHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IGNvbXBhcmVTdHJpbmdzKGl0ZW0uZGF0YVt0aGlzLmZpbHRlckJ5XSwgc2VhcmNoVGVybSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMgPSB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxJbnRlcm5hbFBpY2tsaXN0SXRlbVtdPikge1xuICAgICAgICBjb25zdCBpc0RpZmZlcmVudENvbnRhaW5lciA9IGV2ZW50LmNvbnRhaW5lciAhPT0gZXZlbnQucHJldmlvdXNDb250YWluZXI7XG4gICAgICAgIGlmICghaXNEaWZmZXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUmVtb3ZlZEl0ZW5zID0gZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVuc0lkO1xuICAgICAgICBpZiAoaXNSZW1vdmVkSXRlbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkRyYWdTdGFydChldmVudDogQ2RrRHJhZ0V2ZW50LCBkcmFnTGlzdElkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkSXRlbnNCeUxpc3RJZCh0aGlzLmdldE9wcG9zaXRpdmVJZChkcmFnTGlzdElkKSk7XG4gICAgICAgIGV2ZW50LnNvdXJjZS5kYXRhLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zTWFwLmFkZChldmVudC5zb3VyY2UuZGF0YSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc01hcC5mb3JFYWNoKCh4KSA9PiAoeC5pbnZpc2libGUgPSB0cnVlKSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkRyYWdSZWxlYXNlKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaW52aXNpYmxlID0gZmFsc2UpKTtcbiAgICB9XG5cbiAgICBjaGVja0FsbEF2YWlsYWJsZUl0ZW5zQ2hhbmdlKHRhcmdldDogSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjaGVja2VkID0gdGFyZ2V0LmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuX2NoZWNrQWxsU2VsZWN0ZWRJdGVuc0NoYW5nZShcbiAgICAgICAgICAgIGNoZWNrZWQsXG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgIHRoaXMuaXRlbnNUb1NlbGVjdElkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNoZWNrQWxsU2VsZWN0ZWRJdGVuc0NoYW5nZSh0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRhcmdldC5jaGVja2VkO1xuICAgICAgICB0aGlzLl9jaGVja0FsbFNlbGVjdGVkSXRlbnNDaGFuZ2UoXG4gICAgICAgICAgICBjaGVja2VkLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNJZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXQgZGlzYWJsZVNlbGVjdGVkSXRlbnNDaGVja2JveCgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckVuYWJsZWQodGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBnZXQgZGlzYWJsZUl0ZW5zVG9TZWxlY3RDaGVja2JveCgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckVuYWJsZWQodGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBnZXQgaXRlbnNUb1NlbGVjdEFsbFNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tBbGxTZWxlY3RlZEJ5TGlzdCh0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCk7XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkSXRlbnNBbGxTZWxlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrQWxsU2VsZWN0ZWRCeUxpc3QodGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMpO1xuICAgIH1cblxuICAgIGdldCBjYW5BZGRJdGVucygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLml0ZW5zVG9TZWxlY3QgYXMgSW50ZXJuYWxQaWNrbGlzdEl0ZW1bXSkuZmlsdGVyKCh4KSA9PiB4Py5zZWxlY3RlZCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXQgY2FuUmVtb3ZlSXRlbnMoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZEl0ZW5zIGFzIEludGVybmFsUGlja2xpc3RJdGVtW10pLmZpbHRlcigoeCkgPT4geD8uc2VsZWN0ZWQpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hlY2tBbGxTZWxlY3RlZEJ5TGlzdChsaXN0OiBJbnRlcm5hbFBpY2tsaXN0SXRlbVtdKSB7XG4gICAgICAgIGNvbnN0IF9saXN0SXRlbnMgPSBmaWx0ZXJFbmFibGVkKGxpc3QpO1xuICAgICAgICBpZiAoIV9saXN0SXRlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX2xpc3RJdGVucy5ldmVyeSgoeCkgPT4geC5zZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja0FsbFNlbGVjdGVkSXRlbnNDaGFuZ2UoY2hlY2tlZDogYm9vbGVhbiwgbGlzdDogSW50ZXJuYWxQaWNrbGlzdEl0ZW1bXSwgbGlzdElkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkSXRlbnNCeUxpc3RJZChsaXN0SWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVuc0lkID8gdGhpcy5pdGVuc1RvU2VsZWN0SWQgOiB0aGlzLnNlbGVjdGVkSXRlbnNJZCk7XG4gICAgICAgIGZpbHRlckVuYWJsZWQobGlzdCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGNoZWNrZWQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuYWRkKGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5zZWxlY3RlZEl0ZW5zQnlMaXN0SWQobGlzdElkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY2xlYXJMaXN0ID0gdGhpcy5nZXRBbGxFbGVtZW50c0J5TGlzdElkKGxpc3RJZCk7XG4gICAgICAgIGNsZWFyTGlzdC5mb3JFYWNoKCh4KSA9PiB7XG4gICAgICAgICAgICB4LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuZGVsZXRlKHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWxsRWxlbWVudHNCeUxpc3RJZChsaXN0SWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbGlzdElkID09PSB0aGlzLnNlbGVjdGVkSXRlbnNJZFxuICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnNcbiAgICAgICAgICAgIDogdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3Bwb3NpdGl2ZUlkKGxpc3RJZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBsaXN0SWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVuc0lkID8gdGhpcy5pdGVuc1RvU2VsZWN0SWQgOiB0aGlzLnNlbGVjdGVkSXRlbnNJZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVtaXREYXRhKCkge1xuICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RDaGFuZ2UuZW1pdChwYXJzZVZhbHVlRW1pdCh0aGlzLml0ZW5zVG9TZWxlY3QpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zQ2hhbmdlLmVtaXQocGFyc2VWYWx1ZUVtaXQodGhpcy5zZWxlY3RlZEl0ZW5zKSk7XG4gICAgfVxufVxuXG5jb25zdCBub3JtYWxpemVTdHJpbmcgPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJylcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIGJ5IG5vcm1hbGl6aW5nIHRoZW0gdG8gYSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBhY2NlbnQtZnJlZSBmb3JtLFxuICogYW5kIGNoZWNrcyBpZiB0aGUgbWFpbiBzdHJpbmcgY29udGFpbnMgdGhlIHN1YnN0cmluZy5cbiAqXG4gKiBAcGFyYW0gbWFpblN0cmluZyAtIFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQuXG4gKiBAcGFyYW0gc3Vic3RyaW5nIC0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yIHdpdGhpbiB0aGUgbWFpbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBub3JtYWxpemVkIG1haW4gc3RyaW5nIGNvbnRhaW5zIHRoZSBub3JtYWxpemVkIHN1YnN0cmluZy5cbiAqL1xuXG5jb25zdCBjb21wYXJlU3RyaW5ncyA9IChtYWluU3RyaW5nOiBzdHJpbmcsIHN1YnN0cmluZzogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVN0cmluZyhtYWluU3RyaW5nKS5pbmNsdWRlcyhub3JtYWxpemVTdHJpbmcoc3Vic3RyaW5nKSk7XG59O1xuXG5jb25zdCBmaWx0ZXJFbmFibGVkID0gKGxpc3Q6IFBpY2tMaXN0SXRlbTxhbnk+W10gfCBTZXQ8SW50ZXJuYWxQaWNrbGlzdEl0ZW0+KTogSW50ZXJuYWxQaWNrbGlzdEl0ZW1bXSA9PiB7XG4gICAgY29uc3QgX2xpc3QgPSBsaXN0IGluc3RhbmNlb2YgU2V0ID8gQXJyYXkuZnJvbShsaXN0KSA6IGxpc3Q7XG4gICAgcmV0dXJuIF9saXN0LmZpbHRlcigoeCkgPT4gIXguZGlzYWJsZWQpO1xufTtcblxuY29uc3QgbWFwRGF0YSA9IChsaXN0OiBQaWNrTGlzdEl0ZW08YW55PltdKSA9PiB7XG4gICAgcmV0dXJuIGxpc3QubWFwKCh4KSA9PiB4LmRhdGEpO1xufTtcblxuY29uc3QgcGFyc2VWYWx1ZUVtaXQgPSBwaXBlKGZpbHRlckVuYWJsZWQsIG1hcERhdGEpO1xuXG5leHBvcnQgY29uc3QgcGFyc2VJdGVuc1BpY2tMaXN0ID0gPFQ+KGFycmF5OiBUW10sIGRpc2FibGVkRm4/OiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFBpY2tMaXN0SXRlbTxUPltdID0+IHtcbiAgICByZXR1cm4gYXJyYXkubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB4LFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkRm4gPyBkaXNhYmxlZEZuKHgpIDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgfSk7XG59O1xuXG4iLCI8bmctdGVtcGxhdGVcbiAgICAjcHJldmlld1JlbmRlclxuICAgIGxldC1pdGVucz1cIml0ZW5zXCJcbiAgICBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiXG4+XG4gICAgPHNlY3Rpb24gY2xhc3M9XCJwaWNrbGlzdC1pdGVtc1wiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW5zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogeyBpdGVtOiBpdGVtLmRhdGEgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgPC9zZWN0aW9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICAgI3BpY2tsaXN0SXRlbnNSZW5kZXJcbiAgICBsZXQtaWQ9XCJpZFwiXG4gICAgbGV0LWl0ZW5zPVwiaXRlbnNcIlxuICAgIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCJcbiAgICBsZXQtbGlzdENvbm5lY3RlZFRvPVwibGlzdENvbm5lY3RlZFRvXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicGlja2xpc3QtaXRlbXNcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICBbY2RrRHJvcExpc3RTb3J0aW5nRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwiaXRlbnNcIlxuICAgICAgICBbY2RrRHJvcExpc3RDb25uZWN0ZWRUb109XCJsaXN0Q29ubmVjdGVkVG9cIlxuICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW5zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGVkKGl0ZW0sIGlkKVwiXG4gICAgICAgICAgICAgICAgKGNka0RyYWdTdGFydGVkKT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaWQpXCJcbiAgICAgICAgICAgICAgICAoY2RrRHJhZ1JlbGVhc2VkKT1cIm9uRHJhZ1JlbGVhc2UoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwaWNrbGlzdC1pdGVtXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucGlja2xpc3QtZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnBpY2tsaXN0LWl0ZW0taW52aXNpYmxlXT1cIml0ZW0uaW52aXNpYmxlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucGlja2xpc3QtaXRlbS1hY3RpdmVdPVwiaXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93Q2hlY2tib3gpIHtcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2xpc3QtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6IHsgaXRlbTogaXRlbS5kYXRhLCBzZWxlY3RlZDogaXRlbS5zZWxlY3RlZCwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka0RyYWdQcmV2aWV3PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJldmlld1JlbmRlcjsgY29udGV4dDogeyBpdGVuczogc2VsZWN0ZWRJdGVuc01hcCwgdGVtcGxhdGU6IHRlbXBsYXRlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgICAjY2hlY2tib3hUaXRsZVJlbmRlclxuICAgIGxldC1kaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBsZXQtY2hlY2tlZD1cImNoZWNrZWRcIlxuICAgIGxldC1jaGFuZ2VGbj1cImNoYW5nZUZuXCJcbj5cbiAgICBAaWYgKHNob3dDaGVja2JveCkge1xuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtY2hlY2tib3hcIlxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJjaGVja2VkXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlRm4oJGV2ZW50LnRhcmdldClcIlxuICAgICAgICAvPlxuICAgIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJwaWNrbGlzdC1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicGlja2xpc3QtaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tsaXN0LWJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tsaXN0LXRpdGxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIEBpZiAoIWZpbHRlckJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hUaXRsZVJlbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlSXRlbnNUb1NlbGVjdENoZWNrYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBpdGVuc1RvU2VsZWN0QWxsU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUZuOiBjaGVja0FsbEF2YWlsYWJsZUl0ZW5zQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tsaXN0LXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGF2YWlsYWJsZUl0ZW5zTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5hdmFpbGFibGUtaXRlbXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKGZpbHRlckJ5ICYmIHNob3dDaGVja2JveCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaWNrbGlzdC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFRpdGxlUmVuZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVJdGVuc1RvU2VsZWN0Q2hlY2tib3gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IGl0ZW5zVG9TZWxlY3RBbGxTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRm46IGNoZWNrQWxsQXZhaWxhYmxlSXRlbnNDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyQnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhdmFpbGFibGVJdGVuc0ZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVySXRlbnNUb1NlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiYXZhaWxhYmxlSXRlbnNQbGFjZWhvbGRlciB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnBpY2tsaXN0LXBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBwaWNrbGlzdEl0ZW5zUmVuZGVyO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogaXRlbnNUb1NlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbnM6IGl0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBpdGVtVG9TZWxlY3RUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RDb25uZWN0ZWRUbzogc2VsZWN0ZWRJdGVuc0lkLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYWRkU2VsZWN0ZWRJdGVuc0xhYmVsIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYWRkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICByaWdodEljb25DbGFzcz1cImZhIGZhLWZ3IGZhLWFycm93LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbkFkZEl0ZW5zXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJhZGQoKVwiXG4gICAgICAgICAgICAgICAgW2F1eGlsaWFyeV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2NhcmV0XT1cImZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYWRkQWxsSXRlbnNMYWJlbCB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmFkZF9hbGwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwcmlvcml0eT1cImxpbmtcIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImFkZCh0cnVlKVwiXG4gICAgICAgICAgICAgICAgW2F1eGlsaWFyeV09XCJmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3MtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGlja2xpc3QtaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tsaXN0LWJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tsaXN0LXRpdGxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIEBpZiAoIWZpbHRlckJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hUaXRsZVJlbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVTZWxlY3RlZEl0ZW5zQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBzZWxlY3RlZEl0ZW5zQWxsU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGbjogY2hlY2tBbGxTZWxlY3RlZEl0ZW5zQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaWNrbGlzdC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZEl0ZW5zTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3RlZC1pdGVtcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBpY2tsaXN0LWZpbHRlclwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJCeSAmJiBzaG93Q2hlY2tib3hcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94VGl0bGVSZW5kZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IGRpc2FibGVkOiBkaXNhYmxlU2VsZWN0ZWRJdGVuc0NoZWNrYm94LCBjaGVja2VkOiBzZWxlY3RlZEl0ZW5zQWxsU2VsZWN0ZWQsIGNoYW5nZUZuOiBjaGVja0FsbFNlbGVjdGVkSXRlbnNDaGFuZ2UuYmluZCh0aGlzKSB9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyQnkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSXRlbnNGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyU2VsZWN0ZWRJdGVucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RlZEl0ZW5zUGxhY2Vob2xkZXIgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5waWNrbGlzdC1wbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgIHBpY2tsaXN0SXRlbnNSZW5kZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZEl0ZW5zSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVuczogc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGl0ZW1TZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdENvbm5lY3RlZFRvOiBpdGVuc1RvU2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZW1vdmVTZWxlY3RlZEl0ZW1zTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5yZW1vdmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwcmlvcml0eT1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWZ3IGZhLWFycm93LWxlZnRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVtb3ZlSXRlbnNcIlxuICAgICAgICAgICAgICAgIFthdXhpbGlhcnldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInJlbW92ZSgpXCJcbiAgICAgICAgICAgICAgICBbY2FyZXRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZW1vdmVBbGxJdGVtc0xhYmVsIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMucmVtb3ZlX2FsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHByaW9yaXR5PVwibGlua1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwicmVtb3ZlKHRydWUpXCJcbiAgICAgICAgICAgICAgICBbYXV4aWxpYXJ5XT1cImZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
685
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2xpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3BpY2tsaXN0L3NyYy9saWIvcGlja2xpc3QvcGlja2xpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3BpY2tsaXN0L3NyYy9saWIvcGlja2xpc3QvcGlja2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUVOLE1BQU0sR0FHVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM5RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVV6Rjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQVFILE1BQU0sT0FBTyxpQkFBaUI7SUFDbEIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hDLDBGQUEwRjtJQUVuRixhQUFhLEdBQXNCLEVBQUUsQ0FBQztJQUU3QyxnRkFBZ0Y7SUFFekUsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFN0MsNkRBQTZEO0lBRXRELG1CQUFtQixDQUFVO0lBRXBDLGlFQUFpRTtJQUUxRCx5QkFBeUIsQ0FBVTtJQUUxQyxvRUFBb0U7SUFFN0QscUJBQXFCLENBQVU7SUFFdEMsZ0VBQWdFO0lBRXpELGdCQUFnQixDQUFVO0lBRWpDLDhEQUE4RDtJQUV2RCxrQkFBa0IsQ0FBVTtJQUVuQyxrRUFBa0U7SUFFM0Qsd0JBQXdCLENBQVU7SUFFekMsa0VBQWtFO0lBRTNELHdCQUF3QixDQUFVO0lBRXpDLDhEQUE4RDtJQUV2RCxtQkFBbUIsQ0FBVTtJQUVwQyx1RUFBdUU7SUFFaEUsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUU1QixtRkFBbUY7SUFFNUUsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUVyQixpR0FBaUc7SUFDakcsUUFBUSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUVqQywrR0FBK0c7SUFDL0csSUFBSSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUV6QixxS0FBcUs7SUFDckssWUFBWSxHQUFHLEtBQUssRUFBcUIsQ0FBQztJQUUxQyxxS0FBcUs7SUFDckssWUFBWSxHQUFHLEtBQUssRUFBcUIsQ0FBQztJQUV2QixjQUFjLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXhDLGNBQWMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFM0Qsa0dBQWtHO0lBQ2xHLFNBQVMsR0FBRyxNQUFNLEVBQXVCLENBQUM7SUFFMUMsZ0VBQWdFO0lBRXpELG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7SUFFdkQsK0RBQStEO0lBRXhELG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7SUFFaEQsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0lBRTFCLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztJQUV6QixvQkFBb0IsR0FBMEIsSUFBSSxDQUFDO0lBRW5ELG9CQUFvQixHQUEwQixJQUFJLENBQUM7SUFFaEQsYUFBYSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQztJQUU1Qyx1QkFBdUIsR0FJN0I7UUFDQSxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGdCQUFnQixFQUFFLEVBQUU7UUFDcEIscUJBQXFCLEVBQUUsRUFBRTtLQUM1QixDQUFDO0lBRVEsdUJBQXVCLEdBSTdCO1FBQ0EsZ0JBQWdCLEVBQUUsS0FBSztRQUN2QixnQkFBZ0IsRUFBRSxFQUFFO1FBQ3BCLHFCQUFxQixFQUFFLEVBQUU7S0FDNUIsQ0FBQztJQUVLLGdCQUFnQixHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3hELGVBQWUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVwQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFDNUMsbUJBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUM1QyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztJQUN6RCxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztJQUNsRSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUN0QixpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFFdEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBRXpCLFNBQVMsR0FBd0MsSUFBSSxDQUFDO0lBRTlELGVBQWU7UUFDWCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO1FBQ3RHLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLG9GQUFvRixDQUFDLENBQUM7WUFDeEcsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxtRkFBbUYsQ0FBQyxDQUFDO1lBQ3ZHLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDckMsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEQsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEQsSUFBSSxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyx1QkFBdUIsR0FBRztnQkFDM0IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixJQUFJLEtBQUs7Z0JBQ3hFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUNwQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsYUFBYTthQUM1QyxDQUFDO1FBQ04sQ0FBQzthQUFNLElBQUksb0JBQW9CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHO2dCQUM1QyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0I7Z0JBQ2hELEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDeEIsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixFQUM3QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQzdDLElBQUksQ0FBQyxlQUFlLENBQ3ZCLENBQUM7WUFDTixDQUFDO1lBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RyxDQUFDO1FBRUQsSUFBSSxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyx1QkFBdUIsR0FBRztnQkFDM0IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixJQUFJLEtBQUs7Z0JBQ3hFLHFCQUFxQixFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUN6QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsYUFBYTthQUN2QyxDQUFDO1FBQ04sQ0FBQzthQUFNLElBQUksb0JBQW9CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHO2dCQUM1QyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0I7Z0JBQ2hELEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDeEIsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixFQUM3QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQzdDLElBQUksQ0FBQyxlQUFlLENBQ3ZCLENBQUM7WUFDTixDQUFDO1lBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxvQkFBMEMsRUFBRSxlQUF1QjtRQUM5RSxJQUFJLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUNwRSxvQkFBb0IsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7UUFDL0QsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQ3JCLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQzlDLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZTtZQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQjtZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixDQUMzRCxDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLElBQUksbUJBQW1CLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM1RixtQkFBbUIsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDakQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLGFBQWEsSUFBSSxtQkFBbUIsQ0FBQyxnQkFBZ0IsS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUNwRyxtQkFBbUIsQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSztRQUNkLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPO1FBQ1gsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7UUFDekYsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRztnQkFDNUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCO2dCQUNoRCxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDZixDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztvQkFDbkIsT0FBTyxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxDQUFDO2FBQ0wsQ0FBQztZQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUNoRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUM1QixDQUFDO1lBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUN0RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO2dCQUNuRyxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO1lBQ3ZHLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2hCLFNBQVMsRUFBRSxXQUFXO1lBQ3RCLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUUsT0FBTyxFQUFFLEdBQUc7WUFDWixZQUFZO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHO1lBQzVDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQjtZQUNoRCxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDeEIsVUFBVSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sVUFBVSxDQUFDO1lBQ3RCLENBQUMsQ0FBQztTQUNMLENBQUM7UUFDRixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDaEcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO1lBQ25HLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7UUFDdkcsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNuRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNuRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSztRQUNYLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7UUFDekYsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRztnQkFDNUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCO2dCQUNoRCxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDZixDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztvQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxDQUFDO2FBQ0wsQ0FBQztZQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUNoRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUM1QixDQUFDO1lBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUN0RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO2dCQUNuRyxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO1lBQ3ZHLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2hCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUUsT0FBTyxFQUFFLEdBQUc7WUFDWixZQUFZO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHO1lBQzVDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQjtZQUNoRCxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDeEIsVUFBVSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sVUFBVSxDQUFDO1lBQ3RCLENBQUMsQ0FBQztTQUNMLENBQUM7UUFDRixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDaEcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDO1lBQ25HLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7UUFDdkcsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNuRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNuRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELG1CQUFtQjtRQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN6RCxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQ3JHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQ2pFLENBQUM7UUFDTixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7UUFDdkcsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELG1CQUFtQjtRQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN4RCxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQ3JHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQ2pFLENBQUM7UUFDTixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7UUFDdkcsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBMEM7UUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUN6RSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMzRSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBc0IsRUFBRSxVQUFrQjtRQUNsRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQy9ELEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsNEJBQTRCLENBQUMsT0FBZ0I7UUFDekMsSUFBSSxDQUFDLDRCQUE0QixDQUM3QixPQUFPLEVBQ1AsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixFQUNsRCxJQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDO0lBQ04sQ0FBQztJQUVELDJCQUEyQixDQUFDLE9BQWdCO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0IsT0FBTyxFQUNQLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsRUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FDdkIsQ0FBQztJQUNOLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBWSxFQUFFLE1BQWM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDNUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDcEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2QsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBbUIsTUFBTSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzFGLE1BQU0sZ0JBQWdCLEdBQ2xCLE1BQU0sS0FBSyxVQUFVO1lBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0I7WUFDeEYsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ2pHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksNEJBQTRCO1FBQzVCLE9BQU8sYUFBYSxDQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELElBQUksNEJBQTRCO1FBQzVCLE9BQU8sYUFBYSxDQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELElBQUksd0JBQXdCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxJQUFJLHdCQUF3QjtRQUN4QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWlDRztJQUNJLFNBQVMsQ0FBQyxJQUF5QjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBc0I7UUFDN0MsSUFBSSxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQzVELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQzVELENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxJQUE0QjtRQUN4RCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUksSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyRSxPQUFPLENBQUMsS0FBSyxDQUNULHFKQUFxSixDQUN4SixDQUFDO1FBQ04sQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGlCQUFpQjtpQkFDakIsSUFBSSxDQUNELFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLEVBQ0Ysa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUN0QztpQkFDQSxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsWUFBWSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEdBQUc7b0JBQzVDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQjtvQkFDaEQsR0FBRyxLQUFLO2lCQUNYLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLDRCQUE0QixDQUM3QixJQUFJLEVBQ0osSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixFQUM3QyxJQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDO2dCQUNOLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixHQUFHO29CQUNqRCxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0I7aUJBQ25ELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsaUJBQWlCO2lCQUNqQixJQUFJLENBQ0QsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsRUFDRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3RDO2lCQUNBLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsR0FBRztvQkFDNUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCO29CQUNoRCxHQUFHLEtBQUs7aUJBQ1gsQ0FBQztnQkFDRixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUNoRCxJQUFJLENBQUMsNEJBQTRCLENBQzdCLElBQUksRUFDSixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQzdDLElBQUksQ0FBQyxlQUFlLENBQ3ZCLENBQUM7Z0JBQ04sQ0FBQztnQkFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUc7b0JBQ2pELEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQjtpQkFDbkQsQ0FBQztnQkFDRixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxtQkFBbUI7YUFDbkIsSUFBSSxDQUNELG9CQUFvQixFQUFFLEVBQ3RCLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNMLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUMsQ0FBQyxFQUNGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdEM7YUFDQSxTQUFTLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsbUJBQW1CO2FBQ25CLElBQUksQ0FDRCxvQkFBb0IsRUFBRSxFQUN0QixZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsRUFDRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3RDO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLG1CQUFtQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNYLENBQUM7UUFFRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sWUFBWSxDQUFDLE1BQXNCO1FBQ3ZDLE1BQU0sY0FBYyxHQUFHLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3JHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXpELElBQUksTUFBTSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFzQjtRQUMxQyxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUM1RixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUVyRixNQUFNLEtBQUssR0FBMEIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFFckYsSUFBSSxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNMLENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxPQUFnQixFQUFFLElBQTRCLEVBQUUsTUFBYztRQUMvRixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1RyxhQUFhLENBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDeEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO1FBQzVELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sdUJBQXVCLENBQUMsTUFBYztRQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BCLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFjO1FBQ3pDLE9BQU8sTUFBTSxLQUFLLElBQUksQ0FBQyxlQUFlO1lBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCO1lBQy9DLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUM7SUFDeEQsQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFjO1FBQ2xDLE9BQU8sTUFBTSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDekYsQ0FBQztJQUVPLFFBQVE7UUFDWixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO3dHQXJ0QlEsaUJBQWlCOzRGQUFqQixpQkFBaUIsNm1GQTBIVCxpQkFBaUIsa0RDdEx0Qyw0aFZBNFFBLHMyRURyTmMsZUFBZSwyRkFBRSxjQUFjLG9uQ0FBRSxXQUFXLGd5QkFBRSxlQUFlLHVVQUFFLGdCQUFnQixtSkFBRSxrQkFBa0I7OzRGQUtwRyxpQkFBaUI7a0JBUDdCLFNBQVM7aUNBQ00sSUFBSSxXQUNQLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixDQUFDLFlBQ3BHLFlBQVk7OEJBUWYsYUFBYTtzQkFEbkIsS0FBSztnQkFLQyxhQUFhO3NCQURuQixLQUFLO2dCQUtDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFLQyx5QkFBeUI7c0JBRC9CLEtBQUs7Z0JBS0MscUJBQXFCO3NCQUQzQixLQUFLO2dCQUtDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFLQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBS0Msd0JBQXdCO3NCQUQ5QixLQUFLO2dCQUtDLHdCQUF3QjtzQkFEOUIsS0FBSztnQkFLQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBS0MsWUFBWTtzQkFEbEIsS0FBSztnQkFLQyxRQUFRO3NCQURkLEtBQUs7Z0JBd0JDLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFLQSxtQkFBbUI7c0JBRHpCLE1BQU07Z0JBaURDLFNBQVM7c0JBRGhCLGVBQWU7dUJBQUMsaUJBQWlCOztBQThsQnRDLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDcEMsT0FBTyxHQUFHO1NBQ0wsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUNoQixPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1NBQy9CLFdBQVcsRUFBRSxDQUFDO0FBQ3ZCLENBQUMsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxFQUFFO0lBQzdELE9BQU8sZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFJLElBQW1ELEVBQTBCLEVBQUU7SUFDckcsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLEdBQUcsQ0FBSSxJQUF1QixFQUFFLEVBQUU7SUFDM0MsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUM5QixLQUFVLEVBQ1YsVUFBaUMsRUFDakMsS0FBZSxFQUNFLEVBQUU7SUFDbkIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbkIsT0FBTztZQUNILElBQUksRUFBRSxDQUFDO1lBQ1AsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQzVDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtTQUNyRCxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRGVzdHJveVJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgb3V0cHV0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgc2lnbmFsLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZUluZGljYXRvcnMsIExvYWRpbmdTdGF0ZU1vZHVsZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvbG9hZGluZy1zdGF0ZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdGVtcGxhdGUnO1xuaW1wb3J0IHsgcmFuZG9tSGFzaCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdXRpbHMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgcGlwZSwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBpY2tMaXN0SXRlbSwgUGlja2xpc3RJdGVtTW92ZSwgUGlja2xpc3RMYXp5TG9hZEV2ZW50LCBQaWNrbGlzdExvYWRlciwgUGlja2xpc3RUYXJnZXQgfSBmcm9tICcuL3R5cGVzJztcblxuaW50ZXJmYWNlIEludGVybmFsUGlja2xpc3RJdGVtPFQgPSBhbnk+IGV4dGVuZHMgUGlja0xpc3RJdGVtPFQ+IHtcbiAgICBpbnZpc2libGU/OiBib29sZWFuO1xuICAgIHNlbGVjdGVkPzogYm9vbGVhbjtcbn1cblxudHlwZSBDZGtEcmFnRXZlbnQ8VD4gPSB7IHNvdXJjZTogQ2RrRHJhZzxJbnRlcm5hbFBpY2tsaXN0SXRlbTxUPj4gfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBsaXN0YSBkZSBkdXBsYSBzZWxlw6fDo28gKHBpY2tsaXN0KSBjb20gc3Vwb3J0ZSBhXG4gKiBhcnJhc3RhciBlIHNvbHRhciwgZmlsdHJvLCBjaGVja2JveGVzIGUgdGVtcGxhdGUgY3VzdG9taXrDoXZlbCBwYXJhIGNhZGEgaXRlbS5cbiAqIEVtaXRlIGV2ZW50b3MgYW8gbW92ZXIgaXRlbnMgZW50cmUgYXMgbGlzdGFzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8cy1waWNrbGlzdFxuICogICBbaXRlbnNUb1NlbGVjdF09XCJpdGVuc0Rpc3Bvbml2ZWlzXCJcbiAqICAgW3NlbGVjdGVkSXRlbnNdPVwiaXRlbnNTZWxlY2lvbmFkb3NcIlxuICogICAoc2VsZWN0ZWRJdGVuc0NoYW5nZSk9XCJvblNlbGVjYW9NdWRvdSgkZXZlbnQpXCIgLz5cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBEYXRhXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgRHJhZ0Ryb3BNb2R1bGUsIEZvcm1zTW9kdWxlLCBCdXR0b25Db21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXQsIExvYWRpbmdTdGF0ZU1vZHVsZV0sXG4gICAgc2VsZWN0b3I6ICdzLXBpY2tsaXN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcGlja2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3BpY2tsaXN0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBpY2tsaXN0Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkluaXQge1xuICAgIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIGl0ZW5zIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8OjbyAoY29sdW5hIGVzcXVlcmRhKS4gQGRlZmF1bHQgW10gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpdGVuc1RvU2VsZWN0OiBQaWNrTGlzdEl0ZW08VD5bXSA9IFtdO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBMaXN0YSBkZSBpdGVucyBqw6Egc2VsZWNpb25hZG9zIChjb2x1bmEgZGlyZWl0YSkuIEBkZWZhdWx0IFtdICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVuczogUGlja0xpc3RJdGVtPFQ+W10gPSBbXTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUsOzdHVsbyBkbyB0w610dWxvIGRhIGxpc3RhIGRlIGRpc3BvbsOtdmVpcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdmFpbGFibGVJdGVuc0xhYmVsPzogc3RyaW5nO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBQbGFjZWhvbGRlciBkYSBidXNjYSBuYSBsaXN0YSBkZSBkaXNwb27DrXZlaXMuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXZhaWxhYmxlSXRlbnNQbGFjZWhvbGRlcj86IHN0cmluZztcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUsOzdHVsbyBkbyBib3TDo28gZGUgYWRpY2lvbmFyIGl0ZW5zIHNlbGVjaW9uYWRvcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhZGRTZWxlY3RlZEl0ZW5zTGFiZWw/OiBzdHJpbmc7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFLDs3R1bG8gZG8gYm90w6NvIGRlIGFkaWNpb25hciB0b2RvcyBvcyBpdGVucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhZGRBbGxJdGVuc0xhYmVsPzogc3RyaW5nO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBSw7N0dWxvIGRvIHTDrXR1bG8gZGEgbGlzdGEgZGUgc2VsZWNpb25hZG9zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkSXRlbnNMYWJlbD86IHN0cmluZztcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUGxhY2Vob2xkZXIgZGEgYnVzY2EgbmEgbGlzdGEgZGUgc2VsZWNpb25hZG9zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkSXRlbnNQbGFjZWhvbGRlcj86IHN0cmluZztcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gUsOzdHVsbyBkbyBib3TDo28gZGUgcmVtb3ZlciBpdGVucyBzZWxlY2lvbmFkb3MuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmVtb3ZlU2VsZWN0ZWRJdGVtc0xhYmVsPzogc3RyaW5nO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBSw7N0dWxvIGRvIGJvdMOjbyBkZSByZW1vdmVyIHRvZG9zIG9zIGl0ZW5zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlbW92ZUFsbEl0ZW1zTGFiZWw/OiBzdHJpbmc7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIGNoZWNrYm94IG5vcyBpdGVucyBkYXMgbGlzdGFzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dDaGVja2JveCA9IGZhbHNlO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBQcm9wcmllZGFkZSB1c2FkYSBwYXJhIGZpbHRyYXIgb3MgaXRlbnMgZGFzIGxpc3Rhcy4gQGRlZmF1bHQgJycgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJCeSA9ICcnO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBvIGNhcnJlZ2FtZW50byBwcmVndWnDp29zbyAobGF6eSBsb2FkKSBwYXJhIGFzIGxpc3Rhcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBsYXp5TG9hZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTsO6bWVybyBkZSBsaW5oYXMgYSBzZXJlbSBleGliaWRhcyBwb3IgcMOhZ2luYSBjYXNvIG8gbGF6eUxvYWQgZXN0ZWphIGhhYmlsaXRhZG8uIEBkZWZhdWx0IDEwICovXG4gICAgcm93cyA9IGlucHV0PG51bWJlcj4oMTApO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBGdW7Dp8OjbyBsb2FkZXIgcGFyYSBhIGxpc3RhIGRlIGRpc3BvbsOtdmVpcyAodG8tc2VsZWN0KS4gUXVhbmRvIGZvcm5lY2lkYSwgbyBjb21wb25lbnRlIGdlcmVuY2lhIGludGVybmFtZW50ZSBwYWdpbmHDp8OjbywgbG9hZGluZyBlIHJhY2UgY29uZGl0aW9ucy4gKi9cbiAgICBzb3VyY2VMb2FkZXIgPSBpbnB1dDxQaWNrbGlzdExvYWRlcjxUPj4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRnVuw6fDo28gbG9hZGVyIHBhcmEgYSBsaXN0YSBkZSBzZWxlY2lvbmFkb3MgKHNlbGVjdGVkKS4gUXVhbmRvIGZvcm5lY2lkYSwgbyBjb21wb25lbnRlIGdlcmVuY2lhIGludGVybmFtZW50ZSBwYWdpbmHDp8OjbywgbG9hZGluZyBlIHJhY2UgY29uZGl0aW9ucy4gKi9cbiAgICB0YXJnZXRMb2FkZXIgPSBpbnB1dDxQaWNrbGlzdExvYWRlcjxUPj4oKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfbG9hZGluZ1RhcmdldCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2xvYWRpbmdTb3VyY2UgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIHF1YW5kbyB1bSBpdGVtIMOpIG1vdmlkbyBlbnRyZSBhcyBsaXN0YXMgZSBvIGxhenkgbG9hZCBlc3TDoSBoYWJpbGl0YWRvLiAqL1xuICAgIG5vZGVNb3ZlZCA9IG91dHB1dDxQaWNrbGlzdEl0ZW1Nb3ZlPFQ+PigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIHF1YW5kbyBhIGxpc3RhIGRlIHNlbGVjaW9uYWRvcyBtdWRhLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gYSBsaXN0YSBkZSBkaXNwb27DrXZlaXMgbXVkYS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgaXRlbnNUb1NlbGVjdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgICBwdWJsaWMgYXZhaWxhYmxlSXRlbnNGaWx0ZXIgPSAnJztcblxuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW5zRmlsdGVyID0gJyc7XG5cbiAgICBwdWJsaWMgaXRlbVRvU2VsZWN0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPFQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgaXRlbVNlbGVjdGVkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPFQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcm90ZWN0ZWQgbG9nb0luZGljYXRvciA9IExvYWRpbmdTdGF0ZUluZGljYXRvcnMuTG9nbztcblxuICAgIHByb3RlY3RlZCBpdGVuc1RvU2VsZWN0RmlsdGVyVXRpbDoge1xuICAgICAgICBhbGxJdGVuc1NlbGVjdGVkOiBib29sZWFuO1xuICAgICAgICByYXdJdGVuc1RvU2VsZWN0OiBJbnRlcm5hbFBpY2tsaXN0SXRlbVtdO1xuICAgICAgICBmaWx0ZXJlZEl0ZW5zVG9TZWxlY3Q6IEludGVybmFsUGlja2xpc3RJdGVtW107XG4gICAgfSA9IHtcbiAgICAgICAgYWxsSXRlbnNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHJhd0l0ZW5zVG9TZWxlY3Q6IFtdLFxuICAgICAgICBmaWx0ZXJlZEl0ZW5zVG9TZWxlY3Q6IFtdLFxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWw6IHtcbiAgICAgICAgYWxsSXRlbnNTZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgICAgcmF3U2VsZWN0ZWRJdGVuczogSW50ZXJuYWxQaWNrbGlzdEl0ZW1bXTtcbiAgICAgICAgZmlsdGVyZWRTZWxlY3RlZEl0ZW5zOiBJbnRlcm5hbFBpY2tsaXN0SXRlbVtdO1xuICAgIH0gPSB7XG4gICAgICAgIGFsbEl0ZW5zU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICByYXdTZWxlY3RlZEl0ZW5zOiBbXSxcbiAgICAgICAgZmlsdGVyZWRTZWxlY3RlZEl0ZW5zOiBbXSxcbiAgICB9O1xuXG4gICAgcHVibGljIHNlbGVjdGVkSXRlbnNNYXA6IFNldDxJbnRlcm5hbFBpY2tsaXN0SXRlbT4gPSBuZXcgU2V0KCk7XG4gICAgcHVibGljIGl0ZW5zVG9TZWxlY3RJZCA9IHJhbmRvbUhhc2goJ2l0ZW5zVG9TZWxlY3QnKTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVuc0lkID0gcmFuZG9tSGFzaCgnc2VsZWN0ZWRJdGVucycpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc291cmNlRmlsdGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldEZpbHRlclN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VMb2FkU3ViamVjdCA9IG5ldyBTdWJqZWN0PFBpY2tsaXN0TGF6eUxvYWRFdmVudD4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldExvYWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8UGlja2xpc3RMYXp5TG9hZEV2ZW50PigpO1xuICAgIHByaXZhdGUgX2ludGVybmFsVG90YWxTb3VyY2UgPSAwO1xuICAgIHByaXZhdGUgX2ludGVybmFsVG90YWxUYXJnZXQgPSAwO1xuICAgIHByaXZhdGUgc291cmNlQ3VycmVudFBhZ2UgPSAwO1xuICAgIHByaXZhdGUgdGFyZ2V0Q3VycmVudFBhZ2UgPSAwO1xuXG4gICAgcHJpdmF0ZSBfbG9nRXJyb3JUZW1wbGF0ZSA9IHRydWU7XG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBwcml2YXRlIHRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlRGlyZWN0aXZlPiB8IG51bGwgPSBudWxsO1xuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1Ub1NlbGVjdFRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZXM/LmZpbmQoKHgpID0+IHgudHlwZSA9PT0gJ2l0ZW0tdG8tc2VsZWN0Jyk/LnRlbXBsYXRlID8/IG51bGw7XG4gICAgICAgIHRoaXMuaXRlbVNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlcz8uZmluZCgoeCkgPT4geC50eXBlID09PSAnc2VsZWN0ZWQtaXRlbScpPy50ZW1wbGF0ZSA/PyBudWxsO1xuICAgICAgICBpZiAodGhpcy5fbG9nRXJyb3JUZW1wbGF0ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1Ub1NlbGVjdFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTWlzc2luZyB0ZW1wbGF0ZSBmb3IgJ2l0ZW0tdG8tc2VsZWN0JyBhZGQgdGhpcyB0ZW1wbGF0ZSB1c2luZyBzVGVtcGxhdGUgZGlyZWN0aXZlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1TZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTWlzc2luZyB0ZW1wbGF0ZSBmb3IgJ3NlbGVjdGVkLWl0ZW0nIGFkZCB0aGlzIHRlbXBsYXRlIHVzaW5nIHNUZW1wbGF0ZSBkaXJlY3RpdmUuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldHVwTG9hZGVyUGlwZWxpbmVzKCk7XG4gICAgICAgIHRoaXMuc2V0dXBMYXp5TG9hZEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNldHVwRmlsdGVyRGVib3VuY2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBjaGFuZ2VkSXRlbnNUb1NlbGVjdCA9IGNoYW5nZXNbJ2l0ZW5zVG9TZWxlY3QnXTtcbiAgICAgICAgY29uc3QgY2hhbmdlZFNlbGVjdGVkSXRlbnMgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZW5zJ107XG4gICAgICAgIGlmIChjaGFuZ2VkSXRlbnNUb1NlbGVjdCAmJiAhdGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsID0ge1xuICAgICAgICAgICAgICAgIGFsbEl0ZW5zU2VsZWN0ZWQ6IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwuYWxsSXRlbnNTZWxlY3RlZCB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICByYXdJdGVuc1RvU2VsZWN0OiB0aGlzLml0ZW5zVG9TZWxlY3QsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRJdGVuc1RvU2VsZWN0OiB0aGlzLml0ZW5zVG9TZWxlY3QsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZWRJdGVuc1RvU2VsZWN0ICYmIHRoaXMubGF6eUxvYWQoKSkge1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0ID0gW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLml0ZW5zVG9TZWxlY3QsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwuYWxsSXRlbnNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrQWxsU2VsZWN0ZWRJdGVuc0NoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbnNUb1NlbGVjdElkLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCA9IFsuLi50aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3RdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWRTZWxlY3RlZEl0ZW5zICYmICF0aGlzLmxhenlMb2FkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwgPSB7XG4gICAgICAgICAgICAgICAgYWxsSXRlbnNTZWxlY3RlZDogdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkU2VsZWN0ZWRJdGVuczogdGhpcy5zZWxlY3RlZEl0ZW5zLFxuICAgICAgICAgICAgICAgIHJhd1NlbGVjdGVkSXRlbnM6IHRoaXMuc2VsZWN0ZWRJdGVucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlZFNlbGVjdGVkSXRlbnMgJiYgdGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnMgPSBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRJdGVucyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tBbGxTZWxlY3RlZEl0ZW5zQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLmFsbEl0ZW5zU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zSWQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zID0gWy4uLnRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVuc107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVTZWxlY3RlZChpbnRlcm5hbFBpY2tsaXN0SXRlbTogSW50ZXJuYWxQaWNrbGlzdEl0ZW0sIGNvbnRhaW5lckxpc3RJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChpbnRlcm5hbFBpY2tsaXN0SXRlbS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZEl0ZW5zQnlMaXN0SWQodGhpcy5nZXRPcHBvc2l0aXZlSWQoY29udGFpbmVyTGlzdElkKSk7XG4gICAgICAgIGludGVybmFsUGlja2xpc3RJdGVtLnNlbGVjdGVkID0gIWludGVybmFsUGlja2xpc3RJdGVtLnNlbGVjdGVkO1xuICAgICAgICBpZiAoaW50ZXJuYWxQaWNrbGlzdEl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc01hcC5hZGQoaW50ZXJuYWxQaWNrbGlzdEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zTWFwLmRlbGV0ZShpbnRlcm5hbFBpY2tsaXN0SXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250YWluZXJGaWx0ZXJVdGlsID1cbiAgICAgICAgICAgIGNvbnRhaW5lckxpc3RJZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW5zSWQgPyB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsIDogdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbDtcbiAgICAgICAgY29uc3QgaXNBbGxTZWxlY3RlZCA9IHRoaXMuX2NoZWNrQWxsU2VsZWN0ZWRCeUxpc3QoXG4gICAgICAgICAgICBjb250YWluZXJMaXN0SWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVuc0lkXG4gICAgICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLmZpbHRlcmVkU2VsZWN0ZWRJdGVuc1xuICAgICAgICAgICAgICAgIDogdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmxhenlMb2FkKCkgJiYgIWludGVybmFsUGlja2xpc3RJdGVtLnNlbGVjdGVkICYmIGNvbnRhaW5lckZpbHRlclV0aWwuYWxsSXRlbnNTZWxlY3RlZCkge1xuICAgICAgICAgICAgY29udGFpbmVyRmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXp5TG9hZCgpICYmIGlzQWxsU2VsZWN0ZWQgJiYgY29udGFpbmVyRmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkICE9PSBpc0FsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb250YWluZXJGaWx0ZXJVdGlsLmFsbEl0ZW5zU2VsZWN0ZWQgPSBpc0FsbFNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICByZW1vdmUoYWxsID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgaXRlbnMgPSBmaWx0ZXJFbmFibGVkPFQ+KGFsbCA/IHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucyA6IHRoaXMuc2VsZWN0ZWRJdGVuc01hcCk7XG4gICAgICAgIGlmICghaXRlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWxsRWxlbWVudHMgPSB0aGlzLmxhenlMb2FkKCkgPyBbXSA6IHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucztcbiAgICAgICAgY29uc3QgcmV2ZXJ0QWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zID0gW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucyxcbiAgICAgICAgICAgICAgICAuLi5pdGVucy5tYXAoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh4KSA9PiAhaXRlbnMuaW5jbHVkZXMoeCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMgPSB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnM7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3Q7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVucyA9IHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucztcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3Q7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJTZWxlY3RlZEl0ZW5zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVuc1RvU2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0RGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5vZGVNb3ZlZC5lbWl0KHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3RvLXNlbGVjdCcsXG4gICAgICAgICAgICBpdGVtczogYWxsID8gYWxsRWxlbWVudHMgOiBwYXJzZVZhbHVlRW1pdChBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWRJdGVuc01hcCkpLFxuICAgICAgICAgICAgbW92ZUFsbDogYWxsLFxuICAgICAgICAgICAgcmV2ZXJ0QWN0aW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0ID0gW1xuICAgICAgICAgICAgLi4udGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0LFxuICAgICAgICAgICAgLi4uaXRlbnMubWFwKChpdGVtUmVtb3ZlKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbVJlbW92ZS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc01hcC5kZWxldGUoaXRlbVJlbW92ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1SZW1vdmU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zID0gdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zLmZpbHRlcihcbiAgICAgICAgICAgICh4KSA9PiAhaXRlbnMuaW5jbHVkZXMoeCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuYWxsSXRlbnNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCA9IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zID0gdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0ID0gdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zID0gdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTZWxlY3RlZEl0ZW5zKCk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW5zVG9TZWxlY3QoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdERhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgYWRkKGFsbCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGl0ZW5zID0gZmlsdGVyRW5hYmxlZDxUPihhbGwgPyB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QgOiB0aGlzLnNlbGVjdGVkSXRlbnNNYXApO1xuICAgICAgICBpZiAoIWl0ZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxsRWxlbWVudHMgPSB0aGlzLmxhenlMb2FkKCkgPyBbXSA6IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdDtcbiAgICAgICAgY29uc3QgcmV2ZXJ0QWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0ID0gW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgICAgICAuLi5pdGVucy5tYXAoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuZGVsZXRlKGkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnMgPSB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh4KSA9PiAhaXRlbnMuaW5jbHVkZXMoeCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3Q7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMgPSB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbnNUb1NlbGVjdCA9IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnMgPSB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnM7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJTZWxlY3RlZEl0ZW5zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVuc1RvU2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0RGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5vZGVNb3ZlZC5lbWl0KHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3NlbGVjdGVkJyxcbiAgICAgICAgICAgIGl0ZW1zOiBhbGwgPyBhbGxFbGVtZW50cyA6IHBhcnNlVmFsdWVFbWl0KEFycmF5LmZyb20odGhpcy5zZWxlY3RlZEl0ZW5zTWFwKSksXG4gICAgICAgICAgICBtb3ZlQWxsOiBhbGwsXG4gICAgICAgICAgICByZXZlcnRBY3Rpb24sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnMsXG4gICAgICAgICAgICAuLi5pdGVucy5tYXAoKGl0ZW1SZW1vdmUpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtUmVtb3ZlLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zTWFwLmRlbGV0ZShpdGVtUmVtb3ZlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVJlbW92ZTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QuZmlsdGVyKFxuICAgICAgICAgICAgKHgpID0+ICFpdGVucy5pbmNsdWRlcyh4KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5hbGxJdGVuc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmxhenlMb2FkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zID0gdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zO1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnMgPSB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnM7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3Q7XG4gICAgICAgICAgICB0aGlzLmZpbHRlclNlbGVjdGVkSXRlbnMoKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySXRlbnNUb1NlbGVjdCgpO1xuICAgICAgICAgICAgdGhpcy5lbWl0RGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJJdGVuc1RvU2VsZWN0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nU291cmNlLnNldCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlRmlsdGVyU3ViamVjdC5uZXh0KHRoaXMuYXZhaWxhYmxlSXRlbnNGaWx0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWFyY2hUZXJtID0gdGhpcy5hdmFpbGFibGVJdGVuc0ZpbHRlci50cmltKCk7XG4gICAgICAgIGlmIChzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCA9IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IGNvbXBhcmVTdHJpbmdzKGl0ZW0uZGF0YVt0aGlzLmZpbHRlckJ5XSwgc2VhcmNoVGVybSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QgPSB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGZpbHRlclNlbGVjdGVkSXRlbnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxhenlMb2FkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdUYXJnZXQuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy50YXJnZXRGaWx0ZXJTdWJqZWN0Lm5leHQodGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VhcmNoVGVybSA9IHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlci50cmltKCk7XG4gICAgICAgIGlmIChzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLmZpbHRlcmVkU2VsZWN0ZWRJdGVucyA9IHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IGNvbXBhcmVTdHJpbmdzKGl0ZW0uZGF0YVt0aGlzLmZpbHRlckJ5XSwgc2VhcmNoVGVybSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMgPSB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxJbnRlcm5hbFBpY2tsaXN0SXRlbVtdPikge1xuICAgICAgICBjb25zdCBpc0RpZmZlcmVudENvbnRhaW5lciA9IGV2ZW50LmNvbnRhaW5lciAhPT0gZXZlbnQucHJldmlvdXNDb250YWluZXI7XG4gICAgICAgIGlmICghaXNEaWZmZXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUmVtb3ZlZEl0ZW5zID0gZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVuc0lkO1xuICAgICAgICBpZiAoaXNSZW1vdmVkSXRlbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkRyYWdTdGFydChldmVudDogQ2RrRHJhZ0V2ZW50PFQ+LCBkcmFnTGlzdElkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkSXRlbnNCeUxpc3RJZCh0aGlzLmdldE9wcG9zaXRpdmVJZChkcmFnTGlzdElkKSk7XG4gICAgICAgIGV2ZW50LnNvdXJjZS5kYXRhLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zTWFwLmFkZChldmVudC5zb3VyY2UuZGF0YSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc01hcC5mb3JFYWNoKCh4KSA9PiAoeC5pbnZpc2libGUgPSB0cnVlKSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkRyYWdSZWxlYXNlKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaW52aXNpYmxlID0gZmFsc2UpKTtcbiAgICB9XG5cbiAgICBjaGVja0FsbEF2YWlsYWJsZUl0ZW5zQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tBbGxTZWxlY3RlZEl0ZW5zQ2hhbmdlKFxuICAgICAgICAgICAgY2hlY2tlZCxcbiAgICAgICAgICAgIHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwuZmlsdGVyZWRJdGVuc1RvU2VsZWN0LFxuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0SWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY2hlY2tBbGxTZWxlY3RlZEl0ZW5zQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tBbGxTZWxlY3RlZEl0ZW5zQ2hhbmdlKFxuICAgICAgICAgICAgY2hlY2tlZCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zSWQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25TY3JvbGwoZXZlbnQ6IEV2ZW50LCBsaXN0SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubGF6eUxvYWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgcmVhY2hMaW1pdCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgZWxlbWVudC5zY3JvbGxUb3AgPj0gZWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIGlmICghcmVhY2hMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldDogUGlja2xpc3RUYXJnZXQgPSBsaXN0SWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVuc0lkID8gJ3NlbGVjdGVkJyA6ICd0by1zZWxlY3QnO1xuICAgICAgICBjb25zdCB0YXJnZXRSZWFjaExpbWl0ID1cbiAgICAgICAgICAgIHRhcmdldCA9PT0gJ3NlbGVjdGVkJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMubGVuZ3RoID49IHRoaXMuX2ludGVybmFsVG90YWxUYXJnZXRcbiAgICAgICAgICAgICAgICA6IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwuZmlsdGVyZWRJdGVuc1RvU2VsZWN0Lmxlbmd0aCA+PSB0aGlzLl9pbnRlcm5hbFRvdGFsU291cmNlO1xuICAgICAgICBpZiAodGFyZ2V0UmVhY2hMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZE5leHRQYWdlKHRhcmdldCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpc2FibGVTZWxlY3RlZEl0ZW5zQ2hlY2tib3goKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJFbmFibGVkPFQ+KHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zKS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgZ2V0IGRpc2FibGVJdGVuc1RvU2VsZWN0Q2hlY2tib3goKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJFbmFibGVkPFQ+KHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwuZmlsdGVyZWRJdGVuc1RvU2VsZWN0KS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgZ2V0IGl0ZW5zVG9TZWxlY3RBbGxTZWxlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrQWxsU2VsZWN0ZWRCeUxpc3QodGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QpO1xuICAgIH1cblxuICAgIGdldCBzZWxlY3RlZEl0ZW5zQWxsU2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja0FsbFNlbGVjdGVkQnlMaXN0KHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzU2VsZWN0ZWRJdGVucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVuc01hcC5zaXplID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVjYXJyZWdhIGFzIGxpc3RhcyBhcMOzcyBhIGNvbmZpcm1hw6fDo28gZGUgdW1hIG1vdmltZW50YcOnw6NvIHBlbG8gYmFja2VuZC5cbiAgICAgKlxuICAgICAqICoqUG9yIHF1ZSB1c2FyPyoqXG4gICAgICogQW8gbW92ZXIgaXRlbnMsIG8gY29tcG9uZW50ZSBhdHVhbGl6YSBhIFVJIGRlIGZvcm1hIG90aW1pc3RhIOKAlCBvcyBpdGVucyBzw6NvIG1vdmlkb3NcbiAgICAgKiBpbWVkaWF0YW1lbnRlIGFudGVzIGRhIGNvbmZpcm1hw6fDo28gZG8gc2Vydmlkb3IuIEFww7NzIG8gYmFja2VuZCBjb25maXJtYXIgYSBvcGVyYcOnw6NvLFxuICAgICAqIGNoYW1lIGByZXNldExpc3RgIHBhcmEgbGltcGFyIGUgcmVjYXJyZWdhciBhcyBsaXN0YXMgYWZldGFkYXMgZG8gemVybywgZ2FyYW50aW5kbyBxdWVcbiAgICAgKiBvIGVzdGFkbyBkYSBVSSByZWZsaXRhIG9zIGRhZG9zIHJlYWlzIHBlcnNpc3RpZG9zLlxuICAgICAqXG4gICAgICogKipPIHF1ZSBlc3BlcmE/KipcbiAgICAgKiBSZWNlYmUgbyBvYmpldG8gYFBpY2tsaXN0SXRlbU1vdmU8VD5gIGVtaXRpZG8gcGVsbyBvdXRwdXQgYChub2RlTW92ZWQpYC4gTyBjb21wb25lbnRlXG4gICAgICogdXRpbGl6YSBgbm9kZS5kaXJlY3Rpb25gIHBhcmEgZGV0ZXJtaW5hciBxdWFsIGxpc3RhIHJlY2FycmVnYXIgKGEgbGlzdGEgZGUgZGVzdGlubyBkYVxuICAgICAqIG1vdmltZW50YcOnw6NvKSBlIGBub2RlLm1vdmVBbGxgIHBhcmEgdmVyaWZpY2FyIHNlIGEgb3JpZ2VtIHRhbWLDqW0gZGV2ZSBzZXIgcmVjYXJyZWdhZGFcbiAgICAgKiAocG9yIGV4ZW1wbG8sIGFvIG1vdmVyIHRvZG9zIG9zIGl0ZW5zIGRlIHVtYSBsaXN0YSBwYXJhIG91dHJhLCBhbWJhcyBmaWNhbSBjb20gZXN0YWRvXG4gICAgICogYWx0ZXJhZG8gbm8gYmFja2VuZCkuXG4gICAgICpcbiAgICAgKiAqKk8gcXVlIGZhej8qKlxuICAgICAqIC0gUmVzZXRhIG8gY29udGFkb3IgZGUgcMOhZ2luYSBkYSBsaXN0YSBkZSBkZXN0aW5vIHBhcmEgYDBgIChwcmltZWlyYSBww6FnaW5hKS5cbiAgICAgKiAtIExpbXBhIHRvZG9zIG9zIGl0ZW5zIGNhcnJlZ2Fkb3MgbmEgbGlzdGEgZGUgZGVzdGluby5cbiAgICAgKiAtIERpc3BhcmEgaW1lZGlhdGFtZW50ZSBvIGNhcnJlZ2FtZW50byBkYSBwcmltZWlyYSBww6FnaW5hIHZpYSBgc291cmNlTG9hZGVyYC9gdGFyZ2V0TG9hZGVyYC5cbiAgICAgKiAtIFNlIGBub2RlLm1vdmVBbGwgPT09IHRydWVgLCByZXBldGUgbyBwcm9jZXNzbyBwYXJhIGEgbGlzdGEgZGUgb3JpZ2VtLlxuICAgICAqXG4gICAgICogKipFeGVtcGxvIGRlIHVzbzoqKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBub2RlTW92ZWQobm9kZTogUGlja2xpc3RJdGVtTW92ZTxNeUl0ZW0+KTogdm9pZCB7XG4gICAgICogICAgIHRoaXMuc2VydmljZS5tb3ZlSXRlbXMobm9kZSkuc3Vic2NyaWJlKHtcbiAgICAgKiAgICAgICAgIG5leHQ6ICgpID0+IHRoaXMubXlQaWNrbGlzdCgpLnJlc2V0TGlzdChub2RlKSxcbiAgICAgKiAgICAgICAgIGVycm9yOiAoKSA9PiBub2RlLnJldmVydEFjdGlvbigpLFxuICAgICAqICAgICB9KTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIE8gb2JqZXRvIGRlIG1vdmltZW50YcOnw6NvIGVtaXRpZG8gcGVsbyBvdXRwdXQgYChub2RlTW92ZWQpYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRMaXN0KG5vZGU6IFBpY2tsaXN0SXRlbU1vdmU8VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmxhenlMb2FkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc2V0TGlzdEJ5VGFyZ2V0KG5vZGUuZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKG5vZGUubW92ZUFsbCkge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRMaXN0QnlUYXJnZXQobm9kZS5kaXJlY3Rpb24gPT09ICdzZWxlY3RlZCcgPyAndG8tc2VsZWN0JyA6ICdzZWxlY3RlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXRMaXN0QnlUYXJnZXQodGFyZ2V0OiBQaWNrbGlzdFRhcmdldCk6IHZvaWQge1xuICAgICAgICBpZiAodGFyZ2V0ID09PSAnc2VsZWN0ZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldEN1cnJlbnRQYWdlID0gLTE7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFRvdGFsVGFyZ2V0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVucyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zID0gW107XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLmZpbHRlcmVkU2VsZWN0ZWRJdGVucyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDdXJyZW50UGFnZSA9IC0xO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxUb3RhbFNvdXJjZSA9IDA7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3QgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdCA9IFtdO1xuICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5maWx0ZXJlZEl0ZW5zVG9TZWxlY3QgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmxvYWROZXh0UGFnZSh0YXJnZXQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja0FsbFNlbGVjdGVkQnlMaXN0KGxpc3Q6IEludGVybmFsUGlja2xpc3RJdGVtW10pIHtcbiAgICAgICAgY29uc3QgX2xpc3RJdGVucyA9IGZpbHRlckVuYWJsZWQ8VD4obGlzdCk7XG4gICAgICAgIGlmICghX2xpc3RJdGVucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfbGlzdEl0ZW5zLmV2ZXJ5KCh4KSA9PiB4LnNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBMb2FkZXJQaXBlbGluZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc291cmNlTG9hZGVyICYmICF0aGlzLnRhcmdldExvYWRlciAmJiB0aGlzLl9sb2dFcnJvclRlbXBsYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGBMYXp5IGxvYWQgaXMgZW5hYmxlZCBidXQgbm8gbG9hZGVyIGZ1bmN0aW9uIHdhcyBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgYXQgbGVhc3Qgb25lIGxvYWRlciBmdW5jdGlvbiB1c2luZyAnc291cmNlTG9hZGVyJyBvciAndGFyZ2V0TG9hZGVyJyBpbnB1dC5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZUxvYWRlcigpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxvYWRTdWJqZWN0XG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdTb3VyY2Uuc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlTG9hZGVyKCkhKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGl0ZW1zLCB0b3RhbFJlY29yZHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFRvdGFsU291cmNlID0gdG90YWxSZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLnJhd0l0ZW5zVG9TZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwuYWxsSXRlbnNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tBbGxTZWxlY3RlZEl0ZW5zQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0RmlsdGVyVXRpbC5yYXdJdGVuc1RvU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbnNUb1NlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ1NvdXJjZS5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50YXJnZXRMb2FkZXIoKSkge1xuICAgICAgICAgICAgdGhpcy50YXJnZXRMb2FkU3ViamVjdFxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nVGFyZ2V0LnNldCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldExvYWRlcigpIShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBpdGVtcywgdG90YWxSZWNvcmRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxUb3RhbFRhcmdldCA9IHRvdGFsUmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLmFsbEl0ZW5zU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrQWxsU2VsZWN0ZWRJdGVuc0NoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5maWx0ZXJlZFNlbGVjdGVkSXRlbnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLnJhd1NlbGVjdGVkSXRlbnMsXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdUYXJnZXQuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cEZpbHRlckRlYm91bmNlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubGF6eUxvYWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zb3VyY2VGaWx0ZXJTdWJqZWN0XG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQ3VycmVudFBhZ2UgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkTmV4dFBhZ2UoJ3RvLXNlbGVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy50YXJnZXRGaWx0ZXJTdWJqZWN0XG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0Q3VycmVudFBhZ2UgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwucmF3U2VsZWN0ZWRJdGVucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXJVdGlsLmZpbHRlcmVkU2VsZWN0ZWRJdGVucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkTmV4dFBhZ2UoJ3NlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwTGF6eUxvYWRFdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZE5leHRQYWdlKCd0by1zZWxlY3QnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZE5leHRQYWdlKCdzZWxlY3RlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWROZXh0UGFnZSh0YXJnZXQ6IFBpY2tsaXN0VGFyZ2V0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvdGFsUmVnaXN0ZXJzID0gdGFyZ2V0ID09PSAnc2VsZWN0ZWQnID8gdGhpcy5faW50ZXJuYWxUb3RhbFRhcmdldCA6IHRoaXMuX2ludGVybmFsVG90YWxTb3VyY2U7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTWF0aC5jZWlsKHRvdGFsUmVnaXN0ZXJzIC8gdGhpcy5yb3dzKCkpO1xuXG4gICAgICAgIGlmICh0YXJnZXQgPT09ICdzZWxlY3RlZCcgJiYgdGhpcy50YXJnZXRDdXJyZW50UGFnZSA8IGxhc3RQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldEN1cnJlbnRQYWdlKys7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSAndG8tc2VsZWN0JyAmJiB0aGlzLnNvdXJjZUN1cnJlbnRQYWdlIDwgbGFzdFBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ3VycmVudFBhZ2UrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdEN1cnJlbnRQYWdlKHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0Q3VycmVudFBhZ2UodGFyZ2V0OiBQaWNrbGlzdFRhcmdldCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0YXJnZXQgPT09ICdzZWxlY3RlZCcgPyB0aGlzLnNlbGVjdGVkSXRlbnNGaWx0ZXIgOiB0aGlzLmF2YWlsYWJsZUl0ZW5zRmlsdGVyO1xuICAgICAgICBjb25zdCBwYWdlID0gdGFyZ2V0ID09PSAnc2VsZWN0ZWQnID8gdGhpcy50YXJnZXRDdXJyZW50UGFnZSA6IHRoaXMuc291cmNlQ3VycmVudFBhZ2U7XG5cbiAgICAgICAgY29uc3QgZXZlbnQ6IFBpY2tsaXN0TGF6eUxvYWRFdmVudCA9IHsgdGFyZ2V0LCBwYWdlLCBmaWx0ZXIsIHBhZ2VTaXplOiB0aGlzLnJvd3MoKSB9O1xuXG4gICAgICAgIGlmICh0YXJnZXQgPT09ICdzZWxlY3RlZCcpIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0TG9hZFN1YmplY3QubmV4dChldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxvYWRTdWJqZWN0Lm5leHQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hlY2tBbGxTZWxlY3RlZEl0ZW5zQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4sIGxpc3Q6IEludGVybmFsUGlja2xpc3RJdGVtW10sIGxpc3RJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZEl0ZW5zQnlMaXN0SWQobGlzdElkID09PSB0aGlzLnNlbGVjdGVkSXRlbnNJZCA/IHRoaXMuaXRlbnNUb1NlbGVjdElkIDogdGhpcy5zZWxlY3RlZEl0ZW5zSWQpO1xuICAgICAgICBmaWx0ZXJFbmFibGVkPFQ+KGxpc3QpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuYWRkKGl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbnNNYXAuZGVsZXRlKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxpc3RJZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW5zSWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuYWxsSXRlbnNTZWxlY3RlZCA9IGNoZWNrZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmFsbEl0ZW5zU2VsZWN0ZWQgPSBjaGVja2VkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuc2VsZWN0ZWRJdGVuc0J5TGlzdElkKGxpc3RJZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGNsZWFyTGlzdCA9IHRoaXMuZ2V0QWxsRWxlbWVudHNCeUxpc3RJZChsaXN0SWQpO1xuICAgICAgICBjbGVhckxpc3QuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICAgICAgeC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW5zTWFwLmRlbGV0ZSh4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFsbEVsZW1lbnRzQnlMaXN0SWQobGlzdElkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RJZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW5zSWRcbiAgICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEl0ZW5zRmlsdGVyVXRpbC5yYXdTZWxlY3RlZEl0ZW5zXG4gICAgICAgICAgICA6IHRoaXMuaXRlbnNUb1NlbGVjdEZpbHRlclV0aWwucmF3SXRlbnNUb1NlbGVjdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9wcG9zaXRpdmVJZChsaXN0SWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbGlzdElkID09PSB0aGlzLnNlbGVjdGVkSXRlbnNJZCA/IHRoaXMuaXRlbnNUb1NlbGVjdElkIDogdGhpcy5zZWxlY3RlZEl0ZW5zSWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0RGF0YSgpIHtcbiAgICAgICAgdGhpcy5pdGVuc1RvU2VsZWN0Q2hhbmdlLmVtaXQocGFyc2VWYWx1ZUVtaXQodGhpcy5pdGVuc1RvU2VsZWN0KSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVuc0NoYW5nZS5lbWl0KHBhcnNlVmFsdWVFbWl0KHRoaXMuc2VsZWN0ZWRJdGVucykpO1xuICAgIH1cbn1cblxuY29uc3Qgbm9ybWFsaXplU3RyaW5nID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gc3RyaW5ncyBieSBub3JtYWxpemluZyB0aGVtIHRvIGEgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgYWNjZW50LWZyZWUgZm9ybSxcbiAqIGFuZCBjaGVja3MgaWYgdGhlIG1haW4gc3RyaW5nIGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcuXG4gKlxuICogQHBhcmFtIG1haW5TdHJpbmcgLSBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkLlxuICogQHBhcmFtIHN1YnN0cmluZyAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciB3aXRoaW4gdGhlIG1haW4gc3RyaW5nLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm9ybWFsaXplZCBtYWluIHN0cmluZyBjb250YWlucyB0aGUgbm9ybWFsaXplZCBzdWJzdHJpbmcuXG4gKi9cblxuY29uc3QgY29tcGFyZVN0cmluZ3MgPSAobWFpblN0cmluZzogc3RyaW5nLCBzdWJzdHJpbmc6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBub3JtYWxpemVTdHJpbmcobWFpblN0cmluZykuaW5jbHVkZXMobm9ybWFsaXplU3RyaW5nKHN1YnN0cmluZykpO1xufTtcblxuY29uc3QgZmlsdGVyRW5hYmxlZCA9IDxUPihsaXN0OiBQaWNrTGlzdEl0ZW08VD5bXSB8IFNldDxJbnRlcm5hbFBpY2tsaXN0SXRlbT4pOiBJbnRlcm5hbFBpY2tsaXN0SXRlbVtdID0+IHtcbiAgICBjb25zdCBfbGlzdCA9IGxpc3QgaW5zdGFuY2VvZiBTZXQgPyBBcnJheS5mcm9tKGxpc3QpIDogbGlzdDtcbiAgICByZXR1cm4gX2xpc3QuZmlsdGVyKCh4KSA9PiAheC5kaXNhYmxlZCk7XG59O1xuXG5jb25zdCBtYXBEYXRhID0gPFQ+KGxpc3Q6IFBpY2tMaXN0SXRlbTxUPltdKSA9PiB7XG4gICAgcmV0dXJuIGxpc3QubWFwKCh4KSA9PiB4LmRhdGEpO1xufTtcblxuY29uc3QgcGFyc2VWYWx1ZUVtaXQgPSBwaXBlKGZpbHRlckVuYWJsZWQsIG1hcERhdGEpO1xuXG5leHBvcnQgY29uc3QgcGFyc2VJdGVuc1BpY2tMaXN0ID0gPFQ+KFxuICAgIGFycmF5OiBUW10sXG4gICAgZGlzYWJsZWRGbj86IChpdGVtOiBUKSA9PiBib29sZWFuLFxuICAgIGlkS2V5Pzoga2V5b2YgVCxcbik6IFBpY2tMaXN0SXRlbTxUPltdID0+IHtcbiAgICByZXR1cm4gYXJyYXkubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB4LFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkRm4gPyBkaXNhYmxlZEZuKHgpIDogZmFsc2UsXG4gICAgICAgICAgICBpZDogaWRLZXkgPyBTdHJpbmcoeFtpZEtleV0pIDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn07XG5cbiIsIjxuZy10ZW1wbGF0ZVxuICAgICNwcmV2aWV3UmVuZGVyXG4gICAgbGV0LWl0ZW5zPVwiaXRlbnNcIlxuICAgIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCJcbj5cbiAgICA8c2VjdGlvbiBjbGFzcz1cInBpY2tsaXN0LWl0ZW1zXCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0uZGF0YSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICA8L3NlY3Rpb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgICAjcGlja2xpc3RJdGVuc1JlbmRlclxuICAgIGxldC1pZD1cImlkXCJcbiAgICBsZXQtaXRlbnM9XCJpdGVuc1wiXG4gICAgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIlxuICAgIGxldC1saXN0Q29ubmVjdGVkVG89XCJsaXN0Q29ubmVjdGVkVG9cIlxuICAgIGxldC1pc0xvYWRpbmc9XCJpc0xvYWRpbmdcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwaWNrbGlzdC1pdGVtc1wiXG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJpdGVuc1wiXG4gICAgICAgIFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cImxpc3RDb25uZWN0ZWRUb1wiXG4gICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcbiAgICAgICAgKnNMb2FkaW5nU3RhdGU9XCJ7IGxvYWRpbmc6IGlzTG9hZGluZywgaW5kaWNhdG9yOiBsb2dvSW5kaWNhdG9yIH1cIlxuICAgICAgICAoc2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudCwgaWQpXCJcbiAgICA+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VsZWN0ZWQoaXRlbSwgaWQpXCJcbiAgICAgICAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpZClcIlxuICAgICAgICAgICAgICAgIChjZGtEcmFnUmVsZWFzZWQpPVwib25EcmFnUmVsZWFzZSgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBpY2tsaXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5waWNrbGlzdC1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucGlja2xpc3QtaXRlbS1pbnZpc2libGVdPVwiaXRlbS5pbnZpc2libGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5waWNrbGlzdC1pdGVtLWFjdGl2ZV09XCJpdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dDaGVja2JveCkge1xuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaWNrbGlzdC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBpdGVtOiBpdGVtLmRhdGEsIHNlbGVjdGVkOiBpdGVtLnNlbGVjdGVkLCBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqY2RrRHJhZ1ByZXZpZXc+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJldmlld1JlbmRlcjsgY29udGV4dDogeyBpdGVuczogc2VsZWN0ZWRJdGVuc01hcCwgdGVtcGxhdGU6IHRlbXBsYXRlIH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICAgI2NoZWNrYm94VGl0bGVSZW5kZXJcbiAgICBsZXQtZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgbGV0LWNoZWNrZWQ9XCJjaGVja2VkXCJcbiAgICBsZXQtY2hhbmdlRm49XCJjaGFuZ2VGblwiXG4gICAgbGV0LWlkPVwiaWRcIlxuPlxuICAgIEBpZiAoc2hvd0NoZWNrYm94ICYmICFsYXp5TG9hZCgpKSB7XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1jaGVja2JveFwiXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImNoZWNrZWRcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VGbigkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCJcbiAgICAgICAgLz5cbiAgICB9IEBlbHNlIGlmIChzaG93Q2hlY2tib3ggJiYgbGF6eUxvYWQoKSAmJiBpZCA9PT0gaXRlbnNUb1NlbGVjdElkKSB7XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1jaGVja2JveFwiXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmFsbEl0ZW5zU2VsZWN0ZWRcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGVja0FsbEF2YWlsYWJsZUl0ZW5zQ2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkuY2hlY2tlZClcIlxuICAgICAgICAvPlxuICAgIH0gQGVsc2UgaWYgKHNob3dDaGVja2JveCAmJiBsYXp5TG9hZCgpICYmIGlkID09PSBzZWxlY3RlZEl0ZW5zSWQpIHtcbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cImlucHV0LWNoZWNrYm94XCJcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuYWxsSXRlbnNTZWxlY3RlZFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImNoZWNrQWxsU2VsZWN0ZWRJdGVuc0NoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLmNoZWNrZWQpXCJcbiAgICAgICAgLz5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2IGNsYXNzPVwicGlja2xpc3QtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInBpY2tsaXN0LWl0ZW0tY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwaWNrbGlzdC1ib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaWNrbGlzdC10aXRsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICBAaWYgKCFmaWx0ZXJCeSAmJiAhbGF6eUxvYWQoKSkge1xuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94VGl0bGVSZW5kZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZUl0ZW5zVG9TZWxlY3RDaGVja2JveCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZDogaXRlbnNUb1NlbGVjdEFsbFNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGbjogY2hlY2tBbGxBdmFpbGFibGVJdGVuc0NoYW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaXRlbnNUb1NlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaWNrbGlzdC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBhdmFpbGFibGVJdGVuc0xhYmVsIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYXZhaWxhYmxlLWl0ZW1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChmaWx0ZXJCeSB8fCBsYXp5TG9hZCgpKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tsaXN0LWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dDaGVja2JveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94VGl0bGVSZW5kZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlSXRlbnNUb1NlbGVjdENoZWNrYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZDogaXRlbnNUb1NlbGVjdEFsbFNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRm46IGNoZWNrQWxsQXZhaWxhYmxlSXRlbnNDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpdGVuc1RvU2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhdmFpbGFibGVJdGVuc0ZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJJdGVuc1RvU2VsZWN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUl0ZW5zUGxhY2Vob2xkZXIgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5waWNrbGlzdC1wbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBwaWNrbGlzdEl0ZW5zUmVuZGVyO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogaXRlbnNUb1NlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbnM6IGl0ZW5zVG9TZWxlY3RGaWx0ZXJVdGlsLmZpbHRlcmVkSXRlbnNUb1NlbGVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBpdGVtVG9TZWxlY3RUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RDb25uZWN0ZWRUbzogc2VsZWN0ZWRJdGVuc0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBfbG9hZGluZ1NvdXJjZSgpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYWRkU2VsZWN0ZWRJdGVuc0xhYmVsIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYWRkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICByaWdodEljb25DbGFzcz1cImZhIGZhLWZ3IGZhLWFycm93LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1NlbGVjdGVkSXRlbnNcIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImFkZCgpXCJcbiAgICAgICAgICAgICAgICBbYXV4aWxpYXJ5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbY2FyZXRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJhZGRBbGxJdGVuc0xhYmVsIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYWRkX2FsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHByaW9yaXR5PVwibGlua1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwiYWRkKHRydWUpXCJcbiAgICAgICAgICAgICAgICBbYXV4aWxpYXJ5XT1cImZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwaWNrbGlzdC1pdGVtLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2xpc3QtYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2xpc3QtdGl0bGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgQGlmICghZmlsdGVyQnkgJiYgIWxhenlMb2FkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFRpdGxlUmVuZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVTZWxlY3RlZEl0ZW5zQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkSXRlbnNBbGxTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRm46IGNoZWNrQWxsU2VsZWN0ZWRJdGVuc0NoYW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2VsZWN0ZWRJdGVuc0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaWNrbGlzdC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZEl0ZW5zTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3RlZC1pdGVtcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAoZmlsdGVyQnkgfHwgbGF6eUxvYWQoKSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaWNrbGlzdC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93Q2hlY2tib3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFRpdGxlUmVuZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZVNlbGVjdGVkSXRlbnNDaGVja2JveCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IHNlbGVjdGVkSXRlbnNBbGxTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUZuOiBjaGVja0FsbFNlbGVjdGVkSXRlbnNDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZEl0ZW5zSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEl0ZW5zRmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclNlbGVjdGVkSXRlbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVuc1BsYWNlaG9sZGVyIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMucGlja2xpc3QtcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgIHBpY2tsaXN0SXRlbnNSZW5kZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZEl0ZW5zSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVuczogc2VsZWN0ZWRJdGVuc0ZpbHRlclV0aWwuZmlsdGVyZWRTZWxlY3RlZEl0ZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGl0ZW1TZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdENvbm5lY3RlZFRvOiBpdGVuc1RvU2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IF9sb2FkaW5nVGFyZ2V0KCksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZW1vdmVTZWxlY3RlZEl0ZW1zTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5yZW1vdmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwcmlvcml0eT1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWZ3IGZhLWFycm93LWxlZnRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzU2VsZWN0ZWRJdGVuc1wiXG4gICAgICAgICAgICAgICAgW2F1eGlsaWFyeV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwicmVtb3ZlKClcIlxuICAgICAgICAgICAgICAgIFtjYXJldF09XCJmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3MtYnV0dG9uPlxuICAgICAgICAgICAgPHMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cInJlbW92ZUFsbEl0ZW1zTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5yZW1vdmVfYWxsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJsaW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJyZW1vdmUodHJ1ZSlcIlxuICAgICAgICAgICAgICAgIFthdXhpbGlhcnldPVwiZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuIl19