UNPKG

kwikid-agent-dashboard

Version:

KwikID's EKYC Agent Map View Module.

141 lines 26.3 kB
/* eslint-disable no-empty-function */ /* eslint-disable no-magic-numbers */ /* eslint-disable class-methods-use-this */ /* eslint-disable no-prototype-builtins */ import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from "@angular/core"; import { checkObjectPathExists, getObjectValueFromPath, isNotEmptyArray } from "kwikid-toolkit"; import * as i0 from "@angular/core"; import * as i1 from "../../services/agent.service"; import * as i2 from "../../services/google-maps.service"; import * as i3 from "../../services/open-street-maps.service"; import * as i4 from "kwikui"; import * as i5 from "../customer-tile/status-pill/status-pill.component"; import * as i6 from "../action-button/action-button.component"; import * as i7 from "@angular/common"; export class CustomerDetailsComponent { constructor(agentService, googleMapsService, openStreetMapsService, cdr) { this.agentService = agentService; this.googleMapsService = googleMapsService; this.openStreetMapsService = openStreetMapsService; this.cdr = cdr; this.customer = {}; this.title = "Session Details"; this.viewTaskDetails = []; this.taskId = ""; this.labelValuePairConfig = {}; this.labelValuePairData = []; this.nextStep = new EventEmitter(); this.removeTask = new EventEmitter(); this.onClickPerformAction = new EventEmitter(); } ngOnInit() { this.parseData(); } ngOnChanges(changes) { const verifyChange = (key) => { return changes.hasOwnProperty(key) && !changes[key].firstChange; }; if (verifyChange("customer")) { this.customer = changes.customer.currentValue; this.parseData(); } } getValueFromArray(paths) { let data = ""; // eslint-disable-next-line array-callback-return paths.map((path) => { const value = getObjectValueFromPath(this.customer, path); data = `${data} ${value}`; }); return data; } parseData() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; const identifier = (_a = this.config.taskUI.details.header.taskId.path) !== null && _a !== void 0 ? _a : "user_id"; this.taskId = getObjectValueFromPath(this.customer, identifier); let detailsConfig = []; if (checkObjectPathExists(this.config, "taskUI.details.data") && isNotEmptyArray(this.config.taskUI.details.data)) { const data = []; detailsConfig = this.config.taskUI.details.data; detailsConfig.map((field) => { let value; if (Array.isArray(field.path)) { value = this.getValueFromArray(field.path); } else { value = getObjectValueFromPath(this.customer, field.path); } data.push({ label: field.label, value }); return true; }); this.labelValuePairData = data; } this.labelValuePairConfig = (_e = (_d = (_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.taskUI) === null || _c === void 0 ? void 0 : _c.details) === null || _d === void 0 ? void 0 : _d.config) !== null && _e !== void 0 ? _e : {}; this.title = (_k = (_j = (_h = (_g = (_f = this.config) === null || _f === void 0 ? void 0 : _f.taskUI) === null || _g === void 0 ? void 0 : _g.details) === null || _h === void 0 ? void 0 : _h.header) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : this.title; } getTaskCreationTime(task) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; if ((_d = (_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.taskUI) === null || _b === void 0 ? void 0 : _b.details) === null || _c === void 0 ? void 0 : _c.time) === null || _d === void 0 ? void 0 : _d.path) { const time = getObjectValueFromPath(task, (_h = (_g = (_f = (_e = this.config) === null || _e === void 0 ? void 0 : _e.taskUI) === null || _f === void 0 ? void 0 : _f.details) === null || _g === void 0 ? void 0 : _g.time) === null || _h === void 0 ? void 0 : _h.path); return this.convertEpochToDate(time); } return this.convertEpochToDate((_j = task === null || task === void 0 ? void 0 : task.task_creation_time) !== null && _j !== void 0 ? _j : task === null || task === void 0 ? void 0 : task.start_time); } convertEpochToDate(epochTime) { if (typeof epochTime === "string") epochTime = Number(epochTime); const date = new Date(epochTime * 1000); // Convert to milliseconds const day = date.getDate().toString().padStart(2, "0"); const month = (date.getMonth() + 1).toString().padStart(2, "0"); // Months are zero-based const year = date.getFullYear().toString(); return `${day}-${month}-${year}`; } getTaskDetails(taskData) { return getObjectValueFromPath(this.customer, taskData); } goToMaps(location) { window.open(`${location}`, "_blank"); } handleOnClickNext(e) { this.nextStep.emit(e); } close() { var _a, _b; this.agentService.currentTaskDetails = undefined; if (((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.mapType) === "google-maps") { this.googleMapsService.plotDirectionsForSelectedTask(null); } else { this.openStreetMapsService.plotDirectionsForSelectedTask(null); } } handleOnClickRemoveTask(task) { this.removeTask.emit(task); } handleOnClickPerformAction(event) { this.onClickPerformAction.emit(event); } } /** @nocollapse */ CustomerDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomerDetailsComponent, deps: [{ token: i1.AgentService }, { token: i2.GoogleMapsService }, { token: i3.OpenStreetMapsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ CustomerDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: CustomerDetailsComponent, selector: "customer-details", inputs: { customer: "customer", config: "config" }, outputs: { nextStep: "nextStep", removeTask: "removeTask", onClickPerformAction: "onClickPerformAction" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"customer-details-wrapper\">\n <div>\n <kwikui-button\n icon=\"tuiIconChevronLeft\"\n label=\"Back\"\n shape=\"rounded\"\n size=\"s\"\n (onClick)=\"close()\"\n ></kwikui-button>\n </div>\n <div class=\"customer-details-heading\">{{ title }}</div>\n <div class=\"customer-details-body\">\n <div class=\"customer-details-user-id\">\n {{ taskId }}\n\n <status-pill\n *ngIf=\"config?.utilityFlags?.isShowTaskStatus\"\n [config]=\"config?.taskUI?.details?.header?.taskStatus\"\n [status]=\"\n customer[\n config?.taskUI?.details?.header?.taskStatus?.path ??\n 'session_status'\n ]\n \"\n ></status-pill>\n </div>\n\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\n <div\n class=\"customer-details-actions\"\n *ngIf=\"\n config?.taskUI?.details?.action &&\n config?.taskUI?.details?.action?.length > 0\n \"\n >\n <ng-container *ngFor=\"let action of config?.taskUI?.details?.action\">\n <kwikid-action-button\n [action]=\"action\"\n [config]=\"config\"\n [customer]=\"customer\"\n (onClickPerformAction)=\"handleOnClickPerformAction($event)\"\n ></kwikid-action-button>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [".customer-details-wrapper{display:flex;flex-direction:column;align-items:stretch;overflow:auto;grid-gap:.5rem;gap:.5rem;padding:1.5rem;height:100%;width:100%}.customer-details-wrapper .customer-details-heading{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:1rem 0;font-size:1.5rem;font-weight:600}.customer-details-wrapper .customer-details-body{display:flex;flex-direction:column;font-size:1rem}.customer-details-wrapper .customer-details-body .customer-details-user-id{display:flex;flex-direction:row;grid-gap:.6rem;gap:.6rem;align-items:center;font-size:1.25rem;font-weight:500;padding:.5rem 0}.customer-details-wrapper .customer-details-body .customer-details-table{display:flex;grid-gap:.5rem;gap:.5rem;flex-direction:column}.customer-details-wrapper .customer-details-body .customer-details-table .customer-details-table-data .customer-details-table-detail-name{font-weight:500}.customer-details-wrapper .customer-details-body .customer-details-table .customer-details-table-data .customer-details-table-detail-value{word-wrap:break-word}.customer-details-wrapper .customer-details-body .customer-details-date{padding-top:1rem}.customer-details-wrapper .customer-details-body .customer-details-actions{padding:.5rem 0;display:flex;flex-wrap:wrap;align-items:center;flex-direction:row;justify-content:flex-start;grid-gap:.5rem;gap:.5rem}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}\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: i5.StatusPillComponent, selector: "status-pill", inputs: ["config", "status"] }, { type: i4.KwikUILabelValuePairComponent, selector: "kwikui-label-value-pair", inputs: ["config", "data", "id"] }, { type: i6.ActionButtonComponent, selector: "kwikid-action-button", inputs: ["action", "config", "customer"], outputs: ["onClickPerformAction"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CustomerDetailsComponent, decorators: [{ type: Component, args: [{ selector: "customer-details", templateUrl: "./customer-details.component.html", styleUrls: ["./customer-details.component.scss"], changeDetection: ChangeDetectionStrategy.Default }] }], ctorParameters: function () { return [{ type: i1.AgentService }, { type: i2.GoogleMapsService }, { type: i3.OpenStreetMapsService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { customer: [{ type: Input }], config: [{ type: Input }], nextStep: [{ type: Output }], removeTask: [{ type: Output }], onClickPerformAction: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtYWdlbnQtZGFzaGJvYXJkL3NyYy9saWIvdjEvY29tcG9uZW50cy9jdXN0b21lci1kZXRhaWxzL2N1c3RvbWVyLWRldGFpbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWFnZW50LWRhc2hib2FyZC9zcmMvbGliL3YxL2NvbXBvbmVudHMvY3VzdG9tZXItZGV0YWlscy9jdXN0b21lci1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNDQUFzQztBQUN0QyxxQ0FBcUM7QUFDckMsMkNBQTJDO0FBQzNDLDBDQUEwQztBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLHVCQUF1QixFQUV4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQVd4QixNQUFNLE9BQU8sd0JBQXdCO0lBMEJuQyxZQUNTLFlBQTBCLEVBQzFCLGlCQUFvQyxFQUNwQyxxQkFBNEMsRUFDM0MsR0FBc0I7UUFIdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzNDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBNUJoQyxhQUFRLEdBQVEsRUFBRSxDQUFDO1FBS25CLFVBQUssR0FBRyxpQkFBaUIsQ0FBQztRQUUxQixvQkFBZSxHQUFrQixFQUFFLENBQUM7UUFFcEMsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUVqQix5QkFBb0IsR0FBUSxFQUFFLENBQUM7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QkFBd0I7NkhBQXhCLHdCQUF3Qiw0T0M5QnJDLG0rQ0FvREE7NEZEdEJhLHdCQUF3QjtrQkFOcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixXQUFXLEVBQUUsbUNBQW1DO29CQUNoRCxTQUFTLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQztvQkFDaEQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE9BQU87aUJBQ2pEO3VNQUdDLFFBQVE7c0JBRFAsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxNQUFNO2dCQUlQLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxvQkFBb0I7c0JBRG5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eS1mdW5jdGlvbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbWFnaWMtbnVtYmVycyAqL1xuLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgY2hlY2tPYmplY3RQYXRoRXhpc3RzLFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBpc05vdEVtcHR5QXJyYXlcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBBZ2VudFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYWdlbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgR29vZ2xlTWFwc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZ29vZ2xlLW1hcHMuc2VydmljZVwiO1xuaW1wb3J0IHsgT3BlblN0cmVldE1hcHNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL29wZW4tc3RyZWV0LW1hcHMuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiY3VzdG9tZXItZGV0YWlsc1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2N1c3RvbWVyLWRldGFpbHMuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2N1c3RvbWVyLWRldGFpbHMuY29tcG9uZW50LnNjc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdFxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21lckRldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIGN1c3RvbWVyOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBjb25maWc6IGFueTtcblxuICB0aXRsZSA9IFwiU2Vzc2lvbiBEZXRhaWxzXCI7XG5cbiAgdmlld1Rhc2tEZXRhaWxzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgdGFza0lkOiBhbnkgPSBcIlwiO1xuXG4gIGxhYmVsVmFsdWVQYWlyQ29uZmlnOiBhbnkgPSB7fTtcblxuICBsYWJlbFZhbHVlUGFpckRhdGE6IGFueSA9IFtdO1xuXG4gIEBPdXRwdXQoKVxuICBuZXh0U3RlcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcmVtb3ZlVGFzayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DbGlja1BlcmZvcm1BY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFnZW50U2VydmljZTogQWdlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBnb29nbGVNYXBzU2VydmljZTogR29vZ2xlTWFwc1NlcnZpY2UsXG4gICAgcHVibGljIG9wZW5TdHJlZXRNYXBzU2VydmljZTogT3BlblN0cmVldE1hcHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wYXJzZURhdGEoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB2ZXJpZnlDaGFuZ2UgPSAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBjaGFuZ2VzLmhhc093blByb3BlcnR5KGtleSkgJiYgIWNoYW5nZXNba2V5XS5maXJzdENoYW5nZTtcbiAgICB9O1xuXG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImN1c3RvbWVyXCIpKSB7XG4gICAgICB0aGlzLmN1c3RvbWVyID0gY2hhbmdlcy5jdXN0b21lci5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnBhcnNlRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhbHVlRnJvbUFycmF5KHBhdGhzKSB7XG4gICAgbGV0IGRhdGEgPSBcIlwiO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhcnJheS1jYWxsYmFjay1yZXR1cm5cbiAgICBwYXRocy5tYXAoKHBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCh0aGlzLmN1c3RvbWVyLCBwYXRoKTtcbiAgICAgIGRhdGEgPSBgJHtkYXRhfSAke3ZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHBhcnNlRGF0YSgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID1cbiAgICAgIHRoaXMuY29uZmlnLnRhc2tVSS5kZXRhaWxzLmhlYWRlci50YXNrSWQucGF0aCA/PyBcInVzZXJfaWRcIjtcbiAgICB0aGlzLnRhc2tJZCA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGhpcy5jdXN0b21lciwgaWRlbnRpZmllcik7XG5cbiAgICBsZXQgZGV0YWlsc0NvbmZpZyA9IFtdO1xuICAgIGlmIChcbiAgICAgIGNoZWNrT2JqZWN0UGF0aEV4aXN0cyh0aGlzLmNvbmZpZywgXCJ0YXNrVUkuZGV0YWlscy5kYXRhXCIpICYmXG4gICAgICBpc05vdEVtcHR5QXJyYXkodGhpcy5jb25maWcudGFza1VJLmRldGFpbHMuZGF0YSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICAgIGRldGFpbHNDb25maWcgPSB0aGlzLmNvbmZpZy50YXNrVUkuZGV0YWlscy5kYXRhO1xuICAgICAgZGV0YWlsc0NvbmZpZy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQucGF0aCkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tQXJyYXkoZmllbGQucGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKHRoaXMuY3VzdG9tZXIsIGZpZWxkLnBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEucHVzaCh7IGxhYmVsOiBmaWVsZC5sYWJlbCwgdmFsdWUgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxhYmVsVmFsdWVQYWlyRGF0YSA9IGRhdGE7XG4gICAgfVxuICAgIHRoaXMubGFiZWxWYWx1ZVBhaXJDb25maWcgPSB0aGlzLmNvbmZpZz8udGFza1VJPy5kZXRhaWxzPy5jb25maWcgPz8ge307XG4gICAgdGhpcy50aXRsZSA9IHRoaXMuY29uZmlnPy50YXNrVUk/LmRldGFpbHM/LmhlYWRlcj8udGl0bGUgPz8gdGhpcy50aXRsZTtcbiAgfVxuXG4gIGdldFRhc2tDcmVhdGlvblRpbWUodGFzaykge1xuICAgIGlmICh0aGlzLmNvbmZpZz8udGFza1VJPy5kZXRhaWxzPy50aW1lPy5wYXRoKSB7XG4gICAgICBjb25zdCB0aW1lID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgdGFzayxcbiAgICAgICAgdGhpcy5jb25maWc/LnRhc2tVST8uZGV0YWlscz8udGltZT8ucGF0aFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRFcG9jaFRvRGF0ZSh0aW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udmVydEVwb2NoVG9EYXRlKFxuICAgICAgdGFzaz8udGFza19jcmVhdGlvbl90aW1lID8/IHRhc2s/LnN0YXJ0X3RpbWVcbiAgICApO1xuICB9XG5cbiAgY29udmVydEVwb2NoVG9EYXRlKGVwb2NoVGltZSkge1xuICAgIGlmICh0eXBlb2YgZXBvY2hUaW1lID09PSBcInN0cmluZ1wiKSBlcG9jaFRpbWUgPSBOdW1iZXIoZXBvY2hUaW1lKTtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZXBvY2hUaW1lICogMTAwMCk7IC8vIENvbnZlcnQgdG8gbWlsbGlzZWNvbmRzXG4gICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7XG4gICAgY29uc3QgbW9udGggPSAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7IC8vIE1vbnRocyBhcmUgemVyby1iYXNlZFxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcblxuICAgIHJldHVybiBgJHtkYXl9LSR7bW9udGh9LSR7eWVhcn1gO1xuICB9XG5cbiAgZ2V0VGFza0RldGFpbHModGFza0RhdGEpIHtcbiAgICByZXR1cm4gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCh0aGlzLmN1c3RvbWVyLCB0YXNrRGF0YSk7XG4gIH1cblxuICBnb1RvTWFwcyhsb2NhdGlvbikge1xuICAgIHdpbmRvdy5vcGVuKGAke2xvY2F0aW9ufWAsIFwiX2JsYW5rXCIpO1xuICB9XG5cbiAgaGFuZGxlT25DbGlja05leHQoZSkge1xuICAgIHRoaXMubmV4dFN0ZXAuZW1pdChlKTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuYWdlbnRTZXJ2aWNlLmN1cnJlbnRUYXNrRGV0YWlscyA9IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLmNvbmZpZz8ubWFwcz8ubWFwVHlwZSA9PT0gXCJnb29nbGUtbWFwc1wiKSB7XG4gICAgICB0aGlzLmdvb2dsZU1hcHNTZXJ2aWNlLnBsb3REaXJlY3Rpb25zRm9yU2VsZWN0ZWRUYXNrKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5TdHJlZXRNYXBzU2VydmljZS5wbG90RGlyZWN0aW9uc0ZvclNlbGVjdGVkVGFzayhudWxsKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVPbkNsaWNrUmVtb3ZlVGFzayh0YXNrKSB7XG4gICAgdGhpcy5yZW1vdmVUYXNrLmVtaXQodGFzayk7XG4gIH1cblxuICBoYW5kbGVPbkNsaWNrUGVyZm9ybUFjdGlvbihldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNsaWNrUGVyZm9ybUFjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImN1c3RvbWVyLWRldGFpbHMtd3JhcHBlclwiPlxuICA8ZGl2PlxuICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICBpY29uPVwidHVpSWNvbkNoZXZyb25MZWZ0XCJcbiAgICAgIGxhYmVsPVwiQmFja1wiXG4gICAgICBzaGFwZT1cInJvdW5kZWRcIlxuICAgICAgc2l6ZT1cInNcIlxuICAgICAgKG9uQ2xpY2spPVwiY2xvc2UoKVwiXG4gICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjdXN0b21lci1kZXRhaWxzLWhlYWRpbmdcIj57eyB0aXRsZSB9fTwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3VzdG9tZXItZGV0YWlscy1ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbWVyLWRldGFpbHMtdXNlci1pZFwiPlxuICAgICAge3sgdGFza0lkIH19XG5cbiAgICAgIDxzdGF0dXMtcGlsbFxuICAgICAgICAqbmdJZj1cImNvbmZpZz8udXRpbGl0eUZsYWdzPy5pc1Nob3dUYXNrU3RhdHVzXCJcbiAgICAgICAgW2NvbmZpZ109XCJjb25maWc/LnRhc2tVST8uZGV0YWlscz8uaGVhZGVyPy50YXNrU3RhdHVzXCJcbiAgICAgICAgW3N0YXR1c109XCJcbiAgICAgICAgICBjdXN0b21lcltcbiAgICAgICAgICAgIGNvbmZpZz8udGFza1VJPy5kZXRhaWxzPy5oZWFkZXI/LnRhc2tTdGF0dXM/LnBhdGggPz9cbiAgICAgICAgICAgICAgJ3Nlc3Npb25fc3RhdHVzJ1xuICAgICAgICAgIF1cbiAgICAgICAgXCJcbiAgICAgID48L3N0YXR1cy1waWxsPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbWVyLWRldGFpbHMtdGFibGVcIj5cbiAgICAgIDxrd2lrdWktbGFiZWwtdmFsdWUtcGFpclxuICAgICAgICBbY29uZmlnXT1cImxhYmVsVmFsdWVQYWlyQ29uZmlnXCJcbiAgICAgICAgW2RhdGFdPVwibGFiZWxWYWx1ZVBhaXJEYXRhXCJcbiAgICAgID48L2t3aWt1aS1sYWJlbC12YWx1ZS1wYWlyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjdXN0b21lci1kZXRhaWxzLWFjdGlvbnNcIlxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgY29uZmlnPy50YXNrVUk/LmRldGFpbHM/LmFjdGlvbiAmJlxuICAgICAgICBjb25maWc/LnRhc2tVST8uZGV0YWlscz8uYWN0aW9uPy5sZW5ndGggPiAwXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb25maWc/LnRhc2tVST8uZGV0YWlscz8uYWN0aW9uXCI+XG4gICAgICAgIDxrd2lraWQtYWN0aW9uLWJ1dHRvblxuICAgICAgICAgIFthY3Rpb25dPVwiYWN0aW9uXCJcbiAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgICAgICAgW2N1c3RvbWVyXT1cImN1c3RvbWVyXCJcbiAgICAgICAgICAob25DbGlja1BlcmZvcm1BY3Rpb24pPVwiaGFuZGxlT25DbGlja1BlcmZvcm1BY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgID48L2t3aWtpZC1hY3Rpb24tYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=