sp-grid
Version:
<div align="center"> <h1>sp-grid</h1>
239 lines • 44 kB
JavaScript
import * as tslib_1 from "tslib";
import { SettingsVM } from './models/SettingsVM';
import { Component, Input, ViewChild, Output, EventEmitter } from '@angular/core';
import { MatSort } from '@angular/material/sort';
import { animate, state, style, transition, trigger } from '@angular/animations';
import { MatPaginator } from '@angular/material/paginator';
import { MatTableDataSource } from '@angular/material/table';
var SpGridComponent = /** @class */ (function () {
function SpGridComponent() {
this.settings = new SettingsVM();
//output
this.rowClickEmit = new EventEmitter;
this.updatedRow = new EventEmitter;
this.getDetails = new EventEmitter();
this.sortEvent = new EventEmitter();
this.pageEvent = new EventEmitter();
//private
this.clickedCol = false;
}
SpGridComponent.prototype.ngOnInit = function () {
};
SpGridComponent.prototype.ngOnChanges = function (changes) {
if (changes && changes.settings) {
this._setColor();
}
if (changes && changes.colDef) {
if (this.settings.expandable)
this.colDef.splice(0, 0, ({
key: 'expand',
label: '',
sortable: false,
template: this.expandTemplate
}));
}
if (changes && changes.data) {
//set colums to display
this.displayedColumns = this.colDef.map(function (col) {
return col['key'];
});
//set dataSopurce
this.dataSource = new MatTableDataSource(this.data);
this.dataSource.sort = this.sort;
this.dataSource.paginator = this.paginator;
}
if (changes && changes.dataExpanded) {
if (this.dataExpanded && this.dataExpanded.length > 0) {
//set colums to display
this.displayedColumnsExpanded = this.colDefExpanded.map(function (col) {
return col['key'];
});
}
;
this.dataSourceExpanded = this.dataExpanded;
this.expandedElement = this.clickedElement;
}
;
};
SpGridComponent.prototype.sortData = function (sort) {
var data = this.data.slice();
if (!sort.active || sort.direction === '') {
return;
}
this.sortEvent.emit(sort);
};
SpGridComponent.prototype.expandClick = function (element) {
this.dataSourceExpanded = [];
if (this.expandedElement == element) {
this.expandedElement = "";
}
else {
this.clickedElement = element;
//emit
this.getDetails.emit(element);
}
};
SpGridComponent.prototype.clickCol = function (col, element) {
//set clicked col
this.clickedCol = true;
//reset all editing
this.dataSource.data.forEach(function (cc) {
cc.isEditingCol = "";
});
//set specific editing field
if (col.editable) {
element.isEditingCol = col.key;
element.editValue = element[col.key];
switch (col.inputType) {
case 'text':
this.editingTemplate = this.inputTextTemplate;
break;
case 'select':
this.editingTemplate = this.selectTemplate;
break;
case 'date':
this.editingTemplate = this.datePickerTemplate;
break;
default:
break;
}
}
};
SpGridComponent.prototype.setDate = function (element, evt) {
element.editValue = evt.value;
};
SpGridComponent.prototype.removeEditing = function (element) {
element.isEditingCol = "";
};
SpGridComponent.prototype.saveEditing = function (element, key) {
element[key] = element.editValue;
this.updatedRow.emit(element);
element.isEditingCol = "";
};
SpGridComponent.prototype.page = function (evt) {
this.pageEvent.emit(evt);
};
SpGridComponent.prototype._setColor = function () {
//setting default theme
if (this.settings.theme) {
switch (this.settings.theme) {
case 'green':
document.documentElement.style.setProperty('--accent-color', "#009500");
document.documentElement.style.setProperty('--border-color', "#B4BFCC");
document.documentElement.style.setProperty('--title-color', "white");
document.documentElement.style.setProperty('--title-background', "#00C300");
document.documentElement.style.setProperty('--light-background', "rgb(237, 237, 237)");
document.documentElement.style.setProperty('--hover-color', "#B4BFCC");
break;
case 'dark':
document.documentElement.style.setProperty('--accent-color', "#88629A");
document.documentElement.style.setProperty('--border-color', "#B4BFCC");
document.documentElement.style.setProperty('--title-color', "white");
document.documentElement.style.setProperty('--title-background', "#222423");
document.documentElement.style.setProperty('--light-background', "rgb(237, 237, 237)");
document.documentElement.style.setProperty('--hover-color', "#B4BFCC");
break;
case 'gray':
document.documentElement.style.setProperty('--accent-color', "#5E3C4C");
document.documentElement.style.setProperty('--border-color', "#B4BFCC");
document.documentElement.style.setProperty('--title-color', "white");
document.documentElement.style.setProperty('--title-background', "#C9C7B0");
document.documentElement.style.setProperty('--light-background', "rgb(237, 237, 237)");
document.documentElement.style.setProperty('--hover-color', "#B4BFCC");
break;
default:
document.documentElement.style.setProperty('--accent-color', "#22406d");
document.documentElement.style.setProperty('--border-color', "#B4BFCC");
document.documentElement.style.setProperty('--title-color', "white");
document.documentElement.style.setProperty('--title-background', "#47618E");
document.documentElement.style.setProperty('--light-background', "rgb(237, 237, 237)");
document.documentElement.style.setProperty('--hover-color', "#B4BFCC");
break;
}
}
//setting custom color
if (this.settings.colorTitleBackground)
document.documentElement.style.setProperty('--title-background', this.settings.colorTitleBackground);
if (this.settings.colorLightBackground)
document.documentElement.style.setProperty('--light-background', this.settings.colorLightBackground);
if (this.settings.colorAccent)
document.documentElement.style.setProperty('--accent-color', this.settings.colorAccent);
if (this.settings.colorBorder)
document.documentElement.style.setProperty('--border-color', this.settings.colorBorder);
if (this.settings.colorHover)
document.documentElement.style.setProperty('--hover-color', this.settings.colorHover);
if (this.settings.colorTitle)
document.documentElement.style.setProperty('--title-color', this.settings.colorTitle);
};
tslib_1.__decorate([
ViewChild('percTemplate', { static: true })
], SpGridComponent.prototype, "percTemplate", void 0);
tslib_1.__decorate([
ViewChild('currencyTemplate', { static: true })
], SpGridComponent.prototype, "currencyTemplate", void 0);
tslib_1.__decorate([
ViewChild('expandTemplate', { static: true })
], SpGridComponent.prototype, "expandTemplate", void 0);
tslib_1.__decorate([
ViewChild('inputTextTemplate', { static: true })
], SpGridComponent.prototype, "inputTextTemplate", void 0);
tslib_1.__decorate([
ViewChild('selectTemplate', { static: true })
], SpGridComponent.prototype, "selectTemplate", void 0);
tslib_1.__decorate([
ViewChild('datePickerTemplate', { static: true })
], SpGridComponent.prototype, "datePickerTemplate", void 0);
tslib_1.__decorate([
ViewChild(MatPaginator, { static: true })
], SpGridComponent.prototype, "paginator", void 0);
tslib_1.__decorate([
ViewChild(MatSort, { static: true })
], SpGridComponent.prototype, "sort", void 0);
tslib_1.__decorate([
Input()
], SpGridComponent.prototype, "data", void 0);
tslib_1.__decorate([
Input()
], SpGridComponent.prototype, "colDef", void 0);
tslib_1.__decorate([
Input()
], SpGridComponent.prototype, "dataExpanded", void 0);
tslib_1.__decorate([
Input()
], SpGridComponent.prototype, "colDefExpanded", void 0);
tslib_1.__decorate([
Input()
], SpGridComponent.prototype, "settings", void 0);
tslib_1.__decorate([
Output()
], SpGridComponent.prototype, "rowClickEmit", void 0);
tslib_1.__decorate([
Output()
], SpGridComponent.prototype, "updatedRow", void 0);
tslib_1.__decorate([
Output()
], SpGridComponent.prototype, "getDetails", void 0);
tslib_1.__decorate([
Output()
], SpGridComponent.prototype, "sortEvent", void 0);
tslib_1.__decorate([
Output()
], SpGridComponent.prototype, "pageEvent", void 0);
SpGridComponent = tslib_1.__decorate([
Component({
selector: 'app-sp-grid',
template: "<table multiTemplateDataRows mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"sortData($event)\"\r\n class=\"data-table-custom\">\r\n\r\n <ng-container [matColumnDef]=\"col?.key\" *ngFor=\"let col of colDef; let i = index\">\r\n\r\n\r\n <th [ngStyle]=\"{'width': col?.width ? col.width : 'auto'}\" class=\"fade-in\" mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"!col?.sortable\">{{col?.label}}</th>\r\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"{'editable-cell': col?.editable}\">\r\n <div class=\"edit-icon\" *ngIf=\"element.isEditingCol!==col.key\" (click)=\"clickCol(col,element)\"> <i class=\"material-icons\">edit</i> </div>\r\n\r\n <div *ngIf=\"!col?.template && !col?.defaultTemplate\">\r\n <span [hidden]=\"element.isEditingCol==col.key\" (click)=\"clickCol(col,element)\">\r\n <span *ngIf=\"col?.type=='date'\">{{element[col?.key] | date: col?.formatDate}}</span>\r\n <span *ngIf=\"col?.type=='number'\">{{element[col?.key] | number: col?.formatNumber}}</span>\r\n <span *ngIf=\"col?.type!=='date' && col?.type!=='number'\">{{element[col?.key]}}</span>\r\n </span>\r\n <div *ngIf=\"element.isEditingCol==col.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"editingTemplate;context:{$implicit: element, col: col.key, options: col?.optionsSelect}\">\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- Perc Template -->\r\n <div *ngIf=\" col?.defaultTemplate=='percTemplate'\">\r\n <ng-container *ngTemplateOutlet=\" percTemplate;context:{$implicit: element[col?.key]}\">\r\n </ng-container>\r\n </div>\r\n <!-- Currency template -->\r\n <div *ngIf=\"col?.defaultTemplate=='currencyTemplate'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"currencyTemplate;context:{$implicit: element[col?.key], symbol: col?.currency}\">\r\n </ng-container>\r\n </div>\r\n <!-- Expand template -->\r\n <div *ngIf=\"col?.template && col?.template==expandTemplate\">\r\n <ng-container *ngTemplateOutlet=\"col?.template;context:{$implicit: element}\">\r\n </ng-container>\r\n </div>\r\n <!-- Template custom -->\r\n <div *ngIf=\"col?.template && col?.template!==expandTemplate\">\r\n <ng-container\r\n *ngTemplateOutlet=\"col?.template;context:{$implicit: element[col?.key], secondVal: element[col?.secondVal], thirdVal: element[col?.thirdVal]}\">\r\n </ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <!-- Expanded details -->\r\n <ng-container matColumnDef=\"expandedDetail\">\r\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"displayedColumns.length\">\r\n <div class=\"example-element-detail\" [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\">\r\n <table mat-table [dataSource]=\"dataSourceExpanded\" class=\"data-table-custom inner-after-open-table\">\r\n <ng-container [matColumnDef]=\"colExpanded?.key\"\r\n *ngFor=\"let colExpanded of colDefExpanded; let iExpanded = index\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n {{colExpanded?.label}}</th>\r\n <td mat-cell class=\"cell-expanded\" *matCellDef=\"let element\">\r\n <div *ngIf=\"!colExpanded?.template && !colExpanded?.defaultTemplate\">\r\n <span [hidden]=\"element.isEditingCol==colExpanded.key\" (click)=\"clickCol(colExpanded,element)\">\r\n <span\r\n *ngIf=\"colExpanded?.type=='date'\">{{element[colExpanded?.key] | date: colExpanded?.formatDate}}</span>\r\n <span *ngIf=\"colExpanded?.type!=='date'\">{{element[colExpanded?.key]}}</span>\r\n </span>\r\n <div *ngIf=\"element.isEditingCol==colExpanded.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"editingTemplate;context:{$implicit: element, col: colExpanded.key, options: colExpanded?.optionsSelect}\">\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- Perc Template -->\r\n <div *ngIf=\" colExpanded?.defaultTemplate=='percTemplate'\">\r\n <ng-container *ngTemplateOutlet=\" percTemplate;context:{$implicit: element[colExpanded?.key]}\">\r\n </ng-container>\r\n </div>\r\n <!-- Currency template -->\r\n <div *ngIf=\"colExpanded?.defaultTemplate=='currencyTemplate'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"currencyTemplate;context:{$implicit: element[colExpanded?.key], symbol: colExpanded?.currency}\">\r\n </ng-container>\r\n </div>\r\n <!-- Template custom -->\r\n <div *ngIf=\"colExpanded?.template\">\r\n <ng-container\r\n *ngTemplateOutlet=\"colExpanded?.template;context:{$implicit: element[colExpanded?.key], secondVal: element[colExpanded?.secondVal], thirdVal: element[colExpanded?.thirdVal]}\">\r\n </ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumnsExpanded\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumnsExpanded;\"></tr>\r\n </table>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: displayedColumns;\"\r\n [ngClass]=\"{'expandable-row': settings.expandable}\" [class.example-expanded-row]=\"expandedElement === element\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"example-detail-row\"></tr>\r\n</table>\r\n<div [hidden]=\"!settings.paginable\">\r\n <mat-paginator (page)=\"page($event)\" [pageSizeOptions]=\"settings.pageSizeOptions\" [pageSize]=\"settings.pageSize\">\r\n </mat-paginator>\r\n</div>\r\n\r\n<ng-template #percTemplate let-value>\r\n {{value | number}} %\r\n</ng-template>\r\n\r\n<ng-template #numberTemplate let-value>\r\n {{value | number}}\r\n</ng-template>\r\n\r\n<ng-template #currencyTemplate let-value let-symbol=\"symbol\">\r\n {{value | number}} {{symbol}}\r\n</ng-template>\r\n\r\n<ng-template #expandTemplate let-value>\r\n <div class=\"master-detail-button\">\r\n <div (click)=\"expandClick(value)\">+</div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #inputTextTemplate let-value let-key=\"col\">\r\n <div class=\"wrap-editor fade-in\">\r\n <div><input class=\"custom-editing-item\" type=\"text\" [(ngModel)]=\"value.editValue\"></div>\r\n <div><button class=\"save-button\" mat-button (click)=\"saveEditing(value,key)\">Save</button></div>\r\n <div> <button class=\"save-button\" mat-button (click)=\"removeEditing(value)\">Undo</button> </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #selectTemplate let-value let-key=\"col\" let-optionsList=\"options\">\r\n <div class=\"wrap-editor fade-in\">\r\n <select [(ngModel)]=\"value.editValue\" class=\"custom-editing-item\">\r\n <option *ngFor=\"let opt of optionsList\" [value]=\"opt\">{{opt}}</option>\r\n </select><br>\r\n <button class=\"save-button\" mat-button (click)=\"saveEditing(value,key)\">Save</button>\r\n <button class=\"save-button\" mat-button (click)=\"removeEditing(value)\">Undo</button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #datePickerTemplate let-value let-key=\"col\">\r\n <div class=\"wrap-editor fade-in\">\r\n\r\n <input class=\"custom-editing-item\" matInput [matDatepicker]=\"picker\" placeholder=\"Date\"\r\n (dateChange)=\"setDate(value, $event)\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n <br>\r\n <button class=\"save-button\" mat-button (click)=\"saveEditing(value,key)\">Save</button>\r\n <button class=\"save-button\" mat-button (click)=\"removeEditing(value)\">Undo</button>\r\n </div>\r\n</ng-template>\r\n",
animations: [
trigger('detailExpand', [
state('collapsed', style({ height: '0px', minHeight: '0' })),
state('expanded', style({ height: '*' })),
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
]),
],
styles: ["@charset \"UTF-8\";@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,700);@import url(https://fonts.googleapis.com/icon?family=Material+Icons);.fade-in{animation:1s fadein;-moz-animation:1s fadein;-webkit-animation:1s fadein;-o-animation:1s fadein}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}input,select,td,tr{transition:.3s}.data-table-custom{width:100%;font-family:\"Source Sans Pro\",sans-serif}.data-table-custom tr.mat-header-row,.data-table-custom tr.mat-row{padding:0}.wrap-editor input,.wrap-editor select{font-family:\"Source Sans Pro\",sans-serif;margin-right:10px;outline:0!important;margin-top:0!important;border:0;line-height:25px;background:rgba(0,0,0,.1);padding:0 10px;border-radius:40px}.wrap-editor input:focus,.wrap-editor select:focus{outline:0;background:rgba(0,0,0,.2)}tr.example-detail-row{height:0}.example-element-detail{overflow:hidden;display:flex}.example-element-detail .mat-tab-group{width:100%}.example-element-detail ::ng-deep .mat-tab-body-content{height:auto}.example-element-diagram{min-width:80px;border:2px solid #000;padding:8px;font-weight:lighter;margin:8px 0;height:104px}.example-element-symbol{font-weight:700;font-size:40px;line-height:normal}.example-element-description{padding:16px}.example-element-description-attribution{opacity:.5}.ng-trigger{margin-top:0!important}.mat-column-expandedDetail{padding:0!important}.expandable-row{cursor:pointer}.example-expanded-row{background-color:var(--accent-color);box-shadow:0 3px 3px rgba(0,0,0,.3);mix-blend-mode:multiply}.example-expanded-row .mat-cell{color:#fff;border-left:none;border-bottom:0!important;cursor:default}.example-detail-row .mat-cell{border-bottom:0}.example-detail-row .cell-expanded{border-bottom:1px solid var(--border-color)}.inner-after-open-table{padding:12px;background:var(--light-background);box-shadow:none!important}.inner-after-open-table td:last-child{border-right:1px solid rgba(0,0,0,.12)!important;border-bottom:1px solid var(--border-color)}.inner-after-open-table .table-title{padding:0;text-align:center}.inner-after-open-table tr{background:#fff}.inner-after-open-table tr:hover{background:var(--hover-color)}.first-layer-row{box-shadow:2px 2px 2px #000}.mat-column-arrow{padding:10px 16px!important;text-align:center}.mat-column-arrow::after{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\uF054\";font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased}th.mat-column-arrow::after{display:none}.example-expanded-row .mat-column-arrow::after{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\uF078\";font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased}td.mat-cell{border-bottom:.5px solid var(--border-color);border-bottom-width:.5px}td.mat-cell:last-of-type.mat-column-expand{border-bottom:1px solid var(--border-color)}th.mat-header-cell{border-bottom-color:var(--border-color);background-color:var(--title-background);text-transform:uppercase;color:var(--title-color);letter-spacing:1px}::ng-deep button.mat-sort-header-button{color:var(--title-color);letter-spacing:1px;text-transform:uppercase;font-weight:700}.custom-editing-item{float:left}.save-button{background-color:var(--title-background);line-height:25px;border-radius:40px;margin-right:5px;font-size:10px;font-weight:500;text-transform:uppercase;float:left;color:var(--title-color)}.wrap-editor{display:flex;align-items:center}.edit-icon{display:none;float:left;padding:2px}.edit-icon i{font-size:14px;line-height:1;color:var(--title-background)}.editable-cell{cursor:pointer}.editable-cell .edit-icon{display:flex!important}"]
})
], SpGridComponent);
return SpGridComponent;
}());
export { SpGridComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3AtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zcC1ncmlkLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL3NwLWdyaWQvc3AtZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBaUIsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFFOUcsT0FBTyxFQUFFLE9BQU8sRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBYzdEO0lBd0NFO1FBdkJTLGFBQVEsR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2pELFFBQVE7UUFDRSxpQkFBWSxHQUFzQixJQUFJLFlBQVksQ0FBQztRQUNuRCxlQUFVLEdBQXNCLElBQUksWUFBWSxDQUFDO1FBQ2pELGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuRCxjQUFTLEdBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkQsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBYzVELFNBQVM7UUFDRCxlQUFVLEdBQVksS0FBSyxDQUFDO0lBRXBCLENBQUM7SUFFakIsa0NBQVEsR0FBUjtJQUVBLENBQUM7SUFFRCxxQ0FBVyxHQUFYLFVBQVksT0FBc0I7UUFDaEMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7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O1lBRXZDLFVBQVUsRUFBRTtnQkFDVixPQUFPLENBQUMsY0FBYyxFQUFFO29CQUN0QixLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQzVELEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ3pDLFVBQVUsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQztpQkFDdEYsQ0FBQzthQUNIOztTQUNGLENBQUM7T0FDVyxlQUFlLENBdU0zQjtJQUFELHNCQUFDO0NBQUEsQUF2TUQsSUF1TUM7U0F2TVksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNldHRpbmdzVk0gfSBmcm9tICcuL21vZGVscy9TZXR0aW5nc1ZNJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi9tb2RlbHMvQ29sdW1uRGVmaW5pdGlvblZNJztcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNwLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3AtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwLWdyaWQuY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG1pbkhlaWdodDogJzAnIH0pKSxcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcbiAgICBdKSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BHcmlkQ29tcG9uZW50IHtcbiAgLy90ZW1wbGF0ZSB2aWV3XG4gIEBWaWV3Q2hpbGQoJ3BlcmNUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHBlcmNUZW1wbGF0ZTogYW55O1xuICBAVmlld0NoaWxkKCdjdXJyZW5jeVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgY3VycmVuY3lUZW1wbGF0ZTogYW55O1xuICBAVmlld0NoaWxkKCdleHBhbmRUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGV4cGFuZFRlbXBsYXRlOiBhbnk7XG4gIC8vdGVtcGxhdGUgaW5wdXRcbiAgQFZpZXdDaGlsZCgnaW5wdXRUZXh0VGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dFRleHRUZW1wbGF0ZTogYW55O1xuICBAVmlld0NoaWxkKCdzZWxlY3RUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHNlbGVjdFRlbXBsYXRlOiBhbnk7XG4gIEBWaWV3Q2hpbGQoJ2RhdGVQaWNrZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGRhdGVQaWNrZXJUZW1wbGF0ZTogYW55O1xuICAvL1NvcnQgJiBwYWdpbmF0b3JcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IsIHsgc3RhdGljOiB0cnVlIH0pIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICBAVmlld0NoaWxkKE1hdFNvcnQsIHsgc3RhdGljOiB0cnVlIH0pIHNvcnQ6IE1hdFNvcnQ7XG4gIC8vaW5wdXRcbiAgQElucHV0KCkgZGF0YTogQXJyYXk8YW55PjtcbiAgQElucHV0KCkgY29sRGVmOiBBcnJheTxDb2x1bW5EZWZpbml0aW9uPjtcbiAgQElucHV0KCkgZGF0YUV4cGFuZGVkOiBBcnJheTxhbnk+O1xuICBASW5wdXQoKSBjb2xEZWZFeHBhbmRlZDogQXJyYXk8Q29sdW1uRGVmaW5pdGlvbj47XG4gIEBJbnB1dCgpIHNldHRpbmdzOiBTZXR0aW5nc1ZNID0gbmV3IFNldHRpbmdzVk0oKTtcbiAgLy9vdXRwdXRcbiAgQE91dHB1dCgpIHJvd0NsaWNrRW1pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyO1xuICBAT3V0cHV0KCkgdXBkYXRlZFJvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyO1xuICBAT3V0cHV0KCkgZ2V0RGV0YWlsczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQ6IEV2ZW50RW1pdHRlcjxTb3J0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHBhZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLy9tYXN0ZXJcbiAgZGlzcGxheWVkQ29sdW1uczogQXJyYXk8c3RyaW5nPjtcbiAgZGF0YVNvdXJjZTogYW55O1xuICAvL2RldGFpbHNcbiAgZGlzcGxheWVkQ29sdW1uc0V4cGFuZGVkOiBBcnJheTxzdHJpbmc+O1xuICBkYXRhU291cmNlRXhwYW5kZWQ6IGFueTtcbiAgZXhwYW5kZWRFbGVtZW50OiBhbnk7XG4gIGNsaWNrZWRFbGVtZW50OiBhbnk7XG5cbiAgLy9lZGl0aW5nXG4gIGVkaXRpbmdUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvL3ByaXZhdGVcbiAgcHJpdmF0ZSBjbGlja2VkQ29sOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcblxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuc2V0dGluZ3MpIHtcbiAgICAgIHRoaXMuX3NldENvbG9yKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5jb2xEZWYpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmV4cGFuZGFibGUpXG4gICAgICAgIHRoaXMuY29sRGVmLnNwbGljZSgwLDAsPENvbHVtbkRlZmluaXRpb24+KHtcbiAgICAgICAgICBrZXk6ICdleHBhbmQnLFxuICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdGVtcGxhdGU6IHRoaXMuZXhwYW5kVGVtcGxhdGVcbiAgICAgICAgfSkpXG4gICAgfVxuICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuZGF0YSkge1xuICAgICAgLy9zZXQgY29sdW1zIHRvIGRpc3BsYXlcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sRGVmLm1hcCgoY29sKSA9PiB7XG4gICAgICAgIHJldHVybiBjb2xbJ2tleSddO1xuICAgICAgfSk7XG4gICAgICAvL3NldCBkYXRhU29wdXJjZVxuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuZGF0YUV4cGFuZGVkKSB7XG4gICAgICBpZiAodGhpcy5kYXRhRXhwYW5kZWQgJiYgdGhpcy5kYXRhRXhwYW5kZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAvL3NldCBjb2x1bXMgdG8gZGlzcGxheVxuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnNFeHBhbmRlZCA9IHRoaXMuY29sRGVmRXhwYW5kZWQubWFwKChjb2wpID0+IHtcbiAgICAgICAgICByZXR1cm4gY29sWydrZXknXTtcblxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmRhdGFTb3VyY2VFeHBhbmRlZCA9IHRoaXMuZGF0YUV4cGFuZGVkO1xuICAgICAgdGhpcy5leHBhbmRlZEVsZW1lbnQgPSB0aGlzLmNsaWNrZWRFbGVtZW50O1xuICAgIH07XG4gIH1cblxuICBzb3J0RGF0YShzb3J0OiBTb3J0KSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YS5zbGljZSgpO1xuICAgIGlmICghc29ydC5hY3RpdmUgfHwgc29ydC5kaXJlY3Rpb24gPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc29ydEV2ZW50LmVtaXQoc29ydCk7XG4gIH1cblxuICBleHBhbmRDbGljayhlbGVtZW50OmFueSkge1xuICAgIHRoaXMuZGF0YVNvdXJjZUV4cGFuZGVkID0gW107XG4gICAgaWYgKHRoaXMuZXhwYW5kZWRFbGVtZW50ID09IGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRFbGVtZW50ID0gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGlja2VkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAvL2VtaXRcbiAgICAgIHRoaXMuZ2V0RGV0YWlscy5lbWl0KGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsaWNrQ29sKGNvbDogQ29sdW1uRGVmaW5pdGlvbiwgZWxlbWVudDogYW55KSB7XG4gICAgLy9zZXQgY2xpY2tlZCBjb2xcbiAgICB0aGlzLmNsaWNrZWRDb2wgPSB0cnVlO1xuICAgIC8vcmVzZXQgYWxsIGVkaXRpbmdcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YS5mb3JFYWNoKChjYzogYW55KSA9PiB7XG4gICAgICBjYy5pc0VkaXRpbmdDb2wgPSBcIlwiO1xuICAgIH0pO1xuICAgIC8vc2V0IHNwZWNpZmljIGVkaXRpbmcgZmllbGRcbiAgICBpZiAoY29sLmVkaXRhYmxlKSB7XG4gICAgICBlbGVtZW50LmlzRWRpdGluZ0NvbCA9IGNvbC5rZXk7XG4gICAgICBlbGVtZW50LmVkaXRWYWx1ZSA9IGVsZW1lbnRbY29sLmtleV07XG5cbiAgICAgIHN3aXRjaCAoY29sLmlucHV0VHlwZSkge1xuICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICB0aGlzLmVkaXRpbmdUZW1wbGF0ZSA9IHRoaXMuaW5wdXRUZXh0VGVtcGxhdGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgdGhpcy5lZGl0aW5nVGVtcGxhdGUgPSB0aGlzLnNlbGVjdFRlbXBsYXRlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICB0aGlzLmVkaXRpbmdUZW1wbGF0ZSA9IHRoaXMuZGF0ZVBpY2tlclRlbXBsYXRlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0RGF0ZShlbGVtZW50OiBhbnksIGV2dDogYW55KSB7XG4gICAgZWxlbWVudC5lZGl0VmFsdWUgPSBldnQudmFsdWU7XG4gIH1cblxuICByZW1vdmVFZGl0aW5nKGVsZW1lbnQ6IGFueSkge1xuICAgIGVsZW1lbnQuaXNFZGl0aW5nQ29sID0gXCJcIjtcbiAgfVxuXG4gIHNhdmVFZGl0aW5nKGVsZW1lbnQ6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBlbGVtZW50W2tleV0gPSBlbGVtZW50LmVkaXRWYWx1ZTtcbiAgICB0aGlzLnVwZGF0ZWRSb3cuZW1pdChlbGVtZW50KTtcbiAgICBlbGVtZW50LmlzRWRpdGluZ0NvbCA9IFwiXCI7XG4gIH1cblxuICBwYWdlKGV2dDphbnkpIHtcbiAgICB0aGlzLnBhZ2VFdmVudC5lbWl0KGV2dCk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDb2xvcigpIHtcbiAgICAvL3NldHRpbmcgZGVmYXVsdCB0aGVtZVxuICAgIGlmICh0aGlzLnNldHRpbmdzLnRoZW1lKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MudGhlbWUpIHtcbiAgICAgICAgY2FzZSAnZ3JlZW4nOlxuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hY2NlbnQtY29sb3InLCBcIiMwMDk1MDBcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWJvcmRlci1jb2xvcicsIFwiI0I0QkZDQ1wiKTtcbiAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGl0bGUtY29sb3InLCBcIndoaXRlXCIpO1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10aXRsZS1iYWNrZ3JvdW5kJywgXCIjMDBDMzAwXCIpO1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1saWdodC1iYWNrZ3JvdW5kJywgXCJyZ2IoMjM3LCAyMzcsIDIzNylcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWhvdmVyLWNvbG9yJywgXCIjQjRCRkNDXCIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2RhcmsnOlxuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hY2NlbnQtY29sb3InLCBcIiM4ODYyOUFcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWJvcmRlci1jb2xvcicsIFwiI0I0QkZDQ1wiKTtcbiAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGl0bGUtY29sb3InLCBcIndoaXRlXCIpO1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10aXRsZS1iYWNrZ3JvdW5kJywgXCIjMjIyNDIzXCIpO1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1saWdodC1iYWNrZ3JvdW5kJywgXCJyZ2IoMjM3LCAyMzcsIDIzNylcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWhvdmVyLWNvbG9yJywgXCIjQjRCRkNDXCIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2dyYXknOlxuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hY2NlbnQtY29sb3InLCBcIiM1RTNDNENcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWJvcmRlci1jb2xvcicsIFwiI0I0QkZDQ1wiKTtcbiAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGl0bGUtY29sb3InLCBcIndoaXRlXCIpO1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10aXRsZS1iYWNrZ3JvdW5kJywgXCIjQzlDN0IwXCIpO1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1saWdodC1iYWNrZ3JvdW5kJywgXCJyZ2IoMjM3LCAyMzcsIDIzNylcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWhvdmVyLWNvbG9yJywgXCIjQjRCRkNDXCIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWFjY2VudC1jb2xvcicsIFwiIzIyNDA2ZFwiKTtcbiAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tYm9yZGVyLWNvbG9yJywgXCIjQjRCRkNDXCIpO1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10aXRsZS1jb2xvcicsIFwid2hpdGVcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLXRpdGxlLWJhY2tncm91bmQnLCBcIiM0NzYxOEVcIik7XG4gICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWxpZ2h0LWJhY2tncm91bmQnLCBcInJnYigyMzcsIDIzNywgMjM3KVwiKTtcbiAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0taG92ZXItY29sb3InLCBcIiNCNEJGQ0NcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9zZXR0aW5nIGN1c3RvbSBjb2xvclxuICAgIGlmICh0aGlzLnNldHRpbmdzLmNvbG9yVGl0bGVCYWNrZ3JvdW5kKSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGl0bGUtYmFja2dyb3VuZCcsIHRoaXMuc2V0dGluZ3MuY29sb3JUaXRsZUJhY2tncm91bmQpO1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmNvbG9yTGlnaHRCYWNrZ3JvdW5kKSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tbGlnaHQtYmFja2dyb3VuZCcsIHRoaXMuc2V0dGluZ3MuY29sb3JMaWdodEJhY2tncm91bmQpO1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmNvbG9yQWNjZW50KSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tYWNjZW50LWNvbG9yJywgdGhpcy5zZXR0aW5ncy5jb2xvckFjY2VudCk7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuY29sb3JCb3JkZXIpIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1ib3JkZXItY29sb3InLCB0aGlzLnNldHRpbmdzLmNvbG9yQm9yZGVyKTtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5jb2xvckhvdmVyKSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0taG92ZXItY29sb3InLCB0aGlzLnNldHRpbmdzLmNvbG9ySG92ZXIpO1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmNvbG9yVGl0bGUpIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS10aXRsZS1jb2xvcicsIHRoaXMuc2V0dGluZ3MuY29sb3JUaXRsZSk7XG4gIH1cbn1cbiJdfQ==