@worktile/theia 15.0.12 → 15.0.13

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.
@@ -195,17 +195,17 @@ export class TheTableComponent extends TheBaseElementComponent {
195
195
  setHeaderRowShadow() {
196
196
  // 固定标题行遮盖
197
197
  this.renderer.setStyle(this.tableWrapper.nativeElement, 'z-index', this.isStickyTop ? '3' : '0');
198
- const headerRowRightShadow = this.headerRowRightShadow.nativeElement;
199
- const headerRowLeftShadow = this.headerRowLeftShadow.nativeElement;
200
198
  if (this.isLeftShadow || this.isRightShadow) {
201
199
  let { height, top } = this.calcHeaderRowShadow();
202
200
  let { left, width } = this.nativeElement.getBoundingClientRect();
203
- if (this.isRightShadow) {
201
+ if (this.isRightShadow && this.headerRowRightShadow) {
202
+ const headerRowRightShadow = this.headerRowRightShadow.nativeElement;
204
203
  this.renderer.setStyle(headerRowRightShadow, 'height', `${height}px`);
205
204
  this.renderer.setStyle(headerRowRightShadow, 'top', `${top}px`);
206
205
  this.renderer.setStyle(headerRowRightShadow, 'left', `${left + width - 8}px`);
207
206
  }
208
- if (this.isLeftShadow) {
207
+ if (this.isLeftShadow && this.headerRowLeftShadow) {
208
+ const headerRowLeftShadow = this.headerRowLeftShadow.nativeElement;
209
209
  this.renderer.setStyle(headerRowLeftShadow, 'height', `${height}px`);
210
210
  this.renderer.setStyle(headerRowLeftShadow, 'top', `${top}px`);
211
211
  this.renderer.setStyle(headerRowLeftShadow, 'left', `${left + this.getColControlButtonWidth()}px`);
@@ -352,6 +352,7 @@ export class TheTableComponent extends TheBaseElementComponent {
352
352
  const tablePaddingTop = headerRowHeight + 11; // 标题行高 + ctrl btn(11px)高度
353
353
  this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', tablePaddingTop + 'px');
354
354
  this.renderer.setStyle(rowControlInner, 'padding-top', tablePaddingTop + 'px');
355
+ this.renderer.setStyle(this.tableRowControlsWrapper.nativeElement, 'z-index', '4');
355
356
  }
356
357
  else {
357
358
  this.renderer.removeClass(this.nativeElement, TableWithStickyRowClass);
@@ -360,6 +361,7 @@ export class TheTableComponent extends TheBaseElementComponent {
360
361
  });
361
362
  this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', null);
362
363
  this.renderer.setStyle(rowControlInner, 'padding-top', null);
364
+ this.renderer.setStyle(this.tableRowControlsWrapper.nativeElement, 'z-index', '1');
363
365
  }
364
366
  const rowControlButton = this.rowControlsButtonWrapper.first?.nativeElement;
365
367
  if (this.initialized && rowControlButton) {
@@ -569,9 +571,16 @@ export class TheTableComponent extends TheBaseElementComponent {
569
571
  }
570
572
  getDefaultCellWidth() {
571
573
  const tr = this.element.children[0];
572
- const tableWidth = this.elementRef.nativeElement.getBoundingClientRect().width;
574
+ let width = this.elementRef.nativeElement.getBoundingClientRect().width;
575
+ if (this.rowControlsInner) {
576
+ width -= this.rowControlsInner.nativeElement.getBoundingClientRect().width;
577
+ if (this.isCollapsedAndNonReadonly) {
578
+ // 聚焦之后会向左偏移一个 control(-11),见 .the-table-row-controls-wrapper
579
+ width += TABLE_CONTROL;
580
+ }
581
+ }
573
582
  return tr.children.map(cell => {
574
- return Number((tableWidth / tr.children.length).toFixed(2));
583
+ return Number((width / tr.children.length).toFixed(2));
575
584
  });
576
585
  }
577
586
  initializeColumns() {
@@ -820,7 +829,7 @@ TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
820
829
  provide: THE_TABLE_COMPONENT_TOKEN,
821
830
  useExisting: TheTableComponent
822
831
  }
823
- ], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsInner", first: true, predicate: ["rowControlsInner"], descendants: true, read: ElementRef }, { propertyName: "headerRowLeftShadow", first: true, predicate: ["headerRowLeftShadow"], descendants: true, read: ElementRef }, { propertyName: "headerRowRightShadow", first: true, predicate: ["headerRowRightShadow"], descendants: true, read: ElementRef }, { propertyName: "colgroup", first: true, predicate: ["colgroup"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div class=\"header-row-shadow header-row-left-shadow\" #headerRowLeftShadow contenteditable=\"false\"></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "directive", type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "component", type: i10.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }] });
832
+ ], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "tableRowControlsWrapper", first: true, predicate: ["tableRowControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsInner", first: true, predicate: ["rowControlsInner"], descendants: true, read: ElementRef }, { propertyName: "headerRowLeftShadow", first: true, predicate: ["headerRowLeftShadow"], descendants: true, read: ElementRef }, { propertyName: "headerRowRightShadow", first: true, predicate: ["headerRowRightShadow"], descendants: true, read: ElementRef }, { propertyName: "colgroup", first: true, predicate: ["colgroup"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\" #tableRowControlsWrapper>\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n class=\"header-row-shadow header-row-left-shadow\"\n #headerRowLeftShadow\n contenteditable=\"false\"\n *ngIf=\"!element.options?.headerColumn\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "directive", type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "component", type: i10.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }] });
824
833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TheTableComponent, decorators: [{
825
834
  type: Component,
826
835
  args: [{ selector: 'the-table, [theTable]', providers: [
@@ -840,7 +849,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
840
849
  '[class.the-table-with-sticky-column]': 'freezeColumnPipe.transform(element, tablePluginOptions)',
841
850
  '[class.the-numberd-table]': 'element?.options?.numberedColumn',
842
851
  '[class.the-table-selection-hide]': 'tableStore.isCellSelecting || tableStore.isRightClicking'
843
- }, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div class=\"header-row-shadow header-row-left-shadow\" #headerRowLeftShadow contenteditable=\"false\"></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n" }]
852
+ }, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\" #tableRowControlsWrapper>\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n class=\"header-row-shadow header-row-left-shadow\"\n #headerRowLeftShadow\n contenteditable=\"false\"\n *ngIf=\"!element.options?.headerColumn\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n" }]
844
853
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }, { type: i6.TheContextService }]; }, propDecorators: { tableWrapper: [{
845
854
  type: ViewChild,
846
855
  args: ['tableWrapper', { read: ElementRef, static: true }]
@@ -850,6 +859,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
850
859
  }], tbodyElement: [{
851
860
  type: ViewChild,
852
861
  args: ['tbody', { read: ElementRef, static: true }]
862
+ }], tableRowControlsWrapper: [{
863
+ type: ViewChild,
864
+ args: ['tableRowControlsWrapper', { read: ElementRef, static: false }]
853
865
  }], columnControlsWrapper: [{
854
866
  type: ViewChild,
855
867
  args: ['columnControlsWrapper', { read: ElementRef, static: false }]
@@ -875,4 +887,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
875
887
  type: HostListener,
876
888
  args: ['mousedown', ['$event']]
877
889
  }] } });
