UNPKG

ontimize-web-ngx

Version:
277 lines 42.3 kB
import { Component, forwardRef, Inject, Injector, ViewEncapsulation } from '@angular/core'; import { Router } from '@angular/router'; import { OntimizeServiceProvider } from '../../../services/factories'; import { NavigationService } from '../../../services/navigation.service'; import { OntimizeService } from '../../../services/ontimize/ontimize.service'; import { Codes } from '../../../util/codes'; import { Util } from '../../../util/util'; import { OFormBase } from '../o-form-base.class'; import { FactoryUtil } from '../../../util/factory.util'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/common"; import * as i3 from "@angular/material/button"; import * as i4 from "@angular/material/icon"; import * as i5 from "../o-form-base.class"; export class OFormNavigationComponent { constructor(injector, _form, router) { this.injector = injector; this._form = _form; this.router = router; this.navigationData = []; this._currentIndex = 0; this.formNavigation = this._form.getFormNavigation(); this.navigationService = this.injector.get(NavigationService); this.formLayoutManager = this._form.getFormManager(); let navData; if (this.formLayoutManager && this.formLayoutManager.allowNavigation()) { navData = this.navigationService.getLastItem(); } else { navData = this.navigationService.getPreviousRouteData(); } if (Util.isDefined(navData)) { this.navigationData = navData.keysValues || []; this.queryConf = navData.queryConfiguration; } this.currentIndex = this.getCurrentIndex(); this.configureService(); } configureService() { if (!this.queryConf) { return; } const configureService = { injector: this.injector, baseService: OntimizeService, entity: this.queryConf.entity, service: this.queryConf.service, serviceType: this.queryConf.serviceType }; this.dataService = FactoryUtil.configureService(configureService); } getQueryArguments(offset, length) { const queryArguments = { ...this.queryConf.queryArguments }; queryArguments.columns = this.getKeysArray(); queryArguments.ovrrArgs.offset = offset; queryArguments.ovrrArgs.length = length || this.queryConf.queryRows; return queryArguments; } queryNavigationData(offset, length) { if (!this.queryConf) { return Promise.reject(new Error(`Invalid query parameters: ${this.queryConf.queryMethod}`)); } const queryArgs = this.getQueryArguments(offset, length); const serviceMethod = this.dataService[this.queryConf.queryMethod]; if (typeof serviceMethod !== 'function') { return Promise.reject(new Error(`Invalid query method: ${this.queryConf.queryMethod}`)); } const adaptedParams = this.dataService.requestArgumentAdapter.parseQueryParameters(queryArgs); return new Promise((resolve, reject) => { this.querySubscription = this.dataService[this.queryConf.queryMethod](...adaptedParams) .subscribe({ next: res => { if (res.isSuccessful()) { this.navigationData = res.data; this.queryConf.queryRecordOffset = offset; } resolve(); }, error: err => reject(new Error(err)) }); }); } ngOnDestroy() { if (this.querySubscription) { this.querySubscription.unsubscribe(); } } getKeysArray() { const navData = this.navigationData ? (this.navigationData[0] || {}) : {}; const keysArray = []; this._form.keysArray.forEach(key => { if (navData.hasOwnProperty(key)) { keysArray.push(key); } }); return keysArray; } getCurrentIndex() { const keysArray = this.getKeysArray(); const currentKeys = {}; const currentItem = this.formNavigation.getUrlParams(); keysArray.forEach(key => { currentKeys[key] = currentItem[key]; }); const index = (this.navigationData || []).findIndex((item) => { const itemKeys = {}; keysArray.forEach(key => { itemKeys[key] = item[key]; }); return Util.isEquivalent(itemKeys, currentKeys); }); return index >= 0 ? index : 0; } next() { const total = this.navigationData.length; const index = this.currentIndex + 1; if (total > index) { this.move(index); } else if (this.queryConf) { const offset = (this.queryConf.queryRecordOffset || 0) + this.queryConf.queryRows; this.queryNavigationData(offset).then(() => { this.move(0); }); } else { console.error('form-toolbar->next(): total > index'); } } previous() { const index = this.currentIndex - 1; if (index >= 0) { this.move(index); } else if (this.queryConf) { const offset = this.queryConf.queryRecordOffset - this.queryConf.queryRows; this.queryNavigationData(offset).then(() => { this.move(this.navigationData.length - 1); }); } else { console.error('form-toolbar->next(): index < 0'); } } first() { if (!this.queryConf || this.queryConf.queryRecordOffset === 0) { this.move(0); } else { this.queryNavigationData(0).then(() => { this.move(0); }); } } last() { if (!this.queryConf || this.isLast()) { this.moveToLast(); return; } const offset = this.queryConf.totalRecordsNumber - this.queryConf.queryRows; if (offset < 0 || offset === this.queryConf.queryRecordOffset) { this.moveToLast(); return; } this.queryNavigationData(offset, this.queryConf.queryRows).then(() => { this.moveToLast(); }); } moveToLast() { const index = this.navigationData.length - 1; this.move(index); } isFirst() { let result = this.currentIndex === 0; if (result && this.queryConf) { result = this.queryConf.queryRecordOffset === 0; } return result; } isLast() { let result = this.currentIndex === (this.navigationData.length - 1); if (result && this.queryConf) { result = (this.queryConf.queryRecordOffset + this.queryConf.queryRows) >= this.queryConf.totalRecordsNumber; } return result; } move(index) { this._form.showConfirmDiscardChanges().then(res => { if (res === true) { this.currentIndex = index; if (this.formLayoutManager && this.formLayoutManager.allowNavigation()) { this.moveInFormLayoutManager(index); } else { this.moveWithoutManager(index); } } }); } moveWithoutManager(index) { const route = this.getRouteOfSelectedRow(this.navigationData[index]); if (route.length > 0) { const navData = this.navigationService.getLastItem(); if (navData) { this._form.canDiscardChanges = true; const extras = {}; extras[Codes.QUERY_PARAMS] = Codes.getIsDetailObject(); const urlArray = navData.url.split(Codes.ROUTE_SEPARATOR); const url = urlArray.splice(0, urlArray.length - route.length).join(Codes.ROUTE_SEPARATOR); route.unshift(url); this.router.navigate(route, extras).then((navigationDone) => { if (navigationDone) { this.currentIndex = index; const url = this.router.routerState.snapshot.url.split('?')[0]; if (url !== navData.url) { this.navigationService.removeLastItem(); } } }); } } } moveInFormLayoutManager(index) { this._form.setUrlParamsAndReload(this.navigationData[index]); } getRouteOfSelectedRow(item) { const route = []; if (Util.isObject(item)) { this._form.keysArray.forEach(key => { if (Util.isDefined(item[key])) { route.push(item[key]); } }); } return route; } showNavigation() { return (Util.isDefined(this.queryConf) && Util.isDefined(this.queryConf.totalRecordsNumber)) ? this.queryConf.totalRecordsNumber > 1 : this.navigationData.length > 1; } set currentIndex(arg) { this._currentIndex = arg; } get currentIndex() { return this._currentIndex; } getRecordIndex() { let index = this.currentIndex + 1; if (this.queryConf) { index += this.queryConf.queryRecordOffset; } return index; } getTotalRecordsNumber() { if (this.queryConf && this.queryConf.totalRecordsNumber) { return this.queryConf.totalRecordsNumber; } return this.navigationData.length; } } OFormNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormNavigationComponent, deps: [{ token: i0.Injector }, { token: forwardRef(() => OFormBase) }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); OFormNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OFormNavigationComponent, selector: "o-form-navigation", host: { properties: { "class.o-form-navigation": "true" } }, providers: [ OntimizeServiceProvider ], ngImport: i0, template: "<ng-container *ngIf=\"showNavigation()\">\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isFirst()\" (click)=\"first()\">\n <mat-icon aria-label=\"First\" layout-padding svgIcon=\"ontimize:first_page\"></mat-icon>\n </button>\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isFirst()\" (click)=\"previous()\">\n <mat-icon aria-label=\"Previous\" layout-padding svgIcon=\"ontimize:keyboard_arrow_left\"></mat-icon>\n </button>\n <span layout-padding>{{ getRecordIndex() }} / {{ getTotalRecordsNumber() }}</span>\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isLast()\" (click)=\"next()\">\n <mat-icon aria-label=\"Next\" layout-padding svgIcon=\"ontimize:keyboard_arrow_right\"></mat-icon>\n </button>\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isLast()\" (click)=\"last()\">\n <mat-icon aria-label=\"Last\" layout-padding svgIcon=\"ontimize:last_page\"></mat-icon>\n </button>\n</ng-container>", styles: [".o-form-navigation .mat-icon{cursor:pointer}.o-form-navigation span{cursor:default}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormNavigationComponent, decorators: [{ type: Component, args: [{ selector: 'o-form-navigation', encapsulation: ViewEncapsulation.None, host: { '[class.o-form-navigation]': 'true' }, providers: [ OntimizeServiceProvider ], template: "<ng-container *ngIf=\"showNavigation()\">\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isFirst()\" (click)=\"first()\">\n <mat-icon aria-label=\"First\" layout-padding svgIcon=\"ontimize:first_page\"></mat-icon>\n </button>\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isFirst()\" (click)=\"previous()\">\n <mat-icon aria-label=\"Previous\" layout-padding svgIcon=\"ontimize:keyboard_arrow_left\"></mat-icon>\n </button>\n <span layout-padding>{{ getRecordIndex() }} / {{ getTotalRecordsNumber() }}</span>\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isLast()\" (click)=\"next()\">\n <mat-icon aria-label=\"Next\" layout-padding svgIcon=\"ontimize:keyboard_arrow_right\"></mat-icon>\n </button>\n <button mat-icon-button class=\"o-form-toolbar-button\" [disabled]=\"isLast()\" (click)=\"last()\">\n <mat-icon aria-label=\"Last\" layout-padding svgIcon=\"ontimize:last_page\"></mat-icon>\n </button>\n</ng-container>", styles: [".o-form-navigation .mat-icon{cursor:pointer}.o-form-navigation span{cursor:default}\n"] }] }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i5.OFormBase, decorators: [{ type: Inject, args: [forwardRef(() => OFormBase)] }] }, { type: i1.Router }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLW5hdmlnYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9uYXZpZ2F0aW9uL28tZm9ybS1uYXZpZ2F0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vbmF2aWdhdGlvbi9vLWZvcm0tbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFtQixpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBTTNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFOUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7O0FBMEJ6RCxNQUFNLE9BQU8sd0JBQXdCO0lBYW5DLFlBQ1ksUUFBa0IsRUFDaUIsS0FBZ0IsRUFDckQsTUFBYztRQUZaLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDaUIsVUFBSyxHQUFMLEtBQUssQ0FBVztRQUNyRCxXQUFNLEdBQU4s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LGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztTQUMzQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtZQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7U0FDMUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO0lBQ3BDLENBQUM7O3NIQWhTVSx3QkFBd0IsMENBZXpCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7MEdBZjFCLHdCQUF3Qix5R0FKeEI7UUFDVCx1QkFBdUI7S0FDeEIsMEJDeENILHcvQkFjZTs0RkQ0QkYsd0JBQXdCO2tCQVpwQyxTQUFTOytCQUNFLG1CQUFtQixpQkFHZCxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLDJCQUEyQixFQUFFLE1BQU07cUJBQ3BDLGFBQ1U7d0JBQ1QsdUJBQXVCO3FCQUN4Qjs7MEJBaUJFLE1BQU07MkJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBUeXBlLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9Gb3JtTGF5b3V0TWFuYWdlckJhc2UgfSBmcm9tICcuLi8uLi8uLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L28tZm9ybS1sYXlvdXQtbWFuYWdlci1iYXNlLmNsYXNzJztcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFzZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmFjdG9yaWVzJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlLCBPTmF2aWdhdGlvbkl0ZW0gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvb250aW1pemUvb250aW1pemUuc2VydmljZSc7XG5pbXBvcnQgeyBPUXVlcnlQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9xdWVyeS1wYXJhbXMudHlwZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUJhc2UgfSBmcm9tICcuLi9vLWZvcm0tYmFzZS5jbGFzcyc7XG5pbXBvcnQgeyBPQ29uZmlndXJlU2VydmljZUFyZ3MgfSBmcm9tICcuLy4uLy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1zZXJ2aWNlLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBPRm9ybU5hdmlnYXRpb25DbGFzcyB9IGZyb20gJy4vby1mb3JtLm5hdmlnYXRpb24uY2xhc3MnO1xuaW1wb3J0IHsgRmFjdG9yeVV0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlsL2ZhY3RvcnkudXRpbCc7XG5cblxuZXhwb3J0IHR5cGUgUXVlcnlDb25maWd1cmF0aW9uID0ge1xuICBzZXJ2aWNlVHlwZTogc3RyaW5nO1xuICBxdWVyeUFyZ3VtZW50czogT1F1ZXJ5UGFyYW1zO1xuICBlbnRpdHk6IHN0cmluZztcbiAgc2VydmljZTogc3RyaW5nO1xuICBxdWVyeU1ldGhvZDogc3RyaW5nO1xuICB0b3RhbFJlY29yZHNOdW1iZXI6IG51bWJlcjtcbiAgcXVlcnlSb3dzOiBudW1iZXI7XG4gIHF1ZXJ5UmVjb3JkT2Zmc2V0OiBudW1iZXI7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLWZvcm0tbmF2aWdhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLWZvcm0tbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tZm9ybS1uYXZpZ2F0aW9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm8tZm9ybS1uYXZpZ2F0aW9uXSc6ICd0cnVlJ1xuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICBPbnRpbWl6ZVNlcnZpY2VQcm92aWRlclxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE9Gb3JtTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIG5hdmlnYXRpb25EYXRhOiBBcnJheTxhbnk+ID0gW107XG4gIHByaXZhdGUgX2N1cnJlbnRJbmRleCA9IDA7XG5cbiAgcHJvdGVjdGVkIGZvcm1OYXZpZ2F0aW9uOiBPRm9ybU5hdmlnYXRpb25DbGFzcztcbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZTtcbiAgcHJvdGVjdGVkIGZvcm1MYXlvdXRNYW5hZ2VyOiBPRm9ybUxheW91dE1hbmFnZXJCYXNlO1xuXG4gIHByb3RlY3RlZCBxdWVyeVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgZGF0YVNlcnZpY2U6IEJhc2VTZXJ2aWNlPFNlcnZpY2VSZXNwb25zZT47XG4gIHByb3RlY3RlZCBxdWVyeUNvbmY6IFF1ZXJ5Q29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBPRm9ybUJhc2UpKSBwcml2YXRlIF9mb3JtOiBPRm9ybUJhc2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uID0gdGhpcy5fZm9ybS5nZXRGb3JtTmF2aWdhdGlvbigpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxOYXZpZ2F0aW9uU2VydmljZT4oTmF2aWdhdGlvblNlcnZpY2UgYXMgVHlwZTxOYXZpZ2F0aW9uU2VydmljZT4pO1xuXG4gICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlciA9IHRoaXMuX2Zvcm0uZ2V0Rm9ybU1hbmFnZXIoKTtcblxuICAgIGxldCBuYXZEYXRhO1xuICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyICYmIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuYWxsb3dOYXZpZ2F0aW9uKCkpIHtcbiAgICAgIG5hdkRhdGEgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldExhc3RJdGVtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdkRhdGEgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldFByZXZpb3VzUm91dGVEYXRhKCk7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChuYXZEYXRhKSkge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uRGF0YSA9IG5hdkRhdGEua2V5c1ZhbHVlcyB8fCBbXTtcbiAgICAgIHRoaXMucXVlcnlDb25mID0gbmF2RGF0YS5xdWVyeUNvbmZpZ3VyYXRpb247XG4gICAgfVxuICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5nZXRDdXJyZW50SW5kZXgoKTtcbiAgICB0aGlzLmNvbmZpZ3VyZVNlcnZpY2UoKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZVNlcnZpY2UoKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5Q29uZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmVTZXJ2aWNlOiBPQ29uZmlndXJlU2VydmljZUFyZ3MgPSB7XG4gICAgICBpbmplY3RvcjogdGhpcy5pbmplY3RvcixcbiAgICAgIGJhc2VTZXJ2aWNlOiBPbnRpbWl6ZVNlcnZpY2UsXG4gICAgICBlbnRpdHk6IHRoaXMucXVlcnlDb25mLmVudGl0eSxcbiAgICAgIHNlcnZpY2U6IHRoaXMucXVlcnlDb25mLnNlcnZpY2UsXG4gICAgICBzZXJ2aWNlVHlwZTogdGhpcy5xdWVyeUNvbmYuc2VydmljZVR5cGVcbiAgICB9O1xuICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBGYWN0b3J5VXRpbC5jb25maWd1cmVTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2UpO1xuICB9XG5cbiAgZ2V0UXVlcnlBcmd1bWVudHMob2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogT1F1ZXJ5UGFyYW1zIHtcbiAgICBjb25zdCBxdWVyeUFyZ3VtZW50cyA9IHsgLi4udGhpcy5xdWVyeUNvbmYucXVlcnlBcmd1bWVudHMgfTtcbiAgICBxdWVyeUFyZ3VtZW50cy5jb2x1bW5zID0gdGhpcy5nZXRLZXlzQXJyYXkoKTtcbiAgICBxdWVyeUFyZ3VtZW50cy5vdnJyQXJncy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgcXVlcnlBcmd1bWVudHMub3ZyckFyZ3MubGVuZ3RoID0gbGVuZ3RoIHx8IHRoaXMucXVlcnlDb25mLnF1ZXJ5Um93cztcbiAgICByZXR1cm4gcXVlcnlBcmd1bWVudHM7XG4gIH1cblxuICBwcm90ZWN0ZWQgcXVlcnlOYXZpZ2F0aW9uRGF0YShvZmZzZXQ6IG51bWJlciwgbGVuZ3RoPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5Q29uZikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgSW52YWxpZCBxdWVyeSBwYXJhbWV0ZXJzOiAke3RoaXMucXVlcnlDb25mLnF1ZXJ5TWV0aG9kfWApKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlBcmdzID0gdGhpcy5nZXRRdWVyeUFyZ3VtZW50cyhvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlTWV0aG9kID0gdGhpcy5kYXRhU2VydmljZVt0aGlzLnF1ZXJ5Q29uZi5xdWVyeU1ldGhvZF07XG5cbiAgICBpZiAodHlwZW9mIHNlcnZpY2VNZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEludmFsaWQgcXVlcnkgbWV0aG9kOiAke3RoaXMucXVlcnlDb25mLnF1ZXJ5TWV0aG9kfWApKTtcbiAgICB9XG5cbiAgICBjb25zdCBhZGFwdGVkUGFyYW1zID0gdGhpcy5kYXRhU2VydmljZS5yZXF1ZXN0QXJndW1lbnRBZGFwdGVyLnBhcnNlUXVlcnlQYXJhbWV0ZXJzKHF1ZXJ5QXJncyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkgPT4ge1xuICAgICAgdGhpcy5xdWVyeVN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeUNvbmYucXVlcnlNZXRob2RdKC4uLmFkYXB0ZWRQYXJhbXMpXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkRhdGEgPSByZXMuZGF0YTtcbiAgICAgICAgICAgICAgdGhpcy5xdWVyeUNvbmYucXVlcnlSZWNvcmRPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogZXJyID0+IHJlamVjdChuZXcgRXJyb3IoZXJyKSlcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5xdWVyeVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5xdWVyeVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRLZXlzQXJyYXkoKTogc3RyaW5nW10ge1xuICAgIC8vIGdldHRpbmcgYXZhaWxhYmxlIG5hdmlnYXRpb25EYXRhIGtleXNcbiAgICBjb25zdCBuYXZEYXRhID0gdGhpcy5uYXZpZ2F0aW9uRGF0YSA/ICh0aGlzLm5hdmlnYXRpb25EYXRhWzBdIHx8IHt9KSA6IHt9O1xuICAgIGNvbnN0IGtleXNBcnJheSA9IFtdO1xuICAgIHRoaXMuX2Zvcm0ua2V5c0FycmF5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChuYXZEYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAga2V5c0FycmF5LnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ga2V5c0FycmF5O1xuICB9XG5cbiAgZ2V0Q3VycmVudEluZGV4KCk6IG51bWJlciB7XG4gICAgY29uc3Qga2V5c0FycmF5ID0gdGhpcy5nZXRLZXlzQXJyYXkoKTtcbiAgICAvLyBjdXJyZW50IHVybCBrZXlzIG9iamVjdFxuICAgIGNvbnN0IGN1cnJlbnRLZXlzID0ge307XG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdldFVybFBhcmFtcygpO1xuICAgIGtleXNBcnJheS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjdXJyZW50S2V5c1trZXldID0gY3VycmVudEl0ZW1ba2V5XTtcbiAgICB9KTtcbiAgICBjb25zdCBpbmRleDogbnVtYmVyID0gKHRoaXMubmF2aWdhdGlvbkRhdGEgfHwgW10pLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zdCBpdGVtS2V5cyA9IHt9O1xuICAgICAga2V5c0FycmF5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaXRlbUtleXNba2V5XSA9IGl0ZW1ba2V5XTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFV0aWwuaXNFcXVpdmFsZW50KGl0ZW1LZXlzLCBjdXJyZW50S2V5cyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGluZGV4ID49IDAgPyBpbmRleCA6IDA7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5uYXZpZ2F0aW9uRGF0YS5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleCArIDE7XG4gICAgaWYgKHRvdGFsID4gaW5kZXgpIHtcbiAgICAgIHRoaXMubW92ZShpbmRleCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnF1ZXJ5Q29uZikge1xuICAgICAgY29uc3Qgb2Zmc2V0OiBudW1iZXIgPSAodGhpcy5xdWVyeUNvbmYucXVlcnlSZWNvcmRPZmZzZXQgfHwgMCkgKyB0aGlzLnF1ZXJ5Q29uZi5xdWVyeVJvd3M7XG4gICAgICB0aGlzLnF1ZXJ5TmF2aWdhdGlvbkRhdGEob2Zmc2V0KS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5tb3ZlKDApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2Zvcm0tdG9vbGJhci0+bmV4dCgpOiB0b3RhbCA+IGluZGV4Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJldmlvdXMoKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleCAtIDE7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMubW92ZShpbmRleCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnF1ZXJ5Q29uZikge1xuICAgICAgY29uc3Qgb2Zmc2V0OiBudW1iZXIgPSB0aGlzLnF1ZXJ5Q29uZi5xdWVyeVJlY29yZE9mZnNldCAtIHRoaXMucXVlcnlDb25mLnF1ZXJ5Um93cztcbiAgICAgIHRoaXMucXVlcnlOYXZpZ2F0aW9uRGF0YShvZmZzZXQpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLm1vdmUodGhpcy5uYXZpZ2F0aW9uRGF0YS5sZW5ndGggLSAxKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmb3JtLXRvb2xiYXItPm5leHQoKTogaW5kZXggPCAwJyk7XG4gICAgfVxuICB9XG5cbiAgZmlyc3QoKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5Q29uZiB8fCB0aGlzLnF1ZXJ5Q29uZi5xdWVyeVJlY29yZE9mZnNldCA9PT0gMCkge1xuICAgICAgdGhpcy5tb3ZlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5TmF2aWdhdGlvbkRhdGEoMCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMubW92ZSgwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGxhc3QoKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5Q29uZiB8fCB0aGlzLmlzTGFzdCgpKSB7XG4gICAgICB0aGlzLm1vdmVUb0xhc3QoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnF1ZXJ5Q29uZi50b3RhbFJlY29yZHNOdW1iZXIgLSB0aGlzLnF1ZXJ5Q29uZi5xdWVyeVJvd3M7XG5cbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IHRoaXMucXVlcnlDb25mLnF1ZXJ5UmVjb3JkT2Zmc2V0KSB7XG4gICAgICAvLyBpZiB0aGUgb2Zmc2V0IGlzIG5lZ2F0aXZlIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IG9mZnNldCwgaXQgbWVhbnMgd2UgYXJlIGFscmVhZHkgYXQgdGhlIGxhc3QgcGFnZVxuICAgICAgdGhpcy5tb3ZlVG9MYXN0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5xdWVyeU5hdmlnYXRpb25EYXRhKG9mZnNldCwgdGhpcy5xdWVyeUNvbmYucXVlcnlSb3dzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMubW92ZVRvTGFzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlVG9MYXN0KCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5uYXZpZ2F0aW9uRGF0YS5sZW5ndGggLSAxO1xuICAgIHRoaXMubW92ZShpbmRleCk7XG4gIH1cblxuICBpc0ZpcnN0KCkge1xuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSB0aGlzLmN1cnJlbnRJbmRleCA9PT0gMDtcbiAgICBpZiAocmVzdWx0ICYmIHRoaXMucXVlcnlDb25mKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnF1ZXJ5Q29uZi5xdWVyeVJlY29yZE9mZnNldCA9PT0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlzTGFzdCgpIHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gdGhpcy5jdXJyZW50SW5kZXggPT09ICh0aGlzLm5hdmlnYXRpb25EYXRhLmxlbmd0aCAtIDEpO1xuICAgIGlmIChyZXN1bHQgJiYgdGhpcy5xdWVyeUNvbmYpIHtcbiAgICAgIHJlc3VsdCA9ICh0aGlzLnF1ZXJ5Q29uZi5xdWVyeVJlY29yZE9mZnNldCArIHRoaXMucXVlcnlDb25mLnF1ZXJ5Um93cylcbiAgICAgICAgPj0gdGhpcy5xdWVyeUNvbmYudG90YWxSZWNvcmRzTnVtYmVyO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbW92ZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fZm9ybS5zaG93Q29uZmlybURpc2NhcmRDaGFuZ2VzKCkudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlciAmJiB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLmFsbG93TmF2aWdhdGlvbigpKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlSW5Gb3JtTGF5b3V0TWFuYWdlcihpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tb3ZlV2l0aG91dE1hbmFnZXIoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVXaXRob3V0TWFuYWdlcihpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLmdldFJvdXRlT2ZTZWxlY3RlZFJvdyh0aGlzLm5hdmlnYXRpb25EYXRhW2luZGV4XSk7XG4gICAgaWYgKHJvdXRlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5hdkRhdGE6IE9OYXZpZ2F0aW9uSXRlbSA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TGFzdEl0ZW0oKTtcbiAgICAgIGlmIChuYXZEYXRhKSB7XG4gICAgICAgIHRoaXMuX2Zvcm0uY2FuRGlzY2FyZENoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHt9O1xuICAgICAgICBleHRyYXNbQ29kZXMuUVVFUllfUEFSQU1TXSA9IENvZGVzLmdldElzRGV0YWlsT2JqZWN0KCk7XG5cbiAgICAgICAgY29uc3QgdXJsQXJyYXkgPSBuYXZEYXRhLnVybC5zcGxpdChDb2Rlcy5ST1VURV9TRVBBUkFUT1IpO1xuICAgICAgICBjb25zdCB1cmwgPSB1cmxBcnJheS5zcGxpY2UoMCwgdXJsQXJyYXkubGVuZ3RoIC0gcm91dGUubGVuZ3RoKS5qb2luKENvZGVzLlJPVVRFX1NFUEFSQVRPUik7XG4gICAgICAgIHJvdXRlLnVuc2hpZnQodXJsKTtcblxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShyb3V0ZSwgZXh0cmFzKS50aGVuKChuYXZpZ2F0aW9uRG9uZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChuYXZpZ2F0aW9uRG9uZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybC5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgICAgaWYgKHVybCAhPT0gbmF2RGF0YS51cmwpIHtcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZW1vdmVMYXN0SXRlbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlSW5Gb3JtTGF5b3V0TWFuYWdlcihpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fZm9ybS5zZXRVcmxQYXJhbXNBbmRSZWxvYWQodGhpcy5uYXZpZ2F0aW9uRGF0YVtpbmRleF0pO1xuICB9XG5cbiAgZ2V0Um91dGVPZlNlbGVjdGVkUm93KGl0ZW06IGFueSkge1xuICAgIGNvbnN0IHJvdXRlID0gW107XG4gICAgaWYgKFV0aWwuaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgIHRoaXMuX2Zvcm0ua2V5c0FycmF5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGl0ZW1ba2V5XSkpIHtcbiAgICAgICAgICByb3V0ZS5wdXNoKGl0ZW1ba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm91dGU7XG4gIH1cblxuICBzaG93TmF2aWdhdGlvbigpIHtcbiAgICAvKlxuICAgICAgcXVlcnlDb25mIGlzIG9ubHkgZGVmaW5lZCB3aGVuIHRoZSBzZXJ2aWNlIGlzIHBhZ2VhYmxlXG4gICAgKi9cbiAgICByZXR1cm4gKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVlcnlDb25mKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnF1ZXJ5Q29uZi50b3RhbFJlY29yZHNOdW1iZXIpKSA/IHRoaXMucXVlcnlDb25mLnRvdGFsUmVjb3Jkc051bWJlciA+IDEgOiB0aGlzLm5hdmlnYXRpb25EYXRhLmxlbmd0aCA+IDFcbiAgfVxuXG4gIHNldCBjdXJyZW50SW5kZXgoYXJnOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jdXJyZW50SW5kZXggPSBhcmc7XG4gIH1cblxuICBnZXQgY3VycmVudEluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRJbmRleDtcbiAgfVxuXG4gIGdldFJlY29yZEluZGV4KCk6IG51bWJlciB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXggKyAxO1xuICAgIGlmICh0aGlzLnF1ZXJ5Q29uZikge1xuICAgICAgaW5kZXggKz0gdGhpcy5xdWVyeUNvbmYucXVlcnlSZWNvcmRPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGdldFRvdGFsUmVjb3Jkc051bWJlcigpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnF1ZXJ5Q29uZiAmJiB0aGlzLnF1ZXJ5Q29uZi50b3RhbFJlY29yZHNOdW1iZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5Q29uZi50b3RhbFJlY29yZHNOdW1iZXI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25EYXRhLmxlbmd0aDtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dOYXZpZ2F0aW9uKClcIj5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJvLWZvcm0tdG9vbGJhci1idXR0b25cIiBbZGlzYWJsZWRdPVwiaXNGaXJzdCgpXCIgKGNsaWNrKT1cImZpcnN0KClcIj5cbiAgICA8bWF0LWljb24gYXJpYS1sYWJlbD1cIkZpcnN0XCIgbGF5b3V0LXBhZGRpbmcgc3ZnSWNvbj1cIm9udGltaXplOmZpcnN0X3BhZ2VcIj48L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJvLWZvcm0tdG9vbGJhci1idXR0b25cIiBbZGlzYWJsZWRdPVwiaXNGaXJzdCgpXCIgKGNsaWNrKT1cInByZXZpb3VzKClcIj5cbiAgICA8bWF0LWljb24gYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgbGF5b3V0LXBhZGRpbmcgc3ZnSWNvbj1cIm9udGltaXplOmtleWJvYXJkX2Fycm93X2xlZnRcIj48L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPHNwYW4gbGF5b3V0LXBhZGRpbmc+e3sgZ2V0UmVjb3JkSW5kZXgoKSB9fSAvIHt7IGdldFRvdGFsUmVjb3Jkc051bWJlcigpIH19PC9zcGFuPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cIm8tZm9ybS10b29sYmFyLWJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0xhc3QoKVwiIChjbGljayk9XCJuZXh0KClcIj5cbiAgICA8bWF0LWljb24gYXJpYS1sYWJlbD1cIk5leHRcIiBsYXlvdXQtcGFkZGluZyBzdmdJY29uPVwib250aW1pemU6a2V5Ym9hcmRfYXJyb3dfcmlnaHRcIj48L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJvLWZvcm0tdG9vbGJhci1idXR0b25cIiBbZGlzYWJsZWRdPVwiaXNMYXN0KClcIiAoY2xpY2spPVwibGFzdCgpXCI+XG4gICAgPG1hdC1pY29uIGFyaWEtbGFiZWw9XCJMYXN0XCIgbGF5b3V0LXBhZGRpbmcgc3ZnSWNvbj1cIm9udGltaXplOmxhc3RfcGFnZVwiPjwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuPC9uZy1jb250YWluZXI+Il19