kwikid-agent-dashboard
Version:
KwikID's EKYC Agent Map View Module.
222 lines • 51.6 kB
JavaScript
import { __awaiter } from "tslib";
import { Component, EventEmitter, HostListener, Inject, Input, Output, ViewChild } from "@angular/core";
import { MapInfoWindow } from "@angular/google-maps";
import { TuiDialogService } from "@taiga-ui/core";
import { isNotEmptyValue, checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from "kwikid-toolkit";
import { catchError, map } from "rxjs/operators";
import { of } from "rxjs";
import * as i0 from "@angular/core";
import * as i1 from "./services/google-maps.service";
import * as i2 from "./services/agent.service";
import * as i3 from "@angular/common/http";
import * as i4 from "kwikui";
import * as i5 from "@angular/google-maps";
import * as i6 from "./components/customer-details/customer-details.component";
import * as i7 from "./components/customer-list/customer-list.component";
import * as i8 from "kwikid-forms";
import * as i9 from "@angular/common";
import * as i10 from "@taiga-ui/cdk";
import * as i11 from "@taiga-ui/core";
export class KwikIDAgentDashboardComponentV1 {
constructor(googleMapsService, agentService, httpClient, hostElement, dialogService) {
this.googleMapsService = googleMapsService;
this.agentService = agentService;
this.httpClient = httpClient;
this.hostElement = hostElement;
this.dialogService = dialogService;
this.agentInfo = {};
this.config = {};
this.userConfig = {};
this.taskList = [];
this.nextStep = new EventEmitter();
this.addTask = new EventEmitter();
this.removeTask = new EventEmitter();
this.filterTaskList = new EventEmitter();
this.onClickPerformAction = new EventEmitter();
this.loading = true;
this.labelValuePairConfig = {};
this.labelValuePairData = [];
this.open = false;
this.allFormsData = {};
this.String = String;
}
windowResizeWatcher() {
if (this.hostElement.nativeElement.offsetWidth < 600) {
this.isMobileView = true;
this.agentService.isMobileView = true;
}
else {
this.isMobileView = false;
this.agentService.isMobileView = false;
}
}
ngOnInit() {
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
return __awaiter(this, void 0, void 0, function* () {
this.parseData();
this.agentService.config = this.config;
this.agentService.showMapview = (_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.isShowMaps) !== null && _c !== void 0 ? _c : false;
if (((_e = (_d = this.config) === null || _d === void 0 ? void 0 : _d.maps) === null || _e === void 0 ? void 0 : _e.mapType) === "google-maps" &&
isNotEmptyValue((_g = (_f = this.config) === null || _f === void 0 ? void 0 : _f.maps) === null || _g === void 0 ? void 0 : _g.apiKey)) {
this.loadMaps((_j = (_h = this.config) === null || _h === void 0 ? void 0 : _h.maps) === null || _j === void 0 ? void 0 : _j.apiKey).subscribe((loaded) => {
this.mapsLoaded = loaded;
if (loaded) {
console.log("Google Maps JavaScript API loaded successfully.");
this.loading = false;
// Initialize and render Google Map here
}
else {
console.error("Google Maps JavaScript API failed to load.");
this.loading = false;
}
});
}
else {
this.mapsLoaded = true;
this.loading = false;
}
setTimeout(() => {
this.windowResizeWatcher();
}, 1000);
});
}
// Load Google Maps
loadMaps(apiKey) {
const url = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&v=3.exp&libraries=geometry,drawing,places`;
this.googleMapsService.apiKey = apiKey;
return this.httpClient.jsonp(url, "callback").pipe(map(() => true), catchError(() => {
console.error("Error loading Google Maps JavaScript API.");
return of(false);
}));
}
getValueFromArray(paths) {
let data = "";
// eslint-disable-next-line array-callback-return
paths.map((path) => {
const value = getObjectValueFromPath(this.agentInfo, path);
data = `${data} ${value}`;
});
return data;
}
parseData() {
var _a, _b, _c, _d;
let detailsConfig = [];
if (checkObjectPathExists(this.config, "hamburgerUI.data") &&
isNotEmptyArray(this.config.hamburgerUI.data)) {
const data = [];
detailsConfig = this.config.hamburgerUI.data;
detailsConfig.map((field) => {
let value;
if (Array.isArray(field.path)) {
value = this.getValueFromArray(field.path);
}
else {
value = getObjectValueFromPath(this.agentInfo, field.path);
}
data.push({ label: field.label, value });
return true;
});
this.labelValuePairData = data;
}
else {
this.labelValuePairData = [
{
label: "Agent ID",
value: (_a = this.agentInfo) === null || _a === void 0 ? void 0 : _a.agent_id
}
];
}
this.labelValuePairConfig = (_d = (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.hamburgerUI) === null || _c === void 0 ? void 0 : _c.config) !== null && _d !== void 0 ? _d : {};
}
handleOnClickNext(e) {
this.nextStep.emit(e);
}
handleOnClickAddTask(task) {
this.addTask.emit(task);
}
handleOnClickRemoveTask(task) {
this.removeTask.emit(task);
}
handleOnFilterTaskList(filter) {
this.filterTaskList.emit(filter);
}
refresh() {
this.handleOnFilterTaskList({});
}
onClick() {
this.open = !this.open;
}
onObscured(obscured) {
if (obscured) {
this.open = false;
}
}
onActiveZone(active) {
this.open = active && this.open;
}
close() {
this.open = false;
if (this.dialogSubscription) {
this.dialogSubscription.unsubscribe();
}
}
showDialog(content) {
this.dialogSubscription = this.dialogService
.open(content, { closeable: false, dismissible: false })
.subscribe();
}
openInfoWindow(marker) {
this.infoWindow.open(marker);
}
handleOnClickSaveForm(e) {
this.handleOnClickAddTask(e.data);
this.close();
}
handleOnClickLogout() {
this.handleOnClickPerformAction({ action: { type: "logout" } });
}
handleOnClickPerformAction(event) {
this.onClickPerformAction.emit(event);
}
}
/** @nocollapse */ KwikIDAgentDashboardComponentV1.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDAgentDashboardComponentV1, deps: [{ token: i1.GoogleMapsService }, { token: i2.AgentService }, { token: i3.HttpClient }, { token: i0.ElementRef }, { token: TuiDialogService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikIDAgentDashboardComponentV1.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDAgentDashboardComponentV1, selector: "kwikid-agent-dashboard-v1", inputs: { agentInfo: "agentInfo", config: "config", userConfig: "userConfig", taskList: "taskList" }, outputs: { nextStep: "nextStep", addTask: "addTask", removeTask: "removeTask", filterTaskList: "filterTaskList", onClickPerformAction: "onClickPerformAction" }, host: { listeners: { "window:resize": "windowResizeWatcher($event)" } }, viewQueries: [{ propertyName: "infoWindow", first: true, predicate: MapInfoWindow, descendants: true }, { propertyName: "mapElement", first: true, predicate: ["map"], descendants: true, static: true }], ngImport: i0, template: "<div\n class=\"kwikid-agent-dashboard\"\n *ngIf=\"!loading\"\n>\n <div class=\"wrapper\">\n <header>\n <span (tuiActiveZoneChange)=\"onActiveZone($event)\">\n <kwikui-button\n [icon]=\"'tuiIconMenuLarge'\"\n (onClick)=\"onClick()\"\n appearance=\"mono\"\n size=\"m\"\n [tuiDropdown]=\"dropdownContent\"\n [tuiDropdownManual]=\"open\"\n (tuiObscured)=\"onObscured($event)\"\n ></kwikui-button>\n <img\n *ngIf=\"\n userConfig?.theme?.clientLogo &&\n config?.utilityFlags?.isShowClientLogo &&\n !config?.utilityFlags?.isAllowAddTask\n \"\n [src]=\"userConfig?.theme.clientLogo\"\n class=\"client-logo\"\n />\n <ng-template #dropdownContent>\n <div class=\"menu-dropdown\">\n <div class=\"menu-dropdown-header\">\n <div class=\"menu-dropdown-header-agent-name\">\n {{ agentInfo.agent_name ?? userConfig?.theme?.clientName }}\n </div>\n <div class=\"customer-details-table\">\n <kwikui-label-value-pair\n [config]=\"labelValuePairConfig\"\n [data]=\"labelValuePairData\"\n ></kwikui-label-value-pair>\n </div>\n </div>\n <hr />\n <div\n class=\"menu-dropdown-body\"\n tuiGroup\n [collapsed]=\"true\"\n [rounded]=\"false\"\n [orientation]=\"'vertical'\"\n [size]=\"'m'\"\n >\n <kwikui-button\n appearance=\"mono\"\n class=\"menu-dropdown-buttons\"\n label=\"Refresh\"\n [icon]=\"'tuiIconRefreshCw'\"\n size=\"m\"\n type=\"button\"\n (onClick)=\"refresh()\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"this.config?.maps?.isShowMaps\"\n appearance=\"mono\"\n class=\"menu-dropdown-buttons\"\n label=\"{{\n agentService.showMapview ? 'Hide Maps' : 'Show Maps'\n }}\"\n type=\"button\"\n icon=\"{{\n agentService.showMapview ? 'tuiIconEyeOff' : 'tuiIconEye'\n }}\"\n iconRight=\"\"\n [shape]=\"null\"\n size=\"m\"\n styles=\"padding: 0rem !important\"\n (onClick)=\"agentService.toggleMapview()\"\n ></kwikui-button>\n </div>\n <hr />\n <div class=\"menu-dropdown-footer\">\n <kwikui-button\n appearance=\"mono\"\n class=\"menu-dropdown-buttons\"\n label=\"Logout\"\n icon=\"tuiIconLogOut\"\n size=\"m\"\n type=\"button\"\n (onClick)=\"handleOnClickLogout()\"\n ></kwikui-button>\n </div>\n </div>\n </ng-template>\n </span>\n <div class=\"actions\">\n <kwikui-button\n *ngIf=\"config?.utilityFlags?.isAllowAddTask\"\n class=\"menu-dropdown-buttons\"\n type=\"button\"\n appearance=\"primary\"\n [label]=\"config?.formsConfig?.addTaskForm?.title ?? 'Add User'\"\n icon=\"tuiIconPlus\"\n shape=\"rounded\"\n size=\"s\"\n (onClick)=\"showDialog(template)\"\n ></kwikui-button>\n </div>\n </header>\n\n <div class=\"dashboard-body\">\n <div\n *ngIf=\"mapsLoaded\"\n [class]=\"agentService.showMapview ? 'map' : 'map-hidden'\"\n >\n <google-map\n *ngIf=\"config?.maps?.mapType == 'google-maps'\"\n [options]=\"this.googleMapsService.map\"\n height=\"100%\"\n width=\"100%\"\n >\n <map-marker\n #marker=\"mapMarker\"\n *ngFor=\"\n let markerPosition of this.googleMapsService.allMarkers;\n let index = index\n \"\n [position]=\"markerPosition\"\n [label]=\"{ text: String(index) }\"\n ></map-marker>\n <map-directions-renderer\n *ngIf=\"\n this.googleMapsService.directionsResults$\n | async as directionsResults\n \"\n [directions]=\"directionsResults\"\n [options]=\"this.googleMapsService.directionsRenderOption\"\n ></map-directions-renderer>\n </google-map>\n\n <div\n *ngIf=\"config?.maps?.mapType == 'open-street'\"\n id=\"map\"\n style=\"height: 100%\"\n ></div>\n </div>\n\n <div\n class=\"task-details\"\n *ngIf=\"\n !agentService.isMobileView &&\n agentService.currentTaskDetails != undefined &&\n !agentService.showMapview\n \"\n >\n <customer-details\n [customer]=\"agentService.currentTaskDetails\"\n [config]=\"config\"\n (nextStep)=\"handleOnClickNext($event)\"\n (removeTask)=\"handleOnClickRemoveTask($event)\"\n (onClickPerformAction)=\"handleOnClickPerformAction($event)\"\n ></customer-details>\n </div>\n\n <div\n class=\"no-task-details\"\n *ngIf=\"\n agentService.currentTaskDetails == undefined &&\n !agentService.isMobileView &&\n !agentService.showMapview\n \"\n >\n <img\n src=\"assets/No-Results.jpg\"\n class=\"no-task-img\"\n alt=\"No Task\"\n />\n <div>Select a Task to view it's details.</div>\n </div>\n\n <div class=\"customer-list\">\n <customer-list\n [customers]=\"taskList\"\n [config]=\"config\"\n (nextStep)=\"handleOnClickNext($event)\"\n (removeTask)=\"handleOnClickRemoveTask($event)\"\n (filterTaskList)=\"handleOnFilterTaskList($event)\"\n (onClickPerformAction)=\"handleOnClickPerformAction($event)\"\n ></customer-list>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"kwikid-agent-dashboard-loader\"\n *ngIf=\"loading\"\n>\n <span class=\"loader\"></span>\n</div>\n\n<ng-template\n #template\n let-observer\n>\n <div class=\"add-task-header\">\n <h2>{{ config?.formsConfig?.addTaskForm?.title ?? \"Create User\" }}</h2>\n <kwikui-button\n icon=\"tuiIconX\"\n id=\"\"\n styles=\"\"\n type=\"button\"\n appearance=\"mono\"\n [shape]=\"null\"\n size=\"m\"\n (onClick)=\"observer.complete()\"\n ></kwikui-button>\n </div>\n <kwikid-form-view\n [allFormsData]=\"allFormsData\"\n [formConfig]=\"config?.formsConfig?.addTaskForm\"\n [isMobileView]=\"true\"\n (onClickSaveForm)=\"this.handleOnClickSaveForm($event)\"\n ></kwikid-form-view>\n</ng-template>\n", styles: [".kwikid-agent-dashboard{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center;width:100%;height:100%;position:relative}.kwikid-agent-dashboard .wrapper{width:100%;height:100%;display:flex;flex-direction:column;align-content:center;justify-content:space-between;align-items:stretch}.kwikid-agent-dashboard .wrapper header{display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;grid-column-gap:1rem;column-gap:1rem;padding:1rem;max-height:80px;border:1px solid #cdcdcd}.kwikid-agent-dashboard .wrapper header .actions{display:flex;flex-direction:row;align-items:center}.kwikid-agent-dashboard .wrapper header .actions>*{margin-right:.5rem}.kwikid-agent-dashboard .wrapper .dashboard-body{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:stretch;flex:1;overflow:auto}.kwikid-agent-dashboard .wrapper .dashboard-body .map{width:100%;height:100%;position:relative;overflow:hidden}.kwikid-agent-dashboard .wrapper .dashboard-body .map-hidden{visibility:collapse}.kwikid-agent-dashboard .wrapper .dashboard-body .customer-list{width:100%;height:100%;overflow:hidden}@media screen and (min-width: 600px){.kwikid-agent-dashboard{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center;width:100%;height:100%}.kwikid-agent-dashboard .wrapper{width:100%;height:100%;display:flex;flex-direction:column;align-content:center;justify-content:space-between;align-items:stretch}.kwikid-agent-dashboard .wrapper header{display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;grid-column-gap:1rem;column-gap:1rem;padding:.75rem;max-height:80px;border:1px solid #cdcdcd}.kwikid-agent-dashboard .wrapper header .client-name{display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;font-size:1rem;font-weight:600}.kwikid-agent-dashboard .wrapper .dashboard-body{display:flex;flex-direction:row-reverse;align-content:center;justify-content:flex-end;align-items:stretch;overflow:auto}.kwikid-agent-dashboard .wrapper .dashboard-body .map{width:100%;height:100%;position:relative;overflow:hidden;border:1px solid #cdcdcd;border-radius:.5rem}.kwikid-agent-dashboard .wrapper .dashboard-body .map-hidden{visibility:collapse}.kwikid-agent-dashboard .wrapper .dashboard-body .task-details{width:100%;height:100%;position:relative;overflow:hidden;border:1px solid #cdcdcd}.kwikid-agent-dashboard .wrapper .dashboard-body .no-task-details{width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;grid-gap:.5rem;gap:.5rem;overflow:hidden;color:#555}.kwikid-agent-dashboard .wrapper .dashboard-body .no-task-details .no-task-img{height:100px;width:100px}.kwikid-agent-dashboard .wrapper .dashboard-body .customer-list{min-width:300px;max-width:320px;width:100%;height:100%;overflow:hidden;border:1px solid #cdcdcd}}.menu{position:absolute;transition:\"0.15s linear 0s\"}.kwikid-agent-dashboard-loader{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.75);display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;z-index:100}.kwikid-agent-dashboard-loader .loader{width:48px;height:48px;border-radius:50%;display:inline-block;position:relative;border:3px solid;border-color:#fff #fff transparent;box-sizing:border-box;animation:rotation 1s linear infinite}.kwikid-agent-dashboard-loader .loader:after{content:\"\";box-sizing:border-box;position:absolute;left:0;right:0;top:0;bottom:0;margin:auto;border:3px solid;border-color:transparent var(--tui-primary) var(--tui-primary);width:24px;height:24px;border-radius:50%;animation:rotationBack .5s linear infinite;transform-origin:center center}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotationBack{0%{transform:rotate(0)}to{transform:rotate(-360deg)}}.kwikid-agent-dashboard-loader .t-loader{display:none!important}.add-task-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:.5rem 0 1rem 1rem}:host{width:100%;height:100%}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}.menu-dropdown{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;grid-gap:.5rem;gap:.5rem;padding:1rem 1.5rem}.menu-dropdown .menu-dropdown-header{display:flex;flex-direction:column;align-content:flex-start;justify-content:space-between;align-items:flex-start;grid-gap:1rem;gap:1rem}.menu-dropdown .menu-dropdown-header .menu-dropdown-header-agent-name{font-size:1.2rem;margin:0 auto;font-weight:600}.menu-dropdown .menu-dropdown-header .menu-dropdown-header-agent-id{font-size:.8rem;margin:0 auto;font-weight:600}.menu-dropdown .menu-dropdown-buttons ::ng-deep .t-wrapper{padding:0!important}.client-logo{height:40px;width:-moz-fit-content;width:fit-content;margin:0 auto;padding-left:1rem}.client-name{display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;font-size:1rem;margin:0 auto;font-weight:600}\n"], components: [{ type: i4.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["appearance", "class", "disabled", "icon", "iconRight", "id", "label", "shape", "showLoader", "size", "styles", "type", "pseudoHover"], outputs: ["onClick"] }, { type: i4.KwikUILabelValuePairComponent, selector: "kwikui-label-value-pair", inputs: ["config", "data", "id"] }, { type: i5.GoogleMap, selector: "google-map", inputs: ["height", "width", "center", "zoom", "options", "mapTypeId"], outputs: ["authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { type: i6.CustomerDetailsComponent, selector: "customer-details", inputs: ["customer", "config"], outputs: ["nextStep", "removeTask", "onClickPerformAction"] }, { type: i7.CustomerListComponent, selector: "customer-list", inputs: ["customers", "config"], outputs: ["nextStep", "removeTask", "filterTaskList", "onClickPerformAction"] }, { type: i8.KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: ["allFormsData", "extraData", "apiCallResponse", "buttonClickResponse", "formConfig", "formData", "isMobileView", "popupFormCallback", "userConfig", "stepConfig"], outputs: ["getLogs", "getUnsavedDataState", "onActionShowPopupForm", "onClickApiCall", "onClickViewFile", "onClickFormFieldButton", "onClickGoBack", "onClickSaveForm", "onClickViewForms"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.TuiActiveZoneDirective, selector: "[tuiActiveZone]:not(ng-container), [tuiActiveZoneChange]:not(ng-container), [tuiActiveZoneParent]:not(ng-container)", inputs: ["tuiActiveZoneParent"], outputs: ["tuiActiveZoneChange"], exportAs: ["tuiActiveZone"] }, { type: i11.TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { type: i11.TuiDropdownDriverDirective, selector: "[tuiDropdown]" }, { type: i11.TuiDropdownPositionDirective, selector: "[tuiDropdown]" }, { type: i11.TuiDropdownManualDirective, selector: "[tuiDropdown][tuiDropdownManual]", inputs: ["tuiDropdownManual"] }, { type: i11.TuiGroupDirective, selector: "[tuiGroup]:not(ng-container)", inputs: ["orientation", "adaptive", "collapsed", "rounded", "size"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged"], exportAs: ["mapMarker"] }, { type: i5.MapDirectionsRenderer, selector: "map-directions-renderer", inputs: ["directions", "options"], outputs: ["directionsChanged"], exportAs: ["mapDirectionsRenderer"] }], pipes: { "async": i9.AsyncPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDAgentDashboardComponentV1, decorators: [{
type: Component,
args: [{
selector: "kwikid-agent-dashboard-v1",
templateUrl: "./kwikid-agent-dashboard.component.html",
styleUrls: ["./kwikid-agent-dashboard.component.scss"]
}]
}], ctorParameters: function () { return [{ type: i1.GoogleMapsService }, { type: i2.AgentService }, { type: i3.HttpClient }, { type: i0.ElementRef }, { type: i11.TuiDialogService, decorators: [{
type: Inject,
args: [TuiDialogService]
}] }]; }, propDecorators: { windowResizeWatcher: [{
type: HostListener,
args: ["window:resize", ["$event"]]
}], agentInfo: [{
type: Input
}], config: [{
type: Input
}], userConfig: [{
type: Input
}], taskList: [{
type: Input
}], nextStep: [{
type: Output
}], addTask: [{
type: Output
}], removeTask: [{
type: Output
}], filterTaskList: [{
type: Output
}], onClickPerformAction: [{
type: Output
}], infoWindow: [{
type: ViewChild,
args: [MapInfoWindow, { static: false }]
}], mapElement: [{
type: ViewChild,
args: ["map", { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3dpa2lkLWFnZW50LWRhc2hib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtYWdlbnQtZGFzaGJvYXJkL3NyYy9saWIvdjEva3dpa2lkLWFnZW50LWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtYWdlbnQtZGFzaGJvYXJkL3NyYy9saWIvdjEva3dpa2lkLWFnZW50LWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFhLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFvQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFDTCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBU3RDLE1BQU0sT0FBTywrQkFBK0I7SUF5RDFDLFlBQ1MsaUJBQW9DLEVBQ3BDLFlBQTBCLEVBQzFCLFVBQXNCLEVBQ3JCLFdBQXVCLEVBQ1ksYUFBK0I7UUFKbkUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3JCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ1ksa0JBQWEsR0FBYixhQUFh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RCwwQkFBMEIsQ0FBQyxLQUFVO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7Z0pBMU5VLCtCQUErQixtSUE4RGhDLGdCQUFnQjtvSUE5RGYsK0JBQStCLDZiQWlEL0IsYUFBYSxrSkNsRjFCLDYzTkEyTkE7NEZEMUxhLCtCQUErQjtrQkFMM0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxXQUFXLEVBQUUseUNBQXlDO29CQUN0RCxTQUFTLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQztpQkFDdkQ7OzBCQStESSxNQUFNOzJCQUFDLGdCQUFnQjs0Q0E1RDFCLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBY3pDLFNBQVM7c0JBRFIsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFFBQVE7c0JBRFAsS0FBSztnQkFJTixRQUFRO3NCQURQLE1BQU07Z0JBSVAsT0FBTztzQkFETixNQUFNO2dCQUlQLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsb0JBQW9CO3NCQURuQixNQUFNO2dCQVdzQyxVQUFVO3NCQUF0RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRVAsVUFBVTtzQkFBN0MsU0FBUzt1QkFBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbWFnaWMtbnVtYmVycyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tZW1wdHktZnVuY3Rpb24gKi9cbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1hcEluZm9XaW5kb3csIE1hcE1hcmtlciB9IGZyb20gXCJAYW5ndWxhci9nb29nbGUtbWFwc1wiO1xuaW1wb3J0IHsgVHVpRGlhbG9nQ29udGV4dCwgVHVpRGlhbG9nU2VydmljZSB9IGZyb20gXCJAdGFpZ2EtdWkvY29yZVwiO1xuaW1wb3J0IHsgUG9seW1vcnBoZXVzQ29udGVudCB9IGZyb20gXCJAdGlua29mZi9uZy1wb2x5bW9ycGhldXNcIjtcbmltcG9ydCB7XG4gIGlzTm90RW1wdHlWYWx1ZSxcbiAgY2hlY2tPYmplY3RQYXRoRXhpc3RzLFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBpc05vdEVtcHR5QXJyYXlcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEFnZW50U2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2FnZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEdvb2dsZU1hcHNTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvZ29vZ2xlLW1hcHMuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa2lkLWFnZW50LWRhc2hib2FyZC12MVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgS3dpa0lEQWdlbnREYXNoYm9hcmRDb21wb25lbnRWMSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgd2luZG93UmVzaXplV2F0Y2hlcigpIHtcbiAgICBpZiAodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDwgNjAwKSB7XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IHRydWU7XG4gICAgICB0aGlzLmFnZW50U2VydmljZS5pc01vYmlsZVZpZXcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IGZhbHNlO1xuICAgICAgdGhpcy5hZ2VudFNlcnZpY2UuaXNNb2JpbGVWaWV3ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNNb2JpbGVWaWV3O1xuXG4gIEBJbnB1dCgpXG4gIGFnZW50SW5mbzogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgY29uZmlnOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICB1c2VyQ29uZmlnOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICB0YXNrTGlzdDogQXJyYXk8YW55PiA9IFtdO1xuXG4gIEBPdXRwdXQoKVxuICBuZXh0U3RlcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgYWRkVGFzayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcmVtb3ZlVGFzayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgZmlsdGVyVGFza0xpc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tQZXJmb3JtQWN0aW9uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGxvYWRpbmcgPSB0cnVlO1xuXG4gIG1hcDogYW55O1xuXG4gIGxhYmVsVmFsdWVQYWlyQ29uZmlnOiBhbnkgPSB7fTtcblxuICBsYWJlbFZhbHVlUGFpckRhdGE6IGFueSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoTWFwSW5mb1dpbmRvdywgeyBzdGF0aWM6IGZhbHNlIH0pIGluZm9XaW5kb3c6IE1hcEluZm9XaW5kb3c7XG5cbiAgQFZpZXdDaGlsZChcIm1hcFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBtYXBFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIG1hcHNMb2FkZWQ6IGJvb2xlYW47XG5cbiAgZGlhbG9nU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBnb29nbGVNYXBzU2VydmljZTogR29vZ2xlTWFwc1NlcnZpY2UsXG4gICAgcHVibGljIGFnZW50U2VydmljZTogQWdlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgaG9zdEVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgQEluamVjdChUdWlEaWFsb2dTZXJ2aWNlKSBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IFR1aURpYWxvZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMucGFyc2VEYXRhKCk7XG4gICAgdGhpcy5hZ2VudFNlcnZpY2UuY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5hZ2VudFNlcnZpY2Uuc2hvd01hcHZpZXcgPSB0aGlzLmNvbmZpZz8ubWFwcz8uaXNTaG93TWFwcyA/PyBmYWxzZTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnPy5tYXBzPy5tYXBUeXBlID09PSBcImdvb2dsZS1tYXBzXCIgJiZcbiAgICAgIGlzTm90RW1wdHlWYWx1ZSh0aGlzLmNvbmZpZz8ubWFwcz8uYXBpS2V5KVxuICAgICkge1xuICAgICAgdGhpcy5sb2FkTWFwcyh0aGlzLmNvbmZpZz8ubWFwcz8uYXBpS2V5KS5zdWJzY3JpYmUoKGxvYWRlZDogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLm1hcHNMb2FkZWQgPSBsb2FkZWQ7XG4gICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkdvb2dsZSBNYXBzIEphdmFTY3JpcHQgQVBJIGxvYWRlZCBzdWNjZXNzZnVsbHkuXCIpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIC8vIEluaXRpYWxpemUgYW5kIHJlbmRlciBHb29nbGUgTWFwIGhlcmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiR29vZ2xlIE1hcHMgSmF2YVNjcmlwdCBBUEkgZmFpbGVkIHRvIGxvYWQuXCIpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXBzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53aW5kb3dSZXNpemVXYXRjaGVyKCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICAvLyBMb2FkIEdvb2dsZSBNYXBzXG4gIGxvYWRNYXBzKGFwaUtleSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PSR7YXBpS2V5fSZ2PTMuZXhwJmxpYnJhcmllcz1nZW9tZXRyeSxkcmF3aW5nLHBsYWNlc2A7XG4gICAgdGhpcy5nb29nbGVNYXBzU2VydmljZS5hcGlLZXkgPSBhcGlLZXk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50Lmpzb25wKHVybCwgXCJjYWxsYmFja1wiKS5waXBlKFxuICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBsb2FkaW5nIEdvb2dsZSBNYXBzIEphdmFTY3JpcHQgQVBJLlwiKTtcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFZhbHVlRnJvbUFycmF5KHBhdGhzKSB7XG4gICAgbGV0IGRhdGEgPSBcIlwiO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhcnJheS1jYWxsYmFjay1yZXR1cm5cbiAgICBwYXRocy5tYXAoKHBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCh0aGlzLmFnZW50SW5mbywgcGF0aCk7XG4gICAgICBkYXRhID0gYCR7ZGF0YX0gJHt2YWx1ZX1gO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwYXJzZURhdGEoKSB7XG4gICAgbGV0IGRldGFpbHNDb25maWcgPSBbXTtcbiAgICBpZiAoXG4gICAgICBjaGVja09iamVjdFBhdGhFeGlzdHModGhpcy5jb25maWcsIFwiaGFtYnVyZ2VyVUkuZGF0YVwiKSAmJlxuICAgICAgaXNOb3RFbXB0eUFycmF5KHRoaXMuY29uZmlnLmhhbWJ1cmdlclVJLmRhdGEpXG4gICAgKSB7XG4gICAgICBjb25zdCBkYXRhID0gW107XG4gICAgICBkZXRhaWxzQ29uZmlnID0gdGhpcy5jb25maWcuaGFtYnVyZ2VyVUkuZGF0YTtcbiAgICAgIGRldGFpbHNDb25maWcubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLnBhdGgpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbUFycmF5KGZpZWxkLnBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCh0aGlzLmFnZW50SW5mbywgZmllbGQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5wdXNoKHsgbGFiZWw6IGZpZWxkLmxhYmVsLCB2YWx1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubGFiZWxWYWx1ZVBhaXJEYXRhID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbFZhbHVlUGFpckRhdGEgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogXCJBZ2VudCBJRFwiLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmFnZW50SW5mbz8uYWdlbnRfaWRcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgdGhpcy5sYWJlbFZhbHVlUGFpckNvbmZpZyA9IHRoaXMuY29uZmlnPy5oYW1idXJnZXJVST8uY29uZmlnID8/IHt9O1xuICB9XG5cbiAgaGFuZGxlT25DbGlja05leHQoZSkge1xuICAgIHRoaXMubmV4dFN0ZXAuZW1pdChlKTtcbiAgfVxuXG4gIGhhbmRsZU9uQ2xpY2tBZGRUYXNrKHRhc2spIHtcbiAgICB0aGlzLmFkZFRhc2suZW1pdCh0YXNrKTtcbiAgfVxuXG4gIGhhbmRsZU9uQ2xpY2tSZW1vdmVUYXNrKHRhc2spIHtcbiAgICB0aGlzLnJlbW92ZVRhc2suZW1pdCh0YXNrKTtcbiAgfVxuXG4gIGhhbmRsZU9uRmlsdGVyVGFza0xpc3QoZmlsdGVyKSB7XG4gICAgdGhpcy5maWx0ZXJUYXNrTGlzdC5lbWl0KGZpbHRlcik7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIHRoaXMuaGFuZGxlT25GaWx0ZXJUYXNrTGlzdCh7fSk7XG4gIH1cblxuICBvcGVuID0gZmFsc2U7XG5cbiAgb25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuO1xuICB9XG5cbiAgYWxsRm9ybXNEYXRhID0ge307XG5cbiAgU3RyaW5nID0gU3RyaW5nO1xuXG4gIG9uT2JzY3VyZWQob2JzY3VyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAob2JzY3VyZWQpIHtcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uQWN0aXZlWm9uZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4gPSBhY3RpdmUgJiYgdGhpcy5vcGVuO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGlhbG9nU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRpYWxvZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dEaWFsb2coY29udGVudDogUG9seW1vcnBoZXVzQ29udGVudDxUdWlEaWFsb2dDb250ZXh0Pik6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nU3Vic2NyaXB0aW9uID0gdGhpcy5kaWFsb2dTZXJ2aWNlXG4gICAgICAub3Blbihjb250ZW50LCB7IGNsb3NlYWJsZTogZmFsc2UsIGRpc21pc3NpYmxlOiBmYWxzZSB9KVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgb3BlbkluZm9XaW5kb3cobWFya2VyOiBNYXBNYXJrZXIpIHtcbiAgICB0aGlzLmluZm9XaW5kb3cub3BlbihtYXJrZXIpO1xuICB9XG5cbiAgaGFuZGxlT25DbGlja1NhdmVGb3JtKGUpIHtcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2tBZGRUYXNrKGUuZGF0YSk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgaGFuZGxlT25DbGlja0xvZ291dCgpIHtcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2tQZXJmb3JtQWN0aW9uKHsgYWN0aW9uOiB7IHR5cGU6IFwibG9nb3V0XCIgfSB9KTtcbiAgfVxuXG4gIGhhbmRsZU9uQ2xpY2tQZXJmb3JtQWN0aW9uKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpY2tQZXJmb3JtQWN0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwia3dpa2lkLWFnZW50LWRhc2hib2FyZFwiXG4gICpuZ0lmPVwiIWxvYWRpbmdcIlxuPlxuICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgIDxoZWFkZXI+XG4gICAgICA8c3BhbiAodHVpQWN0aXZlWm9uZUNoYW5nZSk9XCJvbkFjdGl2ZVpvbmUoJGV2ZW50KVwiPlxuICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgIFtpY29uXT1cIid0dWlJY29uTWVudUxhcmdlJ1wiXG4gICAgICAgICAgKG9uQ2xpY2spPVwib25DbGljaygpXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwibW9ub1wiXG4gICAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICAgIFt0dWlEcm9wZG93bl09XCJkcm9wZG93bkNvbnRlbnRcIlxuICAgICAgICAgIFt0dWlEcm9wZG93bk1hbnVhbF09XCJvcGVuXCJcbiAgICAgICAgICAodHVpT2JzY3VyZWQpPVwib25PYnNjdXJlZCgkZXZlbnQpXCJcbiAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICB1c2VyQ29uZmlnPy50aGVtZT8uY2xpZW50TG9nbyAmJlxuICAgICAgICAgICAgY29uZmlnPy51dGlsaXR5RmxhZ3M/LmlzU2hvd0NsaWVudExvZ28gJiZcbiAgICAgICAgICAgICFjb25maWc/LnV0aWxpdHlGbGFncz8uaXNBbGxvd0FkZFRhc2tcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzcmNdPVwidXNlckNvbmZpZz8udGhlbWUuY2xpZW50TG9nb1wiXG4gICAgICAgICAgY2xhc3M9XCJjbGllbnQtbG9nb1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd25Db250ZW50PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWRyb3Bkb3duXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1kcm9wZG93bi1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtZHJvcGRvd24taGVhZGVyLWFnZW50LW5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhZ2VudEluZm8uYWdlbnRfbmFtZSA/PyB1c2VyQ29uZmlnPy50aGVtZT8uY2xpZW50TmFtZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbWVyLWRldGFpbHMtdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8a3dpa3VpLWxhYmVsLXZhbHVlLXBhaXJcbiAgICAgICAgICAgICAgICAgIFtjb25maWddPVwibGFiZWxWYWx1ZVBhaXJDb25maWdcIlxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwibGFiZWxWYWx1ZVBhaXJEYXRhXCJcbiAgICAgICAgICAgICAgICA+PC9rd2lrdWktbGFiZWwtdmFsdWUtcGFpcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm1lbnUtZHJvcGRvd24tYm9keVwiXG4gICAgICAgICAgICAgIHR1aUdyb3VwXG4gICAgICAgICAgICAgIFtjb2xsYXBzZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtyb3VuZGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW29yaWVudGF0aW9uXT1cIid2ZXJ0aWNhbCdcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCInbSdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJtb25vXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lbnUtZHJvcGRvd24tYnV0dG9uc1wiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWZyZXNoXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCIndHVpSWNvblJlZnJlc2hDdydcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJyZWZyZXNoKClcIlxuICAgICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5jb25maWc/Lm1hcHM/LmlzU2hvd01hcHNcIlxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJtb25vXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lbnUtZHJvcGRvd24tYnV0dG9uc1wiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJ7e1xuICAgICAgICAgICAgICAgICAgYWdlbnRTZXJ2aWNlLnNob3dNYXB2aWV3ID8gJ0hpZGUgTWFwcycgOiAnU2hvdyBNYXBzJ1xuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpY29uPVwie3tcbiAgICAgICAgICAgICAgICAgIGFnZW50U2VydmljZS5zaG93TWFwdmlldyA/ICd0dWlJY29uRXllT2ZmJyA6ICd0dWlJY29uRXllJ1xuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBpY29uUmlnaHQ9XCJcIlxuICAgICAgICAgICAgICAgIFtzaGFwZV09XCJudWxsXCJcbiAgICAgICAgICAgICAgICBzaXplPVwibVwiXG4gICAgICAgICAgICAgICAgc3R5bGVzPVwicGFkZGluZzogMHJlbSAhaW1wb3J0YW50XCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJhZ2VudFNlcnZpY2UudG9nZ2xlTWFwdmlldygpXCJcbiAgICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1kcm9wZG93bi1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwibW9ub1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZW51LWRyb3Bkb3duLWJ1dHRvbnNcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiTG9nb3V0XCJcbiAgICAgICAgICAgICAgICBpY29uPVwidHVpSWNvbkxvZ091dFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tMb2dvdXQoKVwiXG4gICAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJjb25maWc/LnV0aWxpdHlGbGFncz8uaXNBbGxvd0FkZFRhc2tcIlxuICAgICAgICAgIGNsYXNzPVwibWVudS1kcm9wZG93bi1idXR0b25zXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXG4gICAgICAgICAgW2xhYmVsXT1cImNvbmZpZz8uZm9ybXNDb25maWc/LmFkZFRhc2tGb3JtPy50aXRsZSA/PyAnQWRkIFVzZXInXCJcbiAgICAgICAgICBpY29uPVwidHVpSWNvblBsdXNcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRlZFwiXG4gICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgIChvbkNsaWNrKT1cInNob3dEaWFsb2codGVtcGxhdGUpXCJcbiAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImRhc2hib2FyZC1ib2R5XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwibWFwc0xvYWRlZFwiXG4gICAgICAgIFtjbGFzc109XCJhZ2VudFNlcnZpY2Uuc2hvd01hcHZpZXcgPyAnbWFwJyA6ICdtYXAtaGlkZGVuJ1wiXG4gICAgICA+XG4gICAgICAgIDxnb29nbGUtbWFwXG4gICAgICAgICAgKm5nSWY9XCJjb25maWc/Lm1hcHM/Lm1hcFR5cGUgPT0gJ2dvb2dsZS1tYXBzJ1wiXG4gICAgICAgICAgW29wdGlvbnNdPVwidGhpcy5nb29nbGVNYXBzU2VydmljZS5tYXBcIlxuICAgICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWFwLW1hcmtlclxuICAgICAgICAgICAgI21hcmtlcj1cIm1hcE1hcmtlclwiXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IG1hcmtlclBvc2l0aW9uIG9mIHRoaXMuZ29vZ2xlTWFwc1NlcnZpY2UuYWxsTWFya2VycztcbiAgICAgICAgICAgICAgbGV0IGluZGV4ID0gaW5kZXhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbcG9zaXRpb25dPVwibWFya2VyUG9zaXRpb25cIlxuICAgICAgICAgICAgW2xhYmVsXT1cInsgdGV4dDogU3RyaW5nKGluZGV4KSB9XCJcbiAgICAgICAgICA+PC9tYXAtbWFya2VyPlxuICAgICAgICAgIDxtYXAtZGlyZWN0aW9ucy1yZW5kZXJlclxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgdGhpcy5nb29nbGVNYXBzU2VydmljZS5kaXJlY3Rpb25zUmVzdWx0cyRcbiAgICAgICAgICAgICAgICB8IGFzeW5jIGFzIGRpcmVjdGlvbnNSZXN1bHRzXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2RpcmVjdGlvbnNdPVwiZGlyZWN0aW9uc1Jlc3VsdHNcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwidGhpcy5nb29nbGVNYXBzU2VydmljZS5kaXJlY3Rpb25zUmVuZGVyT3B0aW9uXCJcbiAgICAgICAgICA+PC9tYXAtZGlyZWN0aW9ucy1yZW5kZXJlcj5cbiAgICAgICAgPC9nb29nbGUtbWFwPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImNvbmZpZz8ubWFwcz8ubWFwVHlwZSA9PSAnb3Blbi1zdHJlZXQnXCJcbiAgICAgICAgICBpZD1cIm1hcFwiXG4gICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDEwMCVcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInRhc2stZGV0YWlsc1wiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgIWFnZW50U2VydmljZS5pc01vYmlsZVZpZXcgJiZcbiAgICAgICAgICBhZ2VudFNlcnZpY2UuY3VycmVudFRhc2tEZXRhaWxzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICFhZ2VudFNlcnZpY2Uuc2hvd01hcHZpZXdcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGN1c3RvbWVyLWRldGFpbHNcbiAgICAgICAgICBbY3VzdG9tZXJdPVwiYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlsc1wiXG4gICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgIChuZXh0U3RlcCk9XCJoYW5kbGVPbkNsaWNrTmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAocmVtb3ZlVGFzayk9XCJoYW5kbGVPbkNsaWNrUmVtb3ZlVGFzaygkZXZlbnQpXCJcbiAgICAgICAgICAob25DbGlja1BlcmZvcm1BY3Rpb24pPVwiaGFuZGxlT25DbGlja1BlcmZvcm1BY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgID48L2N1c3RvbWVyLWRldGFpbHM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm5vLXRhc2stZGV0YWlsc1wiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlscyA9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAhYWdlbnRTZXJ2aWNlLmlzTW9iaWxlVmlldyAmJlxuICAgICAgICAgICFhZ2VudFNlcnZpY2Uuc2hvd01hcHZpZXdcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGltZ1xuICAgICAgICAgIHNyYz1cImFzc2V0cy9Oby1SZXN1bHRzLmpwZ1wiXG4gICAgICAgICAgY2xhc3M9XCJuby10YXNrLWltZ1wiXG4gICAgICAgICAgYWx0PVwiTm8gVGFza1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxkaXY+U2VsZWN0IGEgVGFzayB0byB2aWV3IGl0J3MgZGV0YWlscy48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gIC