bit-ng-library 14.0.6 → 14.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,6 +26,12 @@ To get more help on the Angular CLI use `ng help` or go check out the [Angular C
26
26
 
27
27
  ## changelog
28
28
 
29
+ ## [14.0.7] - 2022-02-02
30
+
31
+ nueva versión del footer con dos parámetros nuevos:
32
+ visible: que por defecto será true y en el caso de indicar false hará que el footer no se muestre
33
+ forcePageLinkSize: permite forzar a que solo se muestre un número máximo de links de páginas en el paginador. En el caso de que no se especifique el valor será 1
34
+
29
35
  ## [14.0.6] - 2022-01-25
30
36
 
31
37
  se formatean los campos bit-date y bit-datetime cuando está en modo readonly a formato humano en vez de ISO
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from "@angular/core";
2
2
  import { BaseFilter, BASE_RESULTADOS_PAGE } from "../../../base/shared/base.filter";
3
3
  import { PageStatus } from "../../global.constants";
4
4
  import * as i0 from "@angular/core";
@@ -11,14 +11,15 @@ import * as i5 from "@ngneat/transloco";
11
11
  * Componente que muestra un paginador en la sección footer.
12
12
  **/
13
13
  export class BitFooterComponent {
14
- constructor(translateService, changeRef) {
14
+ constructor(translateService) {
15
15
  this.translateService = translateService;
16
- this.changeRef = changeRef;
17
16
  this.mostrarAvisos = true;
18
17
  this.fixed = true; // Indicará si lo queremos fijo abajo en la página. Por defecto sí.
19
18
  this.status = PageStatus.Init; // Determina en qué estado está la página: PageStatus.Init, PageStatus.SEARCHING, PageStatus.FINISH_SEARCH
20
19
  this.mostrarEnlacesPaginas = true;
21
20
  this.mostrarPrimeraUltimaPagina = true;
21
+ this.visible = true;
22
+ this.forcePageLinkSize = 1; // número de enlaces en el paginador para poder navegar hacia delante o detrás que forzamos a que haya
22
23
  this.onPageChange = new EventEmitter(); //para notificar cambios en la página a mostrar
23
24
  this.onNewPageSize = new EventEmitter(); //para notificar cambios en los elementos a mostrar por página
24
25
  this.baseItemsPerPage = BaseFilter.RESULTADOS_PAGE; // guardamos el número de resultados pre-configurados por página para mostrar la lista de x, x+10 y x+20
@@ -58,20 +59,6 @@ export class BitFooterComponent {
58
59
  console.log("the footer is BLANK!");
59
60
  }
60
61
  }
61
- /**
62
- * Cuando tengamos la referencia al componente paginator actualizamos internamente el número de página y el número de páginas
63
- * del desplegable con la información del filtro proporcionado
64
- */
65
- ngAfterViewInit() {
66
- if (this.pc) {
67
- this.itemsPerPage = this.filter.resultados;
68
- console.log(`this.filter.resultados ${this.filter.resultados}`);
69
- console.log(`this.filter.pagina ${this.filter.pagina}`);
70
- this.pc.rows = this.filter.resultados;
71
- this.pc._first = (this.filter.pagina - 1) * this.pc.rows;
72
- this.pc.updatePageLinks();
73
- }
74
- }
75
62
  /**
76
63
  * Escucharemos a cambios en las propiedades totalItems para actualizar el paginador con respecto a las páginas que mostramos
77
64
  */
@@ -80,56 +67,65 @@ export class BitFooterComponent {
80
67
  let changedProp = changes[propName];
81
68
  if (propName === "status") {
82
69
  this.status = changedProp.currentValue;
83
- console.log(`new status ${this.status}`);
70
+ console.log("status:" + this.status);
84
71
  }
85
72
  else if (propName === "totalItems") {
86
73
  this.totalItems = changedProp.currentValue;
87
- console.log(`new totalItems ${this.totalItems}`);
74
+ console.log("totalItems:" + this.totalItems);
88
75
  if (changedProp.previousValue !== changedProp.currentValue) {
89
76
  this.calculatePageLinkSize(); //recalculamos
90
77
  }
91
- this.maxCurrentItems = this.filter ? this.filter.pagina * this.filter.resultados : -1;
78
+ this.calculateMaxCurrentItems();
92
79
  }
93
80
  else if (propName === "filter") {
94
81
  this.filter = changedProp.currentValue;
95
- if (this.filter?.pagina * this.filter?.resultados > this.maxCurrentItems) {
96
- this.maxCurrentItems = this.filter?.pagina * this.filter?.resultados;
97
- }
98
- console.log(`new filter ${this.filter?.pagina} - ${this.maxCurrentItems}`);
82
+ this.calculateMaxCurrentItems();
99
83
  if (changedProp.previousValue !== changedProp.currentValue) {
100
84
  this.calculatePageLinkSize(); //recalculamos
101
85
  if (!this.filter?.pagina || this.filter.pagina <= 1) {
102
86
  this.goToFirstPage();
87
+ console.log("goToFirstPage");
103
88
  }
104
89
  }
90
+ this.first = (this.filter.pagina - 1) * this.filter.resultados;
91
+ console.log("first:" + this.first);
105
92
  }
106
93
  }
107
- if (this.pc && this.changeRef) {
108
- console.log('updatePageLinks');
109
- this.pc.updatePageLinks();
110
- this.changeRef.detectChanges();
111
- }
112
94
  }
113
95
  showFooter() {
114
- return this.typeFooter === 'list' && this.status == PageStatus.FinishSearch;
96
+ // Problema. Estamos obteniendo un status a null cuando regresamos de una ficha
97
+ // status es null porque realmente no se está lanzando ninguna búsqueda por lo que el método updatePageStatus retorna null
98
+ return this.typeFooter === 'list' && this.visible;
115
99
  }
116
100
  showScroll() {
117
- return this.typeFooter === 'scroll' && this.status != null;
101
+ return this.typeFooter === 'scroll' && this.visible;
118
102
  }
119
103
  /** Calcula el número de enlaces visibles en el paginador (en el rango entre 1 y BASE_RESULTADOS_PAGE). */
120
104
  calculatePageLinkSize() {
121
- console.log(`calculatePageLinkSize totalItems: ${this.totalItems} itemsPerPage:${this.itemsPerPage}`);
122
- this.pageLinkSize = Math.ceil(this.totalItems / this.itemsPerPage);
123
- if (this.pageLinkSize < 1) {
124
- this.pageLinkSize = 1;
105
+ if (this.forcePageLinkSize == 0) {
106
+ console.log(`calculatePageLinkSize totalItems: ${this.totalItems} itemsPerPage:${this.itemsPerPage}`);
107
+ this.pageLinkSize = Math.ceil(this.totalItems / this.itemsPerPage);
108
+ if (this.pageLinkSize < 1) {
109
+ this.pageLinkSize = 1;
110
+ }
111
+ if (this.pageLinkSize > BASE_RESULTADOS_PAGE) {
112
+ this.pageLinkSize = BASE_RESULTADOS_PAGE;
113
+ }
125
114
  }
126
- if (this.pageLinkSize > BASE_RESULTADOS_PAGE) {
127
- this.pageLinkSize = BASE_RESULTADOS_PAGE;
115
+ else {
116
+ this.pageLinkSize = this.forcePageLinkSize;
117
+ }
118
+ console.log("pageLinkSize", this.pageLinkSize);
119
+ }
120
+ calculateMaxCurrentItems() {
121
+ this.maxCurrentItems = this.filter?.pagina * this.filter?.resultados;
122
+ if (this.maxCurrentItems > this.totalItems) {
123
+ this.maxCurrentItems = this.totalItems;
128
124
  }
129
125
  }
130
126
  /** Establece el número de página en la visualización de resultados. Se invoca cuando el usuario cambia el número de resultados a mostrar o cambia de página */
131
127
  paginate(event) {
132
- console.log("Page changed to", event.page);
128
+ console.log("Page changed to:" + event.page + " maxCurrentItems:" + this.maxCurrentItems + " firstElement:" + this.first);
133
129
  if (event.rows !== this.itemsPerPage) {
134
130
  // han cambiado el número de elementos por página
135
131
  //notificamos que los elementos por página han cambiado
@@ -144,20 +140,11 @@ export class BitFooterComponent {
144
140
  }
145
141
  }
146
142
  goToFirstPage() {
147
- if (this.pc) {
148
- //volvemos a la primera página
149
- this.pc._first = 1;
150
- this.pc.updatePageLinks();
151
- }
143
+ this.first = 1;
152
144
  }
153
145
  getStyle() {
154
146
  if (this.fixed && this.typeFooter === BitFooterComponent.TYPE_LIST || this.typeFooter === BitFooterComponent.TYPE_SCROLL) {
155
- if (this.totalItems > 0) {
156
- return "footer navbar-fixed-bottom";
157
- }
158
- else {
159
- return "footer navbar-fixed-bottom-60";
160
- }
147
+ return "footer navbar-fixed-bottom";
161
148
  }
162
149
  else if (this.fixed && this.typeFooter === BitFooterComponent.TYPE_FORM) {
163
150
  return "footer navbar-fixed-bottom-form";
@@ -238,15 +225,12 @@ BitFooterComponent.TYPE_SCROLL = "scroll";
238
225
  BitFooterComponent.TYPE_FORM = "form";
239
226
  BitFooterComponent.TYPE_BLANK = "blank";
240
227
  BitFooterComponent.MORE_RESULTS = -1;
241
- BitFooterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: BitFooterComponent, deps: [{ token: i1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
242
- BitFooterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: BitFooterComponent, selector: "bit-footer", inputs: { totalItems: "totalItems", filter: "filter", paginator: "paginator", mostrarAvisos: "mostrarAvisos", fixed: "fixed", messages: "messages", status: "status", typeFooter: ["type", "typeFooter"], mostrarEnlacesPaginas: "mostrarEnlacesPaginas", mostrarPrimeraUltimaPagina: "mostrarPrimeraUltimaPagina" }, outputs: { onPageChange: "onPageChange", onNewPageSize: "onNewPageSize" }, viewQueries: [{ propertyName: "pc", first: true, predicate: ["pc"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<footer [class]=\"getStyle()\">\n <div class=\"grid\">\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showFooter()\">\n <div class=\"numero-resultados\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span>{{totalItems}}</span>\n </div>\n </div>\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showScroll()\">\n <div class=\"numero-resultados-scroll\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span *ngIf=\"maxCurrentItems >= totalItems\">{{totalItems}}</span>\n <span *ngIf=\"maxCurrentItems < totalItems\">{{maxCurrentItems}} / {{totalItems}}</span>\n </div>\n </div>\n\n <div class=\"col-12 md:col-7 lg:col-7 p-text-center\" *ngIf=\"showScroll()\">\n <p-paginator *ngIf=\"paginator\" #pc\n [rows]=\"itemsPerPage\"\n [totalRecords]=\"totalItems\"\n [pageLinkSize]=\"mostrarEnlacesPaginas ? pageLinkSize : 1\"\n [rowsPerPageOptions]=\"[baseItemsPerPage,baseItemsPerPage*5,baseItemsPerPage*25,baseItemsPerPage*50]\"\n [showPageLinks]=\"true\"\n [showJumpToPageDropdown]=\"false\"\n [showFirstLastIcon]=\"mostrarPrimeraUltimaPagina ? true : maxCurrentItems >= totalItems\"\n (onPageChange)=\"paginate($event)\"></p-paginator>\n </div>\n <div class=\"col-12 md:col-3 lg:col-3\">\n <div *ngIf=\"searchInitiated\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{initMessage | async}}</span>\n </div>\n\n <div *ngIf=\"searching\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{searchingMessage | async}}</span>\n </div>\n\n <div *ngIf=\"readOnly\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{readOnlyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"foundResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{finishMessage | async}}</span>\n </div>\n\n <div *ngIf=\"moreResults\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{moreResultsMessage | async}}</span>\n </div>\n\n <div *ngIf=\"emptyResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation\"></i>\n <span>{{emptyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"error\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n <span>{{errorMessage | async}}</span>\n </div>\n\n <bit-help></bit-help>\n </div>\n </div>\n</footer>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "templateLeft", "templateRight", "dropdownAppendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "showPageLinks", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "component", type: i4.BitHelpComponent, selector: "bit-help" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
228
+ BitFooterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: BitFooterComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
229
+ BitFooterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: BitFooterComponent, selector: "bit-footer", inputs: { totalItems: "totalItems", filter: "filter", paginator: "paginator", mostrarAvisos: "mostrarAvisos", fixed: "fixed", messages: "messages", status: "status", typeFooter: ["type", "typeFooter"], mostrarEnlacesPaginas: "mostrarEnlacesPaginas", mostrarPrimeraUltimaPagina: "mostrarPrimeraUltimaPagina", visible: "visible", forcePageLinkSize: "forcePageLinkSize" }, outputs: { onPageChange: "onPageChange", onNewPageSize: "onNewPageSize" }, usesOnChanges: true, ngImport: i0, template: "<footer [class]=\"getStyle()\">\n <div class=\"grid\">\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showFooter()\">\n <div class=\"numero-resultados\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span>{{maxCurrentItems}} / {{totalItems}}</span>\n </div>\n </div>\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showScroll()\">\n <div class=\"numero-resultados-scroll\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span *ngIf=\"maxCurrentItems >= totalItems\">{{totalItems}}</span>\n <span *ngIf=\"maxCurrentItems < totalItems\">{{maxCurrentItems}} / {{totalItems}}</span>\n </div>\n </div>\n\n <div class=\"col-12 md:col-7 lg:col-7 p-text-center\" *ngIf=\"showFooter()\">\n <p-paginator *ngIf=\"paginator\"\n [first]=\"first\"\n [rows]=\"itemsPerPage\"\n [totalRecords]=\"totalItems\"\n [pageLinkSize]=\"mostrarEnlacesPaginas ? pageLinkSize : 1\"\n [rowsPerPageOptions]=\"[baseItemsPerPage,baseItemsPerPage*5,baseItemsPerPage*25,baseItemsPerPage*50]\"\n [showPageLinks]=\"mostrarEnlacesPaginas\"\n [showJumpToPageDropdown]=\"false\"\n [showFirstLastIcon]=\"mostrarPrimeraUltimaPagina ? true : maxCurrentItems >= totalItems\"\n (onPageChange)=\"paginate($event)\"></p-paginator>\n </div>\n <div class=\"col-12 md:col-3 lg:col-3\">\n <div *ngIf=\"searchInitiated\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{initMessage | async}}</span>\n </div>\n\n <div *ngIf=\"searching\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{searchingMessage | async}}</span>\n </div>\n\n <div *ngIf=\"readOnly\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{readOnlyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"foundResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{finishMessage | async}}</span>\n </div>\n\n <div *ngIf=\"moreResults\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{moreResultsMessage | async}}</span>\n </div>\n\n <div *ngIf=\"emptyResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation\"></i>\n <span>{{emptyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"error\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n <span>{{errorMessage | async}}</span>\n </div>\n\n <bit-help></bit-help>\n </div>\n </div>\n</footer>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "templateLeft", "templateRight", "dropdownAppendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "showPageLinks", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "component", type: i4.BitHelpComponent, selector: "bit-help" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
243
230
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: BitFooterComponent, decorators: [{
244
231
  type: Component,
245
- args: [{ selector: "bit-footer", changeDetection: ChangeDetectionStrategy.OnPush, template: "<footer [class]=\"getStyle()\">\n <div class=\"grid\">\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showFooter()\">\n <div class=\"numero-resultados\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span>{{totalItems}}</span>\n </div>\n </div>\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showScroll()\">\n <div class=\"numero-resultados-scroll\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span *ngIf=\"maxCurrentItems >= totalItems\">{{totalItems}}</span>\n <span *ngIf=\"maxCurrentItems < totalItems\">{{maxCurrentItems}} / {{totalItems}}</span>\n </div>\n </div>\n\n <div class=\"col-12 md:col-7 lg:col-7 p-text-center\" *ngIf=\"showScroll()\">\n <p-paginator *ngIf=\"paginator\" #pc\n [rows]=\"itemsPerPage\"\n [totalRecords]=\"totalItems\"\n [pageLinkSize]=\"mostrarEnlacesPaginas ? pageLinkSize : 1\"\n [rowsPerPageOptions]=\"[baseItemsPerPage,baseItemsPerPage*5,baseItemsPerPage*25,baseItemsPerPage*50]\"\n [showPageLinks]=\"true\"\n [showJumpToPageDropdown]=\"false\"\n [showFirstLastIcon]=\"mostrarPrimeraUltimaPagina ? true : maxCurrentItems >= totalItems\"\n (onPageChange)=\"paginate($event)\"></p-paginator>\n </div>\n <div class=\"col-12 md:col-3 lg:col-3\">\n <div *ngIf=\"searchInitiated\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{initMessage | async}}</span>\n </div>\n\n <div *ngIf=\"searching\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{searchingMessage | async}}</span>\n </div>\n\n <div *ngIf=\"readOnly\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{readOnlyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"foundResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{finishMessage | async}}</span>\n </div>\n\n <div *ngIf=\"moreResults\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{moreResultsMessage | async}}</span>\n </div>\n\n <div *ngIf=\"emptyResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation\"></i>\n <span>{{emptyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"error\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n <span>{{errorMessage | async}}</span>\n </div>\n\n <bit-help></bit-help>\n </div>\n </div>\n</footer>\n" }]
246
- }], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { pc: [{
247
- type: ViewChild,
248
- args: ["pc"]
249
- }], totalItems: [{
232
+ args: [{ selector: "bit-footer", changeDetection: ChangeDetectionStrategy.OnPush, template: "<footer [class]=\"getStyle()\">\n <div class=\"grid\">\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showFooter()\">\n <div class=\"numero-resultados\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span>{{maxCurrentItems}} / {{totalItems}}</span>\n </div>\n </div>\n <div class=\"col-12 md:col-2 lg:col-2\" *ngIf=\"showScroll()\">\n <div class=\"numero-resultados-scroll\">\n <label>{{\"bitnglibrary.footer.results\" | transloco}}</label>\n <span *ngIf=\"maxCurrentItems >= totalItems\">{{totalItems}}</span>\n <span *ngIf=\"maxCurrentItems < totalItems\">{{maxCurrentItems}} / {{totalItems}}</span>\n </div>\n </div>\n\n <div class=\"col-12 md:col-7 lg:col-7 p-text-center\" *ngIf=\"showFooter()\">\n <p-paginator *ngIf=\"paginator\"\n [first]=\"first\"\n [rows]=\"itemsPerPage\"\n [totalRecords]=\"totalItems\"\n [pageLinkSize]=\"mostrarEnlacesPaginas ? pageLinkSize : 1\"\n [rowsPerPageOptions]=\"[baseItemsPerPage,baseItemsPerPage*5,baseItemsPerPage*25,baseItemsPerPage*50]\"\n [showPageLinks]=\"mostrarEnlacesPaginas\"\n [showJumpToPageDropdown]=\"false\"\n [showFirstLastIcon]=\"mostrarPrimeraUltimaPagina ? true : maxCurrentItems >= totalItems\"\n (onPageChange)=\"paginate($event)\"></p-paginator>\n </div>\n <div class=\"col-12 md:col-3 lg:col-3\">\n <div *ngIf=\"searchInitiated\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{initMessage | async}}</span>\n </div>\n\n <div *ngIf=\"searching\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{searchingMessage | async}}</span>\n </div>\n\n <div *ngIf=\"readOnly\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{readOnlyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"foundResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{finishMessage | async}}</span>\n </div>\n\n <div *ngIf=\"moreResults\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-info\"></i>\n <span>{{moreResultsMessage | async}}</span>\n </div>\n\n <div *ngIf=\"emptyResult\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation\"></i>\n <span>{{emptyMessage | async}}</span>\n </div>\n\n <div *ngIf=\"error\"\n [className]=\"typeFooter === 'scroll' ? 'mensaje-scroll mensaje-info' : 'mensaje mensaje-info'\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n <span>{{errorMessage | async}}</span>\n </div>\n\n <bit-help></bit-help>\n </div>\n </div>\n</footer>\n" }]
233
+ }], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { totalItems: [{
250
234
  type: Input
251
235
  }], filter: [{
252
236
  type: Input
@@ -267,9 +251,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
267
251
  type: Input
268
252
  }], mostrarPrimeraUltimaPagina: [{
269
253
  type: Input
254
+ }], visible: [{
255
+ type: Input
256
+ }], forcePageLinkSize: [{
257
+ type: Input
270
258
  }], onPageChange: [{
271
259
  type: Output
272
260
  }], onNewPageSize: [{
273
261
  type: Output
274
262
  }] } });
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWZvb3Rlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iaXQtbmctbGlicmFyeS9zcmMvbGliL3NoYXJlZGxpYnJhcnkvY29tcG9uZW50cy9mb290ZXIvYml0LWZvb3Rlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iaXQtbmctbGlicmFyeS9zcmMvbGliL3NoYXJlZGxpYnJhcnkvY29tcG9uZW50cy9mb290ZXIvYml0LWZvb3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQUdwRDs7SUFFSTtBQU1KLE1BQU0sT0FBTyxrQkFBa0I7SUF5QzdCLFlBQW9CLGdCQUFrQyxFQUNsQyxTQUE0QjtRQUQ1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBekJoRCxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUU5QixVQUFLLEdBQVksSUFBSSxDQUFDLENBQUMsbUVBQW1FO1FBSTFGLFdBQU0sR0FBZSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsMEdBQTBHO1FBSWhKLDBCQUFxQixHQUFZLElBQUksQ0FBQztRQUV0QywrQkFBMEIsR0FBWSxJQUFJLENBQUM7UUFFM0MsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDLENBQUMsK0NBQStDO1FBRTFGLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQyxD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QUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7O0FBalJhLDRCQUFTLEdBQVcsTUFBTSxDQUFDO0FBQzNCLDhCQUFXLEdBQVcsUUFBUSxDQUFDO0FBQy9CLDRCQUFTLEdBQVcsTUFBTSxDQUFDO0FBQzNCLDZCQUFVLEdBQVcsT0FBTyxDQUFDO0FBRTdCLCtCQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7K0dBTnJCLGtCQUFrQjttR0FBbEIsa0JBQWtCLGtpQkMxQi9CLGlzR0EwRUE7MkZEaERhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxZQUFZLG1CQUNMLHVCQUF1QixDQUFDLE1BQU07dUlBWS9DLEVBQUU7c0JBREQsU0FBUzt1QkFBQyxJQUFJO2dCQUdmLFVBQVU7c0JBRFQsS0FBSztnQkFHTixNQUFNO3NCQURMLEtBQUs7Z0JBR04sU0FBUztzQkFEUixLQUFLO2dCQUdOLGFBQWE7c0JBRFosS0FBSztnQkFHTixLQUFLO3NCQURKLEtBQUs7Z0JBR04sUUFBUTtzQkFEUCxLQUFLO2dCQUdOLE1BQU07c0JBREwsS0FBSztnQkFHTixVQUFVO3NCQURULEtBQUs7dUJBQUMsTUFBTTtnQkFHYixxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBR04sMEJBQTBCO3NCQUR6QixLQUFLO2dCQUdOLFlBQVk7c0JBRFgsTUFBTTtnQkFHUCxhQUFhO3NCQURaLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7UGFnaW5hdG9yfSBmcm9tIFwicHJpbWVuZy9wYWdpbmF0b3JcIjtcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEJhc2VGaWx0ZXIsIEJBU0VfUkVTVUxUQURPU19QQUdFIH0gZnJvbSBcIi4uLy4uLy4uL2Jhc2Uvc2hhcmVkL2Jhc2UuZmlsdGVyXCI7XG5pbXBvcnQgeyBQYWdlU3RhdHVzIH0gZnJvbSBcIi4uLy4uL2dsb2JhbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXNcIjtcblxuLyoqXG4gKiBDb21wb25lbnRlIHF1ZSBtdWVzdHJhIHVuIHBhZ2luYWRvciBlbiBsYSBzZWNjacOzbiBmb290ZXIuXG4gKiovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYml0LWZvb3RlclwiLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6IFwiYml0LWZvb3Rlci5jb21wb25lbnQuaHRtbFwiXG59KVxuZXhwb3J0IGNsYXNzIEJpdEZvb3RlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgcHVibGljIHN0YXRpYyBUWVBFX0xJU1Q6IHN0cmluZyA9IFwibGlzdFwiO1xuICBwdWJsaWMgc3RhdGljIFRZUEVfU0NST0xMOiBzdHJpbmcgPSBcInNjcm9sbFwiO1xuICBwdWJsaWMgc3RhdGljIFRZUEVfRk9STTogc3RyaW5nID0gXCJmb3JtXCI7XG4gIHB1YmxpYyBzdGF0aWMgVFlQRV9CTEFOSzogc3RyaW5nID0gXCJibGFua1wiO1xuXG4gIHB1YmxpYyBzdGF0aWMgTU9SRV9SRVNVTFRTID0gLTE7XG5cbiAgQFZpZXdDaGlsZChcInBjXCIpXG4gIHBjOiBQYWdpbmF0b3I7XG4gIEBJbnB1dCgpXG4gIHRvdGFsSXRlbXM6IG51bWJlcjsgICAgIC8vIE7Dum1lcm8gdG90YWwgZGUgZWxlbWVudG9zIHJlY3VwZXJhZG9zIGRlIGxhIGNvbnN1bHRhXG4gIEBJbnB1dCgpXG4gIGZpbHRlcjogQmFzZUZpbHRlcjtcbiAgQElucHV0KClcbiAgcGFnaW5hdG9yOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBtb3N0cmFyQXZpc29zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZml4ZWQ6IGJvb2xlYW4gPSB0cnVlOyAvLyBJbmRpY2Fyw6Egc2kgbG8gcXVlcmVtb3MgZmlqbyBhYmFqbyBlbiBsYSBww6FnaW5hLiBQb3IgZGVmZWN0byBzw60uXG4gIEBJbnB1dCgpXG4gIG1lc3NhZ2VzOiBNYXA8UGFnZVN0YXR1cywgc3RyaW5nPjtcbiAgQElucHV0KClcbiAgc3RhdHVzOiBQYWdlU3RhdHVzID0gUGFnZVN0YXR1cy5Jbml0OyAvLyBEZXRlcm1pbmEgZW4gcXXDqSBlc3RhZG8gZXN0w6EgbGEgcMOhZ2luYTogUGFnZVN0YXR1cy5Jbml0LCBQYWdlU3RhdHVzLlNFQVJDSElORywgUGFnZVN0YXR1cy5GSU5JU0hfU0VBUkNIXG4gIEBJbnB1dChcInR5cGVcIilcbiAgdHlwZUZvb3Rlcjogc3RyaW5nO1xuICBASW5wdXQoKVxuICBtb3N0cmFyRW5sYWNlc1BhZ2luYXM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBtb3N0cmFyUHJpbWVyYVVsdGltYVBhZ2luYTogYm9vbGVhbiA9IHRydWU7XG4gIEBPdXRwdXQoKVxuICBvblBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTsgLy9wYXJhIG5vdGlmaWNhciBjYW1iaW9zIGVuIGxhIHDDoWdpbmEgYSBtb3N0cmFyXG4gIEBPdXRwdXQoKVxuICBvbk5ld1BhZ2VTaXplID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7IC8vcGFyYSBub3RpZmljYXIgY2FtYmlvcyBlbiBsb3MgZWxlbWVudG9zIGEgbW9zdHJhciBwb3IgcMOhZ2luYVxuXG4gIGJhc2VJdGVtc1BlclBhZ2U6IG51bWJlciA9IEJhc2VGaWx0ZXIuUkVTVUxUQURPU19QQUdFOyAvLyBndWFyZGFtb3MgZWwgbsO6bWVybyBkZSByZXN1bHRhZG9zIHByZS1jb25maWd1cmFkb3MgcG9yIHDDoWdpbmEgcGFyYSBtb3N0cmFyIGxhIGxpc3RhIGRlIHgsIHgrMTAgeSB4KzIwXG4gIHBhZ2VMaW5rU2l6ZTogbnVtYmVyOyAvLyBuw7ptZXJvIGRlIGVubGFjZXMgZW4gZWwgcGFnaW5hZG9yIHBhcmEgcG9kZXIgbmF2ZWdhciBoYWNpYSBkZWxhbnRlIG8gZGV0csOhc1xuICBpdGVtc1BlclBhZ2U6IG51bWJlciA9IEJhc2VGaWx0ZXIuUkVTVUxUQURPU19QQUdFOyAvLyBuw7ptZXJvIGRlIGVsZW1lbnRvcyBwb3IgcMOhZ2luYSBxdWUgbW9zdHJhbW9zXG5cbiAgbWF4Q3VycmVudEl0ZW1zOiBudW1iZXIgPSAtMTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHlwZUZvb3RlciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudHlwZUZvb3RlciA9IFwibGlzdFwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYWdpbmF0b3IgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhZ2luYXRvciA9IGZhbHNlO1xuICAgIH1cbiAgICAvL21lbnNhamVzIHBvciBkZWZlY3RvIHNpIG5vIHZpZW5lbiBkZWZpbmlkb3NcbiAgICBpZiAodGhpcy5tZXNzYWdlcyA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnZXMoKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KFBhZ2VTdGF0dXMuRXJyb3IsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5lcnJvclwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE1lc3NhZ2VzKCkge1xuICAgIGNvbnNvbGUubG9nKFwiZGVmaW5pbW9zIGxvcyBtZW5zYWplcyBkZWwgZm9vdGVyIGRlIG1hbmVyYSBlc3TDoW5kYXJcIik7XG4gICAgdGhpcy5tZXNzYWdlcyA9IG5ldyBNYXA8UGFnZVN0YXR1cywgc3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmlzRm9vdGVyTGlzdCgpIHx8IHRoaXMuaXNGb290ZXJTY3JvbGwoKSkge1xuICAgICAgdGhpcy5tZXNzYWdlcy5zZXQoUGFnZVN0YXR1cy5Jbml0LCBcImJpdG5nbGlicmFyeS5mb290ZXIubGlzdC5pbml0XCIpO1xuICAgICAgdGhpcy5tZXNzYWdlcy5zZXQoUGFnZVN0YXR1cy5TZWFyY2hpbmcsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5saXN0LnNlYXJjaGluZ1wiKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KFBhZ2VTdGF0dXMuRW1wdHlSZXN1bHQsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5saXN0LmVtcHR5cmVzdWx0XCIpO1xuICAgICAgdGhpcy5tZXNzYWdlcy5zZXQoUGFnZVN0YXR1cy5GaW5pc2hTZWFyY2gsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5saXN0LmZpbmlzaHNlYXJjaFwiKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KEJpdEZvb3RlckNvbXBvbmVudC5NT1JFX1JFU1VMVFMsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5saXN0Lm1vcmVyZXN1bHRzXCIpXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRm9vdGVyRm9ybSgpKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnNldChQYWdlU3RhdHVzLkluaXQsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5mb3JtLmluaXRcIik7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnNldChQYWdlU3RhdHVzLlNlYXJjaGluZywgXCJiaXRuZ2xpYnJhcnkuZm9vdGVyLmZvcm0uc2VhcmNoaW5nXCIpO1xuICAgICAgdGhpcy5tZXNzYWdlcy5zZXQoUGFnZVN0YXR1cy5GaW5pc2hTZWFyY2gsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5mb3JtLmZpbmlzaHNlYXJjaFwiKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KFBhZ2VTdGF0dXMuUmVhZE9ubHksIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5saXN0LnJlYWRvbmx5XCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlRm9vdGVyID09PSBCaXRGb290ZXJDb21wb25lbnQuVFlQRV9CTEFOSykge1xuICAgICAgY29uc29sZS5sb2coXCJ0aGUgZm9vdGVyIGlzIEJMQU5LIVwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3VhbmRvIHRlbmdhbW9zIGxhIHJlZmVyZW5jaWEgYWwgY29tcG9uZW50ZSBwYWdpbmF0b3IgYWN0dWFsaXphbW9zIGludGVybmFtZW50ZSBlbCBuw7ptZXJvIGRlIHDDoWdpbmEgeSBlbCBuw7ptZXJvIGRlIHDDoWdpbmFzXG4gICAqIGRlbCBkZXNwbGVnYWJsZSBjb24gbGEgaW5mb3JtYWNpw7NuIGRlbCBmaWx0cm8gcHJvcG9yY2lvbmFkb1xuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLnBjKSB7XG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IHRoaXMuZmlsdGVyLnJlc3VsdGFkb3M7XG4gICAgICBjb25zb2xlLmxvZyhgdGhpcy5maWx0ZXIucmVzdWx0YWRvcyAke3RoaXMuZmlsdGVyLnJlc3VsdGFkb3N9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgdGhpcy5maWx0ZXIucGFnaW5hICR7dGhpcy5maWx0ZXIucGFnaW5hfWApO1xuICAgICAgdGhpcy5wYy5yb3dzID0gdGhpcy5maWx0ZXIucmVzdWx0YWRvcztcbiAgICAgIHRoaXMucGMuX2ZpcnN0ID0gKHRoaXMuZmlsdGVyLnBhZ2luYSAtIDEpICogdGhpcy5wYy5yb3dzO1xuICAgICAgdGhpcy5wYy51cGRhdGVQYWdlTGlua3MoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXNjdWNoYXJlbW9zIGEgY2FtYmlvcyBlbiBsYXMgcHJvcGllZGFkZXMgdG90YWxJdGVtcyBwYXJhIGFjdHVhbGl6YXIgZWwgcGFnaW5hZG9yIGNvbiByZXNwZWN0byBhIGxhcyBww6FnaW5hcyBxdWUgbW9zdHJhbW9zXG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtwcm9wS2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSkge1xuICAgIGZvciAobGV0IHByb3BOYW1lIGluIGNoYW5nZXMpIHtcbiAgICAgIGxldCBjaGFuZ2VkUHJvcCA9IGNoYW5nZXNbcHJvcE5hbWVdO1xuICAgICAgaWYgKHByb3BOYW1lID09PSBcInN0YXR1c1wiKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gY2hhbmdlZFByb3AuY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zb2xlLmxvZyhgbmV3IHN0YXR1cyAke3RoaXMuc3RhdHVzfWApO1xuICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJ0b3RhbEl0ZW1zXCIpIHtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gY2hhbmdlZFByb3AuY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zb2xlLmxvZyhgbmV3IHRvdGFsSXRlbXMgJHt0aGlzLnRvdGFsSXRlbXN9YCk7XG4gICAgICAgIGlmIChjaGFuZ2VkUHJvcC5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VkUHJvcC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhZ2VMaW5rU2l6ZSgpOyAgICAgLy9yZWNhbGN1bGFtb3NcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1heEN1cnJlbnRJdGVtcyA9IHRoaXMuZmlsdGVyID8gdGhpcy5maWx0ZXIucGFnaW5hICogdGhpcy5maWx0ZXIucmVzdWx0YWRvcyA6IC0xO1xuICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJmaWx0ZXJcIikge1xuICAgICAgICB0aGlzLmZpbHRlciA9IGNoYW5nZWRQcm9wLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyPy5wYWdpbmEgKiB0aGlzLmZpbHRlcj8ucmVzdWx0YWRvcyA+IHRoaXMubWF4Q3VycmVudEl0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5tYXhDdXJyZW50SXRlbXMgPSB0aGlzLmZpbHRlcj8ucGFnaW5hICogdGhpcy5maWx0ZXI/LnJlc3VsdGFkb3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYG5ldyBmaWx0ZXIgJHt0aGlzLmZpbHRlcj8ucGFnaW5hfSAtICR7dGhpcy5tYXhDdXJyZW50SXRlbXN9YCk7XG4gICAgICAgIGlmIChjaGFuZ2VkUHJvcC5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VkUHJvcC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhZ2VMaW5rU2l6ZSgpOyAgICAgLy9yZWNhbGN1bGFtb3NcbiAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyPy5wYWdpbmEgfHwgdGhpcy5maWx0ZXIucGFnaW5hIDw9IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZ29Ub0ZpcnN0UGFnZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wYyAmJiB0aGlzLmNoYW5nZVJlZikge1xuICAgICAgY29uc29sZS5sb2coJ3VwZGF0ZVBhZ2VMaW5rcycpO1xuICAgICAgdGhpcy5wYy51cGRhdGVQYWdlTGlua3MoKTtcbiAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBzaG93Rm9vdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGVGb290ZXIgPT09ICdsaXN0JyAmJiB0aGlzLnN0YXR1cyA9PSBQYWdlU3RhdHVzLkZpbmlzaFNlYXJjaDtcbiAgfVxuXG4gIHNob3dTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZUZvb3RlciA9PT0gJ3Njcm9sbCcgJiYgdGhpcy5zdGF0dXMgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKiBDYWxjdWxhIGVsIG7Dum1lcm8gZGUgZW5sYWNlcyB2aXNpYmxlcyBlbiBlbCBwYWdpbmFkb3IgKGVuIGVsIHJhbmdvIGVudHJlIDEgeSBCQVNFX1JFU1VMVEFET1NfUEFHRSkuICovXG4gIGNhbGN1bGF0ZVBhZ2VMaW5rU2l6ZSgpIHtcbiAgICBjb25zb2xlLmxvZyhgY2FsY3VsYXRlUGFnZUxpbmtTaXplIHRvdGFsSXRlbXM6ICR7dGhpcy50b3RhbEl0ZW1zfSBpdGVtc1BlclBhZ2U6JHt0aGlzLml0ZW1zUGVyUGFnZX1gKTtcbiAgICB0aGlzLnBhZ2VMaW5rU2l6ZSA9IE1hdGguY2VpbCh0aGlzLnRvdGFsSXRlbXMgLyB0aGlzLml0ZW1zUGVyUGFnZSk7XG4gICAgaWYgKHRoaXMucGFnZUxpbmtTaXplIDwgMSkge1xuICAgICAgdGhpcy5wYWdlTGlua1NpemUgPSAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYWdlTGlua1NpemUgPiBCQVNFX1JFU1VMVEFET1NfUEFHRSkge1xuICAgICAgdGhpcy5wYWdlTGlua1NpemUgPSBCQVNFX1JFU1VMVEFET1NfUEFHRTtcbiAgICB9XG4gIH1cblxuICAvKiogRXN0YWJsZWNlIGVsIG7Dum1lcm8gZGUgcMOhZ2luYSBlbiBsYSB2aXN1YWxpemFjacOzbiBkZSByZXN1bHRhZG9zLiBTZSBpbnZvY2EgY3VhbmRvIGVsIHVzdWFyaW8gY2FtYmlhIGVsIG7Dum1lcm8gZGUgcmVzdWx0YWRvcyBhIG1vc3RyYXIgbyBjYW1iaWEgZGUgcMOhZ2luYSAqL1xuICBwYWdpbmF0ZShldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJQYWdlIGNoYW5nZWQgdG9cIiwgZXZlbnQucGFnZSk7XG4gICAgaWYgKGV2ZW50LnJvd3MgIT09IHRoaXMuaXRlbXNQZXJQYWdlKSB7XG4gICAgICAvLyBoYW4gY2FtYmlhZG8gZWwgbsO6bWVybyBkZSBlbGVtZW50b3MgcG9yIHDDoWdpbmFcbiAgICAgIC8vbm90aWZpY2Ftb3MgcXVlIGxvcyBlbGVtZW50b3MgcG9yIHDDoWdpbmEgaGFuIGNhbWJpYWRvXG4gICAgICB0aGlzLm9uTmV3UGFnZVNpemUuZW1pdChldmVudC5yb3dzKTtcbiAgICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gZXZlbnQucm93cztcbiAgICAgIHRoaXMuZ29Ub0ZpcnN0UGFnZSgpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVQYWdlTGlua1NpemUoKTsgLy8gcmVjYWxjdWxhbW9zIGVsIG7Dum1lcm8gZGUgZW5sYWNlcyBkZSBww6FnaW5hXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdGlmaWNhbW9zIGEgbnVlc3RybyBwYXDDoSBxdWUgbGEgcMOhZ2luYSBoYSBjYW1iaWFkb1xuICAgICAgdGhpcy5vblBhZ2VDaGFuZ2UuZW1pdChldmVudC5wYWdlICsgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnb1RvRmlyc3RQYWdlKCkge1xuICAgIGlmICh0aGlzLnBjKSB7XG4gICAgICAvL3ZvbHZlbW9zIGEgbGEgcHJpbWVyYSBww6FnaW5hXG4gICAgICB0aGlzLnBjLl9maXJzdCA9IDE7XG4gICAgICB0aGlzLnBjLnVwZGF0ZVBhZ2VMaW5rcygpO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0eWxlKCkge1xuICAgIGlmICh0aGlzLmZpeGVkICYmIHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfTElTVCB8fCB0aGlzLnR5cGVGb290ZXIgPT09IEJpdEZvb3RlckNvbXBvbmVudC5UWVBFX1NDUk9MTCkge1xuICAgICAgaWYgKHRoaXMudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgcmV0dXJuIFwiZm9vdGVyIG5hdmJhci1maXhlZC1ib3R0b21cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcImZvb3RlciBuYXZiYXItZml4ZWQtYm90dG9tLTYwXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZpeGVkICYmIHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfRk9STSkge1xuICAgICAgcmV0dXJuIFwiZm9vdGVyIG5hdmJhci1maXhlZC1ib3R0b20tZm9ybVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJmb290ZXJcIjtcbiAgICB9XG4gIH1cblxuICBpc0Zvb3Rlckxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfTElTVDtcbiAgfVxuXG4gIGlzRm9vdGVyU2Nyb2xsKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGVGb290ZXIgPT09IEJpdEZvb3RlckNvbXBvbmVudC5UWVBFX1NDUk9MTDtcbiAgfVxuXG4gIGlzRm9vdGVyRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlRm9vdGVyID09PSBCaXRGb290ZXJDb21wb25lbnQuVFlQRV9GT1JNO1xuICB9XG5cbiAgLyoqIEZsYWc6IGxhIHDDoWdpbmEgZXN0w6EgcmVhbGl6YW5kbyBsYSBiw7pzcXVlZGEuICovXG4gIGdldCBzZWFyY2hJbml0aWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBQYWdlU3RhdHVzLkluaXQgfHwgdGhpcy5zdGF0dXMgPT0gUGFnZVN0YXR1cy5SZXNldCB8fCAhdGhpcy5zdGF0dXM7XG4gIH1cblxuICAvKiogRmxhZzogbGEgcMOhZ2luYSBlc3TDoSByZWFsaXphbmRvIGxhIGLDunNxdWVkYS4gKi9cbiAgZ2V0IHNlYXJjaGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IFBhZ2VTdGF0dXMuU2VhcmNoaW5nO1xuICB9XG5cbiAgLyoqIEZsYWc6IGxhIHDDoWdpbmEgaGEgZmluYWxpemFkbyBsYSDDumx0aW1hIGLDunNxdWVkYS4gKi9cbiAgZ2V0IHNlYXJjaEZpbmlzaGVkKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gUGFnZVN0YXR1cy5GaW5pc2hTZWFyY2g7XG4gIH1cblxuICAvKiogRmxhZzogbGEgcMOhZ2luYSBlc3TDoSBlbiBtb2RvIHNvbG8gbGVjdHVyYSAqL1xuICBnZXQgcmVhZE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09IFBhZ2VTdGF0dXMuUmVhZE9ubHk7XG4gIH1cblxuICAvKiogRmxhZzogbGEgcMOhZ2luYSBoYSBmaW5hbGl6YWRvIGNvbiBlcnJvciAqL1xuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09IFBhZ2VTdGF0dXMuRXJyb3I7XG4gIH1cblxuICAvKiogRmxhZzogZW5jb250cmFkbyByZXN1bHRhZG8uICovXG4gIGdldCBmb3VuZFJlc3VsdCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdGF0dXMgPT09IFBhZ2VTdGF0dXMuRmluaXNoU2VhcmNoICYmXG4gICAgICAoKHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfTElTVCAmJiB0aGlzLnRvdGFsSXRlbXMgPiAwKVxuICAgICAgICB8fCB0aGlzLnR5cGVGb290ZXIgPT09IEJpdEZvb3RlckNvbXBvbmVudC5UWVBFX0ZPUk1cbiAgICAgICAgfHwgKHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfU0NST0xMICYmIHRoaXMudG90YWxJdGVtcyA8PSB0aGlzLm1heEN1cnJlbnRJdGVtcykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBGbGFnOiBoYXkgbcOhcyByZXN1bHRhZG9zIChzY3JvbGwpLiAqL1xuICBnZXQgbW9yZVJlc3VsdHMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhdHVzID09PSBQYWdlU3RhdHVzLkZpbmlzaFNlYXJjaCAmJlxuICAgICAgKHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfU0NST0xMICYmIHRoaXMudG90YWxJdGVtcyA+IHRoaXMubWF4Q3VycmVudEl0ZW1zKVxuICAgICk7XG4gIH1cblxuICAvKiogRmxhZzogbm8gaGF5IHJlc3VsdGFkb3MuICovXG4gIGdldCBlbXB0eVJlc3VsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IFBhZ2VTdGF0dXMuRmluaXNoU2VhcmNoICYmIHRoaXMudG90YWxJdGVtcyA9PT0gMDtcbiAgfVxuXG4gIGdldCBpbml0TWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlKHRoaXMubWVzc2FnZXMuZ2V0KFBhZ2VTdGF0dXMuSW5pdCkpO1xuICB9XG5cbiAgZ2V0IHNlYXJjaGluZ01lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNlbGVjdFRyYW5zbGF0ZSh0aGlzLm1lc3NhZ2VzLmdldChQYWdlU3RhdHVzLlNlYXJjaGluZykpO1xuICB9XG5cbiAgZ2V0IGZpbmlzaE1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNlbGVjdFRyYW5zbGF0ZSh0aGlzLm1lc3NhZ2VzLmdldChQYWdlU3RhdHVzLkZpbmlzaFNlYXJjaCkpO1xuICB9XG5cbiAgZ2V0IG1vcmVSZXN1bHRzTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlKHRoaXMubWVzc2FnZXMuZ2V0KEJpdEZvb3RlckNvbXBvbmVudC5NT1JFX1JFU1VMVFMpKTtcbiAgfVxuXG4gIGdldCBlbXB0eU1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNlbGVjdFRyYW5zbGF0ZSh0aGlzLm1lc3NhZ2VzLmdldChQYWdlU3RhdHVzLkVtcHR5UmVzdWx0KSk7XG4gIH1cblxuICBnZXQgcmVhZE9ubHlNZXNzYWdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZWxlY3RUcmFuc2xhdGUodGhpcy5tZXNzYWdlcy5nZXQoUGFnZVN0YXR1cy5SZWFkT25seSkpO1xuICB9XG5cbiAgZ2V0IGVycm9yTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlKHRoaXMubWVzc2FnZXMuZ2V0KFBhZ2VTdGF0dXMuRXJyb3IpKTtcbiAgfVxufVxuIiwiPGZvb3RlciBbY2xhc3NdPVwiZ2V0U3R5bGUoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTIgbGc6Y29sLTJcIiAqbmdJZj1cInNob3dGb290ZXIoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm51bWVyby1yZXN1bHRhZG9zXCI+XG4gICAgICAgIDxsYWJlbD57e1wiYml0bmdsaWJyYXJ5LmZvb3Rlci5yZXN1bHRzXCIgfCB0cmFuc2xvY299fTwvbGFiZWw+XG4gICAgICAgIDxzcGFuPnt7dG90YWxJdGVtc319PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtZDpjb2wtMiBsZzpjb2wtMlwiICpuZ0lmPVwic2hvd1Njcm9sbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibnVtZXJvLXJlc3VsdGFkb3Mtc2Nyb2xsXCI+XG4gICAgICAgIDxsYWJlbD57e1wiYml0bmdsaWJyYXJ5LmZvb3Rlci5yZXN1bHRzXCIgfCB0cmFuc2xvY299fTwvbGFiZWw+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibWF4Q3VycmVudEl0ZW1zID49IHRvdGFsSXRlbXNcIj57e3RvdGFsSXRlbXN9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhDdXJyZW50SXRlbXMgPCB0b3RhbEl0ZW1zXCI+e3ttYXhDdXJyZW50SXRlbXN9fSAvIHt7dG90YWxJdGVtc319PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC03IGxnOmNvbC03IHAtdGV4dC1jZW50ZXJcIiAqbmdJZj1cInNob3dTY3JvbGwoKVwiPlxuICAgICAgPHAtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hdG9yXCIgI3BjXG4gICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiaXRlbXNQZXJQYWdlXCJcbiAgICAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsSXRlbXNcIlxuICAgICAgICAgICAgICAgICAgIFtwYWdlTGlua1NpemVdPVwibW9zdHJhckVubGFjZXNQYWdpbmFzID8gcGFnZUxpbmtTaXplIDogMVwiXG4gICAgICAgICAgICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbYmFzZUl0ZW1zUGVyUGFnZSxiYXNlSXRlbXNQZXJQYWdlKjUsYmFzZUl0ZW1zUGVyUGFnZSoyNSxiYXNlSXRlbXNQZXJQYWdlKjUwXVwiXG4gICAgICAgICAgICAgICAgICAgW3Nob3dQYWdlTGlua3NdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgW3Nob3dKdW1wVG9QYWdlRHJvcGRvd25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgIFtzaG93Rmlyc3RMYXN0SWNvbl09XCJtb3N0cmFyUHJpbWVyYVVsdGltYVBhZ2luYSA/IHRydWUgOiBtYXhDdXJyZW50SXRlbXMgPj0gdG90YWxJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgKG9uUGFnZUNoYW5nZSk9XCJwYWdpbmF0ZSgkZXZlbnQpXCI+PC9wLXBhZ2luYXRvcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC0zIGxnOmNvbC0zXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoSW5pdGlhdGVkXCJcbiAgICAgICAgICAgW2NsYXNzTmFtZV09XCJ0eXBlRm9vdGVyID09PSAnc2Nyb2xsJyA/ICdtZW5zYWplLXNjcm9sbCBtZW5zYWplLWluZm8nIDogJ21lbnNhamUgbWVuc2FqZS1pbmZvJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm9cIj48L2k+XG4gICAgICAgIDxzcGFuPnt7aW5pdE1lc3NhZ2UgfCBhc3luY319PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWFyY2hpbmdcIlxuICAgICAgICAgICBbY2xhc3NOYW1lXT1cInR5cGVGb290ZXIgPT09ICdzY3JvbGwnID8gJ21lbnNhamUtc2Nyb2xsIG1lbnNhamUtaW5mbycgOiAnbWVuc2FqZSBtZW5zYWplLWluZm8nXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mb1wiPjwvaT5cbiAgICAgICAgPHNwYW4+e3tzZWFyY2hpbmdNZXNzYWdlIHwgYXN5bmN9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwicmVhZE9ubHlcIlxuICAgICAgICAgICBbY2xhc3NOYW1lXT1cInR5cGVGb290ZXIgPT09ICdzY3JvbGwnID8gJ21lbnNhamUtc2Nyb2xsIG1lbnNhamUtaW5mbycgOiAnbWVuc2FqZSBtZW5zYWplLWluZm8nXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mb1wiPjwvaT5cbiAgICAgICAgPHNwYW4+e3tyZWFkT25seU1lc3NhZ2UgfCBhc3luY319PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJmb3VuZFJlc3VsdFwiXG4gICAgICAgICAgIFtjbGFzc05hbWVdPVwidHlwZUZvb3RlciA9PT0gJ3Njcm9sbCcgPyAnbWVuc2FqZS1zY3JvbGwgbWVuc2FqZS1pbmZvJyA6ICdtZW5zYWplIG1lbnNhamUtaW5mbydcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e2ZpbmlzaE1lc3NhZ2UgfCBhc3luY319PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJtb3JlUmVzdWx0c1wiXG4gICAgICAgICAgIFtjbGFzc05hbWVdPVwidHlwZUZvb3RlciA9PT0gJ3Njcm9sbCcgPyAnbWVuc2FqZS1zY3JvbGwgbWVuc2FqZS1pbmZvJyA6ICdtZW5zYWplIG1lbnNhamUtaW5mbydcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e21vcmVSZXN1bHRzTWVzc2FnZSB8IGFzeW5jfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cImVtcHR5UmVzdWx0XCJcbiAgICAgICAgICAgW2NsYXNzTmFtZV09XCJ0eXBlRm9vdGVyID09PSAnc2Nyb2xsJyA/ICdtZW5zYWplLXNjcm9sbCBtZW5zYWplLWluZm8nIDogJ21lbnNhamUgbWVuc2FqZS1pbmZvJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e2VtcHR5TWVzc2FnZSB8IGFzeW5jfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cImVycm9yXCJcbiAgICAgICAgICAgW2NsYXNzTmFtZV09XCJ0eXBlRm9vdGVyID09PSAnc2Nyb2xsJyA/ICdtZW5zYWplLXNjcm9sbCBtZW5zYWplLWluZm8nIDogJ21lbnNhamUgbWVuc2FqZS1pbmZvJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e2Vycm9yTWVzc2FnZSB8IGFzeW5jfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJpdC1oZWxwPjwvYml0LWhlbHA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb290ZXI+XG4iXX0=
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWZvb3Rlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iaXQtbmctbGlicmFyeS9zcmMvbGliL3NoYXJlZGxpYnJhcnkvY29tcG9uZW50cy9mb290ZXIvYml0LWZvb3Rlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iaXQtbmctbGlicmFyeS9zcmMvbGliL3NoYXJlZGxpYnJhcnkvY29tcG9uZW50cy9mb290ZXIvYml0LWZvb3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7O0FBR3BEOztJQUVJO0FBTUosTUFBTSxPQUFPLGtCQUFrQjtJQTJDN0IsWUFBb0IsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUE1QnRELGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRTlCLFVBQUssR0FBWSxJQUFJLENBQUMsQ0FBQyxtRUFBbUU7UUFJMUYsV0FBTSxHQUFlLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQywwR0FBMEc7UUFJaEosMEJBQXFCLEdBQVksSUFBSSxDQUFDO1FBRXRDLCtCQUEwQixHQUFZLElBQUksQ0FBQztRQUUzQyxZQUFPLEdBQVksSUFBSSxDQUFDO1FBRXhCLHNCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDLHNHQUFzRztRQUVySSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUMsQ0FBQywrQ0FBK0M7UUFFMUYsa0JBQWEsR0FBRyxJQUFJ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QkFHTixPQUFPO3NCQUROLEtBQUs7Z0JBR04saUJBQWlCO3NCQURoQixLQUFLO2dCQUdOLFlBQVk7c0JBRFgsTUFBTTtnQkFHUCxhQUFhO3NCQURaLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBCYXNlRmlsdGVyLCBCQVNFX1JFU1VMVEFET1NfUEFHRSB9IGZyb20gXCIuLi8uLi8uLi9iYXNlL3NoYXJlZC9iYXNlLmZpbHRlclwiO1xuaW1wb3J0IHsgUGFnZVN0YXR1cyB9IGZyb20gXCIuLi8uLi9nbG9iYWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzXCI7XG5cbi8qKlxuICogQ29tcG9uZW50ZSBxdWUgbXVlc3RyYSB1biBwYWdpbmFkb3IgZW4gbGEgc2VjY2nDs24gZm9vdGVyLlxuICoqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImJpdC1mb290ZXJcIixcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiBcImJpdC1mb290ZXIuY29tcG9uZW50Lmh0bWxcIlxufSlcbmV4cG9ydCBjbGFzcyBCaXRGb290ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIHB1YmxpYyBzdGF0aWMgVFlQRV9MSVNUOiBzdHJpbmcgPSBcImxpc3RcIjtcbiAgcHVibGljIHN0YXRpYyBUWVBFX1NDUk9MTDogc3RyaW5nID0gXCJzY3JvbGxcIjtcbiAgcHVibGljIHN0YXRpYyBUWVBFX0ZPUk06IHN0cmluZyA9IFwiZm9ybVwiO1xuICBwdWJsaWMgc3RhdGljIFRZUEVfQkxBTks6IHN0cmluZyA9IFwiYmxhbmtcIjtcblxuICBwdWJsaWMgc3RhdGljIE1PUkVfUkVTVUxUUyA9IC0xO1xuXG4gIEBJbnB1dCgpXG4gIHRvdGFsSXRlbXM6IG51bWJlcjsgICAgIC8vIE7Dum1lcm8gdG90YWwgZGUgZWxlbWVudG9zIHJlY3VwZXJhZG9zIGRlIGxhIGNvbnN1bHRhXG4gIEBJbnB1dCgpXG4gIGZpbHRlcjogQmFzZUZpbHRlcjtcbiAgQElucHV0KClcbiAgcGFnaW5hdG9yOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBtb3N0cmFyQXZpc29zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZml4ZWQ6IGJvb2xlYW4gPSB0cnVlOyAvLyBJbmRpY2Fyw6Egc2kgbG8gcXVlcmVtb3MgZmlqbyBhYmFqbyBlbiBsYSBww6FnaW5hLiBQb3IgZGVmZWN0byBzw60uXG4gIEBJbnB1dCgpXG4gIG1lc3NhZ2VzOiBNYXA8UGFnZVN0YXR1cywgc3RyaW5nPjtcbiAgQElucHV0KClcbiAgc3RhdHVzOiBQYWdlU3RhdHVzID0gUGFnZVN0YXR1cy5Jbml0OyAvLyBEZXRlcm1pbmEgZW4gcXXDqSBlc3RhZG8gZXN0w6EgbGEgcMOhZ2luYTogUGFnZVN0YXR1cy5Jbml0LCBQYWdlU3RhdHVzLlNFQVJDSElORywgUGFnZVN0YXR1cy5GSU5JU0hfU0VBUkNIXG4gIEBJbnB1dChcInR5cGVcIilcbiAgdHlwZUZvb3Rlcjogc3RyaW5nO1xuICBASW5wdXQoKVxuICBtb3N0cmFyRW5sYWNlc1BhZ2luYXM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBtb3N0cmFyUHJpbWVyYVVsdGltYVBhZ2luYTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBmb3JjZVBhZ2VMaW5rU2l6ZTogbnVtYmVyID0gMTsgLy8gbsO6bWVybyBkZSBlbmxhY2VzIGVuIGVsIHBhZ2luYWRvciBwYXJhIHBvZGVyIG5hdmVnYXIgaGFjaWEgZGVsYW50ZSBvIGRldHLDoXMgcXVlIGZvcnphbW9zIGEgcXVlIGhheWFcbiAgQE91dHB1dCgpXG4gIG9uUGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpOyAvL3BhcmEgbm90aWZpY2FyIGNhbWJpb3MgZW4gbGEgcMOhZ2luYSBhIG1vc3RyYXJcbiAgQE91dHB1dCgpXG4gIG9uTmV3UGFnZVNpemUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTsgLy9wYXJhIG5vdGlmaWNhciBjYW1iaW9zIGVuIGxvcyBlbGVtZW50b3MgYSBtb3N0cmFyIHBvciBww6FnaW5hXG5cbiAgYmFzZUl0ZW1zUGVyUGFnZTogbnVtYmVyID0gQmFzZUZpbHRlci5SRVNVTFRBRE9TX1BBR0U7IC8vIGd1YXJkYW1vcyBlbCBuw7ptZXJvIGRlIHJlc3VsdGFkb3MgcHJlLWNvbmZpZ3VyYWRvcyBwb3IgcMOhZ2luYSBwYXJhIG1vc3RyYXIgbGEgbGlzdGEgZGUgeCwgeCsxMCB5IHgrMjBcbiAgaXRlbXNQZXJQYWdlOiBudW1iZXIgPSBCYXNlRmlsdGVyLlJFU1VMVEFET1NfUEFHRTsgLy8gbsO6bWVybyBkZSBlbGVtZW50b3MgcG9yIHDDoWdpbmEgcXVlIG1vc3RyYW1vc1xuICBmaXJzdDogbnVtYmVyO1xuICBwYWdlTGlua1NpemU6IG51bWJlcjsgLy8gbsO6bWVybyBkZSBlbmxhY2VzIGVuIGVsIHBhZ2luYWRvciBwYXJhIHBvZGVyIG5hdmVnYXIgaGFjaWEgZGVsYW50ZSBvIGRldHLDoXNcbiAgbWF4Q3VycmVudEl0ZW1zOiBudW1iZXIgPSAtMTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGVGb290ZXIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnR5cGVGb290ZXIgPSBcImxpc3RcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFnaW5hdG9yID09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYWdpbmF0b3IgPSBmYWxzZTtcbiAgICB9XG4gICAgLy9tZW5zYWplcyBwb3IgZGVmZWN0byBzaSBubyB2aWVuZW4gZGVmaW5pZG9zXG4gICAgaWYgKHRoaXMubWVzc2FnZXMgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldE1lc3NhZ2VzKCk7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnNldChQYWdlU3RhdHVzLkVycm9yLCBcImJpdG5nbGlicmFyeS5mb290ZXIuZXJyb3JcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdlcygpIHtcbiAgICBjb25zb2xlLmxvZyhcImRlZmluaW1vcyBsb3MgbWVuc2FqZXMgZGVsIGZvb3RlciBkZSBtYW5lcmEgZXN0w6FuZGFyXCIpO1xuICAgIHRoaXMubWVzc2FnZXMgPSBuZXcgTWFwPFBhZ2VTdGF0dXMsIHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy5pc0Zvb3Rlckxpc3QoKSB8fCB0aGlzLmlzRm9vdGVyU2Nyb2xsKCkpIHtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KFBhZ2VTdGF0dXMuSW5pdCwgXCJiaXRuZ2xpYnJhcnkuZm9vdGVyLmxpc3QuaW5pdFwiKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KFBhZ2VTdGF0dXMuU2VhcmNoaW5nLCBcImJpdG5nbGlicmFyeS5mb290ZXIubGlzdC5zZWFyY2hpbmdcIik7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnNldChQYWdlU3RhdHVzLkVtcHR5UmVzdWx0LCBcImJpdG5nbGlicmFyeS5mb290ZXIubGlzdC5lbXB0eXJlc3VsdFwiKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KFBhZ2VTdGF0dXMuRmluaXNoU2VhcmNoLCBcImJpdG5nbGlicmFyeS5mb290ZXIubGlzdC5maW5pc2hzZWFyY2hcIik7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnNldChCaXRGb290ZXJDb21wb25lbnQuTU9SRV9SRVNVTFRTLCBcImJpdG5nbGlicmFyeS5mb290ZXIubGlzdC5tb3JlcmVzdWx0c1wiKVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0Zvb3RlckZvcm0oKSkge1xuICAgICAgdGhpcy5tZXNzYWdlcy5zZXQoUGFnZVN0YXR1cy5Jbml0LCBcImJpdG5nbGlicmFyeS5mb290ZXIuZm9ybS5pbml0XCIpO1xuICAgICAgdGhpcy5tZXNzYWdlcy5zZXQoUGFnZVN0YXR1cy5TZWFyY2hpbmcsIFwiYml0bmdsaWJyYXJ5LmZvb3Rlci5mb3JtLnNlYXJjaGluZ1wiKTtcbiAgICAgIHRoaXMubWVzc2FnZXMuc2V0KFBhZ2VTdGF0dXMuRmluaXNoU2VhcmNoLCBcImJpdG5nbGlicmFyeS5mb290ZXIuZm9ybS5maW5pc2hzZWFyY2hcIik7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnNldChQYWdlU3RhdHVzLlJlYWRPbmx5LCBcImJpdG5nbGlicmFyeS5mb290ZXIubGlzdC5yZWFkb25seVwiKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfQkxBTkspIHtcbiAgICAgIGNvbnNvbGUubG9nKFwidGhlIGZvb3RlciBpcyBCTEFOSyFcIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY3VjaGFyZW1vcyBhIGNhbWJpb3MgZW4gbGFzIHByb3BpZWRhZGVzIHRvdGFsSXRlbXMgcGFyYSBhY3R1YWxpemFyIGVsIHBhZ2luYWRvciBjb24gcmVzcGVjdG8gYSBsYXMgcMOhZ2luYXMgcXVlIG1vc3RyYW1vc1xuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBbcHJvcEtleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pIHtcbiAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBjaGFuZ2VzKSB7XG4gICAgICBsZXQgY2hhbmdlZFByb3AgPSBjaGFuZ2VzW3Byb3BOYW1lXTtcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJzdGF0dXNcIikge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGNoYW5nZWRQcm9wLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgY29uc29sZS5sb2coXCJzdGF0dXM6XCIgKyB0aGlzLnN0YXR1cyk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSBcInRvdGFsSXRlbXNcIikge1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBjaGFuZ2VkUHJvcC5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidG90YWxJdGVtczpcIiArIHRoaXMudG90YWxJdGVtcyk7XG4gICAgICAgIGlmIChjaGFuZ2VkUHJvcC5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VkUHJvcC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhZ2VMaW5rU2l6ZSgpOyAgICAgLy9yZWNhbGN1bGFtb3NcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGN1bGF0ZU1heEN1cnJlbnRJdGVtcygpO1xuICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJmaWx0ZXJcIikge1xuICAgICAgICB0aGlzLmZpbHRlciA9IGNoYW5nZWRQcm9wLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVNYXhDdXJyZW50SXRlbXMoKTtcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wLnByZXZpb3VzVmFsdWUgIT09IGNoYW5nZWRQcm9wLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFnZUxpbmtTaXplKCk7ICAgICAvL3JlY2FsY3VsYW1vc1xuICAgICAgICAgIGlmICghdGhpcy5maWx0ZXI/LnBhZ2luYSB8fCB0aGlzLmZpbHRlci5wYWdpbmEgPD0gMSkge1xuICAgICAgICAgICAgdGhpcy5nb1RvRmlyc3RQYWdlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImdvVG9GaXJzdFBhZ2VcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyc3QgPSAodGhpcy5maWx0ZXIucGFnaW5hIC0gMSkgKiB0aGlzLmZpbHRlci5yZXN1bHRhZG9zO1xuICAgICAgICBjb25zb2xlLmxvZyhcImZpcnN0OlwiICsgdGhpcy5maXJzdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2hvd0Zvb3RlcigpIHtcbiAgICAvLyBQcm9ibGVtYS4gRXN0YW1vcyBvYnRlbmllbmRvIHVuIHN0YXR1cyBhIG51bGwgY3VhbmRvIHJlZ3Jlc2Ftb3MgZGUgdW5hIGZpY2hhXG4gICAgLy8gc3RhdHVzIGVzIG51bGwgcG9ycXVlIHJlYWxtZW50ZSBubyBzZSBlc3TDoSBsYW56YW5kbyBuaW5ndW5hIGLDunNxdWVkYSBwb3IgbG8gcXVlIGVsIG3DqXRvZG8gdXBkYXRlUGFnZVN0YXR1cyByZXRvcm5hICBudWxsXG4gICAgcmV0dXJuIHRoaXMudHlwZUZvb3RlciA9PT0gJ2xpc3QnICYmIHRoaXMudmlzaWJsZTtcbiAgfVxuXG4gIHNob3dTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZUZvb3RlciA9PT0gJ3Njcm9sbCcgJiYgdGhpcy52aXNpYmxlO1xuICB9XG5cbiAgLyoqIENhbGN1bGEgZWwgbsO6bWVybyBkZSBlbmxhY2VzIHZpc2libGVzIGVuIGVsIHBhZ2luYWRvciAoZW4gZWwgcmFuZ28gZW50cmUgMSB5IEJBU0VfUkVTVUxUQURPU19QQUdFKS4gKi9cbiAgY2FsY3VsYXRlUGFnZUxpbmtTaXplKCkge1xuICAgIGlmICh0aGlzLmZvcmNlUGFnZUxpbmtTaXplID09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGBjYWxjdWxhdGVQYWdlTGlua1NpemUgdG90YWxJdGVtczogJHt0aGlzLnRvdGFsSXRlbXN9IGl0ZW1zUGVyUGFnZToke3RoaXMuaXRlbXNQZXJQYWdlfWApO1xuICAgICAgdGhpcy5wYWdlTGlua1NpemUgPSBNYXRoLmNlaWwodGhpcy50b3RhbEl0ZW1zIC8gdGhpcy5pdGVtc1BlclBhZ2UpO1xuICAgICAgaWYgKHRoaXMucGFnZUxpbmtTaXplIDwgMSkge1xuICAgICAgICB0aGlzLnBhZ2VMaW5rU2l6ZSA9IDE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wYWdlTGlua1NpemUgPiBCQVNFX1JFU1VMVEFET1NfUEFHRSkge1xuICAgICAgICB0aGlzLnBhZ2VMaW5rU2l6ZSA9IEJBU0VfUkVTVUxUQURPU19QQUdFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VMaW5rU2l6ZSA9IHRoaXMuZm9yY2VQYWdlTGlua1NpemU7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFwicGFnZUxpbmtTaXplXCIsIHRoaXMucGFnZUxpbmtTaXplKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZU1heEN1cnJlbnRJdGVtcygpIHtcbiAgICB0aGlzLm1heEN1cnJlbnRJdGVtcyA9IHRoaXMuZmlsdGVyPy5wYWdpbmEgKiB0aGlzLmZpbHRlcj8ucmVzdWx0YWRvcztcbiAgICBpZiAodGhpcy5tYXhDdXJyZW50SXRlbXMgPiB0aGlzLnRvdGFsSXRlbXMpIHtcbiAgICAgIHRoaXMubWF4Q3VycmVudEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFc3RhYmxlY2UgZWwgbsO6bWVybyBkZSBww6FnaW5hIGVuIGxhIHZpc3VhbGl6YWNpw7NuIGRlIHJlc3VsdGFkb3MuIFNlIGludm9jYSBjdWFuZG8gZWwgdXN1YXJpbyBjYW1iaWEgZWwgbsO6bWVybyBkZSByZXN1bHRhZG9zIGEgbW9zdHJhciBvIGNhbWJpYSBkZSBww6FnaW5hICovXG4gIHBhZ2luYXRlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcIlBhZ2UgY2hhbmdlZCB0bzpcIiArIGV2ZW50LnBhZ2UgKyBcIiBtYXhDdXJyZW50SXRlbXM6XCIgKyB0aGlzLm1heEN1cnJlbnRJdGVtcyArIFwiIGZpcnN0RWxlbWVudDpcIiArIHRoaXMuZmlyc3QpO1xuICAgIGlmIChldmVudC5yb3dzICE9PSB0aGlzLml0ZW1zUGVyUGFnZSkge1xuICAgICAgLy8gaGFuIGNhbWJpYWRvIGVsIG7Dum1lcm8gZGUgZWxlbWVudG9zIHBvciBww6FnaW5hXG4gICAgICAvL25vdGlmaWNhbW9zIHF1ZSBsb3MgZWxlbWVudG9zIHBvciBww6FnaW5hIGhhbiBjYW1iaWFkb1xuICAgICAgdGhpcy5vbk5ld1BhZ2VTaXplLmVtaXQoZXZlbnQucm93cyk7XG4gICAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IGV2ZW50LnJvd3M7XG4gICAgICB0aGlzLmdvVG9GaXJzdFBhZ2UoKTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlUGFnZUxpbmtTaXplKCk7IC8vIHJlY2FsY3VsYW1vcyBlbCBuw7ptZXJvIGRlIGVubGFjZXMgZGUgcMOhZ2luYVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub3RpZmljYW1vcyBhIG51ZXN0cm8gcGFww6EgcXVlIGxhIHDDoWdpbmEgaGEgY2FtYmlhZG9cbiAgICAgIHRoaXMub25QYWdlQ2hhbmdlLmVtaXQoZXZlbnQucGFnZSArIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ29Ub0ZpcnN0UGFnZSgpIHtcbiAgICB0aGlzLmZpcnN0ID0gMTtcbiAgfVxuXG4gIGdldFN0eWxlKCkge1xuICAgIGlmICh0aGlzLmZpeGVkICYmIHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfTElTVCB8fCB0aGlzLnR5cGVGb290ZXIgPT09IEJpdEZvb3RlckNvbXBvbmVudC5UWVBFX1NDUk9MTCkge1xuICAgICAgcmV0dXJuIFwiZm9vdGVyIG5hdmJhci1maXhlZC1ib3R0b21cIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZml4ZWQgJiYgdGhpcy50eXBlRm9vdGVyID09PSBCaXRGb290ZXJDb21wb25lbnQuVFlQRV9GT1JNKSB7XG4gICAgICByZXR1cm4gXCJmb290ZXIgbmF2YmFyLWZpeGVkLWJvdHRvbS1mb3JtXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcImZvb3RlclwiO1xuICAgIH1cbiAgfVxuXG4gIGlzRm9vdGVyTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlRm9vdGVyID09PSBCaXRGb290ZXJDb21wb25lbnQuVFlQRV9MSVNUO1xuICB9XG5cbiAgaXNGb290ZXJTY3JvbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfU0NST0xMO1xuICB9XG5cbiAgaXNGb290ZXJGb3JtKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGVGb290ZXIgPT09IEJpdEZvb3RlckNvbXBvbmVudC5UWVBFX0ZPUk07XG4gIH1cblxuICAvKiogRmxhZzogbGEgcMOhZ2luYSBlc3TDoSByZWFsaXphbmRvIGxhIGLDunNxdWVkYS4gKi9cbiAgZ2V0IHNlYXJjaEluaXRpYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IFBhZ2VTdGF0dXMuSW5pdCB8fCB0aGlzLnN0YXR1cyA9PSBQYWdlU3RhdHVzLlJlc2V0IHx8ICF0aGlzLnN0YXR1cztcbiAgfVxuXG4gIC8qKiBGbGFnOiBsYSBww6FnaW5hIGVzdMOhIHJlYWxpemFuZG8gbGEgYsO6c3F1ZWRhLiAqL1xuICBnZXQgc2VhcmNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gUGFnZVN0YXR1cy5TZWFyY2hpbmc7XG4gIH1cblxuICAvKiogRmxhZzogbGEgcMOhZ2luYSBoYSBmaW5hbGl6YWRvIGxhIMO6bHRpbWEgYsO6c3F1ZWRhLiAqL1xuICBnZXQgc2VhcmNoRmluaXNoZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBQYWdlU3RhdHVzLkZpbmlzaFNlYXJjaDtcbiAgfVxuXG4gIC8qKiBGbGFnOiBsYSBww6FnaW5hIGVzdMOhIGVuIG1vZG8gc29sbyBsZWN0dXJhICovXG4gIGdldCByZWFkT25seSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT0gUGFnZVN0YXR1cy5SZWFkT25seTtcbiAgfVxuXG4gIC8qKiBGbGFnOiBsYSBww6FnaW5hIGhhIGZpbmFsaXphZG8gY29uIGVycm9yICovXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT0gUGFnZVN0YXR1cy5FcnJvcjtcbiAgfVxuXG4gIC8qKiBGbGFnOiBlbmNvbnRyYWRvIHJlc3VsdGFkby4gKi9cbiAgZ2V0IGZvdW5kUmVzdWx0KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0YXR1cyA9PT0gUGFnZVN0YXR1cy5GaW5pc2hTZWFyY2ggJiZcbiAgICAgICgodGhpcy50eXBlRm9vdGVyID09PSBCaXRGb290ZXJDb21wb25lbnQuVFlQRV9MSVNUICYmIHRoaXMudG90YWxJdGVtcyA+IDApXG4gICAgICAgIHx8IHRoaXMudHlwZUZvb3RlciA9PT0gQml0Rm9vdGVyQ29tcG9uZW50LlRZUEVfRk9STVxuICAgICAgICB8fCAodGhpcy50eXBlRm9vdGVyID09PSBCaXRGb290ZXJDb21wb25lbnQuVFlQRV9TQ1JPTEwgJiYgdGhpcy50b3RhbEl0ZW1zIDw9IHRoaXMubWF4Q3VycmVudEl0ZW1zKSlcbiAgICApO1xuICB9XG5cbiAgLyoqIEZsYWc6IGhheSBtw6FzIHJlc3VsdGFkb3MgKHNjcm9sbCkuICovXG4gIGdldCBtb3JlUmVzdWx0cygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdGF0dXMgPT09IFBhZ2VTdGF0dXMuRmluaXNoU2VhcmNoICYmXG4gICAgICAodGhpcy50eXBlRm9vdGVyID09PSBCaXRGb290ZXJDb21wb25lbnQuVFlQRV9TQ1JPTEwgJiYgdGhpcy50b3RhbEl0ZW1zID4gdGhpcy5tYXhDdXJyZW50SXRlbXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBGbGFnOiBubyBoYXkgcmVzdWx0YWRvcy4gKi9cbiAgZ2V0IGVtcHR5UmVzdWx0KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gUGFnZVN0YXR1cy5GaW5pc2hTZWFyY2ggJiYgdGhpcy50b3RhbEl0ZW1zID09PSAwO1xuICB9XG5cbiAgZ2V0IGluaXRNZXNzYWdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZWxlY3RUcmFuc2xhdGUodGhpcy5tZXNzYWdlcy5nZXQoUGFnZVN0YXR1cy5Jbml0KSk7XG4gIH1cblxuICBnZXQgc2VhcmNoaW5nTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlKHRoaXMubWVzc2FnZXMuZ2V0KFBhZ2VTdGF0dXMuU2VhcmNoaW5nKSk7XG4gIH1cblxuICBnZXQgZmluaXNoTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlKHRoaXMubWVzc2FnZXMuZ2V0KFBhZ2VTdGF0dXMuRmluaXNoU2VhcmNoKSk7XG4gIH1cblxuICBnZXQgbW9yZVJlc3VsdHNNZXNzYWdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZWxlY3RUcmFuc2xhdGUodGhpcy5tZXNzYWdlcy5nZXQoQml0Rm9vdGVyQ29tcG9uZW50Lk1PUkVfUkVTVUxUUykpO1xuICB9XG5cbiAgZ2V0IGVtcHR5TWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlKHRoaXMubWVzc2FnZXMuZ2V0KFBhZ2VTdGF0dXMuRW1wdHlSZXN1bHQpKTtcbiAgfVxuXG4gIGdldCByZWFkT25seU1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNlbGVjdFRyYW5zbGF0ZSh0aGlzLm1lc3NhZ2VzLmdldChQYWdlU3RhdHVzLlJlYWRPbmx5KSk7XG4gIH1cblxuICBnZXQgZXJyb3JNZXNzYWdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZWxlY3RUcmFuc2xhdGUodGhpcy5tZXNzYWdlcy5nZXQoUGFnZVN0YXR1cy5FcnJvcikpO1xuICB9XG59XG4iLCI8Zm9vdGVyIFtjbGFzc109XCJnZXRTdHlsZSgpXCI+XG4gIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtZDpjb2wtMiBsZzpjb2wtMlwiICpuZ0lmPVwic2hvd0Zvb3RlcigpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibnVtZXJvLXJlc3VsdGFkb3NcIj5cbiAgICAgICAgPGxhYmVsPnt7XCJiaXRuZ2xpYnJhcnkuZm9vdGVyLnJlc3VsdHNcIiB8IHRyYW5zbG9jb319PC9sYWJlbD5cbiAgICAgICAgPHNwYW4+e3ttYXhDdXJyZW50SXRlbXN9fSAvIHt7dG90YWxJdGVtc319PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtZDpjb2wtMiBsZzpjb2wtMlwiICpuZ0lmPVwic2hvd1Njcm9sbCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibnVtZXJvLXJlc3VsdGFkb3Mtc2Nyb2xsXCI+XG4gICAgICAgIDxsYWJlbD57e1wiYml0bmdsaWJyYXJ5LmZvb3Rlci5yZXN1bHRzXCIgfCB0cmFuc2xvY299fTwvbGFiZWw+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibWF4Q3VycmVudEl0ZW1zID49IHRvdGFsSXRlbXNcIj57e3RvdGFsSXRlbXN9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhDdXJyZW50SXRlbXMgPCB0b3RhbEl0ZW1zXCI+e3ttYXhDdXJyZW50SXRlbXN9fSAvIHt7dG90YWxJdGVtc319PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC03IGxnOmNvbC03IHAtdGV4dC1jZW50ZXJcIiAqbmdJZj1cInNob3dGb290ZXIoKVwiPlxuICAgICAgPHAtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hdG9yXCJcbiAgICAgICAgICBbZmlyc3RdPVwiZmlyc3RcIlxuICAgICAgICAgIFtyb3dzXT1cIml0ZW1zUGVyUGFnZVwiXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbEl0ZW1zXCJcbiAgICAgICAgICBbcGFnZUxpbmtTaXplXT1cIm1vc3RyYXJFbmxhY2VzUGFnaW5hcyA/IHBhZ2VMaW5rU2l6ZSA6IDFcIlxuICAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiW2Jhc2VJdGVtc1BlclBhZ2UsYmFzZUl0ZW1zUGVyUGFnZSo1LGJhc2VJdGVtc1BlclBhZ2UqMjUsYmFzZUl0ZW1zUGVyUGFnZSo1MF1cIlxuICAgICAgICAgIFtzaG93UGFnZUxpbmtzXT1cIm1vc3RyYXJFbmxhY2VzUGFnaW5hc1wiXG4gICAgICAgICAgW3Nob3dKdW1wVG9QYWdlRHJvcGRvd25dPVwiZmFsc2VcIlxuICAgICAgICAgIFtzaG93Rmlyc3RMYXN0SWNvbl09XCJtb3N0cmFyUHJpbWVyYVVsdGltYVBhZ2luYSA/IHRydWUgOiBtYXhDdXJyZW50SXRlbXMgPj0gdG90YWxJdGVtc1wiXG4gICAgICAgICAgKG9uUGFnZUNoYW5nZSk9XCJwYWdpbmF0ZSgkZXZlbnQpXCI+PC9wLXBhZ2luYXRvcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC0zIGxnOmNvbC0zXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoSW5pdGlhdGVkXCJcbiAgICAgICAgICAgW2NsYXNzTmFtZV09XCJ0eXBlRm9vdGVyID09PSAnc2Nyb2xsJyA/ICdtZW5zYWplLXNjcm9sbCBtZW5zYWplLWluZm8nIDogJ21lbnNhamUgbWVuc2FqZS1pbmZvJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm9cIj48L2k+XG4gICAgICAgIDxzcGFuPnt7aW5pdE1lc3NhZ2UgfCBhc3luY319PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWFyY2hpbmdcIlxuICAgICAgICAgICBbY2xhc3NOYW1lXT1cInR5cGVGb290ZXIgPT09ICdzY3JvbGwnID8gJ21lbnNhamUtc2Nyb2xsIG1lbnNhamUtaW5mbycgOiAnbWVuc2FqZSBtZW5zYWplLWluZm8nXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mb1wiPjwvaT5cbiAgICAgICAgPHNwYW4+e3tzZWFyY2hpbmdNZXNzYWdlIHwgYXN5bmN9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwicmVhZE9ubHlcIlxuICAgICAgICAgICBbY2xhc3NOYW1lXT1cInR5cGVGb290ZXIgPT09ICdzY3JvbGwnID8gJ21lbnNhamUtc2Nyb2xsIG1lbnNhamUtaW5mbycgOiAnbWVuc2FqZSBtZW5zYWplLWluZm8nXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mb1wiPjwvaT5cbiAgICAgICAgPHNwYW4+e3tyZWFkT25seU1lc3NhZ2UgfCBhc3luY319PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJmb3VuZFJlc3VsdFwiXG4gICAgICAgICAgIFtjbGFzc05hbWVdPVwidHlwZUZvb3RlciA9PT0gJ3Njcm9sbCcgPyAnbWVuc2FqZS1zY3JvbGwgbWVuc2FqZS1pbmZvJyA6ICdtZW5zYWplIG1lbnNhamUtaW5mbydcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e2ZpbmlzaE1lc3NhZ2UgfCBhc3luY319PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJtb3JlUmVzdWx0c1wiXG4gICAgICAgICAgIFtjbGFzc05hbWVdPVwidHlwZUZvb3RlciA9PT0gJ3Njcm9sbCcgPyAnbWVuc2FqZS1zY3JvbGwgbWVuc2FqZS1pbmZvJyA6ICdtZW5zYWplIG1lbnNhamUtaW5mbydcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e21vcmVSZXN1bHRzTWVzc2FnZSB8IGFzeW5jfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cImVtcHR5UmVzdWx0XCJcbiAgICAgICAgICAgW2NsYXNzTmFtZV09XCJ0eXBlRm9vdGVyID09PSAnc2Nyb2xsJyA/ICdtZW5zYWplLXNjcm9sbCBtZW5zYWplLWluZm8nIDogJ21lbnNhamUgbWVuc2FqZS1pbmZvJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e2VtcHR5TWVzc2FnZSB8IGFzeW5jfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cImVycm9yXCJcbiAgICAgICAgICAgW2NsYXNzTmFtZV09XCJ0eXBlRm9vdGVyID09PSAnc2Nyb2xsJyA/ICdtZW5zYWplLXNjcm9sbCBtZW5zYWplLWluZm8nIDogJ21lbnNhamUgbWVuc2FqZS1pbmZvJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCI+PC9pPlxuICAgICAgICA8c3Bhbj57e2Vycm9yTWVzc2FnZSB8IGFzeW5jfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJpdC1oZWxwPjwvYml0LWhlbHA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb290ZXI+XG4iXX0=