sdk-datagrid
Version:
Customizable (Angular) datagrid with data options for manipulation, and charts for visualization.
129 lines • 37.7 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { moveItemInArray } from '@angular/cdk/drag-drop';
import { SDKDataGridMessage } from '../../models/datagrid-message';
import { Clone } from '../../utils/clone';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/cdk/drag-drop";
export class SDKDataGridColumnsOptionComponent {
constructor() {
/**************************************************************************
* Input/Output Parameters
**************************************************************************/
this.columns = [];
this.closeEvent = new EventEmitter();
this.applyEvent = new EventEmitter();
/**************************************************************************
* Component Variables
**************************************************************************/
this.columnList = [];
this.allVisible = true;
this._columns = [];
/**************************************************************************
* Message Variables
**************************************************************************/
this.showMessage = false;
this.message = new SDKDataGridMessage();
}
/**************************************************************************
* Component Lifecycle Methods
**************************************************************************/
ngOnChanges(_args) {
if (_args.columns?.currentValue !== undefined) {
this._columns = Clone.deepCopy(this.columns);
this.initialize();
}
}
/**************************************************************************
* Setup Methods
**************************************************************************/
initialize() {
// Remove any "Action" columns. They are NOT available for user updates.
this.columnList = this._columns.filter((column) => !column.isAction);
this.allVisible = this.columnList.filter((column) => !column.isVisible).length > 0 ? false : true;
}
getColumnName(column) {
let name = column.Name;
name = (column.DisplayName && column.DisplayName !== "") ? column.DisplayName : name;
name = (column.FriendlyName && column.FriendlyName !== "") ? column.FriendlyName : name;
return name;
}
setFriendlyName(event, column) {
column.FriendlyName = event.target.value;
}
/**************************************************************************
* User Action Methods
**************************************************************************/
groupVisibleColumns() {
let visible = this.columnList.filter((column) => column.isVisible);
let hidden = this.columnList.filter((column) => !column.isVisible);
this.columnList = visible.concat(hidden);
}
toggleAllColumns(event) {
this.allVisible = event.target.checked;
this.columnList.forEach((column) => {
column.isVisible = this.allVisible;
});
}
toggleColumn(event, column) {
column.isVisible = event.target.checked;
}
drop(event) {
moveItemInArray(this.columnList, event.previousIndex, event.currentIndex);
}
reset() {
this.message = {
Title: "Reset Columns",
Text: "Are you sure?",
OKText: "YES",
CancelText: "NO",
OK: () => {
this.showMessage = false;
this.columnList.sort((a, b) => (a._original.index > b._original.index) ? 1 : -1);
this.columnList.forEach((column) => {
column.FriendlyName = column._original.FriendlyName;
column.isVisible = column._original.isVisible;
});
this.initialize();
},
Cancel: () => {
this.showMessage = false;
}
};
this.showMessage = true;
}
apply() {
// Add 'left' action columns back into list.
this._columns.filter((column) => column.isAction && column.actionSide === "left").forEach((column) => {
this.columnList.unshift({ ...column });
});
// Add 'right' action columns back into list.
this._columns.filter((column) => column.isAction && column.actionSide === "right").forEach((column) => {
this.columnList.push({ ...column });
});
// Remove any sorting/filtering for columns that are no longer visible.
this.columnList.forEach((column) => {
if (!column.isVisible) {
column.Filter = column._original.Filter;
column.Sort = column._original.Sort;
}
});
this.applyEvent.emit({ option: "Columns", columns: this.columnList });
}
close() {
this.closeEvent.emit();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SDKDataGridColumnsOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SDKDataGridColumnsOptionComponent, selector: "sdk-datagrid-columns-option", inputs: { columns: "columns" }, outputs: { closeEvent: "closeEvent", applyEvent: "applyEvent" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"sdk-datagrid-window\">\r\n <div class=\"header\">\r\n <span class=\"title\">Columns</span>\r\n <span title=\"Close\" class=\"sdk-icon close\" (click)=\"close()\">close</span>\r\n </div>\r\n <div class=\"actions\">\r\n <div class=\"all-select\">\r\n <input type=\"checkbox\" class=\"select\" [checked]=\"allVisible\" (change)=\"toggleAllColumns($event)\" />\r\n <span>All</span>\r\n </div>\r\n <button class=\"sdk-button button-right\" (click)=\"groupVisibleColumns()\">Group Visible</button>\r\n </div>\r\n <div cdkDropList class=\"content\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"box\" *ngFor=\"let column of columnList\" cdkDragBoundary=\".list\" cdkDrag>\r\n <div class=\"select\">\r\n <input type=\"checkbox\" [checked]=\"column.isVisible\" (change)=\"toggleColumn($event, column)\" />\r\n </div>\r\n <div class=\"name\">\r\n <input (input)=\"setFriendlyName($event, column);\" [value]=\"getColumnName(column)\" />\r\n </div>\r\n <div class=\"move\" cdkDragHandle>\r\n <span class=\"sdk-icon\">drag_handle</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"footer\">\r\n <button class=\"sdk-button delete\" (click)=\"reset()\">Reset</button>\r\n <button class=\"sdk-button\" (click)=\"apply()\">Apply</button>\r\n </div>\r\n</div>\r\n\r\n<!-- Lock -->\r\n<div *ngIf=\"showMessage\" title=\"\" class=\"sdk-datagrid-windows-lock\"></div>\r\n\r\n<!-- Message -->\r\n<div *ngIf=\"showMessage\" title=\"\" class=\"sdk-datagrid-message\">\r\n <div class=\"title\">{{ message.Title }}</div>\r\n <div class=\"text\" [innerHtml]=\"message.Text\"></div>\r\n <div class=\"action\">\r\n <button class=\"sdk-button\" (click)=\"message.OK()\">{{ message.OKText }}</button>\r\n <button class=\"sdk-button cancel\" (click)=\"message.Cancel()\">{{ message.CancelText }}</button>\r\n </div>\r\n</div>\r\n", styles: [".sdk-datagrid-window{position:absolute;inset:10px;overflow:hidden}.sdk-datagrid-window .header{position:absolute;top:0;right:0;left:0;height:50px}.sdk-datagrid-window .header .title{position:absolute;top:0;left:0;font-size:large;font-weight:600}.sdk-datagrid-window .header .sdk-icon.close{position:absolute;top:0;right:0}.sdk-datagrid-window .actions{position:absolute;top:50px;right:0;left:0;margin-top:5px;height:50px;width:100%}.sdk-datagrid-window .actions .button-left{float:left;margin:0}.sdk-datagrid-window .actions .button-right{float:right;margin:0 5px 0 0}.sdk-datagrid-window .content{position:absolute;inset:100px 0 50px;border:1px solid var(--sdk-border-dark);display:block;background:var(--sdk-white);border-radius:4px;margin-top:0;overflow:auto;text-align:left}.sdk-datagrid-window .content.no-actions{top:50px}.sdk-datagrid-window .content .keyword{position:relative;padding:5px 10px}.sdk-datagrid-window .content .no-box{position:relative;background-color:var(--sdk-white);text-align:left;margin:4px;box-sizing:border-box;cursor:default}.sdk-datagrid-window .content .no-box input{border-radius:unset;border-width:unset;margin:unset;padding:unset;width:unset}.sdk-datagrid-window .content .no-box input.data-option{padding:0;margin:0 5px 0 0;vertical-align:middle;cursor:pointer}.sdk-datagrid-window .content .no-box .data-label{padding:0;margin:0 10px 0 0;display:inline;vertical-align:middle;text-transform:uppercase;font-weight:600;font-size:small;cursor:pointer}.sdk-datagrid-window .content .box{position:relative;border:1px solid var(--sdk-border);background-color:var(--sdk-white);text-align:left;margin:4px;box-sizing:border-box;cursor:default}.sdk-datagrid-window .content .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.sdk-datagrid-window .content .cdk-drag-placeholder{opacity:0}.sdk-datagrid-window .content .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.sdk-datagrid-window .content .list.cdk-drop-list-dragging .box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.sdk-datagrid-window .content .section{margin:10px 10px 20px}.sdk-datagrid-window .content .section span{margin-bottom:5px;display:block;font-weight:600}.sdk-datagrid-window .content .section .column{display:block;padding:5px;width:100%}.sdk-datagrid-window .content .section .note{margin:-10px 0 5px;font-size:small;font-style:italic;font-weight:400}.sdk-datagrid-window .content .no-records{height:100%;width:100%;display:table;text-align:center;align-items:center}.sdk-datagrid-window .content .no-records span{display:table-cell;vertical-align:middle;font-size:large;font-weight:600;color:var(--sdk-red)}.sdk-datagrid-window .content .error{display:table;text-align:left;vertical-align:top;padding:20px;color:var(--sdk-red)}.sdk-datagrid-window .footer{position:absolute;right:0;left:0;bottom:0;height:40px;width:100%;text-align:center}.sdk-datagrid-window input,.sdk-datagrid-window select{border-radius:5px;border-width:.5px;margin:0;padding:5px;width:100%}.sdk-datagrid-window input:hover,.sdk-datagrid-window select:hover{border-width:1px}.sdk-datagrid-windows-lock{position:absolute;inset:0;z-index:8;overflow:hidden;background-color:var(--sdk-black);opacity:.33}.sdk-datagrid-message{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);height:200px;width:300px;background-color:var(--sdk-white);border-top:.5px solid var(--sdk-gray);border-left:.5px solid var(--sdk-gray);border-bottom:.5px solid var(--sdk-gray);box-shadow:5px 5px 10px #606060;z-index:10}.sdk-datagrid-message .title{position:absolute;top:0;left:0;right:0;height:50px;padding-top:10px;color:var(--sdk-blue);font-size:1.5em;font-weight:600;text-align:center}.sdk-datagrid-message .text{position:absolute;inset:50px 0;padding:0 10px;text-align:center}.sdk-datagrid-message .action{position:absolute;left:0;right:0;bottom:0;height:50px;text-align:center}.actions .all-select{margin:20px 0 0 15px;float:left}.actions .all-select input{border-radius:unset;border-width:unset;margin:unset;padding:unset;width:unset}.actions .all-select input.select{margin-right:10px}.actions .all-select span{text-transform:uppercase;font-size:14px;font-weight:600}.box{height:70px}.box .select{position:absolute;top:50%;left:10px;-ms-transform:translateY(-50%);transform:translateY(-50%);display:inline-flex}.box .name{position:absolute;top:50%;right:60px;left:40px;-ms-transform:translateY(-50%);transform:translateY(-50%)}.box .move{position:absolute;top:50%;right:10px;-ms-transform:translateY(-50%);transform:translateY(-50%)}.box .move .sdk-icon{display:inline-flex;font-size:30px;cursor:move}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SDKDataGridColumnsOptionComponent, decorators: [{
type: Component,
args: [{ selector: 'sdk-datagrid-columns-option', template: "<div class=\"sdk-datagrid-window\">\r\n <div class=\"header\">\r\n <span class=\"title\">Columns</span>\r\n <span title=\"Close\" class=\"sdk-icon close\" (click)=\"close()\">close</span>\r\n </div>\r\n <div class=\"actions\">\r\n <div class=\"all-select\">\r\n <input type=\"checkbox\" class=\"select\" [checked]=\"allVisible\" (change)=\"toggleAllColumns($event)\" />\r\n <span>All</span>\r\n </div>\r\n <button class=\"sdk-button button-right\" (click)=\"groupVisibleColumns()\">Group Visible</button>\r\n </div>\r\n <div cdkDropList class=\"content\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"box\" *ngFor=\"let column of columnList\" cdkDragBoundary=\".list\" cdkDrag>\r\n <div class=\"select\">\r\n <input type=\"checkbox\" [checked]=\"column.isVisible\" (change)=\"toggleColumn($event, column)\" />\r\n </div>\r\n <div class=\"name\">\r\n <input (input)=\"setFriendlyName($event, column);\" [value]=\"getColumnName(column)\" />\r\n </div>\r\n <div class=\"move\" cdkDragHandle>\r\n <span class=\"sdk-icon\">drag_handle</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"footer\">\r\n <button class=\"sdk-button delete\" (click)=\"reset()\">Reset</button>\r\n <button class=\"sdk-button\" (click)=\"apply()\">Apply</button>\r\n </div>\r\n</div>\r\n\r\n<!-- Lock -->\r\n<div *ngIf=\"showMessage\" title=\"\" class=\"sdk-datagrid-windows-lock\"></div>\r\n\r\n<!-- Message -->\r\n<div *ngIf=\"showMessage\" title=\"\" class=\"sdk-datagrid-message\">\r\n <div class=\"title\">{{ message.Title }}</div>\r\n <div class=\"text\" [innerHtml]=\"message.Text\"></div>\r\n <div class=\"action\">\r\n <button class=\"sdk-button\" (click)=\"message.OK()\">{{ message.OKText }}</button>\r\n <button class=\"sdk-button cancel\" (click)=\"message.Cancel()\">{{ message.CancelText }}</button>\r\n </div>\r\n</div>\r\n", styles: [".sdk-datagrid-window{position:absolute;inset:10px;overflow:hidden}.sdk-datagrid-window .header{position:absolute;top:0;right:0;left:0;height:50px}.sdk-datagrid-window .header .title{position:absolute;top:0;left:0;font-size:large;font-weight:600}.sdk-datagrid-window .header .sdk-icon.close{position:absolute;top:0;right:0}.sdk-datagrid-window .actions{position:absolute;top:50px;right:0;left:0;margin-top:5px;height:50px;width:100%}.sdk-datagrid-window .actions .button-left{float:left;margin:0}.sdk-datagrid-window .actions .button-right{float:right;margin:0 5px 0 0}.sdk-datagrid-window .content{position:absolute;inset:100px 0 50px;border:1px solid var(--sdk-border-dark);display:block;background:var(--sdk-white);border-radius:4px;margin-top:0;overflow:auto;text-align:left}.sdk-datagrid-window .content.no-actions{top:50px}.sdk-datagrid-window .content .keyword{position:relative;padding:5px 10px}.sdk-datagrid-window .content .no-box{position:relative;background-color:var(--sdk-white);text-align:left;margin:4px;box-sizing:border-box;cursor:default}.sdk-datagrid-window .content .no-box input{border-radius:unset;border-width:unset;margin:unset;padding:unset;width:unset}.sdk-datagrid-window .content .no-box input.data-option{padding:0;margin:0 5px 0 0;vertical-align:middle;cursor:pointer}.sdk-datagrid-window .content .no-box .data-label{padding:0;margin:0 10px 0 0;display:inline;vertical-align:middle;text-transform:uppercase;font-weight:600;font-size:small;cursor:pointer}.sdk-datagrid-window .content .box{position:relative;border:1px solid var(--sdk-border);background-color:var(--sdk-white);text-align:left;margin:4px;box-sizing:border-box;cursor:default}.sdk-datagrid-window .content .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.sdk-datagrid-window .content .cdk-drag-placeholder{opacity:0}.sdk-datagrid-window .content .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.sdk-datagrid-window .content .list.cdk-drop-list-dragging .box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.sdk-datagrid-window .content .section{margin:10px 10px 20px}.sdk-datagrid-window .content .section span{margin-bottom:5px;display:block;font-weight:600}.sdk-datagrid-window .content .section .column{display:block;padding:5px;width:100%}.sdk-datagrid-window .content .section .note{margin:-10px 0 5px;font-size:small;font-style:italic;font-weight:400}.sdk-datagrid-window .content .no-records{height:100%;width:100%;display:table;text-align:center;align-items:center}.sdk-datagrid-window .content .no-records span{display:table-cell;vertical-align:middle;font-size:large;font-weight:600;color:var(--sdk-red)}.sdk-datagrid-window .content .error{display:table;text-align:left;vertical-align:top;padding:20px;color:var(--sdk-red)}.sdk-datagrid-window .footer{position:absolute;right:0;left:0;bottom:0;height:40px;width:100%;text-align:center}.sdk-datagrid-window input,.sdk-datagrid-window select{border-radius:5px;border-width:.5px;margin:0;padding:5px;width:100%}.sdk-datagrid-window input:hover,.sdk-datagrid-window select:hover{border-width:1px}.sdk-datagrid-windows-lock{position:absolute;inset:0;z-index:8;overflow:hidden;background-color:var(--sdk-black);opacity:.33}.sdk-datagrid-message{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);height:200px;width:300px;background-color:var(--sdk-white);border-top:.5px solid var(--sdk-gray);border-left:.5px solid var(--sdk-gray);border-bottom:.5px solid var(--sdk-gray);box-shadow:5px 5px 10px #606060;z-index:10}.sdk-datagrid-message .title{position:absolute;top:0;left:0;right:0;height:50px;padding-top:10px;color:var(--sdk-blue);font-size:1.5em;font-weight:600;text-align:center}.sdk-datagrid-message .text{position:absolute;inset:50px 0;padding:0 10px;text-align:center}.sdk-datagrid-message .action{position:absolute;left:0;right:0;bottom:0;height:50px;text-align:center}.actions .all-select{margin:20px 0 0 15px;float:left}.actions .all-select input{border-radius:unset;border-width:unset;margin:unset;padding:unset;width:unset}.actions .all-select input.select{margin-right:10px}.actions .all-select span{text-transform:uppercase;font-size:14px;font-weight:600}.box{height:70px}.box .select{position:absolute;top:50%;left:10px;-ms-transform:translateY(-50%);transform:translateY(-50%);display:inline-flex}.box .name{position:absolute;top:50%;right:60px;left:40px;-ms-transform:translateY(-50%);transform:translateY(-50%)}.box .move{position:absolute;top:50%;right:10px;-ms-transform:translateY(-50%);transform:translateY(-50%)}.box .move .sdk-icon{display:inline-flex;font-size:30px;cursor:move}\n"] }]
}], propDecorators: { columns: [{
type: Input
}], closeEvent: [{
type: Output
}], applyEvent: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1ucy1vcHRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrLWRhdGFncmlkL3NyYy9saWIvb3B0aW9ucy9jb2x1bW5zL2NvbHVtbnMtb3B0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay1kYXRhZ3JpZC9zcmMvbGliL29wdGlvbnMvY29sdW1ucy9jb2x1bW5zLW9wdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUd6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFRMUMsTUFBTSxPQUFPLGlDQUFpQztJQU45QztRQU9JOzttRkFFMkU7UUFDbEUsWUFBTyxHQUF3QixFQUFFLENBQUM7UUFDakMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFMUM7O21GQUUyRTtRQUNqRSxlQUFVLEdBQXdCLEVBQUUsQ0FBQztRQUNyQyxlQUFVLEdBQVksSUFBSSxDQUFDO1FBRTdCLGFBQVEsR0FBd0IsRUFBRSxDQUFDO1FBRTNDOzttRkFFMkU7UUFDakUsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsWUFBTyxHQUF1QixJQUFJLGtCQUFrQixFQUFFLENBQUM7S0FnSHBFO0lBOUdHOzsrRUFFMkU7SUFDakUsV0FBVyxDQUFDLEtBQVU7UUFDNUIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFlBQVksS0FBSyxTQUFTLEVB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Q0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBeUIsRUFBRSxFQUFFO1lBQ3hJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBeUIsRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDeEMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRVMsS0FBSztRQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQzsrR0FuSVEsaUNBQWlDO21HQUFqQyxpQ0FBaUMseUxDZDlDLDBoRUEyQ0E7OzRGRDdCYSxpQ0FBaUM7a0JBTjdDLFNBQVM7K0JBQ0ksNkJBQTZCOzhCQVM5QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcblxyXG5pbXBvcnQgeyBTREtEYXRhR3JpZENvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRhZ3JpZC1jb2x1bW4nO1xyXG5pbXBvcnQgeyBTREtEYXRhR3JpZE1lc3NhZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0YWdyaWQtbWVzc2FnZSc7XHJcblxyXG5pbXBvcnQgeyBDbG9uZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Nsb25lJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzZGstZGF0YWdyaWQtY29sdW1ucy1vcHRpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbHVtbnMtb3B0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NvbHVtbnMtb3B0aW9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBTREtEYXRhR3JpZENvbHVtbnNPcHRpb25Db21wb25lbnQge1xyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAqIElucHV0L091dHB1dCBQYXJhbWV0ZXJzXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIEBJbnB1dCgpIGNvbHVtbnM6IFNES0RhdGFHcmlkQ29sdW1uW10gPSBbXTtcclxuICAgIEBPdXRwdXQoKSBjbG9zZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIGFwcGx5RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAqIENvbXBvbmVudCBWYXJpYWJsZXNcclxuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gICAgcHJvdGVjdGVkIGNvbHVtbkxpc3Q6IFNES0RhdGFHcmlkQ29sdW1uW10gPSBbXTtcclxuICAgIHByb3RlY3RlZCBhbGxWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9jb2x1bW5zOiBTREtEYXRhR3JpZENvbHVtbltdID0gW107XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAqIE1lc3NhZ2UgVmFyaWFibGVzXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIHByb3RlY3RlZCBzaG93TWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJvdGVjdGVkIG1lc3NhZ2U6IFNES0RhdGFHcmlkTWVzc2FnZSA9IG5ldyBTREtEYXRhR3JpZE1lc3NhZ2UoKTtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICogQ29tcG9uZW50IExpZmVjeWNsZSBNZXRob2RzXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIHByb3RlY3RlZCBuZ09uQ2hhbmdlcyhfYXJnczogYW55KSB7XHJcbiAgICAgICAgaWYgKF9hcmdzLmNvbHVtbnM/LmN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMgPSBDbG9uZS5kZWVwQ29weSh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgKiBTZXR1cCBNZXRob2RzXHJcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICAvLyBSZW1vdmUgYW55IFwiQWN0aW9uXCIgY29sdW1ucy4gVGhleSBhcmUgTk9UIGF2YWlsYWJsZSBmb3IgdXNlciB1cGRhdGVzLlxyXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdCA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKChjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSA9PiAhY29sdW1uLmlzQWN0aW9uKTtcclxuICAgICAgICB0aGlzLmFsbFZpc2libGUgPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSA9PiAhY29sdW1uLmlzVmlzaWJsZSkubGVuZ3RoID4gMCA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q29sdW1uTmFtZShjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSB7XHJcbiAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IGNvbHVtbi5OYW1lO1xyXG5cclxuICAgICAgICBuYW1lID0gKGNvbHVtbi5EaXNwbGF5TmFtZSAmJiBjb2x1bW4uRGlzcGxheU5hbWUgIT09IFwiXCIpID8gY29sdW1uLkRpc3BsYXlOYW1lIDogbmFtZTtcclxuICAgICAgICBuYW1lID0gKGNvbHVtbi5GcmllbmRseU5hbWUgJiYgY29sdW1uLkZyaWVuZGx5TmFtZSAhPT0gXCJcIikgPyBjb2x1bW4uRnJpZW5kbHlOYW1lIDogbmFtZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldEZyaWVuZGx5TmFtZShldmVudDogYW55LCBjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSB7XHJcbiAgICAgICAgY29sdW1uLkZyaWVuZGx5TmFtZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICogVXNlciBBY3Rpb24gTWV0aG9kc1xyXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICBwcm90ZWN0ZWQgZ3JvdXBWaXNpYmxlQ29sdW1ucygpIHtcclxuICAgICAgICBsZXQgdmlzaWJsZTogU0RLRGF0YUdyaWRDb2x1bW5bXSA9IHRoaXMuY29sdW1uTGlzdC5maWx0ZXIoKGNvbHVtbjogU0RLRGF0YUdyaWRDb2x1bW4pID0+IGNvbHVtbi5pc1Zpc2libGUpO1xyXG4gICAgICAgIGxldCBoaWRkZW46IFNES0RhdGFHcmlkQ29sdW1uW10gPSB0aGlzLmNvbHVtbkxpc3QuZmlsdGVyKChjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSA9PiAhY29sdW1uLmlzVmlzaWJsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdCA9IHZpc2libGUuY29uY2F0KGhpZGRlbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRvZ2dsZUFsbENvbHVtbnMoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuYWxsVmlzaWJsZSA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuZm9yRWFjaCgoY29sdW1uOiBTREtEYXRhR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBjb2x1bW4uaXNWaXNpYmxlID0gdGhpcy5hbGxWaXNpYmxlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCB0b2dnbGVDb2x1bW4oZXZlbnQ6IGFueSwgY29sdW1uOiBTREtEYXRhR3JpZENvbHVtbikge1xyXG4gICAgICAgIGNvbHVtbi5pc1Zpc2libGUgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZHJvcChldmVudDogYW55KSB7XHJcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuY29sdW1uTGlzdCwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0ge1xyXG4gICAgICAgICAgICBUaXRsZTogXCJSZXNldCBDb2x1bW5zXCIsXHJcbiAgICAgICAgICAgIFRleHQ6IFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBPS1RleHQ6IFwiWUVTXCIsXHJcbiAgICAgICAgICAgIENhbmNlbFRleHQ6IFwiTk9cIixcclxuICAgICAgICAgICAgT0s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkxpc3Quc29ydCgoYTogU0RLRGF0YUdyaWRDb2x1bW4sIGI6IFNES0RhdGFHcmlkQ29sdW1uKSA9PiAoYS5fb3JpZ2luYWwuaW5kZXggPiBiLl9vcmlnaW5hbC5pbmRleCkgPyAxIDogLTEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC5mb3JFYWNoKChjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLkZyaWVuZGx5TmFtZSA9IGNvbHVtbi5fb3JpZ2luYWwuRnJpZW5kbHlOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pc1Zpc2libGUgPSBjb2x1bW4uX29yaWdpbmFsLmlzVmlzaWJsZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBDYW5jZWw6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhcHBseSgpIHtcclxuICAgICAgICAvLyBBZGQgJ2xlZnQnIGFjdGlvbiBjb2x1bW5zIGJhY2sgaW50byBsaXN0LlxyXG4gICAgICAgIHRoaXMuX2NvbHVtbnMuZmlsdGVyKChjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSA9PiBjb2x1bW4uaXNBY3Rpb24gJiYgY29sdW1uLmFjdGlvblNpZGUgPT09IFwibGVmdFwiKS5mb3JFYWNoKChjb2x1bW46IFNES0RhdGFHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTGlzdC51bnNoaWZ0KHsgLi4uY29sdW1uIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBBZGQgJ3JpZ2h0JyBhY3Rpb24gY29sdW1ucyBiYWNrIGludG8gbGlzdC5cclxuICAgICAgICB0aGlzLl9jb2x1bW5zLmZpbHRlcigoY29sdW1uOiBTREtEYXRhR3JpZENvbHVtbikgPT4gY29sdW1uLmlzQWN0aW9uICYmIGNvbHVtbi5hY3Rpb25TaWRlID09PSBcInJpZ2h0XCIpLmZvckVhY2goKGNvbHVtbjogU0RLRGF0YUdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5MaXN0LnB1c2goeyAuLi5jb2x1bW4gfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSBhbnkgc29ydGluZy9maWx0ZXJpbmcgZm9yIGNvbHVtbnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHZpc2libGUuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmZvckVhY2goKGNvbHVtbjogU0RLRGF0YUdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb2x1bW4uaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uRmlsdGVyID0gY29sdW1uLl9vcmlnaW5hbC5GaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uU29ydCA9IGNvbHVtbi5fb3JpZ2luYWwuU29ydDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RXZlbnQuZW1pdCh7IG9wdGlvbjogXCJDb2x1bW5zXCIsIGNvbHVtbnM6IHRoaXMuY29sdW1uTGlzdCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwic2RrLWRhdGFncmlkLXdpbmRvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj5Db2x1bW5zPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIHRpdGxlPVwiQ2xvc2VcIiBjbGFzcz1cInNkay1pY29uIGNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5jbG9zZTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxsLXNlbGVjdFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RcIiBbY2hlY2tlZF09XCJhbGxWaXNpYmxlXCIgKGNoYW5nZSk9XCJ0b2dnbGVBbGxDb2x1bW5zKCRldmVudClcIiAvPlxyXG4gICAgICAgICAgICA8c3Bhbj5BbGw8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNkay1idXR0b24gYnV0dG9uLXJpZ2h0XCIgKGNsaWNrKT1cImdyb3VwVmlzaWJsZUNvbHVtbnMoKVwiPkdyb3VwIFZpc2libGU8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjZGtEcm9wTGlzdCBjbGFzcz1cImNvbnRlbnRcIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbkxpc3RcIiBjZGtEcmFnQm91bmRhcnk9XCIubGlzdFwiIGNka0RyYWc+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJjb2x1bW4uaXNWaXNpYmxlXCIgKGNoYW5nZSk9XCJ0b2dnbGVDb2x1bW4oJGV2ZW50LCBjb2x1bW4pXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKGlucHV0KT1cInNldEZyaWVuZGx5TmFtZSgkZXZlbnQsIGNvbHVtbik7XCIgW3ZhbHVlXT1cImdldENvbHVtbk5hbWUoY29sdW1uKVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW92ZVwiIGNka0RyYWdIYW5kbGU+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkay1pY29uXCI+ZHJhZ19oYW5kbGU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNkay1idXR0b24gZGVsZXRlXCIgKGNsaWNrKT1cInJlc2V0KClcIj5SZXNldDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZGstYnV0dG9uXCIgKGNsaWNrKT1cImFwcGx5KClcIj5BcHBseTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBMb2NrIC0tPlxyXG48ZGl2ICpuZ0lmPVwic2hvd01lc3NhZ2VcIiB0aXRsZT1cIlwiIGNsYXNzPVwic2RrLWRhdGFncmlkLXdpbmRvd3MtbG9ja1wiPjwvZGl2PlxyXG5cclxuPCEtLSBNZXNzYWdlIC0tPlxyXG48ZGl2ICpuZ0lmPVwic2hvd01lc3NhZ2VcIiB0aXRsZT1cIlwiIGNsYXNzPVwic2RrLWRhdGFncmlkLW1lc3NhZ2VcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IG1lc3NhZ2UuVGl0bGUgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0XCIgW2lubmVySHRtbF09XCJtZXNzYWdlLlRleHRcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25cIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2RrLWJ1dHRvblwiIChjbGljayk9XCJtZXNzYWdlLk9LKClcIj57eyBtZXNzYWdlLk9LVGV4dCB9fTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZGstYnV0dG9uIGNhbmNlbFwiIChjbGljayk9XCJtZXNzYWdlLkNhbmNlbCgpXCI+e3sgbWVzc2FnZS5DYW5jZWxUZXh0IH19PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==