878
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsVUFBVSxFQUtWLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFD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QUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl2RSxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUkvRCxnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJbEUsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUlyRSxvQkFBb0I7c0JBRG5CLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSXRFLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR00sd0JBQXdCO3NCQUF2RixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHOUQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uRGVzdHJveSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBOZ1pvbmUsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSwgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVkaXRvciwgVHJhbnNmb3JtcyB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IFRoZUVkaXRvciwgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQsIFBsdWdpbktleXMsIFRoZVBsdWdpbk9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgaXNIb3RrZXkgfSBmcm9tICdpcy1ob3RrZXknO1xuaW1wb3J0IHsgU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvc2VsZWN0b3InO1xuaW1wb3J0IHsgVGFibGVDZWxsRWxlbWVudCwgVGFibGVFbGVtZW50LCBUYWJsZVJvd0VsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jdXN0b20tdHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90YWJsZS1jb250ZXh0bWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi90YWJsZS5zdG9yZSc7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgSEVBREVSX0NFTExfQ0xBU1MsXG4gICAgVGFibGVPcHRpb25zLFxuICAgIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzLFxuICAgIFRBQkxFX0NPTlRST0wsXG4gICAgVEFCTEVfSU5TRVJUX01BU0ssXG4gICAgVEFCTEVfTlVNQkVSX0NPTFVNTixcbiAgICBUQUJMRV9QQURESU5HLFxuICAgIFRoZVBsdWdpblRhYmxlT3B0aW9uLFxuICAgIFRoZVRhYmxlQ29sdW1uLFxuICAgIFRIRV9UQUJMRV9DT01QT05FTlRfVE9LRU5cbn0gZnJvbSAnLi4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgaXNWaXJ0dWFsS2V5IH0gZnJvbSAnLi4vdXRpbHMvaXMtdmlydHVhbC1rZXknO1xuaW1wb3J0IHsgZ2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgVGFibGVGcmVlemVDb2x1bW5QaXBlLCBUYWJsZUZyZWV6ZVJvd1BpcGUgfSBmcm9tICcuLi90YWJsZS5waXBlJztcbmltcG9ydCAqIGFzIFRoZVRyYW5zZm9ybXMgZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3Jtcyc7XG5pbXBvcnQgeyBUaGVDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRDb2x1bW5zV2lkdGgsIGdldEdyaWRDb2x1bW5zIH0gZnJvbSAnLi4vdXRpbHMvZ2V0LWdyaWQtY29sdW1ucyc7XG5pbXBvcnQgeyBERUZBVUxUX1NDUk9MTF9DT05UQUlORVIgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBTY3JvbGxEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvbm9kZS10eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGhlLXRhYmxlLCBbdGhlVGFibGVdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBUYWJsZVN0b3JlLFxuICAgICAgICBUYWJsZVNlcnZpY2UsXG4gICAgICAgIFRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLFxuICAgICAgICBUYWJsZUNlbGxFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLFxuICAgICAgICBUYWJsZUZyZWV6ZUNvbHVtblBpcGUsXG4gICAgICAgIFRhYmxlRnJlZXplUm93UGlwZSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVEhFX1RBQkxFX0NPTVBPTkVOVF9UT0tFTixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUaGVUYWJsZUNvbXBvbmVudFxuICAgICAgICB9XG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXdpdGgtY29udHJvbHNdJzogJ2lzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZycsXG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXdpdGgtc3RpY2t5LWNvbHVtbl0nOiAnZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0oZWxlbWVudCwgdGFibGVQbHVnaW5PcHRpb25zKScsXG4gICAgICAgICdbY2xhc3MudGhlLW51bWJlcmQtdGFibGVdJzogJ2VsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtc2VsZWN0aW9uLWhpZGVdJzogJ3RhYmxlU3RvcmUuaXNDZWxsU2VsZWN0aW5nIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBUaGVCYXNlRWxlbWVudENvbXBvbmVudDxUYWJsZUVsZW1lbnQsIEVkaXRvcj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgaGVhZGVyUm93ID0gZmFsc2U7XG5cbiAgICBpc1NlbGVjdGVkQWxsQ2VsbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcm93Q29udHJvbHM6IHsgaGVpZ2h0OiBudW1iZXI7IHJvd0luZGV4OiBudW1iZXIgfVtdID0gW107XG5cbiAgICBjb2xDb250cm9scyA9IFtdO1xuXG4gICAgaXNJblRhYmxlOiBib29sZWFuO1xuXG4gICAgdGFibGVQbHVnaW5PcHRpb25zOiBUaGVQbHVnaW5PcHRpb248VGhlUGx1Z2luVGFibGVPcHRpb24+O1xuXG4gICAgaXNTdGlja3lUb3A6IGJvb2xlYW47XG5cbiAgICBpc1Njcm9sbFg6IGJvb2xlYW47XG5cbiAgICBzY3JvbGxDb250YWluZXJUb3A6IG51bWJlcjtcblxuICAgIHRhYmxlUmVjdExlZnQ6IG51bWJlcjtcblxuICAgIGlzUmlnaHRTaGFkb3c6IGJvb2xlYW47XG5cbiAgICBpc0xlZnRTaGFkb3c6IGJvb2xlYW47XG5cbiAgICBwcmV2aW91c1Njcm9sbENvbnRhaW5lcjogc3RyaW5nO1xuXG4gICAgZ2V0IGNvbHVtbnMoKTogVGhlVGFibGVDb2x1bW5bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50LmNvbHVtbnM7XG4gICAgfVxuXG4gICAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZ2V0IHRib2R5TmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRib2R5RWxlbWVudD8ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCd0YWJsZVdyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRhYmxlV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCd0aGVUYWJsZScsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgdGhlVGFibGVFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgndGJvZHknLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRib2R5RWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvbHVtbkNvbnRyb2xzV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb3JuZXJDb250cm9sJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29ybmVyQ29udHJvbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdyb3dDb250cm9sc0lubmVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcm93Q29udHJvbHNJbm5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dMZWZ0U2hhZG93JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgaGVhZGVyUm93TGVmdFNoYWRvdzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dSaWdodFNoYWRvdycsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGhlYWRlclJvd1JpZ2h0U2hhZG93OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbGdyb3VwJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29sZ3JvdXA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93Q29udHJvbHNCdXR0b25XcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNhbGN1bGF0ZVNlbGVjdGVkQ29sdW1uc0FuZFJvd0luZGV4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWFkZXJSb3cgPSB0aGlzLmdldEhlYWRlclJvdygpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHVibGljIGV2ZW50RGlzcGF0Y2hlcjogVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBwdWJsaWMgcmVzaXplTm90aWZpZXI6IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLFxuICAgICAgICBwdWJsaWMgdGFibGVTdG9yZTogVGFibGVTdG9yZSxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHVibGljIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlOiBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmcmVlemVDb2x1bW5QaXBlOiBUYWJsZUZyZWV6ZUNvbHVtblBpcGUsXG4gICAgICAgIHB1YmxpYyBmcmVlemVSb3dQaXBlOiBUYWJsZUZyZWV6ZVJvd1BpcGUsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0U2VydmljZTogVGhlQ29udGV4dFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2RyKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5nZXRDb2xDb250cm9scygpO1xuICAgICAgICB0aGlzLmdldElzSW5UYWJsZSgpO1xuICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucyA9IGdldFBsdWdpbk9wdGlvbnM8VGhlUGx1Z2luVGFibGVPcHRpb24+KHRoaXMuZWRpdG9yLCBQbHVnaW5LZXlzLnRhYmxlKTtcbiAgICAgICAgaWYgKHRoaXMudGFibGVQbHVnaW5PcHRpb25zLnNob3dGdWxsc2NyZWVuICYmIHRoaXMudGFibGVQbHVnaW5PcHRpb25zLmZ1bGxzY3JlZW5BY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVQbHVnaW5PcHRpb25zXG4gICAgICAgICAgICAgICAgLmZ1bGxzY3JlZW5BY3Rpb24odGhpcy5lZGl0b3IpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQuZWxlbWVudCA9PT0gdGhpcy5lbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQuc3RhdGUgPT09ICdvZmYnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzRnVsbHNjcmVlbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWJsZVN0b3JlLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c1Njcm9sbENvbnRhaW5lciA9IHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iub3B0aW9ucy5zY3JvbGxDb250YWluZXIgPSBERUZBVUxUX1NDUk9MTF9DT05UQUlORVI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lciA9IHRoaXMucHJldmlvdXNTY3JvbGxDb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreVRvcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UucmViaW5kQ29udGFpbmVyU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuc2VsZWN0ZWRDZWxsc0NoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VsZWN0ZWRBbGxDZWxsID0gdGhpcy50YWJsZVN0b3JlLmlzU2VsZWN0ZWRBbGxDZWxsKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRXcmFwcGVyV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gdGhpcy5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdMZWZ0ID0gY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhYmxlQ29udGFpbmVyKVsncGFkZGluZ0xlZnQnXSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGFibGVDb250YWluZXIub2Zmc2V0V2lkdGggLSBwYWRkaW5nTGVmdDtcbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNvbXBhdGlibGUgd2l0aCBvbGQgZGF0YVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZ2V0SGVhZGVyUm93KCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50Py5vcHRpb25zPy5oZWFkZXJSb3cpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbXBhdCBvbGQgZGF0YVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50Py5jaGlsZHJlblswXS5oZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0NhcmRFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJ3NsYXRlLWJsb2NrLWNhcmQnKTtcbiAgICAgICAgICAgIGlmIChibG9ja0NhcmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYmxvY2tDYXJkRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBzbGF0ZS1ibG9jay1jYXJkLSR7dGhpcy5lbGVtZW50LnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaW5pdEVkaXRvcih0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVDZWxsc0NoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVDZWxsUG9zaXRpb25DaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuVGFibGVDb250ZXh0TWVudUV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3Rlbk9uU2VsZWN0ZWRDZWxscygpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5LZXlkb3duU2VsZWN0RXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlV3JhcHBlclNjcm9sbCgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZEltYWdlRG9uZSA9IGF3YWl0IHRoaXMucmVzb2x2ZUltYWdlKCk7XG4gICAgICAgICAgICAgICAgLy8g562J5b6F5bqP5Y+35YiX6KGo5qC85YaF5Zu+54mH5Yqg6L295a6M5oiQ5ZCO5YaN5Y675riy5p+T6KGo5qC86KGM6auY5bqmXG4gICAgICAgICAgICAgICAgaWYgKGxvYWRJbWFnZURvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlckNlbGxTdHlsZSgpO1xuICAgICAgICAgICAgY29uc3QgeyBsZWZ0IH0gPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUmVjdExlZnQgPSBsZWZ0O1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVTY3JvbGxDb250YWluZXJTY3JvbGwoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY29udGFpbmVyUmVzaXplZCQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQud2lkdGhDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0R3JpZENvbHVtbnNTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0aWNreVJvd1N0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2Uud2luZG93UmVzaXplZCQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQud2lkdGhDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIOe7meagh+mimOihjOeahOW3pi/lj7PliqDpmLTlvbEgKi9cbiAgICBzZXRIZWFkZXJSb3dTaGFkb3coKSB7XG4gICAgICAgIC8vIOWbuuWumuagh+mimOihjOmBruebllxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICd6LWluZGV4JywgdGhpcy5pc1N0aWNreVRvcCA/ICczJyA6ICcwJyk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVyUm93UmlnaHRTaGFkb3cgPSB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvd0xlZnRTaGFkb3cgPSB0aGlzLmhlYWRlclJvd0xlZnRTaGFkb3cubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0U2hhZG93IHx8IHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbGV0IHsgaGVpZ2h0LCB0b3AgfSA9IHRoaXMuY2FsY0hlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgbGV0IHsgbGVmdCwgd2lkdGggfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmlnaHRTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd1JpZ2h0U2hhZG93LCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dSaWdodFNoYWRvdywgJ3RvcCcsIGAke3RvcH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93UmlnaHRTaGFkb3csICdsZWZ0JywgYCR7bGVmdCArIHdpZHRoIC0gOH1weGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWZ0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnbGVmdCcsIGAke2xlZnQgKyB0aGlzLmdldENvbENvbnRyb2xCdXR0b25XaWR0aCgpfXB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjSGVhZGVyUm93U2hhZG93KCkge1xuICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzKClbMF0/LmhlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IGhlYWRlclJvd0hlaWdodDtcbiAgICAgICAgLy8g6buY6K6k77yI5rKh5pyJ6IGa54Sm77yJ55qEIHRvcCDlgLzvvJrmu5rliqjlrrnlmajpq5jluqYgKyDooajmoLznmoRwYWRkaW5n77yIOO+8iVxuICAgICAgICBsZXQgdG9wID0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyBUQUJMRV9QQURESU5HO1xuICAgICAgICAvLyDogZrnhKbnirbmgIHkuIvvvJog6auY5bqmICsgY29udHJvbO+8iDEx77yJ77yMdG9wIOWKoOS4gOS4qiBtYXNr77yIMTnvvIlcbiAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgVEFCTEVfQ09OVFJPTDtcbiAgICAgICAgICAgIHRvcCA9IHRvcCArIFRBQkxFX0lOU0VSVF9NQVNLIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBoZWlnaHQsIHRvcCB9O1xuICAgIH1cblxuICAgIHN1YnNjcmliZVNjcm9sbENvbnRhaW5lclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jb250YWluZXJTY3JvbGxlZCRcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoZW50aXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGV2ZW50LCBkaXJlY3Rpb24gfSA9IGVudGlyZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxYID0gdGhpcy50YWJsZVJlY3RMZWZ0ICE9PSBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyVG9wSGVpZ2h0ID0gdGhpcy5pc0luVGFibGUgPyAtMTkgOiAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzKClbMF0/LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBjbGllbnRSZWN0LnRvcCArIGhlYWRlclRvcEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIDw9IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgOCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRSZWN0LmJvdHRvbSAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID49IGhlYWRlclJvd0hlaWdodCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3csIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmoIfpopjooYzlhoXlrrnotoXov4flm7rlrprpq5jluqbml7bnp7vpmaTlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWFkZXJSb3dIZWlnaHQgPSAoMjQgKyA4KSAqIDExOyAvLyDotoXlh7ogMTEg6KGM77yM5Y+W5raI5Ya757uTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBoZWFkZXJSb3dIZWlnaHQgPD0gbWF4SGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RpY2t5VG9wO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDZWxsU3R5bGUoKSB7XG4gICAgICAgIGxldCBoZWFkZXJSb3dDZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pO1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUm93KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJSb3dDZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJDZWxsU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGVhZGVyQ2VsbHMgPSBoZWFkZXJSb3dDZWxscy5jb25jYXQoaGVhZGVyQ29sdW1uQ2VsbHMpLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIGlmICh0aGlzLmhlYWRlclJvdyAmJiB0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxscy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJDZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ29sdW1uQW5kQ29udHJvbFN0eWxlKGhlYWRlckNvbHVtbkNlbGxzKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZUhlYWRlckNlbGxTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxFbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNlbGxFbGVtZW50LCBIRUFERVJfQ0VMTF9DTEFTUyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlckNvbHVtbkFuZENvbnRyb2xTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGxldCBoZWFkZXJDb2x1bW5DZWxscyA9IFtdO1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAoaXRlbSA9PiBpdGVtLmNoaWxkcmVuWzBdKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBjZWxscy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlckNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGNvbnN0IGhlYWRlckNvbHVtbkVsZW1lbnRzID0gaGVhZGVyQ29sdW1uQ2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgWy4uLmhlYWRlckNvbHVtbkVsZW1lbnRzLCBoZWFkZXJDb2xDb250cm9sXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mcmVlemVDb2x1bW5QaXBlLnRyYW5zZm9ybSh0aGlzLmVsZW1lbnQsIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXRlbSwgJ3RoZS1zdGlja3ktY2VsbCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGl0ZW0sICd0aGUtc3RpY2t5LWNlbGwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyUm93U3R5bGUoKSB7XG4gICAgICAgIHRoaXMuc2V0R3JpZENvbHVtbnNTdHlsZSgpO1xuICAgICAgICB0aGlzLnNldFN0aWNreVJvd1N0eWxlKCk7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgfVxuXG4gICAgc2V0R3JpZENvbHVtbnNTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3csIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gKHRoaXMudGJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBjZWxsc1dpZHRoID0gdGhpcy5jb2xncm91cD8ubmF0aXZlRWxlbWVudCA/IGdldENvbHVtbnNXaWR0aCh0aGlzLmNvbGdyb3VwLm5hdGl2ZUVsZW1lbnQpIDogdGhpcy5nZXREZWZhdWx0Q2VsbFdpZHRoKCk7XG4gICAgICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IGdldEdyaWRDb2x1bW5zKGhlYWRlclJvdywgY2VsbHNXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmcgPSA0NDtcbiAgICAgICAgICAgIGxldCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uID8gdGFibGVXaWR0aCAtIHRhYmxlUGFkZGluZyA6IHRhYmxlV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBzdGlja3lSb3dzID0gdGhpcy5pc0luVGFibGUgPyBbY29sQ29udHJvbCwgaGVhZGVyUm93XSA6IFtoZWFkZXJSb3ddO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJywgZ3JpZENvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3dpZHRoJywgdGFibGVXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGlja3lSb3dTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keSB0cicpO1xuICAgICAgICBjb25zdCByb3dDb250cm9sSW5uZXIgPSB0aGlzLnJvd0NvbnRyb2xzSW5uZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFibGVDb3JuZXJCdG4gPSB0aGlzLmNvcm5lckNvbnRyb2wubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVSb3dDb250cm9scygpWzBdPy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bWJlcmVkQ29sdW1uID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uO1xuXG4gICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgVGFibGVXaXRoU3RpY2t5Um93Q2xhc3MpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmlzSW5UYWJsZSA/IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgMzYgOiB0aGlzLnNjcm9sbENvbnRhaW5lclRvcDtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93LCAndG9wJywgdG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvdywgJ2hlaWdodCcsIGAke2hlYWRlclJvd0hlaWdodH1weGApO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJblRhYmxlIHx8IG51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgW2NvbENvbnRyb2wsIHRhYmxlQ29ybmVyQnRuXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAndG9wJywgdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAncHgnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOS8mOWMlu+8mnRhYmxlIOeahCBwYWRkaW5nLXRvcCDlupTor6XliqjmgIHlj5jljJbvvIjkuI7pmLTlvbHlkIzlj5jvvIlcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUGFkZGluZ1RvcCA9IGhlYWRlclJvd0hlaWdodCArIDExOyAvLyDmoIfpopjooYzpq5ggKyBjdHJsIGJ0bu+8iDExcHjvvInpq5jluqZcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmctdG9wJywgdGFibGVQYWRkaW5nVG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xJbm5lciwgJ3BhZGRpbmctdG9wJywgdGFibGVQYWRkaW5nVG9wICsgJ3B4Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgVGFibGVXaXRoU3RpY2t5Um93Q2xhc3MpO1xuICAgICAgICAgICAgW2hlYWRlclJvdywgY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG5dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3RvcCcsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLXRvcCcsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sSW5uZXIsICdwYWRkaW5nLXRvcCcsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93Q29udHJvbEJ1dHRvbiA9IHRoaXMucm93Q29udHJvbHNCdXR0b25XcmFwcGVyLmZpcnN0Py5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiByb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldFJvd0NvbnRyb2xCdXR0b25TdHlsZShyb3dDb250cm9sQnV0dG9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNldFRpbWVvdXTvvJog6ZyA6KaB562J5b6FIHJvd0NvbnRyb2xzIOWcqCBkb20g5Lit5riy5p+T5a6M5q+V5ZCO5omN6IO96I635Y+W5YiwIHJvd0NvbnRyb2xCdXR0b25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRSb3dDb250cm9sQnV0dG9uU3R5bGUocm93Q29udHJvbEJ1dHRvbikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0Um93Q29udHJvbEJ1dHRvblN0eWxlKHJvd0NvbnRyb2xCdXR0b246IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IG51bWJlcmVkQ29sdW1uID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uO1xuICAgICAgICBpZiAoIXJvd0NvbnRyb2xCdXR0b24pIHtcbiAgICAgICAgICAgIHJvd0NvbnRyb2xCdXR0b24gPSB0aGlzLnJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlci5maXJzdD8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmlzSW5UYWJsZSB8fCBudW1iZXJlZENvbHVtbikgJiYgcm93Q29udHJvbEJ1dHRvbikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbEJ1dHRvbiwgJ3RvcCcsIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dDb250cm9sQnV0dG9uICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbEJ1dHRvbiwgJ3RvcCcsIG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCkge1xuICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IG5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSBuYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgICBjb25zdCBjbGllbnRXaWR0aCA9IG5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIHRoaXMuaXNMZWZ0U2hhZG93ID0gc2Nyb2xsTGVmdCA+IDA7XG4gICAgICAgIHRoaXMuaXNSaWdodFNoYWRvdyA9IHNjcm9sbExlZnQgKyBjbGllbnRXaWR0aCA8IHNjcm9sbFdpZHRoO1xuICAgICAgICBjb25zdCByb3dzID0gbmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGB0cmApO1xuICAgICAgICBjb25zdCBzdGlja3lDZWxscyA9IEFycmF5LmZyb20ocm93cykubWFwKGl0ZW0gPT4gaXRlbS5xdWVyeVNlbGVjdG9yKCd0aCcpIHx8IGl0ZW0ucXVlcnlTZWxlY3RvcigndGQnKSk7XG4gICAgICAgIGNvbnN0IGlzQ29sdW1uSGVhZGVyID0gdGhpcy5mcmVlemVDb2x1bW5QaXBlLnRyYW5zZm9ybSh0aGlzLmVsZW1lbnQsIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBpc0NvbHVtbkhlYWRlciA/IHN0aWNreUNlbGxzIDogW25hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudF07XG4gICAgICAgIGlmICh0aGlzLmlzTGVmdFNoYWRvdykge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZS10YWJsZS1sZWZ0LXNoYWRvdycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgndGhlLXRhYmxlLWxlZnQtc2hhZG93Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICBuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlLXRhYmxlLXJpZ2h0LXNoYWRvdycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RoZS10YWJsZS1yaWdodC1zaGFkb3cnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuY2VsbHNQb3NpdGlvbkNoYW5nZSgpXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlQ2VsbHNDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmRhbmdlcm91c09yU2VsZWN0ZWRDZWxsc0NoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1c2VSb3dDb250cm9scygpIHtcbiAgICAgICAgaWYgKCh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkgfHwgdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIHx8IHRoaXMudGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucm93Q29udHJvbHMgPSB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRlY3RDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlTWluUm93U3BhbkNlbGxGb3JSb3dzKCk6IHsgY2VsbD86IFRhYmxlQ2VsbEVsZW1lbnQ7IHJvd0luZGV4OiBudW1iZXIgfVtdIHtcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub0hpZGRlbkNlbGxzID0gcm93LmNoaWxkcmVuLmZpbHRlcihjZWxsID0+ICFjZWxsLmhpZGRlbik7XG4gICAgICAgICAgICBpZiAobm9IaWRkZW5DZWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluUm93c3BhbiA9IE1hdGgubWluLmFwcGx5KFxuICAgICAgICAgICAgICAgICAgICBNYXRoLFxuICAgICAgICAgICAgICAgICAgICBub0hpZGRlbkNlbGxzLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsLnJvd3NwYW4gfHwgMTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jaGlsZHJlbi5maW5kKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuICYmIChpdGVtLnJvd3NwYW4gfHwgMSkgPT09IG1pblJvd3NwYW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlUm93Q29udHJvbHMoKSB7XG4gICAgICAgIGNvbnN0IG1pblJvd1NwYW5DZWxsRm9yUm93cyA9IHRoaXMuY2FsY3VsYXRlTWluUm93U3BhbkNlbGxGb3JSb3dzKCk7XG5cbiAgICAgICAgY29uc3Qgcm93Q29udHJvbHMgPSBbXTtcbiAgICAgICAgbGV0IHByZXZpb3VzUm93SW5kZXggPSAwO1xuICAgICAgICBsZXQgcHJldmlvdXNDb21iaW5lUm93SW5kZXggPSAwO1xuICAgICAgICBtaW5Sb3dTcGFuQ2VsbEZvclJvd3MuZm9yRWFjaCgoY2VsbEluZm8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNlbGxJbmZvLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByb3dDb250cm9scy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbWluUm93U3BhbkNlbGxGb3JSb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSb3dDb250cm9sc0F2Z0hlaWdodChwcmV2aW91c0NvbWJpbmVSb3dJbmRleCwgcHJldmlvdXNSb3dJbmRleCwgcm93Q29udHJvbHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBjb21iaW5lIHJvdyBoZWlnaHRcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA+IHByZXZpb3VzUm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzQXZnSGVpZ2h0KHByZXZpb3VzQ29tYmluZVJvd0luZGV4LCBwcmV2aW91c1Jvd0luZGV4LCByb3dDb250cm9scyk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNDb21iaW5lUm93SW5kZXggPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjZWxsRG9tID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGNlbGxJbmZvLmNlbGwpO1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQoY2VsbERvbSk7XG4gICAgICAgICAgICAvLyDlvZNjZWxs5Li65ZCI5bm255qE5Y2V5YWD5qC8KHJvd3NwYW4gPiAxKe+8jOiuoeeul+WFtuWunumZhemrmOW6pu+8iOW9k+WJjeWNleWFg+agvOeahOmrmOW6piAtIOS4i+aWueWQiOW5tuWNleWFg+agvOeahOmrmOW6pu+8iVxuICAgICAgICAgICAgaWYgKGNlbGxJbmZvLmNlbGwucm93c3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxjSGVpZ2h0ID0gaGVpZ2h0IC0gdGhpcy5nZXRCZWxvd1Jvd0hlaWdodChtaW5Sb3dTcGFuQ2VsbEZvclJvd3MsIGluZGV4LCBjZWxsSW5mby5yb3dJbmRleCwgY2VsbEluZm8uY2VsbC5yb3dzcGFuKTtcbiAgICAgICAgICAgICAgICByb3dDb250cm9scy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjYWxjSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogY2VsbEluZm8ucm93SW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93Q29udHJvbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGNlbGxJbmZvLnJvd0luZGV4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1Jvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcm93Q29udHJvbHM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlUm93Q29udHJvbHNBdmdIZWlnaHQoXG4gICAgICAgIHByZXZpb3VzQ29tYmluZVJvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHByZXZpb3VzUm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93Q29udHJvbHM6IHsgaGVpZ2h0OiBudW1iZXI7IHJvd0luZGV4OiBudW1iZXIgfVtdXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHJvd0NvbnRyb2wgPSByb3dDb250cm9sc1twcmV2aW91c1Jvd0luZGV4XTtcbiAgICAgICAgY29uc3QgY291bnQgPSBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCAtIHByZXZpb3VzUm93SW5kZXg7XG4gICAgICAgIGNvbnN0IGF2Z0hlaWdodCA9IE1hdGguZmxvb3Iocm93Q29udHJvbC5oZWlnaHQgLyAoY291bnQgKyAxKSk7XG4gICAgICAgIGNvbnN0IGZpcnN0SGVpZ2h0ID0gcm93Q29udHJvbC5oZWlnaHQgLSBhdmdIZWlnaHQgKiBjb3VudDtcbiAgICAgICAgcm93Q29udHJvbC5oZWlnaHQgPSBmaXJzdEhlaWdodDtcbiAgICAgICAgcm93Q29udHJvbHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0sIF9pbmRleCkgPT4gX2luZGV4ID4gcHJldmlvdXNSb3dJbmRleCAmJiBfaW5kZXggPD0gcHJldmlvdXNDb21iaW5lUm93SW5kZXgpXG4gICAgICAgICAgICAuZm9yRWFjaChyb3dDb250cm9sID0+IHtcbiAgICAgICAgICAgICAgICByb3dDb250cm9sLmhlaWdodCA9IGF2Z0hlaWdodDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEJlbG93Um93SGVpZ2h0KFxuICAgICAgICBjZWxsczoge1xuICAgICAgICAgICAgY2VsbD86IFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICByb3dJbmRleDogbnVtYmVyO1xuICAgICAgICB9W10sXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHJvd3NwYW46IG51bWJlclxuICAgICkge1xuICAgICAgICBsZXQgYmVsb3dSb3dsSGVpZ2h0ID0gMDtcbiAgICAgICAgY2VsbHMuc2xpY2UoaW5kZXggKyAxLCBjZWxscy5sZW5ndGgpLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5jZWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvd0luZGV4ICsgcm93c3BhbiA+IGl0ZW0ucm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRG9tID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0uY2VsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY2VsbC5yb3dzcGFuID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzkuIvmlrnljZXlhYPmoLznmoRyb3dzcGFuID4gMe+8jOmAkuW9kuiuoeeul1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmdldEJlbG93Um93SGVpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5maW5kSW5kZXgoY2VsbCA9PiBjZWxsLnJvd0luZGV4ID09PSBpdGVtLnJvd0luZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNlbGwucm93c3BhblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd2xIZWlnaHQgKz0gZ2V0RWxlbWVudEhlaWdodChjZWxsRG9tKSAtIGhlaWdodDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd2xIZWlnaHQgKz0gZ2V0RWxlbWVudEhlaWdodChjZWxsRG9tKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYmVsb3dSb3dsSGVpZ2h0O1xuICAgIH1cblxuICAgIHJlc29sdmVJbWFnZSgpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50cyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTtcbiAgICAgICAgaWYgKGltYWdlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVJlc29sdmVzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICAgICAgaW1hZ2VFbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VMb2FkID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW1hZ2VSZXNvbHZlcy5wdXNoKGltYWdlTG9hZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChpbWFnZVJlc29sdmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH1cblxuICAgIGdldENvbENvbnRyb2xzKCkge1xuICAgICAgICB0aGlzLmNvbENvbnRyb2xzID0gdGhpcy5lbGVtZW50Py5jaGlsZHJlblswXT8uY2hpbGRyZW4gfHwgW107XG4gICAgfVxuXG4gICAgZ2V0SXNJblRhYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvci5zZWxlY3Rpb247XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgdGhpcy5lZGl0b3IsIHNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIHRoaXMuZWRpdG9yLCBzZWxlY3Rpb24uZm9jdXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IHN0YXJ0UG9zaXRpb24uaXNJblRhYmxlKCkgJiYgZW5kUG9zaXRpb24uaXNJblRhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdENlbGxXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW5bMF0gYXMgVGFibGVSb3dFbGVtZW50O1xuICAgICAgICBjb25zdCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIHJldHVybiB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKCh0YWJsZVdpZHRoIC8gdHIuY2hpbGRyZW4ubGVuZ3RoKS50b0ZpeGVkKDIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29sdW1ucykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IFtdO1xuICAgICAgICAgICAgdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdjb2wnKS5mb3JFYWNoKChlbGU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ29tcGF0aWJsZSB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgdGhlIHdpZHRoIGNhbm5vdCBiZSBvYnRhaW5lZCB1bmRlciBzYWZhcmkgI1dJSy05NjQzXG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKHsgd2lkdGg6IGVsZS5jbGllbnRXaWR0aCB8fCBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUoZWxlLnN0eWxlLndpZHRoKSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRWRpdG9yIGNvbnRhaW5lciB3aWR0aCBjaGFuZ2VzLCByZXN1bHRpbmcgaW4gY29sdW1uIHdpZHRocyBubyBsb25nZXIgdmFsaWQgI1dJSy02NzY2XG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nID0gdGhpcy5lbGVtZW50LmNvbHVtbnMuc29tZSgoY29sLCBpbmRleCkgPT4gY29sLndpZHRoICE9PSBjb2x1bW5zW2luZGV4XT8ud2lkdGgpO1xuICAgICAgICAgICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdHIgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW5bMF0gYXMgVGFibGVSb3dFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgdGFibGVXaWR0aCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCB0cikub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdHIuY2hpbGRyZW4ubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiBOdW1iZXIoKHRhYmxlV2lkdGggLyB0ci5jaGlsZHJlbi5sZW5ndGggLSB0ci5jaGlsZHJlbi5sZW5ndGgpLnRvRml4ZWQoMikpIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0aWFsaXplUm93cygpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHJvdyk7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGhlaWdodCB9LCByb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Sb3dIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IHJvd0VsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuY2hpbGRyZW47XG4gICAgICAgIGlmIChyb3dFbGVtZW50cykge1xuICAgICAgICAgICAgKFsuLi5yb3dFbGVtZW50c10gYXMgSFRNTFRhYmxlUm93RWxlbWVudFtdKS5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3cpO1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBoZWlnaHQgfSwgdGhpcy5lbGVtZW50LmNoaWxkcmVuW2luZGV4XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYW5zZm9ybUNvbHVtbnNXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgY29scyA9IFsuLi50aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY29sZ3JvdXAnKS5jaGlsZHJlbl0gYXMgSFRNTFRhYmxlQ29sRWxlbWVudFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5zOiBUaGVUYWJsZUNvbHVtbltdID0gY29scy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiBnZXRFbGVtZW50V2lkdGgoY29sKSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBvbkNvbE1vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCEhdGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhckRhbmdlcm91c0NlbGxzKCk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q29sdW1uKHRoaXMuZWRpdG9yLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Sb3dNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghdGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBUaGVFZGl0b3IuZmluZFBhdGgodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFJvdyh0aGlzLmVkaXRvciwgaW5kZXgpO1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0VGFibGUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RUYWJsZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgbGlzdGVuVGFibGVDb250ZXh0TWVudUV2ZW50KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NvbnRleHRtZW51JylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFNMQV9UQUJMRV9DRUxMX1NFTEVDVE9SKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZC1jZWxsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbChjZWxsLCB0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VDb250ZXh0TWVudSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFibGVTZXJ2aWNlLmlzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZVRvb2xiYXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGF0Y2ggZm9yIHJpZ2h0IGNsaWNrIHNlbGVjdCBuZXh0IGNlbGxcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgRWRpdG9yLnN0YXJ0KHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvci5zZWxlY3Rpb24pKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3Rlbk9uU2VsZWN0ZWRDZWxscygpIHtcbiAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZWRvd24nKS5waXBlKGZpbHRlcigoZTogTW91c2VFdmVudCkgPT4gZS5idXR0b24gIT09IDIpKSxcbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzVmlydHVhbEtleShlKSAmJiAhdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5pc09wZW5lZDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZVN0b3JlLnNlbGVjdGVkQ2VsbFBvc2l0aW9ucz8ubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyU2VsZWN0ZWRDZWxsc0NvbnRlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50VGFibGVFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFRhYmxlRWxlbWVudCB8fCAhdGhpcy50YWJsZVN0b3JlLnBvaW50ZXJTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyU2VsZWN0ZWRDZWxscygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFRhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJMYXN0Rm9jdXNQYXRoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmNsb3NlVG9vbGJhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuS2V5ZG93blNlbGVjdEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiAhIWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hvdGtleSgnbW9kJywgZXZlbnQpICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKHRoaXMudGJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5mb2N1c2VkLWNlbGwnXG4gICAgICAgICAgICAgICAgICAgICAgICApIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCAmJiB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbFN0YXJ0KGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5dXAnKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gISFlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnBvaW50ZXJTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuVGFibGVXcmFwcGVyU2Nyb2xsKCkge1xuICAgICAgICBjb25zdCBzdGlja3lSb3dzID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRoZS1zdGlja3ktcm93Jyk7XG5cbiAgICAgICAgY29uc3Qgc2V0U3RpY2t5Um93UG9pbnRlckV2ZW50cyA9IChwb2ludGVyRXZlbnRzU3R5bGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdGlSb3cgb2Ygc3RpY2t5Um93cykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3RpUm93LCAncG9pbnRlci1ldmVudHMnLCBwb2ludGVyRXZlbnRzU3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0aW1lcjtcbiAgICAgICAgZnJvbUV2ZW50KHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICd3aGVlbCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyDlpITnkIbmoIfpopjooYzlm7rlrprml7bnmoTmu5rliqjot5/pmo9cbiAgICAgICAgICAgICAgICBzZXRTdGlja3lSb3dQb2ludGVyRXZlbnRzKCdub25lJyk7XG4gICAgICAgICAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRTdGlja3lSb3dQb2ludGVyRXZlbnRzKCdhdXRvJyk7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZnJvbUV2ZW50KHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreVJvd1Njcm9sbExlZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlU3RpY2t5Um93U2Nyb2xsTGVmdCgpIHtcbiAgICAgICAgLy8g5Yik5pat5piv5ZCm5Ye6546w5Zu65a6a5qCH6aKY6KGMXG4gICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wKSB7XG4gICAgICAgICAgICBjb25zdCBzdGlja3lSb3dzID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRoZS1zdGlja3ktcm93Jyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0aVJvdyBvZiBzdGlja3lSb3dzKSB7XG4gICAgICAgICAgICAgICAgLy8g5L+u5aSN6I635Y+WIHNjcm9sbExlZnQg5bGe5oCn5byV6LW355qE5rWP6KeI5Zmo6YeN57uY77yM5a+86Ie06Lez5Yqo6Zeu6aKYICNXSUstMTEwMzhcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyDlkIzmraXmu5rliqjnirbmgIHliLAgLnRoZS1zdGlja3ktcm93XG4gICAgICAgICAgICAgICAgICAgIHN0aVJvdy5zY3JvbGxMZWZ0ID0gdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyUm93TGVmdFN0eWxlKCkge1xuICAgICAgICBjb25zdCBzdGlja3lSb3dzID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRoZS1zdGlja3ktcm93Jyk7XG4gICAgICAgIGNvbnN0IGNvcm5lckNvbnRyb2wgPSB0aGlzLmNvcm5lckNvbnRyb2wubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbCA9IHRoaXMucm93Q29udHJvbHNCdXR0b25XcmFwcGVyLmZpcnN0Py5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBzdGlja3lFbGVtZW50cyA9IFsuLi5zdGlja3lSb3dzLCBjb3JuZXJDb250cm9sLCByb3dDb250cm9sXTtcbiAgICAgICAgY29uc3QgeyBsZWZ0IH0gPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuaXNJblRhYmxlID8gLVRBQkxFX0NPTlRST0wgOiAwO1xuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCAmJiB0aGlzLmlzU2Nyb2xsWCkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgIHN0aWNreVJvd3MuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdsZWZ0JywgYCR7bGVmdCArIHRoaXMuZ2V0Q29sQ29udHJvbEJ1dHRvbldpZHRoKCl9cHhgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb3JuZXJDb250cm9sLCAnbGVmdCcsIGAke2xlZnQgKyBidWZmZXJ9cHhgKTtcbiAgICAgICAgICAgIHJvd0NvbnRyb2wgJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sLCAnbGVmdCcsIGAke2xlZnQgKyBidWZmZXJ9cHhgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0aWNreUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdsZWZ0JywgbnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENvbENvbnRyb2xCdXR0b25XaWR0aCA9ICgpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIHJlc3VsdCArPSB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyBUQUJMRV9OVU1CRVJfQ09MVU1OIDogMDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdHJhY2tCeUZuUm93Q29udHJvbHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgdHJhY2tCeUZuQ29sQ29udHJvbHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb250YWluZXJcIiB0aGVDb2x1bW5SZXNpemU+XG4gIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMgdGhlLXN0aWNreS1jb3JuZXItY29udHJvbHNcIlxuICAgICAgI2Nvcm5lckNvbnRyb2xcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgdmlzaWJsZTogIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcpLFxuICAgICAgICAnY29udHJvbC1hY3RpdmUnOiBpc1NlbGVjdGVkQWxsQ2VsbCxcbiAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmlzU2VsZWN0ZWRUYWJsZSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWJ1dHRvblwiIChtb3VzZWRvd24pPVwib25TZWxlY3RUYWJsZSgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtcm93LW1hcmtlclwiICpuZ0lmPVwiIWhlYWRlclJvd1wiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LWNvbHVtbi1tYXJrZXJcIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJjb2x1bW5cIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiICNyb3dDb250cm9sc0lubmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbi13cmFwXCJcbiAgICAgICAgICAjcm93Q29udHJvbHNCdXR0b25XcmFwcGVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygcm93Q29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblJvd0NvbnRyb2xzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpLFxuICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c1Jvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgKGlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZykgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW2NvbnRlbnRFZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlZG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwicm93LW51bWJlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+e3sgaGVhZGVyUm93ICYmIGkgPT09IDAgPyAnJyA6IGhlYWRlclJvdyA/IGkgOiBpICsgMSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCJjb250cm9sLnJvd0luZGV4ICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj4gPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXdyYXBwZXJcIiAjdGFibGVXcmFwcGVyIFtuZ0NsYXNzXT1cInsgJ3RoZS10YWJsZS1udW1iZXJlZCc6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIH1cIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0aGUtdGFibGVcIiAjdGhlVGFibGU+XG4gICAgICA8Y29sZ3JvdXAgI2NvbGdyb3VwICpuZ0lmPVwiY29sdW1uc1wiPlxuICAgICAgICA8Y29sICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtuZ1N0eWxlXT1cInsgd2lkdGg6IGNvbC53aWR0aCArICdweCcgfVwiIC8+XG4gICAgICA8L2NvbGdyb3VwPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0aGUtdGFibGUtY29sLWNvbnRyb2xzLXdyYXBwZXIgdGhlLXN0aWNreS1yb3dcIiAjY29sdW1uQ29udHJvbHNXcmFwcGVyPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgI2NvbENvbnRyb2xcbiAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9sc1wiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiBjb2xDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuQ29sQ29udHJvbHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpLFxuICAgICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ29sTW91c2Vkb3duKCRldmVudCwgaSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmtcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgW2F0XT1cImkgKyAxXCJcbiAgICAgICAgICAgICAgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiXG4gICAgICAgICAgICAgIFtwYXJlbnRFbGVtZW50XT1cImNvbENvbnRyb2xcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHkgI3Rib2R5PlxuICAgICAgICA8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+IDwvc2xhdGUtY2hpbGRyZW4+XG4gICAgICA8L3Rib2R5PlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yb3ctc2hhZG93IGhlYWRlci1yb3ctbGVmdC1zaGFkb3dcIiAjaGVhZGVyUm93TGVmdFNoYWRvdyBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yb3ctc2hhZG93IGhlYWRlci1yb3ctcmlnaHQtc2hhZG93XCIgI2hlYWRlclJvd1JpZ2h0U2hhZG93IGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCI+PC9kaXY+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
890
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsVUFBVSxFQUtWLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFD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RUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJdEUsUUFBUTtzQkFEUCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHTSx3QkFBd0I7c0JBQXZGLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUc5RCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgT25EZXN0cm95LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIE5nWm9uZSxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWRpdG9yLCBUcmFuc2Zvcm1zIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgVGhlRWRpdG9yLCBUaGVCYXNlRWxlbWVudENvbXBvbmVudCwgUGx1Z2luS2V5cywgVGhlUGx1Z2luT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0hvdGtleSB9IGZyb20gJ2lzLWhvdGtleSc7XG5pbXBvcnQgeyBTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9zZWxlY3Rvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSwgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbnRleHRtZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlLCBnZXRFbGVtZW50SGVpZ2h0LCBnZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBUYWJsZVBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVGFibGVTdG9yZSB9IGZyb20gJy4uL3RhYmxlLnN0b3JlJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBIRUFERVJfQ0VMTF9DTEFTUyxcbiAgICBUYWJsZU9wdGlvbnMsXG4gICAgVGFibGVXaXRoU3RpY2t5Um93Q2xhc3MsXG4gICAgVEFCTEVfQ09OVFJPTCxcbiAgICBUQUJMRV9JTlNFUlRfTUFTSyxcbiAgICBUQUJMRV9OVU1CRVJfQ09MVU1OLFxuICAgIFRBQkxFX1BBRERJTkcsXG4gICAgVGhlUGx1Z2luVGFibGVPcHRpb24sXG4gICAgVGhlVGFibGVDb2x1bW4sXG4gICAgVEhFX1RBQkxFX0NPTVBPTkVOVF9UT0tFTlxufSBmcm9tICcuLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBpc1ZpcnR1YWxLZXkgfSBmcm9tICcuLi91dGlscy9pcy12aXJ0dWFsLWtleSc7XG5pbXBvcnQgeyBnZXRQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBUYWJsZUZyZWV6ZUNvbHVtblBpcGUsIFRhYmxlRnJlZXplUm93UGlwZSB9IGZyb20gJy4uL3RhYmxlLnBpcGUnO1xuaW1wb3J0ICogYXMgVGhlVHJhbnNmb3JtcyBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1zJztcbmltcG9ydCB7IFRoZUNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldENvbHVtbnNXaWR0aCwgZ2V0R3JpZENvbHVtbnMgfSBmcm9tICcuLi91dGlscy9nZXQtZ3JpZC1jb2x1bW5zJztcbmltcG9ydCB7IERFRkFVTFRfU0NST0xMX0NPTlRBSU5FUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IFNjcm9sbERpcmVjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9ub2RlLXR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtdGFibGUsIFt0aGVUYWJsZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFRhYmxlU3RvcmUsXG4gICAgICAgIFRhYmxlU2VydmljZSxcbiAgICAgICAgVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsXG4gICAgICAgIFRhYmxlRnJlZXplQ29sdW1uUGlwZSxcbiAgICAgICAgVGFibGVGcmVlemVSb3dQaXBlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUSEVfVEFCTEVfQ09NUE9ORU5UX1RPS0VOLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRoZVRhYmxlQ29tcG9uZW50XG4gICAgICAgIH1cbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtd2l0aC1jb250cm9sc10nOiAnaXNJblRhYmxlIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtd2l0aC1zdGlja3ktY29sdW1uXSc6ICdmcmVlemVDb2x1bW5QaXBlLnRyYW5zZm9ybShlbGVtZW50LCB0YWJsZVBsdWdpbk9wdGlvbnMpJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtbnVtYmVyZC10YWJsZV0nOiAnZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4nLFxuICAgICAgICAnW2NsYXNzLnRoZS10YWJsZS1zZWxlY3Rpb24taGlkZV0nOiAndGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBUaGVUYWJsZUNvbXBvbmVudCBleHRlbmRzIFRoZUJhc2VFbGVtZW50Q29tcG9uZW50PFRhYmxlRWxlbWVudCwgRWRpdG9yPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBoZWFkZXJSb3cgPSBmYWxzZTtcblxuICAgIGlzU2VsZWN0ZWRBbGxDZWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICByb3dDb250cm9sczogeyBoZWlnaHQ6IG51bWJlcjsgcm93SW5kZXg6IG51bWJlciB9W10gPSBbXTtcblxuICAgIGNvbENvbnRyb2xzID0gW107XG5cbiAgICBpc0luVGFibGU6IGJvb2xlYW47XG5cbiAgICB0YWJsZVBsdWdpbk9wdGlvbnM6IFRoZVBsdWdpbk9wdGlvbjxUaGVQbHVnaW5UYWJsZU9wdGlvbj47XG5cbiAgICBpc1N0aWNreVRvcDogYm9vbGVhbjtcblxuICAgIGlzU2Nyb2xsWDogYm9vbGVhbjtcblxuICAgIHNjcm9sbENvbnRhaW5lclRvcDogbnVtYmVyO1xuXG4gICAgdGFibGVSZWN0TGVmdDogbnVtYmVyO1xuXG4gICAgaXNSaWdodFNoYWRvdzogYm9vbGVhbjtcblxuICAgIGlzTGVmdFNoYWRvdzogYm9vbGVhbjtcblxuICAgIHByZXZpb3VzU2Nyb2xsQ29udGFpbmVyOiBzdHJpbmc7XG5cbiAgICBnZXQgY29sdW1ucygpOiBUaGVUYWJsZUNvbHVtbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQuY29sdW1ucztcbiAgICB9XG5cbiAgICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgdGJvZHlOYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGJvZHlFbGVtZW50Py5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgdGFibGVXcmFwcGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ3RoZVRhYmxlJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0aGVUYWJsZUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgdGJvZHlFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgndGFibGVSb3dDb250cm9sc1dyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICB0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb2x1bW5Db250cm9sc1dyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBjb2x1bW5Db250cm9sc1dyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29ybmVyQ29udHJvbCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvcm5lckNvbnRyb2w6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgncm93Q29udHJvbHNJbm5lcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHJvd0NvbnRyb2xzSW5uZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyUm93TGVmdFNoYWRvdycsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGhlYWRlclJvd0xlZnRTaGFkb3c6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyUm93UmlnaHRTaGFkb3cnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBoZWFkZXJSb3dSaWdodFNoYWRvdzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb2xncm91cCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvbGdyb3VwOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3Jvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSByb3dDb250cm9sc0J1dHRvbldyYXBwZXI6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICAgIGhhbmRsZU1vdXNlZG93bihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0aGlzLnRib2R5TmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFUaGVFZGl0b3IuaXNGb2N1c2VkKHRoaXMuZWRpdG9yKSkge1xuICAgICAgICAgICAgVGhlRWRpdG9yLmZvY3VzKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBBbmd1bGFyRWRpdG9yLm1vdmVCbG9ja0NhcmQodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBvbkNvbnRleHRDaGFuZ2UoKSB7XG4gICAgICAgIHN1cGVyLm9uQ29udGV4dENoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmVtaXRUYWJsZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jYWxjdWxhdGVTZWxlY3RlZENvbHVtbnNBbmRSb3dJbmRleCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmdldElzSW5UYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5nZXRDb2xDb250cm9scygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGVhZGVyUm93ID0gdGhpcy5nZXRIZWFkZXJSb3coKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHB1YmxpYyBldmVudERpc3BhdGNoZXI6IFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgcHVibGljIHJlc2l6ZU5vdGlmaWVyOiBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAgcHVibGljIHRhYmxlU3RvcmU6IFRhYmxlU3RvcmUsXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0aGVUYWJsZUNvbnRleHRNZW51U2VydmljZTogVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZnJlZXplQ29sdW1uUGlwZTogVGFibGVGcmVlemVDb2x1bW5QaXBlLFxuICAgICAgICBwdWJsaWMgZnJlZXplUm93UGlwZTogVGFibGVGcmVlemVSb3dQaXBlLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IFRoZUNvbnRleHRTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNkcik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMgPSBnZXRQbHVnaW5PcHRpb25zPFRoZVBsdWdpblRhYmxlT3B0aW9uPih0aGlzLmVkaXRvciwgUGx1Z2luS2V5cy50YWJsZSk7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5zaG93RnVsbHNjcmVlbiAmJiB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5mdWxsc2NyZWVuQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9uc1xuICAgICAgICAgICAgICAgIC5mdWxsc2NyZWVuQWN0aW9uKHRoaXMuZWRpdG9yKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LmVsZW1lbnQgPT09IHRoaXMuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChjb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50LnN0YXRlID09PSAnb2ZmJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTY3JvbGxDb250YWluZXIgPSB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iub3B0aW9ucy5zY3JvbGxDb250YWluZXIgPSB0aGlzLnByZXZpb3VzU2Nyb2xsQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnJlYmluZENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLnNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGVkQWxsQ2VsbCA9IHRoaXMudGFibGVTdG9yZS5pc1NlbGVjdGVkQWxsQ2VsbCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0V3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMubmF0aXZlRWxlbWVudC5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWJsZUNvbnRhaW5lcilbJ3BhZGRpbmdMZWZ0J10pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRhYmxlQ29udGFpbmVyLm9mZnNldFdpZHRoIC0gcGFkZGluZ0xlZnQ7XG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb21wYXRpYmxlIHdpdGggb2xkIGRhdGFcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldEhlYWRlclJvdygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8ub3B0aW9ucz8uaGVhZGVyUm93KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21wYXQgb2xkIGRhdGFcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8uY2hpbGRyZW5bMF0uaGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tDYXJkRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdzbGF0ZS1ibG9jay1jYXJkJyk7XG4gICAgICAgICAgICBpZiAoYmxvY2tDYXJkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGJsb2NrQ2FyZEVsZW1lbnQuY2xhc3NMaXN0LmFkZChgc2xhdGUtYmxvY2stY2FyZC0ke3RoaXMuZWxlbWVudC50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmluaXRFZGl0b3IodGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbHNDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbFBvc2l0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5PblNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuS2V5ZG93blNlbGVjdEV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5UYWJsZVdyYXBwZXJTY3JvbGwoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRJbWFnZURvbmUgPSBhd2FpdCB0aGlzLnJlc29sdmVJbWFnZSgpO1xuICAgICAgICAgICAgICAgIC8vIOetieW+heW6j+WPt+WIl+ihqOagvOWGheWbvueJh+WKoOi9veWujOaIkOWQjuWGjeWOu+a4suafk+ihqOagvOihjOmrmOW6plxuICAgICAgICAgICAgICAgIGlmIChsb2FkSW1hZ2VEb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlUm93Q29udHJvbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVJlY3RMZWZ0ID0gbGVmdDtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlU2Nyb2xsQ29udGFpbmVyU2Nyb2xsKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNvbnRhaW5lclJlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEdyaWRDb2x1bW5zU3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLndpbmRvd1Jlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiDnu5nmoIfpopjooYznmoTlt6Yv5Y+z5Yqg6Zi05b2xICovXG4gICAgc2V0SGVhZGVyUm93U2hhZG93KCkge1xuICAgICAgICAvLyDlm7rlrprmoIfpopjooYzpga7nm5ZcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsIHRoaXMuaXNTdGlja3lUb3AgPyAnMycgOiAnMCcpO1xuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cgfHwgdGhpcy5pc1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWlnaHQsIHRvcCB9ID0gdGhpcy5jYWxjSGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICBsZXQgeyBsZWZ0LCB3aWR0aCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNSaWdodFNoYWRvdyAmJiB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93UmlnaHRTaGFkb3cgPSB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dSaWdodFNoYWRvdywgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93UmlnaHRTaGFkb3csICd0b3AnLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd1JpZ2h0U2hhZG93LCAnbGVmdCcsIGAke2xlZnQgKyB3aWR0aCAtIDh9cHhgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdFNoYWRvdyAmJiB0aGlzLmhlYWRlclJvd0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dMZWZ0U2hhZG93ID0gdGhpcy5oZWFkZXJSb3dMZWZ0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnbGVmdCcsIGAke2xlZnQgKyB0aGlzLmdldENvbENvbnRyb2xCdXR0b25XaWR0aCgpfXB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjSGVhZGVyUm93U2hhZG93KCkge1xuICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzKClbMF0/LmhlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IGhlYWRlclJvd0hlaWdodDtcbiAgICAgICAgLy8g6buY6K6k77yI5rKh5pyJ6IGa54Sm77yJ55qEIHRvcCDlgLzvvJrmu5rliqjlrrnlmajpq5jluqYgKyDooajmoLznmoRwYWRkaW5n77yIOO+8iVxuICAgICAgICBsZXQgdG9wID0gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyBUQUJMRV9QQURESU5HO1xuICAgICAgICAvLyDogZrnhKbnirbmgIHkuIvvvJog6auY5bqmICsgY29udHJvbO+8iDEx77yJ77yMdG9wIOWKoOS4gOS4qiBtYXNr77yIMTnvvIlcbiAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgVEFCTEVfQ09OVFJPTDtcbiAgICAgICAgICAgIHRvcCA9IHRvcCArIFRBQkxFX0lOU0VSVF9NQVNLIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBoZWlnaHQsIHRvcCB9O1xuICAgIH1cblxuICAgIHN1YnNjcmliZVNjcm9sbENvbnRhaW5lclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5jb250YWluZXJTY3JvbGxlZCRcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoZW50aXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGV2ZW50LCBkaXJlY3Rpb24gfSA9IGVudGlyZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxYID0gdGhpcy50YWJsZVJlY3RMZWZ0ICE9PSBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24uWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyVG9wSGVpZ2h0ID0gdGhpcy5pc0luVGFibGUgPyAtMTkgOiAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzKClbMF0/LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBjbGllbnRSZWN0LnRvcCArIGhlYWRlclRvcEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIDw9IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgOCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRSZWN0LmJvdHRvbSAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID49IGhlYWRlclJvd0hlaWdodCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3csIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmoIfpopjooYzlhoXlrrnotoXov4flm7rlrprpq5jluqbml7bnp7vpmaTlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWFkZXJSb3dIZWlnaHQgPSAoMjQgKyA4KSAqIDExOyAvLyDotoXlh7ogMTEg6KGM77yM5Y+W5raI5Ya757uTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBoZWFkZXJSb3dIZWlnaHQgPD0gbWF4SGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RpY2t5VG9wO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDZWxsU3R5bGUoKSB7XG4gICAgICAgIGxldCBoZWFkZXJSb3dDZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pO1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUm93KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJSb3dDZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJDZWxsU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGVhZGVyQ2VsbHMgPSBoZWFkZXJSb3dDZWxscy5jb25jYXQoaGVhZGVyQ29sdW1uQ2VsbHMpLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIGlmICh0aGlzLmhlYWRlclJvdyAmJiB0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxscy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJDZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ29sdW1uQW5kQ29udHJvbFN0eWxlKGhlYWRlckNvbHVtbkNlbGxzKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZUhlYWRlckNlbGxTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxFbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNlbGxFbGVtZW50LCBIRUFERVJfQ0VMTF9DTEFTUyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlckNvbHVtbkFuZENvbnRyb2xTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGxldCBoZWFkZXJDb2x1bW5DZWxscyA9IFtdO1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAoaXRlbSA9PiBpdGVtLmNoaWxkcmVuWzBdKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBjZWxscy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlckNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGNvbnN0IGhlYWRlckNvbHVtbkVsZW1lbnRzID0gaGVhZGVyQ29sdW1uQ2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgWy4uLmhlYWRlckNvbHVtbkVsZW1lbnRzLCBoZWFkZXJDb2xDb250cm9sXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mcmVlemVDb2x1bW5QaXBlLnRyYW5zZm9ybSh0aGlzLmVsZW1lbnQsIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXRlbSwgJ3RoZS1zdGlja3ktY2VsbCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGl0ZW0sICd0aGUtc3RpY2t5LWNlbGwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyUm93U3R5bGUoKSB7XG4gICAgICAgIHRoaXMuc2V0R3JpZENvbHVtbnNTdHlsZSgpO1xuICAgICAgICB0aGlzLnNldFN0aWNreVJvd1N0eWxlKCk7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgfVxuXG4gICAgc2V0R3JpZENvbHVtbnNTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3csIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gKHRoaXMudGJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBjZWxsc1dpZHRoID0gdGhpcy5jb2xncm91cD8ubmF0aXZlRWxlbWVudCA/IGdldENvbHVtbnNXaWR0aCh0aGlzLmNvbGdyb3VwLm5hdGl2ZUVsZW1lbnQpIDogdGhpcy5nZXREZWZhdWx0Q2VsbFdpZHRoKCk7XG4gICAgICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IGdldEdyaWRDb2x1bW5zKGhlYWRlclJvdywgY2VsbHNXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmcgPSA0NDtcbiAgICAgICAgICAgIGxldCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uID8gdGFibGVXaWR0aCAtIHRhYmxlUGFkZGluZyA6IHRhYmxlV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBzdGlja3lSb3dzID0gdGhpcy5pc0luVGFibGUgPyBbY29sQ29udHJvbCwgaGVhZGVyUm93XSA6IFtoZWFkZXJSb3ddO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJywgZ3JpZENvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3dpZHRoJywgdGFibGVXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGlja3lSb3dTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keSB0cicpO1xuICAgICAgICBjb25zdCByb3dDb250cm9sSW5uZXIgPSB0aGlzLnJvd0NvbnRyb2xzSW5uZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFibGVDb3JuZXJCdG4gPSB0aGlzLmNvcm5lckNvbnRyb2wubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVSb3dDb250cm9scygpWzBdPy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bWJlcmVkQ29sdW1uID0gdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uO1xuXG4gICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgVGFibGVXaXRoU3RpY2t5Um93Q2xhc3MpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmlzSW5UYWJsZSA/IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgMzYgOiB0aGlzLnNjcm9sbENvbnRhaW5lclRvcDtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93LCAndG9wJywgdG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvdywgJ2hlaWdodCcsIGAke2hlYWRlclJvd0hlaWdodH1weGApO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJblRhYmxlIHx8IG51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgW2NvbENvbnRyb2wsIHRhYmxlQ29ybmVyQnRuXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAndG9wJywgdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAncHgnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOS8mOWMlu+8mnRhYmxlIOeahCBwYWRkaW5nLXRvcCDlupTor6XliqjmgIHlj5jljJbvvIjkuI7pmLTlvbHlkIzlj5jvvIlcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUGFkZGluZ1RvcCA9IGhlYWRlclJvd0hlaWdodCArIDExOyAvLyDmoIfpopjooYzpq5ggKyBjdHJsIGJ0bu+8iDExcHjvvInpq5jluqZcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmctdG9wJywgdGFibGVQYWRkaW5nVG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xJbm5lciwgJ3BhZGRpbmctdG9wJywgdGFibGVQYWRkaW5nVG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVSb3dDb250cm9sc1dyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3otaW5kZXgnLCAnNCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzKTtcbiAgICAgICAgICAgIFtoZWFkZXJSb3csIGNvbENvbnRyb2wsIHRhYmxlQ29ybmVyQnRuXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd0b3AnLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAncGFkZGluZy10b3AnLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbElubmVyLCAncGFkZGluZy10b3AnLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZVJvd0NvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsICcxJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3dDb250cm9sQnV0dG9uID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHJvd0NvbnRyb2xCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Um93Q29udHJvbEJ1dHRvblN0eWxlKHJvd0NvbnRyb2xCdXR0b24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2V0VGltZW91dO+8miDpnIDopoHnrYnlvoUgcm93Q29udHJvbHMg5ZyoIGRvbSDkuK3muLLmn5Plrozmr5XlkI7miY3og73ojrflj5bliLAgcm93Q29udHJvbEJ1dHRvblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFJvd0NvbnRyb2xCdXR0b25TdHlsZShyb3dDb250cm9sQnV0dG9uKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRSb3dDb250cm9sQnV0dG9uU3R5bGUocm93Q29udHJvbEJ1dHRvbjogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgbnVtYmVyZWRDb2x1bW4gPSB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW47XG4gICAgICAgIGlmICghcm93Q29udHJvbEJ1dHRvbikge1xuICAgICAgICAgICAgcm93Q29udHJvbEJ1dHRvbiA9IHRoaXMucm93Q29udHJvbHNCdXR0b25XcmFwcGVyLmZpcnN0Py5uYXRpdmVFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuaXNJblRhYmxlIHx8IG51bWJlcmVkQ29sdW1uKSAmJiByb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sQnV0dG9uLCAndG9wJywgdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAncHgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd0NvbnRyb2xCdXR0b24gJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sQnV0dG9uLCAndG9wJywgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gbmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICBjb25zdCBzY3JvbGxXaWR0aCA9IG5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IGNsaWVudFdpZHRoID0gbmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgdGhpcy5pc0xlZnRTaGFkb3cgPSBzY3JvbGxMZWZ0ID4gMDtcbiAgICAgICAgdGhpcy5pc1JpZ2h0U2hhZG93ID0gc2Nyb2xsTGVmdCArIGNsaWVudFdpZHRoIDwgc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBuYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYHRyYCk7XG4gICAgICAgIGNvbnN0IHN0aWNreUNlbGxzID0gQXJyYXkuZnJvbShyb3dzKS5tYXAoaXRlbSA9PiBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3RoJykgfHwgaXRlbS5xdWVyeVNlbGVjdG9yKCd0ZCcpKTtcbiAgICAgICAgY29uc3QgaXNDb2x1bW5IZWFkZXIgPSB0aGlzLmZyZWV6ZUNvbHVtblBpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGlzQ29sdW1uSGVhZGVyID8gc3RpY2t5Q2VsbHMgOiBbbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50XTtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0U2hhZG93KSB7XG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlLXRhYmxlLWxlZnQtc2hhZG93Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCd0aGUtdGFibGUtbGVmdC1zaGFkb3cnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzUmlnaHRTaGFkb3cpIHtcbiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGUtdGFibGUtcmlnaHQtc2hhZG93Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndGhlLXRhYmxlLXJpZ2h0LXNoYWRvdycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlQ2VsbFBvc2l0aW9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5jZWxsc1Bvc2l0aW9uQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuZGFuZ2Vyb3VzT3JTZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVzZVJvd0NvbnRyb2xzKCkge1xuICAgICAgICBpZiAoKHRoaXMuc2VsZWN0aW9uICYmICF0aGlzLnJlYWRvbmx5KSB8fCB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gfHwgdGhpcy50YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZykge1xuICAgICAgICAgICAgdGhpcy5yb3dDb250cm9scyA9IHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldGVjdENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVNaW5Sb3dTcGFuQ2VsbEZvclJvd3MoKTogeyBjZWxsPzogVGFibGVDZWxsRWxlbWVudDsgcm93SW5kZXg6IG51bWJlciB9W10ge1xuICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vSGlkZGVuQ2VsbHMgPSByb3cuY2hpbGRyZW4uZmlsdGVyKGNlbGwgPT4gIWNlbGwuaGlkZGVuKTtcbiAgICAgICAgICAgIGlmIChub0hpZGRlbkNlbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW5Sb3dzcGFuID0gTWF0aC5taW4uYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIE1hdGgsXG4gICAgICAgICAgICAgICAgICAgIG5vSGlkZGVuQ2VsbHMubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwucm93c3BhbiB8fCAxO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNoaWxkcmVuLmZpbmQoaXRlbSA9PiAhaXRlbS5oaWRkZW4gJiYgKGl0ZW0ucm93c3BhbiB8fCAxKSA9PT0gbWluUm93c3Bhbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVSb3dDb250cm9scygpIHtcbiAgICAgICAgY29uc3QgbWluUm93U3BhbkNlbGxGb3JSb3dzID0gdGhpcy5jYWxjdWxhdGVNaW5Sb3dTcGFuQ2VsbEZvclJvd3MoKTtcblxuICAgICAgICBjb25zdCByb3dDb250cm9scyA9IFtdO1xuICAgICAgICBsZXQgcHJldmlvdXNSb3dJbmRleCA9IDA7XG4gICAgICAgIGxldCBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IDA7XG4gICAgICAgIG1pblJvd1NwYW5DZWxsRm9yUm93cy5mb3JFYWNoKChjZWxsSW5mbywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghY2VsbEluZm8uY2VsbCkge1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2xzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBtaW5Sb3dTcGFuQ2VsbEZvclJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzQXZnSGVpZ2h0KHByZXZpb3VzQ29tYmluZVJvd0luZGV4LCBwcmV2aW91c1Jvd0luZGV4LCByb3dDb250cm9scyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGNvbWJpbmUgcm93IGhlaWdodFxuICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID4gcHJldmlvdXNSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHNBdmdIZWlnaHQocHJldmlvdXNDb21iaW5lUm93SW5kZXgsIHByZXZpb3VzUm93SW5kZXgsIHJvd0NvbnRyb2xzKTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNlbGxEb20gPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgY2VsbEluZm8uY2VsbCk7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChjZWxsRG9tKTtcbiAgICAgICAgICAgIC8vIOW9k2NlbGzkuLrlkIjlubbnmoTljZXlhYPmoLwocm93c3BhbiA+IDEp77yM6K6h566X5YW25a6e6ZmF6auY5bqm77yI5b2T5YmN5Y2V5YWD5qC855qE6auY5bqmIC0g5LiL5pa55ZCI5bm25Y2V5YWD5qC855qE6auY5bqm77yJXG4gICAgICAgICAgICBpZiAoY2VsbEluZm8uY2VsbC5yb3dzcGFuID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGNIZWlnaHQgPSBoZWlnaHQgLSB0aGlzLmdldEJlbG93Um93SGVpZ2h0KG1pblJvd1NwYW5DZWxsRm9yUm93cywgaW5kZXgsIGNlbGxJbmZvLnJvd0luZGV4LCBjZWxsSW5mby5jZWxsLnJvd3NwYW4pO1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2xzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNhbGNIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBjZWxsSW5mby5yb3dJbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb3dDb250cm9scy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogY2VsbEluZm8ucm93SW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByb3dDb250cm9scztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVSb3dDb250cm9sc0F2Z0hlaWdodChcbiAgICAgICAgcHJldmlvdXNDb21iaW5lUm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcHJldmlvdXNSb3dJbmRleDogbnVtYmVyLFxuICAgICAgICByb3dDb250cm9sczogeyBoZWlnaHQ6IG51bWJlcjsgcm93SW5kZXg6IG51bWJlciB9W11cbiAgICApIHtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbCA9IHJvd0NvbnRyb2xzW3ByZXZpb3VzUm93SW5kZXhdO1xuICAgICAgICBjb25zdCBjb3VudCA9IHByZXZpb3VzQ29tYmluZVJvd0luZGV4IC0gcHJldmlvdXNSb3dJbmRleDtcbiAgICAgICAgY29uc3QgYXZnSGVpZ2h0ID0gTWF0aC5mbG9vcihyb3dDb250cm9sLmhlaWdodCAvIChjb3VudCArIDEpKTtcbiAgICAgICAgY29uc3QgZmlyc3RIZWlnaHQgPSByb3dDb250cm9sLmhlaWdodCAtIGF2Z0hlaWdodCAqIGNvdW50O1xuICAgICAgICByb3dDb250cm9sLmhlaWdodCA9IGZpcnN0SGVpZ2h0O1xuICAgICAgICByb3dDb250cm9sc1xuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSwgX2luZGV4KSA9PiBfaW5kZXggPiBwcmV2aW91c1Jvd0luZGV4ICYmIF9pbmRleCA8PSBwcmV2aW91c0NvbWJpbmVSb3dJbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKHJvd0NvbnRyb2wgPT4ge1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2wuaGVpZ2h0ID0gYXZnSGVpZ2h0O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QmVsb3dSb3dIZWlnaHQoXG4gICAgICAgIGNlbGxzOiB7XG4gICAgICAgICAgICBjZWxsPzogVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgIHJvd0luZGV4OiBudW1iZXI7XG4gICAgICAgIH1bXSxcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93c3BhbjogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIGxldCBiZWxvd1Jvd2xIZWlnaHQgPSAwO1xuICAgICAgICBjZWxscy5zbGljZShpbmRleCArIDEsIGNlbGxzLmxlbmd0aCkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm93SW5kZXggKyByb3dzcGFuID4gaXRlbS5yb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxEb20gPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbS5jZWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOS4i+aWueWNleWFg+agvOeahHJvd3NwYW4gPiAx77yM6YCS5b2S6K6h566XXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZ2V0QmVsb3dSb3dIZWlnaHQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxscyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzLmZpbmRJbmRleChjZWxsID0+IGNlbGwucm93SW5kZXggPT09IGl0ZW0ucm93SW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5yb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2VsbC5yb3dzcGFuXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93Um93bEhlaWdodCArPSBnZXRFbGVtZW50SGVpZ2h0KGNlbGxEb20pIC0gaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93Um93bEhlaWdodCArPSBnZXRFbGVtZW50SGVpZ2h0KGNlbGxEb20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiZWxvd1Jvd2xIZWlnaHQ7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUltYWdlKCkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgICAgICBpZiAoaW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUmVzb2x2ZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUxvYWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbWFnZVJlc29sdmVzLnB1c2goaW1hZ2VMb2FkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGltYWdlUmVzb2x2ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbHMoKSB7XG4gICAgICAgIHRoaXMuY29sQ29udHJvbHMgPSB0aGlzLmVsZW1lbnQ/LmNoaWxkcmVuWzBdPy5jaGlsZHJlbiB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXRJc0luVGFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCB0aGlzLmVkaXRvciwgc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgdGhpcy5lZGl0b3IsIHNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgICAgIHRoaXMuaXNJblRhYmxlID0gc3RhcnRQb3NpdGlvbi5pc0luVGFibGUoKSAmJiBlbmRQb3NpdGlvbi5pc0luVGFibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNJblRhYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXREZWZhdWx0Q2VsbFdpZHRoKCkge1xuICAgICAgICBjb25zdCB0ciA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXSBhcyBUYWJsZVJvd0VsZW1lbnQ7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBpZiAodGhpcy5yb3dDb250cm9sc0lubmVyKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnJvd0NvbnRyb2xzSW5uZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkQW5kTm9uUmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAvLyDogZrnhKbkuYvlkI7kvJrlkJHlt6blgY/np7vkuIDkuKogY29udHJvbO+8iC0xMe+8ie+8jOingSAudGhlLXRhYmxlLXJvdy1jb250cm9scy13cmFwcGVyXG4gICAgICAgICAgICAgICAgd2lkdGggKz0gVEFCTEVfQ09OVFJPTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHIuY2hpbGRyZW4ubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlcigod2lkdGggLyB0ci5jaGlsZHJlbi5sZW5ndGgpLnRvRml4ZWQoMikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgICAgICAgICB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvbCcpLmZvckVhY2goKGVsZTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb21wYXRpYmxlIHdpdGggdGhlIHByb2JsZW0gdGhhdCB0aGUgd2lkdGggY2Fubm90IGJlIG9idGFpbmVkIHVuZGVyIHNhZmFyaSAjV0lLLTk2NDNcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goeyB3aWR0aDogZWxlLmNsaWVudFdpZHRoIHx8IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShlbGUuc3R5bGUud2lkdGgpIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBFZGl0b3IgY29udGFpbmVyIHdpZHRoIGNoYW5nZXMsIHJlc3VsdGluZyBpbiBjb2x1bW4gd2lkdGhzIG5vIGxvbmdlciB2YWxpZCAjV0lLLTY3NjZcbiAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPSB0aGlzLmVsZW1lbnQuY29sdW1ucy5zb21lKChjb2wsIGluZGV4KSA9PiBjb2wud2lkdGggIT09IGNvbHVtbnNbaW5kZXhdPy53aWR0aCk7XG4gICAgICAgICAgICBpZiAod2FybmluZykge1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ciA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXSBhcyBUYWJsZVJvd0VsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVdpZHRoID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRyKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IE51bWJlcigodGFibGVXaWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCAtIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSkgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVSb3dzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgcm93KTtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybVJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3Qgcm93RWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHknKS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKHJvd0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAoWy4uLnJvd0VsZW1lbnRzXSBhcyBIVE1MVGFibGVSb3dFbGVtZW50W10pLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBnZXRFbGVtZW50SGVpZ2h0KHJvdyk7XG4gICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGhlaWdodCB9LCB0aGlzLmVsZW1lbnQuY2hpbGRyZW5baW5kZXhdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtQ29sdW1uc1dpZHRoKCkge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdjb2xncm91cCcpLmNoaWxkcmVuXSBhcyBIVE1MVGFibGVDb2xFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IFRoZVRhYmxlQ29sdW1uW10gPSBjb2xzLm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IGdldEVsZW1lbnRXaWR0aChjb2wpIH07XG4gICAgICAgIH0pO1xuICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIG9uQ29sTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoISF0aGlzLnNlbGVjdGlvbiAmJiB0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyRGFuZ2Vyb3VzQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDb2x1bW4odGhpcy5lZGl0b3IsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblJvd01vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCBwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Um93KHRoaXMuZWRpdG9yLCBpbmRleCk7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25TZWxlY3RUYWJsZShldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFRhYmxlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnY29udGV4dG1lbnUnKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkLWNlbGwnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsKGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZUNvbnRleHRNZW51KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlVG9vbGJhcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXRjaCBmb3IgcmlnaHQgY2xpY2sgc2VsZWN0IG5leHQgY2VsbFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCBFZGl0b3Iuc3RhcnQodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yLnNlbGVjdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuT25TZWxlY3RlZENlbGxzKCkge1xuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNlZG93bicpLnBpcGUoZmlsdGVyKChlOiBNb3VzZUV2ZW50KSA9PiBlLmJ1dHRvbiAhPT0gMikpLFxuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNWaXJ0dWFsS2V5KGUpICYmICF0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmlzT3BlbmVkO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0ZWRDZWxsUG9zaXRpb25zPy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzQ29udGVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRUYWJsZUVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50IHx8ICF0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhckxhc3RGb2N1c1BhdGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2xvc2VUb29sYmFyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5LZXlkb3duU2VsZWN0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKGU6IEtleWJvYXJkRXZlbnQpID0+ICEhZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzSG90a2V5KCdtb2QnLCBldmVudCkgJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5wb2ludGVyU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAodGhpcy50Ym9keUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmZvY3VzZWQtY2VsbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsICYmIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsU3RhcnQoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXl1cCcpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiAhIWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZVdyYXBwZXJTY3JvbGwoKSB7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcblxuICAgICAgICBjb25zdCBzZXRTdGlja3lSb3dQb2ludGVyRXZlbnRzID0gKHBvaW50ZXJFdmVudHNTdHlsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0aVJvdyBvZiBzdGlja3lSb3dzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShzdGlSb3csICdwb2ludGVyLWV2ZW50cycsIHBvaW50ZXJFdmVudHNTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3doZWVsJylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIOWkhOeQhuagh+mimOihjOWbuuWumuaXtueahOa7muWKqOi3n+maj1xuICAgICAgICAgICAgICAgIHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMoJ25vbmUnKTtcbiAgICAgICAgICAgICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMoJ2F1dG8nKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Um93U2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCkge1xuICAgICAgICAvLyDliKTmlq3mmK/lkKblh7rnjrDlm7rlrprmoIfpopjooYxcbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RpUm93IG9mIHN0aWNreVJvd3MpIHtcbiAgICAgICAgICAgICAgICAvLyDkv67lpI3ojrflj5Ygc2Nyb2xsTGVmdCDlsZ7mgKflvJXotbfnmoTmtY/op4jlmajph43nu5jvvIzlr7zoh7Tot7Pliqjpl67popggI1dJSy0xMTAzOFxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWQjOatpea7muWKqOeKtuaAgeWIsCAudGhlLXN0aWNreS1yb3dcbiAgICAgICAgICAgICAgICAgICAgc3RpUm93LnNjcm9sbExlZnQgPSB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRIZWFkZXJSb3dMZWZ0U3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlLXN0aWNreS1yb3cnKTtcbiAgICAgICAgY29uc3QgY29ybmVyQ29udHJvbCA9IHRoaXMuY29ybmVyQ29udHJvbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCByb3dDb250cm9sID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHN0aWNreUVsZW1lbnRzID0gWy4uLnN0aWNreVJvd3MsIGNvcm5lckNvbnRyb2wsIHJvd0NvbnRyb2xdO1xuICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5pc0luVGFibGUgPyAtVEFCTEVfQ09OVFJPTCA6IDA7XG4gICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wICYmIHRoaXMuaXNTY3JvbGxYKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ2xlZnQnLCBgJHtsZWZ0ICsgdGhpcy5nZXRDb2xDb250cm9sQnV0dG9uV2lkdGgoKX1weGApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvcm5lckNvbnRyb2wsICdsZWZ0JywgYCR7bGVmdCArIGJ1ZmZlcn1weGApO1xuICAgICAgICAgICAgcm93Q29udHJvbCAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2wsICdsZWZ0JywgYCR7bGVmdCArIGJ1ZmZlcn1weGApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RpY2t5RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ2xlZnQnLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbEJ1dHRvbldpZHRoID0gKCkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgcmVzdWx0ICs9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IFRBQkxFX05VTUJFUl9DT0xVTU4gOiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB0cmFja0J5Rm5Sb3dDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICB0cmFja0J5Rm5Db2xDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvbnRhaW5lclwiIHRoZUNvbHVtblJlc2l6ZT5cbiAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbHMtd3JhcHBlclwiICN0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMgdGhlLXN0aWNreS1jb3JuZXItY29udHJvbHNcIlxuICAgICAgI2Nvcm5lckNvbnRyb2xcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgdmlzaWJsZTogIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcpLFxuICAgICAgICAnY29udHJvbC1hY3RpdmUnOiBpc1NlbGVjdGVkQWxsQ2VsbCxcbiAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmlzU2VsZWN0ZWRUYWJsZSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWJ1dHRvblwiIChtb3VzZWRvd24pPVwib25TZWxlY3RUYWJsZSgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtcm93LW1hcmtlclwiICpuZ0lmPVwiIWhlYWRlclJvd1wiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LWNvbHVtbi1tYXJrZXJcIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJjb2x1bW5cIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiICNyb3dDb250cm9sc0lubmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbi13cmFwXCJcbiAgICAgICAgICAjcm93Q29udHJvbHNCdXR0b25XcmFwcGVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygcm93Q29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblJvd0NvbnRyb2xzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpLFxuICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c1Jvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgKGlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZykgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW2NvbnRlbnRFZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlZG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwicm93LW51bWJlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+e3sgaGVhZGVyUm93ICYmIGkgPT09IDAgPyAnJyA6IGhlYWRlclJvdyA/IGkgOiBpICsgMSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCJjb250cm9sLnJvd0luZGV4ICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj4gPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXdyYXBwZXJcIiAjdGFibGVXcmFwcGVyIFtuZ0NsYXNzXT1cInsgJ3RoZS10YWJsZS1udW1iZXJlZCc6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIH1cIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0aGUtdGFibGVcIiAjdGhlVGFibGU+XG4gICAgICA8Y29sZ3JvdXAgI2NvbGdyb3VwICpuZ0lmPVwiY29sdW1uc1wiPlxuICAgICAgICA8Y29sICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtuZ1N0eWxlXT1cInsgd2lkdGg6IGNvbC53aWR0aCArICdweCcgfVwiIC8+XG4gICAgICA8L2NvbGdyb3VwPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0aGUtdGFibGUtY29sLWNvbnRyb2xzLXdyYXBwZXIgdGhlLXN0aWNreS1yb3dcIiAjY29sdW1uQ29udHJvbHNXcmFwcGVyPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgI2NvbENvbnRyb2xcbiAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9sc1wiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiBjb2xDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuQ29sQ29udHJvbHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpLFxuICAgICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ29sTW91c2Vkb3duKCRldmVudCwgaSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmtcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgW2F0XT1cImkgKyAxXCJcbiAgICAgICAgICAgICAgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiXG4gICAgICAgICAgICAgIFtwYXJlbnRFbGVtZW50XT1cImNvbENvbnRyb2xcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHkgI3Rib2R5PlxuICAgICAgICA8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+IDwvc2xhdGUtY2hpbGRyZW4+XG4gICAgICA8L3Rib2R5PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImhlYWRlci1yb3ctc2hhZG93IGhlYWRlci1yb3ctbGVmdC1zaGFkb3dcIlxuICAgICAgICAjaGVhZGVyUm93TGVmdFNoYWRvd1xuICAgICAgICBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXG4gICAgICAgICpuZ0lmPVwiIWVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcm93LXNoYWRvdyBoZWFkZXItcm93LXJpZ2h0LXNoYWRvd1wiICNoZWFkZXJSb3dSaWdodFNoYWRvdyBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiPjwvZGl2PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=