@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
221 lines • 41.6 kB
JavaScript
import { Component } from '@angular/core';
import * as Ro from '@nakedobjects/restful-objects';
import { CollectionViewState } from '@nakedobjects/services';
import { safeUnsubscribe } from '../helpers-components';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@nakedobjects/services";
import * as i3 from "@nakedobjects/view-models";
import * as i4 from "@angular/common";
import * as i5 from "@angular/cdk/drag-drop";
import * as i6 from "../action-list/action-list.component";
import * as i7 from "../action-bar/action-bar.component";
import * as i8 from "../dialog/dialog.component";
import * as i9 from "../row/row.component";
import * as i10 from "../header/header.component";
export class ListComponent {
activatedRoute;
urlManager;
context;
viewModelFactory;
error;
configService;
loggerService;
dragAndDrop;
ddSub;
dropZones = [];
constructor(activatedRoute, urlManager, context, viewModelFactory, error, configService, loggerService, dragAndDrop) {
this.activatedRoute = activatedRoute;
this.urlManager = urlManager;
this.context = context;
this.viewModelFactory = viewModelFactory;
this.error = error;
this.configService = configService;
this.loggerService = loggerService;
this.dragAndDrop = dragAndDrop;
}
collection;
title = '';
currentState = CollectionViewState.List;
selectedDialogId;
actionButton = {
value: 'Actions',
doClick: () => this.toggleActionMenu(),
show: () => true,
disabled: () => this.disableActions(),
tempDisabled: () => null,
title: () => this.actionsTooltip,
accesskey: 'a',
presentationHint: '',
showDialog: () => false
};
reloadButton = {
value: 'Reload',
doClick: () => this.reloadList(),
show: () => true,
disabled: () => null,
tempDisabled: () => null,
title: () => '',
accesskey: null,
presentationHint: '',
showDialog: () => false
};
firstButton = {
value: 'First',
doClick: () => this.pageFirst(),
show: () => true,
disabled: () => this.pageFirstDisabled(),
tempDisabled: () => null,
title: () => '',
accesskey: null,
presentationHint: '',
showDialog: () => false
};
previousButton = {
value: 'Previous',
doClick: () => this.pagePrevious(),
show: () => true,
disabled: () => this.pagePreviousDisabled(),
tempDisabled: () => null,
title: () => '',
accesskey: null,
presentationHint: '',
showDialog: () => false
};
nextButton = {
value: 'Next',
doClick: () => this.pageNext(),
show: () => true,
disabled: () => this.pageNextDisabled(),
tempDisabled: () => null,
title: () => '',
accesskey: null,
presentationHint: '',
showDialog: () => false
};
lastButton = {
value: 'Last',
doClick: () => this.pageLast(),
show: () => true,
disabled: () => this.pageLastDisabled(),
tempDisabled: () => null,
title: () => '',
accesskey: null,
presentationHint: '',
showDialog: () => false
};
activatedRouteDataSub;
paneRouteDataSub;
lastPaneRouteData;
toggleActionMenu = () => this.collection.toggleActionMenu();
reloadList = () => this.collection.reload();
pageFirst = () => this.collection.pageFirst();
pagePrevious = () => this.collection.pagePrevious();
pageNext = () => this.collection.pageNext();
pageLast = () => this.collection.pageLast();
disableActions = () => this.collection.noActions() ? true : null;
hideAllCheckbox = () => this.collection.noActions() || !this.collection.items || this.collection.items.length === 0;
pageFirstDisabled = () => this.collection.pageFirstDisabled() ? true : null;
pagePreviousDisabled = () => this.collection.pagePreviousDisabled() ? true : null;
pageNextDisabled = () => this.collection.pageNextDisabled() ? true : null;
pageLastDisabled = () => this.collection.pageLastDisabled() ? true : null;
showActions = () => this.collection.showActions();
doTable = () => this.collection.doTable();
doList = () => this.collection.doList();
doSummary = () => this.collection.doSummary();
hasTableData = () => this.collection.hasTableData();
get actionsTooltip() {
return this.collection.actionsTooltip();
}
get message() {
return this.collection.getMessage();
}
get description() {
return this.collection.description();
}
get size() {
return this.collection.size;
}
get items() {
return this.collection.items ?? [];
}
get header() {
return this.collection.header;
}
get actionHolders() {
return [this.actionButton, this.reloadButton, this.firstButton, this.previousButton, this.nextButton, this.lastButton];
}
get state() {
return CollectionViewState[this.currentState].toString().toLowerCase();
}
getActionExtensions(routeData) {
return routeData.objectId
? this.context.getActionExtensionsFromObject(routeData.paneId, Ro.ObjectIdWrapper.fromObjectId(routeData.objectId, this.configService.config.keySeparator), routeData.actionId)
: this.context.getActionExtensionsFromMenu(routeData.menuId, routeData.actionId);
}
setup(routeData) {
const cachedList = this.context.getCachedList(routeData.paneId, routeData.page, routeData.pageSize);
this.getActionExtensions(routeData)
.then((ext) => this.title = ext.friendlyName())
.catch((reject) => this.error.handleError(reject));
const listKey = this.urlManager.getListCacheIndex(routeData.paneId, routeData.page, routeData.pageSize);
if (this.collection && this.collection.id === listKey) {
// same collection/page
this.currentState = routeData.state;
this.collection.refresh(routeData);
}
else if (this.collection && cachedList) {
// same collection different page
this.currentState = routeData.state;
this.collection.reset(cachedList, routeData);
}
else if (cachedList) {
// new collection
this.collection = this.viewModelFactory.listViewModel(cachedList, routeData);
this.currentState = routeData.state;
this.collection.refresh(routeData);
}
else {
// should never get here
this.loggerService.throw('ListComponent:setup Missing cachedList');
}
if (this.collection) {
// if any previous messages clear them
this.collection.resetMessage();
}
this.selectedDialogId = routeData.dialogId;
}
setDropZones(ids) {
setTimeout(() => this.dropZones = ids);
}
// now this is a child investigate reworking so object is passed in from parent
ngOnInit() {
this.activatedRouteDataSub = this.activatedRoute.data.subscribe(d => {
const data = d;
const paneId = data.pane;
if (!this.paneRouteDataSub) {
this.paneRouteDataSub =
this.urlManager.getPaneRouteDataObservable(paneId)
.subscribe((paneRouteData) => {
if (!paneRouteData.isEqual(this.lastPaneRouteData)) {
this.lastPaneRouteData = paneRouteData;
this.setup(paneRouteData);
}
});
}
});
this.ddSub = this.dragAndDrop.dropZoneIds$.subscribe(ids => this.setDropZones(ids || []));
}
ngOnDestroy() {
safeUnsubscribe(this.paneRouteDataSub);
safeUnsubscribe(this.activatedRouteDataSub);
safeUnsubscribe(this.ddSub);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ListComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.UrlManagerService }, { token: i2.ContextService }, { token: i3.ViewModelFactoryService }, { token: i2.ErrorService }, { token: i2.ConfigService }, { token: i2.LoggerService }, { token: i3.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ListComponent, selector: "nof-list", ngImport: i0, template: "<ng-container *ngIf=\"collection\">\n <div class=\"list\">\n <header class=\"header\">\n <div class=\"title\">{{title}}</div>\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n <div class=\"messages\">{{message}}</div>\n </header>\n <div class=\"details\" *ngIf=\"size === 0\">{{description}}</div>\n <ng-container *ngIf=\"size > 0\">\n <nof-action-list *ngIf=\"showActions()\" [menuHolder]=\"collection\"></nof-action-list>\n <nof-dialog [parentVM]=\"collection\" [selectedDialogId]=\"selectedDialogId\"></nof-dialog>\n <div class=\"summary\">\n <div class=\"details\">{{description}}</div>\n <div *ngIf=\"state === 'list'\" class=\"icon table\" (click)=\"doTable()\" title=\"View as Table\" alt=\"View as Table\"></div>\n <div *ngIf=\"state === 'table'\" class=\"icon list\" (click)=\"doList()\" title=\"View as List\" alt=\"View as List\"></div>\n </div>\n <table>\n <thead>\n <tr nof-header [collection]=\"collection\" [state]=\"currentState\"></tr>\n </thead>\n <tbody *ngIf=\"state === 'list' || hasTableData()\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\" [cdkDropListOrientation]=\"'horizontal'\">\n <tr *ngFor=\"let item of items; let i = index\" cdkDrag [cdkDragData]=\"item\" nof-row [item]=\"item\" [row]=\"i\" [withCheckbox]=\"!disableActions()\" [isTable]=\"state === 'table'\"></tr>\n </tbody>\n </table>\n </ng-container>\n </div>\n</ng-container>", styles: [".list{color:#fff;padding-left:var(--space-5);height:100%;overflow-y:auto;display:block;font-weight:var(--font-weight-1)}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}.title,.type{position:relative;font-weight:var(--font-weight-1);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:block}.type{float:left;margin-right:var(--space-5);display:none}.menus{display:block}.menu,.header .action{display:block;float:left;padding:var(--space-3);margin-top:0;margin-left:var(--space-1);margin-right:var(--space-4);margin-bottom:var(--space-3);font-size:var(--font-size-3)}.menu:disabled,.ok:disabled{color:var(--disabled-color)}.summary{display:block;width:var(--table-width);font-size:var(--font-size-2);margin-bottom:var(--space-4);overflow:hidden}.details{padding-left:40px;width:var(--table-width);float:left}.icon{display:block;cursor:pointer;float:right;width:20px;height:var(--field-value-height);padding-top:var(--space-3);padding-left:var(--space-3);margin-right:var(--space-3)}.icon.list{background:var(--list-icon);background-size:cover}.icon.table{background:var(--table-icon);background-size:cover}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i6.ActionListComponent, selector: "nof-action-list", inputs: ["menuHolder"] }, { kind: "component", type: i7.ActionBarComponent, selector: "nof-action-bar", inputs: ["actions", "menuHolder"] }, { kind: "component", type: i8.DialogComponent, selector: "nof-dialog", inputs: ["parentVM"] }, { kind: "component", type: i9.RowComponent, selector: "[nof-row]", inputs: ["item", "row", "withCheckbox", "isTable"] }, { kind: "component", type: i10.HeaderComponent, selector: "[nof-header]", inputs: ["collection", "state"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ListComponent, decorators: [{
type: Component,
args: [{ selector: 'nof-list', template: "<ng-container *ngIf=\"collection\">\n <div class=\"list\">\n <header class=\"header\">\n <div class=\"title\">{{title}}</div>\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n <div class=\"messages\">{{message}}</div>\n </header>\n <div class=\"details\" *ngIf=\"size === 0\">{{description}}</div>\n <ng-container *ngIf=\"size > 0\">\n <nof-action-list *ngIf=\"showActions()\" [menuHolder]=\"collection\"></nof-action-list>\n <nof-dialog [parentVM]=\"collection\" [selectedDialogId]=\"selectedDialogId\"></nof-dialog>\n <div class=\"summary\">\n <div class=\"details\">{{description}}</div>\n <div *ngIf=\"state === 'list'\" class=\"icon table\" (click)=\"doTable()\" title=\"View as Table\" alt=\"View as Table\"></div>\n <div *ngIf=\"state === 'table'\" class=\"icon list\" (click)=\"doList()\" title=\"View as List\" alt=\"View as List\"></div>\n </div>\n <table>\n <thead>\n <tr nof-header [collection]=\"collection\" [state]=\"currentState\"></tr>\n </thead>\n <tbody *ngIf=\"state === 'list' || hasTableData()\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\" [cdkDropListOrientation]=\"'horizontal'\">\n <tr *ngFor=\"let item of items; let i = index\" cdkDrag [cdkDragData]=\"item\" nof-row [item]=\"item\" [row]=\"i\" [withCheckbox]=\"!disableActions()\" [isTable]=\"state === 'table'\"></tr>\n </tbody>\n </table>\n </ng-container>\n </div>\n</ng-container>", styles: [".list{color:#fff;padding-left:var(--space-5);height:100%;overflow-y:auto;display:block;font-weight:var(--font-weight-1)}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}.title,.type{position:relative;font-weight:var(--font-weight-1);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:block}.type{float:left;margin-right:var(--space-5);display:none}.menus{display:block}.menu,.header .action{display:block;float:left;padding:var(--space-3);margin-top:0;margin-left:var(--space-1);margin-right:var(--space-4);margin-bottom:var(--space-3);font-size:var(--font-size-3)}.menu:disabled,.ok:disabled{color:var(--disabled-color)}.summary{display:block;width:var(--table-width);font-size:var(--font-size-2);margin-bottom:var(--space-4);overflow:hidden}.details{padding-left:40px;width:var(--table-width);float:left}.icon{display:block;cursor:pointer;float:right;width:20px;height:var(--field-value-height);padding-top:var(--space-3);padding-left:var(--space-3);margin-right:var(--space-3)}.icon.list{background:var(--list-icon);background-size:cover}.icon.table{background:var(--table-icon);background-size:cover}\n"] }]
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.UrlManagerService }, { type: i2.ContextService }, { type: i3.ViewModelFactoryService }, { type: i2.ErrorService }, { type: i2.ConfigService }, { type: i2.LoggerService }, { type: i3.DragAndDropService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2xpc3QvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2xpc3QvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEtBQUssRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BELE9BQU8sRUFDSCxtQkFBbUIsRUFTdEIsTUFBTSx3QkFBd0IsQ0FBQztBQUloQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7OztBQU94RCxNQUFNLE9BQU8sYUFBYTtJQU1EO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFYYixLQUFLLENBQWlCO0lBQzlCLFNBQVMsR0FBYSxFQUFFLENBQUM7SUFFekIsWUFDcUIsY0FBOEIsRUFDOUIsVUFBNkIsRUFDN0IsT0FBdUIsRUFDdkIsZ0JBQXlDLEVBQ3pDLEtBQW1CLEVBQ25CLGFBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLFdBQStCO1FBUC9CLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBRXBELENBQUM7SUFFRCxVQUFVLENBQWlCO0lBQzNCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxZQUFZLEdBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDO0lBQ3pDLGdCQUFnQixD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QWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQzs0QkFDakQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGFBQWEsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDOUIsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNmLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsV0FBVztRQUNQLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2QyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO3VHQWpPUSxhQUFhOzJGQUFiLGFBQWEsZ0RDeEIxQixzcURBMEJlOzsyRkRGRixhQUFhO2tCQUx6QixTQUFTOytCQUNJLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgKiBhcyBSbyBmcm9tICdAbmFrZWRvYmplY3RzL3Jlc3RmdWwtb2JqZWN0cyc7XG5pbXBvcnQge1xuICAgIENvbGxlY3Rpb25WaWV3U3RhdGUsXG4gICAgQ29uZmlnU2VydmljZSxcbiAgICBDb250ZXh0U2VydmljZSxcbiAgICBFcnJvclNlcnZpY2UsXG4gICAgRXJyb3JXcmFwcGVyLFxuICAgIElDdXN0b21BY3RpdmF0ZWRSb3V0ZURhdGEsXG4gICAgTG9nZ2VyU2VydmljZSxcbiAgICBQYW5lUm91dGVEYXRhLFxuICAgIFVybE1hbmFnZXJTZXJ2aWNlXG59IGZyb20gJ0BuYWtlZG9iamVjdHMvc2VydmljZXMnO1xuaW1wb3J0IHsgSXRlbVZpZXdNb2RlbCwgTGlzdFZpZXdNb2RlbCwgVmlld01vZGVsRmFjdG9yeVNlcnZpY2UsIERyYWdBbmREcm9wU2VydmljZSB9IGZyb20gJ0BuYWtlZG9iamVjdHMvdmlldy1tb2RlbHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uTGlrZSBhcyBJU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQWN0aW9uSG9sZGVyIH0gZnJvbSAnLi4vYWN0aW9uL2FjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgc2FmZVVuc3Vic2NyaWJlIH0gZnJvbSAnLi4vaGVscGVycy1jb21wb25lbnRzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdub2YtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICdsaXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnbGlzdC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHByaXZhdGUgZGRTdWI/OiBJU3Vic2NyaXB0aW9uO1xuICAgIGRyb3Bab25lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB1cmxNYW5hZ2VyOiBVcmxNYW5hZ2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBDb250ZXh0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB2aWV3TW9kZWxGYWN0b3J5OiBWaWV3TW9kZWxGYWN0b3J5U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlcnJvcjogRXJyb3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZTogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkcmFnQW5kRHJvcDogRHJhZ0FuZERyb3BTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG4gICAgY29sbGVjdGlvbiE6IExpc3RWaWV3TW9kZWw7XG4gICAgdGl0bGUgPSAnJztcbiAgICBjdXJyZW50U3RhdGU/ID0gQ29sbGVjdGlvblZpZXdTdGF0ZS5MaXN0O1xuICAgIHNlbGVjdGVkRGlhbG9nSWQ/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdBY3Rpb25zJyxcbiAgICAgICAgZG9DbGljazogKCkgPT4gdGhpcy50b2dnbGVBY3Rpb25NZW51KCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLmRpc2FibGVBY3Rpb25zKCksXG4gICAgICAgIHRlbXBEaXNhYmxlZDogKCkgPT4gbnVsbCxcbiAgICAgICAgdGl0bGU6ICgpID0+IHRoaXMuYWN0aW9uc1Rvb2x0aXAsXG4gICAgICAgIGFjY2Vzc2tleTogJ2EnLFxuICAgICAgICBwcmVzZW50YXRpb25IaW50OiAnJyxcbiAgICAgICAgc2hvd0RpYWxvZzogKCkgPT4gZmFsc2VcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWxvYWRCdXR0b246IElBY3Rpb25Ib2xkZXIgPSB7XG4gICAgICAgIHZhbHVlOiAnUmVsb2FkJyxcbiAgICAgICAgZG9DbGljazogKCkgPT4gdGhpcy5yZWxvYWRMaXN0KCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiBudWxsLFxuICAgICAgICB0ZW1wRGlzYWJsZWQ6ICgpID0+IG51bGwsXG4gICAgICAgIHRpdGxlOiAoKSA9PiAnJyxcbiAgICAgICAgYWNjZXNza2V5OiBudWxsLFxuICAgICAgICBwcmVzZW50YXRpb25IaW50OiAnJyxcbiAgICAgICAgc2hvd0RpYWxvZzogKCkgPT4gZmFsc2VcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBmaXJzdEJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdGaXJzdCcsXG4gICAgICAgIGRvQ2xpY2s6ICgpID0+IHRoaXMucGFnZUZpcnN0KCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLnBhZ2VGaXJzdERpc2FibGVkKCksXG4gICAgICAgIHRlbXBEaXNhYmxlZDogKCkgPT4gbnVsbCxcbiAgICAgICAgdGl0bGU6ICgpID0+ICcnLFxuICAgICAgICBhY2Nlc3NrZXk6IG51bGwsXG4gICAgICAgIHByZXNlbnRhdGlvbkhpbnQ6ICcnLFxuICAgICAgICBzaG93RGlhbG9nOiAoKSA9PiBmYWxzZVxuICAgIH07XG5cbiAgICBwcml2YXRlIHByZXZpb3VzQnV0dG9uOiBJQWN0aW9uSG9sZGVyID0ge1xuICAgICAgICB2YWx1ZTogJ1ByZXZpb3VzJyxcbiAgICAgICAgZG9DbGljazogKCkgPT4gdGhpcy5wYWdlUHJldmlvdXMoKSxcbiAgICAgICAgc2hvdzogKCkgPT4gdHJ1ZSxcbiAgICAgICAgZGlzYWJsZWQ6ICgpID0+IHRoaXMucGFnZVByZXZpb3VzRGlzYWJsZWQoKSxcbiAgICAgICAgdGVtcERpc2FibGVkOiAoKSA9PiBudWxsLFxuICAgICAgICB0aXRsZTogKCkgPT4gJycsXG4gICAgICAgIGFjY2Vzc2tleTogbnVsbCxcbiAgICAgICAgcHJlc2VudGF0aW9uSGludDogJycsXG4gICAgICAgIHNob3dEaWFsb2c6ICgpID0+IGZhbHNlXG4gICAgfTtcblxuICAgIHByaXZhdGUgbmV4dEJ1dHRvbjogSUFjdGlvbkhvbGRlciA9IHtcbiAgICAgICAgdmFsdWU6ICdOZXh0JyxcbiAgICAgICAgZG9DbGljazogKCkgPT4gdGhpcy5wYWdlTmV4dCgpLFxuICAgICAgICBzaG93OiAoKSA9PiB0cnVlLFxuICAgICAgICBkaXNhYmxlZDogKCkgPT4gdGhpcy5wYWdlTmV4dERpc2FibGVkKCksXG4gICAgICAgIHRlbXBEaXNhYmxlZDogKCkgPT4gbnVsbCxcbiAgICAgICAgdGl0bGU6ICgpID0+ICcnLFxuICAgICAgICBhY2Nlc3NrZXk6IG51bGwsXG4gICAgICAgIHByZXNlbnRhdGlvbkhpbnQ6ICcnLFxuICAgICAgICBzaG93RGlhbG9nOiAoKSA9PiBmYWxzZVxuICAgIH07XG5cbiAgICBwcml2YXRlIGxhc3RCdXR0b246IElBY3Rpb25Ib2xkZXIgPSB7XG4gICAgICAgIHZhbHVlOiAnTGFzdCcsXG4gICAgICAgIGRvQ2xpY2s6ICgpID0+IHRoaXMucGFnZUxhc3QoKSxcbiAgICAgICAgc2hvdzogKCkgPT4gdHJ1ZSxcbiAgICAgICAgZGlzYWJsZWQ6ICgpID0+IHRoaXMucGFnZUxhc3REaXNhYmxlZCgpLFxuICAgICAgICB0ZW1wRGlzYWJsZWQ6ICgpID0+IG51bGwsXG4gICAgICAgIHRpdGxlOiAoKSA9PiAnJyxcbiAgICAgICAgYWNjZXNza2V5OiBudWxsLFxuICAgICAgICBwcmVzZW50YXRpb25IaW50OiAnJyxcbiAgICAgICAgc2hvd0RpYWxvZzogKCkgPT4gZmFsc2VcbiAgICB9O1xuXG4gICAgXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZURhdGFTdWI/OiBJU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgcGFuZVJvdXRlRGF0YVN1Yj86IElTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBsYXN0UGFuZVJvdXRlRGF0YT86IFBhbmVSb3V0ZURhdGE7XG5cbiAgICB0b2dnbGVBY3Rpb25NZW51ID0gKCkgPT4gdGhpcy5jb2xsZWN0aW9uLnRvZ2dsZUFjdGlvbk1lbnUoKTtcbiAgICByZWxvYWRMaXN0ID0gKCkgPT4gdGhpcy5jb2xsZWN0aW9uLnJlbG9hZCgpO1xuICAgIHBhZ2VGaXJzdCA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5wYWdlRmlyc3QoKTtcbiAgICBwYWdlUHJldmlvdXMgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ucGFnZVByZXZpb3VzKCk7XG4gICAgcGFnZU5leHQgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ucGFnZU5leHQoKTtcbiAgICBwYWdlTGFzdCA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5wYWdlTGFzdCgpO1xuXG4gICAgZGlzYWJsZUFjdGlvbnMgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ubm9BY3Rpb25zKCkgPyB0cnVlIDogbnVsbDtcbiAgICBoaWRlQWxsQ2hlY2tib3ggPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ubm9BY3Rpb25zKCkgfHwgIXRoaXMuY29sbGVjdGlvbi5pdGVtcyB8fCB0aGlzLmNvbGxlY3Rpb24uaXRlbXMubGVuZ3RoID09PSAwO1xuXG4gICAgcGFnZUZpcnN0RGlzYWJsZWQgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ucGFnZUZpcnN0RGlzYWJsZWQoKSA/IHRydWUgOiBudWxsO1xuICAgIHBhZ2VQcmV2aW91c0Rpc2FibGVkID0gKCkgPT4gdGhpcy5jb2xsZWN0aW9uLnBhZ2VQcmV2aW91c0Rpc2FibGVkKCkgPyB0cnVlIDogbnVsbDtcbiAgICBwYWdlTmV4dERpc2FibGVkID0gKCkgPT4gdGhpcy5jb2xsZWN0aW9uLnBhZ2VOZXh0RGlzYWJsZWQoKSA/IHRydWUgOiBudWxsO1xuICAgIHBhZ2VMYXN0RGlzYWJsZWQgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ucGFnZUxhc3REaXNhYmxlZCgpID8gdHJ1ZSA6IG51bGw7XG5cbiAgICBzaG93QWN0aW9ucyA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5zaG93QWN0aW9ucygpO1xuXG4gICAgZG9UYWJsZSA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5kb1RhYmxlKCk7XG4gICAgZG9MaXN0ID0gKCkgPT4gdGhpcy5jb2xsZWN0aW9uLmRvTGlzdCgpO1xuICAgIGRvU3VtbWFyeSA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5kb1N1bW1hcnkoKTtcblxuICAgIGhhc1RhYmxlRGF0YSA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5oYXNUYWJsZURhdGEoKTtcblxuICAgIGdldCBhY3Rpb25zVG9vbHRpcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5hY3Rpb25zVG9vbHRpcCgpO1xuICAgIH1cblxuICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmdldE1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24uZGVzY3JpcHRpb24oKTtcbiAgICB9XG5cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5zaXplO1xuICAgIH1cblxuICAgIGdldCBpdGVtcygpOiBJdGVtVmlld01vZGVsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLml0ZW1zID8/IFtdO1xuICAgIH1cblxuICAgIGdldCBoZWFkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24uaGVhZGVyO1xuICAgIH1cblxuICAgIGdldCBhY3Rpb25Ib2xkZXJzKCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuYWN0aW9uQnV0dG9uLCB0aGlzLnJlbG9hZEJ1dHRvbiwgdGhpcy5maXJzdEJ1dHRvbiwgdGhpcy5wcmV2aW91c0J1dHRvbiwgdGhpcy5uZXh0QnV0dG9uLCB0aGlzLmxhc3RCdXR0b25dO1xuICAgIH1cblxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25WaWV3U3RhdGVbdGhpcy5jdXJyZW50U3RhdGUhXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0QWN0aW9uRXh0ZW5zaW9ucyhyb3V0ZURhdGE6IFBhbmVSb3V0ZURhdGEpOiBQcm9taXNlPFJvLkV4dGVuc2lvbnM+IHtcbiAgICAgICAgcmV0dXJuIHJvdXRlRGF0YS5vYmplY3RJZFxuICAgICAgICAgICAgPyB0aGlzLmNvbnRleHQuZ2V0QWN0aW9uRXh0ZW5zaW9uc0Zyb21PYmplY3Qocm91dGVEYXRhLnBhbmVJZCwgUm8uT2JqZWN0SWRXcmFwcGVyLmZyb21PYmplY3RJZChyb3V0ZURhdGEub2JqZWN0SWQsIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcua2V5U2VwYXJhdG9yKSwgcm91dGVEYXRhLmFjdGlvbklkISlcbiAgICAgICAgICAgIDogdGhpcy5jb250ZXh0LmdldEFjdGlvbkV4dGVuc2lvbnNGcm9tTWVudShyb3V0ZURhdGEubWVudUlkISwgcm91dGVEYXRhLmFjdGlvbklkISk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldHVwKHJvdXRlRGF0YTogUGFuZVJvdXRlRGF0YSkge1xuICAgICAgICBjb25zdCBjYWNoZWRMaXN0ID0gdGhpcy5jb250ZXh0LmdldENhY2hlZExpc3Qocm91dGVEYXRhLnBhbmVJZCwgcm91dGVEYXRhLnBhZ2UhLCByb3V0ZURhdGEucGFnZVNpemUhKTtcblxuICAgICAgICB0aGlzLmdldEFjdGlvbkV4dGVuc2lvbnMocm91dGVEYXRhKVxuICAgICAgICAgICAgLnRoZW4oKGV4dDogUm8uRXh0ZW5zaW9ucykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gZXh0LmZyaWVuZGx5TmFtZSgpKVxuICAgICAgICAgICAgLmNhdGNoKChyZWplY3Q6IEVycm9yV3JhcHBlcikgPT4gdGhpcy5lcnJvci5oYW5kbGVFcnJvcihyZWplY3QpKTtcblxuICAgICAgICBjb25zdCBsaXN0S2V5ID0gdGhpcy51cmxNYW5hZ2VyLmdldExpc3RDYWNoZUluZGV4KHJvdXRlRGF0YS5wYW5lSWQsIHJvdXRlRGF0YS5wYWdlISwgcm91dGVEYXRhLnBhZ2VTaXplISk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29sbGVjdGlvbiAmJiB0aGlzLmNvbGxlY3Rpb24uaWQgPT09IGxpc3RLZXkpIHtcbiAgICAgICAgICAgIC8vIHNhbWUgY29sbGVjdGlvbi9wYWdlXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHJvdXRlRGF0YS5zdGF0ZTtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbi5yZWZyZXNoKHJvdXRlRGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2xsZWN0aW9uICYmIGNhY2hlZExpc3QpIHtcbiAgICAgICAgICAgIC8vIHNhbWUgY29sbGVjdGlvbiBkaWZmZXJlbnQgcGFnZVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSByb3V0ZURhdGEuc3RhdGU7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb24ucmVzZXQoY2FjaGVkTGlzdCwgcm91dGVEYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChjYWNoZWRMaXN0KSB7XG4gICAgICAgICAgICAvLyBuZXcgY29sbGVjdGlvblxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gdGhpcy52aWV3TW9kZWxGYWN0b3J5Lmxpc3RWaWV3TW9kZWwoY2FjaGVkTGlzdCwgcm91dGVEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gcm91dGVEYXRhLnN0YXRlO1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uLnJlZnJlc2gocm91dGVEYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZVxuICAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLnRocm93KCdMaXN0Q29tcG9uZW50OnNldHVwIE1pc3NpbmcgY2FjaGVkTGlzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29sbGVjdGlvbikge1xuICAgICAgICAgICAgLy8gaWYgYW55IHByZXZpb3VzIG1lc3NhZ2VzIGNsZWFyIHRoZW1cbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbi5yZXNldE1lc3NhZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREaWFsb2dJZCA9IHJvdXRlRGF0YS5kaWFsb2dJZDtcbiAgICB9XG5cbiAgICBzZXREcm9wWm9uZXMoaWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZHJvcFpvbmVzID0gaWRzKTtcbiAgICB9XG5cbiAgICAvLyBub3cgdGhpcyBpcyBhIGNoaWxkIGludmVzdGlnYXRlIHJld29ya2luZyBzbyBvYmplY3QgaXMgcGFzc2VkIGluIGZyb20gcGFyZW50XG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGVEYXRhU3ViID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5kYXRhLnN1YnNjcmliZShkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBkIGFzIElDdXN0b21BY3RpdmF0ZWRSb3V0ZURhdGE7XG4gICAgICAgICAgICBjb25zdCBwYW5lSWQgPSBkYXRhLnBhbmU7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5wYW5lUm91dGVEYXRhU3ViKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYW5lUm91dGVEYXRhU3ViID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cmxNYW5hZ2VyLmdldFBhbmVSb3V0ZURhdGFPYnNlcnZhYmxlKHBhbmVJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHBhbmVSb3V0ZURhdGE6IFBhbmVSb3V0ZURhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhbmVSb3V0ZURhdGEuaXNFcXVhbCh0aGlzLmxhc3RQYW5lUm91dGVEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RQYW5lUm91dGVEYXRhID0gcGFuZVJvdXRlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cChwYW5lUm91dGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZFN1YiA9IHRoaXMuZHJhZ0FuZERyb3AuZHJvcFpvbmVJZHMkLnN1YnNjcmliZShpZHMgPT4gdGhpcy5zZXREcm9wWm9uZXMoaWRzIHx8IFtdKSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHNhZmVVbnN1YnNjcmliZSh0aGlzLnBhbmVSb3V0ZURhdGFTdWIpO1xuICAgICAgICBzYWZlVW5zdWJzY3JpYmUodGhpcy5hY3RpdmF0ZWRSb3V0ZURhdGFTdWIpO1xuICAgICAgICBzYWZlVW5zdWJzY3JpYmUodGhpcy5kZFN1Yik7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbGxlY3Rpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwibGlzdFwiPlxuICAgICAgICA8aGVhZGVyIGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e3RpdGxlfX08L2Rpdj5cbiAgICAgICAgICAgIDxub2YtYWN0aW9uLWJhciBbYWN0aW9uc109XCJhY3Rpb25Ib2xkZXJzXCI+PC9ub2YtYWN0aW9uLWJhcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlc1wiPnt7bWVzc2FnZX19PC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc1wiICpuZ0lmPVwic2l6ZSA9PT0gMFwiPnt7ZGVzY3JpcHRpb259fTwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2l6ZSA+IDBcIj5cbiAgICAgICAgICAgIDxub2YtYWN0aW9uLWxpc3QgKm5nSWY9XCJzaG93QWN0aW9ucygpXCIgW21lbnVIb2xkZXJdPVwiY29sbGVjdGlvblwiPjwvbm9mLWFjdGlvbi1saXN0PlxuICAgICAgICAgICAgPG5vZi1kaWFsb2cgW3BhcmVudFZNXT1cImNvbGxlY3Rpb25cIiBbc2VsZWN0ZWREaWFsb2dJZF09XCJzZWxlY3RlZERpYWxvZ0lkXCI+PC9ub2YtZGlhbG9nPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc1wiPnt7ZGVzY3JpcHRpb259fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZSA9PT0gJ2xpc3QnXCIgY2xhc3M9XCJpY29uIHRhYmxlXCIgKGNsaWNrKT1cImRvVGFibGUoKVwiICB0aXRsZT1cIlZpZXcgYXMgVGFibGVcIiBhbHQ9XCJWaWV3IGFzIFRhYmxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0YXRlID09PSAndGFibGUnXCIgY2xhc3M9XCJpY29uIGxpc3RcIiAoY2xpY2spPVwiZG9MaXN0KClcIiAgdGl0bGU9XCJWaWV3IGFzIExpc3RcIiBhbHQ9XCJWaWV3IGFzIExpc3RcIj48L2Rpdj5cbiAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBub2YtaGVhZGVyIFtjb2xsZWN0aW9uXT1cImNvbGxlY3Rpb25cIiBbc3RhdGVdPVwiY3VycmVudFN0YXRlXCI+PC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5ICpuZ0lmPVwic3RhdGUgPT09ICdsaXN0JyB8fCBoYXNUYWJsZURhdGEoKVwiIGNka0Ryb3BMaXN0IFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cImRyb3Bab25lc1wiIFtjZGtEcm9wTGlzdE9yaWVudGF0aW9uXT1cIidob3Jpem9udGFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCIgY2RrRHJhZyBbY2RrRHJhZ0RhdGFdPVwiaXRlbVwiIG5vZi1yb3cgW2l0ZW1dPVwiaXRlbVwiIFtyb3ddPVwiaVwiIFt3aXRoQ2hlY2tib3hdPVwiIWRpc2FibGVBY3Rpb25zKClcIiBbaXNUYWJsZV09XCJzdGF0ZSA9PT0gJ3RhYmxlJ1wiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj4iXX0=