UNPKG

ontimize-web-ngx

Version:
368 lines 55.1 kB
import { __decorate, __metadata } from "tslib"; import { Directive, ElementRef, EventEmitter, Injector, NgZone, ViewChild } from '@angular/core'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { BooleanInputConverter } from '../../decorators/input-converter'; import { OErrorDialogManager } from '../../services/o-error-dialog-manager.service'; import { OntimizeService } from '../../services/ontimize/ontimize.service'; import { Codes } from '../../util/codes'; import { ServiceUtils } from '../../util/service.utils'; import { Util } from '../../util/util'; import { OContextMenuComponent } from '../contextmenu/o-context-menu.component'; import { OFormComponent } from '../form/o-form.component'; import { OFormDataComponent } from '../o-form-data-component.class'; import { FactoryUtil } from '../../util/factory.util'; import * as i0 from "@angular/core"; import * as i1 from "../form/o-form.component"; export const DEFAULT_INPUTS_O_FORM_SERVICE_COMPONENT = [ 'staticData: static-data', 'entity', 'service', 'columns', 'valueColumn: value-column', 'valueColumnType: value-column-type', 'parentKeys: parent-keys', 'visibleColumns: visible-columns', 'descriptionColumns: description-columns', 'separator', 'queryOnInit: query-on-init', 'queryOnBind: query-on-bind', 'queryOnEvent: query-on-event', 'queryMethod: query-method', 'serviceType: service-type', 'queryWithNullParentKeys: query-with-null-parent-keys', 'setValueOnValueChange: set-value-on-value-change', 'queryFallbackFunction: query-fallback-function', 'translate', 'sort', 'configureServiceArgs: configure-service-args' ]; export const DEFAULT_OUTPUTS_O_FORM_SERVICE_COMPONENT = [ 'onSetValueOnValueChange', 'onDataLoaded' ]; export class OFormServiceComponent extends OFormDataComponent { set oContextMenuRef(value) { this.oContextMenu = value; } constructor(form, elRef, injector) { super(form, elRef, injector); this.valueColumnType = Codes.TYPE_INT; this.separator = Codes.SPACE_SEPARATOR; this.queryOnInit = true; this.queryOnBind = false; this.queryMethod = Codes.QUERY_METHOD; this.queryWithNullParentKeys = false; this.translate = false; this.onSetValueOnValueChange = new EventEmitter(); this.onDataLoaded = new EventEmitter(); this.dataArray = []; this.colArray = []; this.visibleColArray = []; this.descriptionColArray = []; this.loading = false; this.cacheQueried = false; this._pKeysEquiv = {}; this._setValueOnValueChangeEquiv = {}; this.subscriptionDataLoad = new Subscription(); this.delayLoad = 250; this.loadingSubject = new BehaviorSubject(false); this.form = form; this.elRef = elRef; this.oErrorDialogManager = injector.get(OErrorDialogManager); } initialize() { super.initialize(); this.subscriptionDataLoad.add(this.onDataLoaded.subscribe(() => this.syncDataIndex(false))); this.cacheQueried = false; this.colArray = Util.parseArray(this.columns, true); this.visibleColArray = Util.parseArray(this.visibleColumns, true); if (Util.isArrayEmpty(this.visibleColArray)) { this.visibleColumns = this.columns; this.visibleColArray = this.colArray; } this.descriptionColArray = Util.parseArray(this.descriptionColumns); if (Util.isArrayEmpty(this.descriptionColArray)) { this.descriptionColArray = this.visibleColArray; } const pkArray = Util.parseArray(this.parentKeys); this._pKeysEquiv = Util.parseParentKeysEquivalences(pkArray); const setValueSetArray = Util.parseArray(this.setValueOnValueChange); this._setValueOnValueChangeEquiv = Util.parseParentKeysEquivalences(setValueSetArray); if (this.form && this.queryOnBind) { this._formDataSubcribe = this.form.onDataLoaded.subscribe(() => this.queryData()); } if (this.staticData) { this.queryOnBind = false; this.queryOnInit = false; this.setDataArray(this.staticData); } else { this.configureService(); } if (this.queryOnEvent !== undefined && this.queryOnEvent.subscribe !== undefined) { this.queryOnEventSubscription = this.queryOnEvent.subscribe((value) => { if (Util.isDefined(value) || this.queryWithNullParentKeys) { this.queryData(); } }); } if (typeof this.queryFallbackFunction !== 'function') { this.queryFallbackFunction = undefined; } } destroy() { super.destroy(); if (this._formDataSubcribe) { this._formDataSubcribe.unsubscribe(); } if (this.queryOnEventSubscription) { this.queryOnEventSubscription.unsubscribe(); } if (this.loaderSubscription) { this.loaderSubscription.unsubscribe(); } if (this.subscriptionDataLoad) { this.subscriptionDataLoad.unsubscribe(); } } emitOnValueChange(type, newValue, oldValue) { super.emitOnValueChange(type, newValue, oldValue); const record = this.getSelectedRecord(); this.onSetValueOnValueChange.emit(record); const setValueSetKeys = Object.keys(this._setValueOnValueChangeEquiv); if (setValueSetKeys.length) { const formComponents = this.form.getComponents(); setValueSetKeys.forEach(key => { const comp = formComponents[this._setValueOnValueChangeEquiv[key]]; if (Util.isDefined(comp)) { comp.setValue(Util.isDefined(record) ? record[key] : undefined); } }); } } configureService() { let configureServiceArgs = { injector: this.injector, baseService: OntimizeService, entity: this.entity, service: this.service, serviceType: this.serviceType }; if (Util.isDefined(this.configureServiceArgs)) { configureServiceArgs = { ...configureServiceArgs, ...this.configureServiceArgs }; } this.dataService = FactoryUtil.configureService(configureServiceArgs); } getAttributesValuesToQuery(columns) { const result = Util.isDefined(columns) ? columns : this.colArray; if (result.indexOf(this.valueColumn) === -1) { result.push(this.valueColumn); } return result; } queryData(filter) { if (!this.dataService || !(this.queryMethod in this.dataService) || !this.entity) { console.warn('Service not properly configured! aborting query'); return; } filter = Object.assign(filter || {}, ServiceUtils.getParentKeysFromForm(this._pKeysEquiv, this.form)); if (!ServiceUtils.filterContainsAllParentKeys(filter, this._pKeysEquiv) && !this.queryWithNullParentKeys) { this.setDataArray([]); } else { if (this.querySubscription) { this.querySubscription.unsubscribe(); } if (this.loaderSubscription) { this.loaderSubscription.unsubscribe(); } this.loaderSubscription = this.load(); this.queryArguments = this.getQueryArguments(filter); this.querySubscription = this.dataService[this.queryMethod](...this.dataService.requestArgumentAdapter.parseQueryParameters(this.queryArguments)) .subscribe((resp) => { if (resp.isSuccessful()) { this.cacheQueried = true; this.setDataArray(resp.data); } this.loadingSubject.next(false); this.loaderSubscription.unsubscribe(); }, err => { console.error(err); this.loadingSubject.next(false); this.loaderSubscription.unsubscribe(); if (Util.isDefined(this.queryFallbackFunction)) { this.queryFallbackFunction(err); } else { this.oErrorDialogManager.openErrorDialog(err); console.error(err); } }); } } getQueryArguments(filter, ovrrArgs = {}) { const compFilter = filter; const queryCols = this.getAttributesValuesToQuery(); const sqlTypes = ovrrArgs?.sqltypes ?? this.form?.getAttributesSQLTypes() ?? {}; return { filter: compFilter, columns: queryCols, entity: this.entity, sqlTypes: sqlTypes }; } getDataArray() { return this.dataArray; } setDataArray(data) { if (Util.isArray(data)) { this.dataArray = this.sortData(data); } else if (Util.isObject(data) && Object.keys(data).length > 0) { this.dataArray = [data]; } else { console.warn('Component has received not supported service data. Supported data are Array or not empty Object'); this.dataArray = []; } this.onDataLoaded.emit(this.dataArray); } syncDataIndex(queryIfNotFound = true) { this._currentIndex = undefined; if (Util.isDefined(this.value) && !this.isEmpty() && this.dataArray) { this.dataArray.forEach((item, index) => { if (this.value.value instanceof Array) { this._currentIndex = []; this.value.value.forEach((itemValue, indexValue) => { if (item[this.valueColumn] === itemValue) { this._currentIndex[this._currentIndex.length] = indexValue; } }); } else if (item[this.valueColumn] === this.value.value) { this._currentIndex = index; } if (item[this.valueColumn] === this.value.value) { this._currentIndex = index; } }); if (this._currentIndex === undefined) { if (queryIfNotFound && this.queryOnBind && this.dataArray && this.dataArray.length === 0 && !this.cacheQueried) { this.queryData(); } else if (!queryIfNotFound && this.dataArray && this.dataArray.length > 0) { console.warn('It was set the value ' + this.value.value + ' to the component ' + this.oattr + ' but this value does not exist in the data array and this value will be set to undefined'); this.setValue(void 0); } } } } parseByValueColumnType(val) { let value = val; if (this.valueColumnType === Codes.TYPE_INT) { const parsed = parseInt(value, 10); if (!isNaN(parsed)) { value = parsed; } } return value; } setValue(val, options) { const value = this.parseByValueColumnType(val); super.setValue(value, options); } setData(val) { const value = this.parseByValueColumnType(val); super.setData(value); } getSelectedRecord() { let result; const selectedValue = this.getValue(); if (Util.isDefined(selectedValue)) { result = this.getDataArray().find(item => item[this.valueColumn] === selectedValue); } return result; } load() { const zone = this.injector.get(NgZone); const loadObservable = new Observable(observer => { const timer = window.setTimeout(() => { observer.next(true); }, this.delayLoad); return () => { window.clearTimeout(timer); zone.run(() => { observer.next(false); this.loading = false; }); }; }); const subscription = loadObservable.subscribe(val => { zone.run(() => { this.loading = val; this.loadingSubject.next(val); }); }); return subscription; } onFormControlChange(value) { if (this.oldValue === value) { return; } super.onFormControlChange(value); } getOptionDescriptionValue(item = {}) { let descTxt = ''; if (this.descriptionColArray && this.descriptionColArray.length > 0) { this.descriptionColArray.forEach((col, index) => { let txt = item[col]; if (Util.isDefined(txt)) { if (this.translate && this.translateService) { txt = this.translateService.get(txt); } descTxt += txt; } if (index < this.descriptionColArray.length - 1) { descTxt += this.separator; } }); } return descTxt.trim(); } sortData(data) { if (!Util.isDefined(this.sort)) { return data; } const sortDirection = this.sort.toLowerCase(); if (sortDirection !== Codes.ASC_SORT && sortDirection !== Codes.DESC_SORT) { return data; } const sortedData = data.sort((a, b) => Util.compare(this.getOptionDescriptionValue(a), this.getOptionDescriptionValue(b))); if (sortDirection === Codes.DESC_SORT) { sortedData.reverse(); } return sortedData; } refresh() { this.queryData(); } } OFormServiceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormServiceComponent, deps: [{ token: i1.OFormComponent }, { token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); OFormServiceComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: OFormServiceComponent, inputs: { staticData: ["static-data", "staticData"], entity: "entity", service: "service", columns: "columns", valueColumn: ["value-column", "valueColumn"], valueColumnType: ["value-column-type", "valueColumnType"], parentKeys: ["parent-keys", "parentKeys"], visibleColumns: ["visible-columns", "visibleColumns"], descriptionColumns: ["description-columns", "descriptionColumns"], separator: "separator", queryOnInit: ["query-on-init", "queryOnInit"], queryOnBind: ["query-on-bind", "queryOnBind"], queryOnEvent: ["query-on-event", "queryOnEvent"], queryMethod: ["query-method", "queryMethod"], serviceType: ["service-type", "serviceType"], queryWithNullParentKeys: ["query-with-null-parent-keys", "queryWithNullParentKeys"], setValueOnValueChange: ["set-value-on-value-change", "setValueOnValueChange"], queryFallbackFunction: ["query-fallback-function", "queryFallbackFunction"], translate: "translate", sort: "sort", configureServiceArgs: ["configure-service-args", "configureServiceArgs"] }, outputs: { onSetValueOnValueChange: "onSetValueOnValueChange", onDataLoaded: "onDataLoaded" }, viewQueries: [{ propertyName: "oContextMenuRef", first: true, predicate: OContextMenuComponent, descendants: true }], usesInheritance: true, ngImport: i0 }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "queryOnInit", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "queryOnBind", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "queryWithNullParentKeys", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormServiceComponent.prototype, "translate", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormServiceComponent, decorators: [{ type: Directive, args: [{ inputs: DEFAULT_INPUTS_O_FORM_SERVICE_COMPONENT, outputs: DEFAULT_OUTPUTS_O_FORM_SERVICE_COMPONENT }] }], ctorParameters: function () { return [{ type: i1.OFormComponent }, { type: i0.ElementRef }, { type: i0.Injector }]; }, propDecorators: { queryOnInit: [], queryOnBind: [], queryWithNullParentKeys: [], translate: [], oContextMenuRef: [{ type: ViewChild, args: [OContextMenuComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvby1mb3JtLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUszRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7QUFFdEQsTUFBTSxDQUFDLE1BQU0sdUNBQXVDLEdBQUc7SUFFckQseUJBQXlCO0lBQ3pCLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULDJCQUEyQjtJQUMzQixvQ0FB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QyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE5nWm9uZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9FcnJvckRpYWxvZ01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vLWVycm9yLWRpYWxvZy1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb250aW1pemUvb250aW1pemUuc2VydmljZSc7XG5pbXBvcnQgeyBPQ29uZmlndXJlU2VydmljZUFyZ3MgfSBmcm9tICcuLi8uLi90eXBlcy9jb25maWd1cmUtc2VydmljZS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL2Zvcm0tdmFsdWUtb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9RdWVyeURhdGFBcmdzIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktZGF0YS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgT1F1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktcGFyYW1zLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IFNlcnZpY2VVdGlscyB9IGZyb20gJy4uLy4uL3V0aWwvc2VydmljZS51dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9Db250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbnRleHRtZW51L28tY29udGV4dC1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vby1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPRm9ybURhdGFDb21wb25lbnQgfSBmcm9tICcuLi9vLWZvcm0tZGF0YS1jb21wb25lbnQuY2xhc3MnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iYXNlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgRmFjdG9yeVV0aWwgfSBmcm9tICcuLi8uLi91dGlsL2ZhY3RvcnkudXRpbCc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX0ZPUk1fU0VSVklDRV9DT01QT05FTlQgPSBbXG4gIC8vIHN0YXRpYy1kYXRhIFtBcnJheTxhbnk+XSA6IHdheSB0byBwb3B1bGF0ZSB3aXRoIHN0YXRpYyBkYXRhLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3N0YXRpY0RhdGE6IHN0YXRpYy1kYXRhJyxcbiAgJ2VudGl0eScsXG4gICdzZXJ2aWNlJyxcbiAgJ2NvbHVtbnMnLFxuICAndmFsdWVDb2x1bW46IHZhbHVlLWNvbHVtbicsXG4gICd2YWx1ZUNvbHVtblR5cGU6IHZhbHVlLWNvbHVtbi10eXBlJyxcbiAgJ3BhcmVudEtleXM6IHBhcmVudC1rZXlzJyxcbiAgLy8gVmlzaWJsZSBjb2x1bW5zIGludG8gc2VsZWN0aW9uIGRpYWxvZyBmcm9tIHBhcmFtZXRlciAnY29sdW1ucycuIFdpdGggZW1wdHkgcGFyYW1ldGVyIGFsbCBjb2x1bW5zIGFyZSB2aXNpYmxlLlxuICAndmlzaWJsZUNvbHVtbnM6IHZpc2libGUtY29sdW1ucycsXG4gIC8vIFZpc2libGUgY29sdW1ucyBpbiB0ZXh0IGZpZWxkLiBCeSBkZWZhdWx0LCBpdCBpcyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9mIHZpc2libGUgY29sdW1ucy5cbiAgJ2Rlc2NyaXB0aW9uQ29sdW1uczogZGVzY3JpcHRpb24tY29sdW1ucycsXG5cbiAgJ3NlcGFyYXRvcicsXG5cbiAgJ3F1ZXJ5T25Jbml0OiBxdWVyeS1vbi1pbml0JyxcbiAgJ3F1ZXJ5T25CaW5kOiBxdWVyeS1vbi1iaW5kJyxcbiAgJ3F1ZXJ5T25FdmVudDogcXVlcnktb24tZXZlbnQnLFxuXG4gIC8vIHF1ZXJ5LW1ldGhvZCBbc3RyaW5nXTogbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QgdG8gcGVyZm9ybSBxdWVyaWVzLiBEZWZhdWx0OiBxdWVyeS5cbiAgJ3F1ZXJ5TWV0aG9kOiBxdWVyeS1tZXRob2QnLFxuXG4gICdzZXJ2aWNlVHlwZTogc2VydmljZS10eXBlJyxcblxuICAvLyBxdWVyeS13aXRoLW51bGwtcGFyZW50LWtleXMgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gdHJpZ2dlciBxdWVyeSBtZXRob2Qgd2hlbiBwYXJlbnQta2V5cyBmaWx0ZXIgaXMgbnVsbC4gRGVmYXVsdDogZmFsc2VcbiAgJ3F1ZXJ5V2l0aE51bGxQYXJlbnRLZXlzOiBxdWVyeS13aXRoLW51bGwtcGFyZW50LWtleXMnLFxuXG4gIC8vIHNldC12YWx1ZS1vbi12YWx1ZS1jaGFuZ2UgW3N0cmluZ106IEZvcm0gY29tcG9uZW50IGF0dHJpYnV0ZXMgd2hvc2UgdmFsdWUgd2lsbCBiZSBzZXQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50IGNoYW5nZXMgZHVlIHRvIHVzZXIgaW50ZXJhY3Rpb24uIFNlcGFyYXRlZCBieSAnOycuIEFjY2VwdGVkIGZvcm1hdDogYXR0ciB8IGNvbHVtbk5hbWU6YXR0clxuICAnc2V0VmFsdWVPblZhbHVlQ2hhbmdlOiBzZXQtdmFsdWUtb24tdmFsdWUtY2hhbmdlJyxcblxuICAvLyBbZnVuY3Rpb25dOiBmdW5jdGlvbiB0byBleGVjdXRlIG9uIHF1ZXJ5IGVycm9yLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3F1ZXJ5RmFsbGJhY2tGdW5jdGlvbjogcXVlcnktZmFsbGJhY2stZnVuY3Rpb24nLFxuXG4gIC8vICdpbnNlcnRGYWxsYmFja0Z1bmN0aW9uOiBpbnNlcnQtZmFsbGJhY2stZnVuY3Rpb24nLFxuXG4gIC8vICd1cGRhdGVGYWxsYmFja0Z1bmN0aW9uOiB1cGRhdGUtZmFsbGJhY2stZnVuY3Rpb24nLFxuXG4gIC8vICdkZWxldGVGYWxsYmFja0Z1bmN0aW9uOiBkZWxldGUtZmFsbGJhY2stZnVuY3Rpb24nXG5cbiAgJ3RyYW5zbGF0ZScsXG5cbiAgLy8gc29ydCBbc3RyaW5nXTogc29ydGluZyBBU0Mgb3IgREVTQy4gRGVmYXVsdDogbm8gdmFsdWVcbiAgJ3NvcnQnLFxuICAvLyAgY29uZmlndXJlLXNlcnZpY2UtYXJncyBbT0NvbmZpZ3VyZVNlcnZpY2VBcmdzXTogQWxsb3dzIGNvbmZpZ3VyZSBzZXJ2aWNlIC5cbiAgJ2NvbmZpZ3VyZVNlcnZpY2VBcmdzOiBjb25maWd1cmUtc2VydmljZS1hcmdzJ1xuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX0ZPUk1fU0VSVklDRV9DT01QT05FTlQgPSBbXG4gICdvblNldFZhbHVlT25WYWx1ZUNoYW5nZScsXG4gICdvbkRhdGFMb2FkZWQnXG5dO1xuXG5ARGlyZWN0aXZlKHtcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX0ZPUk1fU0VSVklDRV9DT01QT05FTlQsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX0ZPUk1fU0VSVklDRV9DT01QT05FTlRcbn0pXG5leHBvcnQgY2xhc3MgT0Zvcm1TZXJ2aWNlQ29tcG9uZW50IGV4dGVuZHMgT0Zvcm1EYXRhQ29tcG9uZW50IHtcblxuICAvKiBJbnB1dHMgKi9cbiAgcHJvdGVjdGVkIHN0YXRpY0RhdGE6IEFycmF5PGFueT47XG4gIHByb3RlY3RlZCBlbnRpdHk6IHN0cmluZztcbiAgcHJvdGVjdGVkIHNlcnZpY2U6IHN0cmluZztcbiAgcHJvdGVjdGVkIGNvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIHZhbHVlQ29sdW1uOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB2YWx1ZUNvbHVtblR5cGU6IHN0cmluZyA9IENvZGVzLlRZUEVfSU5UO1xuICBwcm90ZWN0ZWQgcGFyZW50S2V5czogc3RyaW5nO1xuICBwcm90ZWN0ZWQgdmlzaWJsZUNvbHVtbnM6IHN0cmluZztcbiAgcHJvdGVjdGVkIGRlc2NyaXB0aW9uQ29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgc2VwYXJhdG9yOiBzdHJpbmcgPSBDb2Rlcy5TUEFDRV9TRVBBUkFUT1I7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwcm90ZWN0ZWQgcXVlcnlPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIHF1ZXJ5T25CaW5kOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBxdWVyeU9uRXZlbnQ6IGFueTtcbiAgcHJvdGVjdGVkIHF1ZXJ5TWV0aG9kOiBzdHJpbmcgPSBDb2Rlcy5RVUVSWV9NRVRIT0Q7XG4gIHByb3RlY3RlZCBzZXJ2aWNlVHlwZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcXVlcnlXaXRoTnVsbFBhcmVudEtleXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNldFZhbHVlT25WYWx1ZUNoYW5nZTogc3RyaW5nO1xuICBwdWJsaWMgcXVlcnlGYWxsYmFja0Z1bmN0aW9uOiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIHRyYW5zbGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc29ydDogJ0FTQycgfCAnREVTQyc7XG5cbiAgLyogT3V0cHV0cyAqL1xuICBwdWJsaWMgb25TZXRWYWx1ZU9uVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxvYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIHB1YmxpYyBvbkRhdGFMb2FkZWQ6IEV2ZW50RW1pdHRlcjxvYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG5cbiAgLyogSW50ZXJuYWwgdmFyaWFibGVzICovXG4gIHB1YmxpYyBkYXRhQXJyYXk6IGFueVtdID0gW107XG4gIHByb3RlY3RlZCBjb2xBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIHZpc2libGVDb2xBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGRlc2NyaXB0aW9uQ29sQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCBkYXRhU2VydmljZTogQmFzZVNlcnZpY2U8U2VydmljZVJlc3BvbnNlPjtcbiAgcHVibGljIGxvYWRlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHF1ZXJ5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBjYWNoZVF1ZXJpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9wS2V5c0VxdWl2ID0ge307XG4gIHByb3RlY3RlZCBfc2V0VmFsdWVPblZhbHVlQ2hhbmdlRXF1aXYgPSB7fTtcbiAgcHJvdGVjdGVkIF9mb3JtRGF0YVN1YmNyaWJlO1xuICBwcm90ZWN0ZWQgX2N1cnJlbnRJbmRleDtcbiAgcHJvdGVjdGVkIG9FcnJvckRpYWxvZ01hbmFnZXI6IE9FcnJvckRpYWxvZ01hbmFnZXI7XG5cbiAgcHJvdGVjdGVkIHF1ZXJ5T25FdmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uRGF0YUxvYWQ6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHVibGljIGRlbGF5TG9hZCA9IDI1MDtcbiAgcHVibGljIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIG9Db250ZXh0TWVudTogT0NvbnRleHRNZW51Q29tcG9uZW50O1xuICBxdWVyeUFyZ3VtZW50czogYW55O1xuICBAVmlld0NoaWxkKE9Db250ZXh0TWVudUNvbXBvbmVudClcbiAgc2V0IG9Db250ZXh0TWVudVJlZih2YWx1ZTogT0NvbnRleHRNZW51Q29tcG9uZW50KSB7XG4gICAgdGhpcy5vQ29udGV4dE1lbnUgPSB2YWx1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVTZXJ2aWNlQXJnczogT0NvbmZpZ3VyZVNlcnZpY2VBcmdzO1xuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtOiBPRm9ybUNvbXBvbmVudCxcbiAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICBpbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7XG4gICAgc3VwZXIoZm9ybSwgZWxSZWYsIGluamVjdG9yKTtcbiAgICB0aGlzLmZvcm0gPSBmb3JtO1xuICAgIHRoaXMuZWxSZWYgPSBlbFJlZjtcbiAgICB0aGlzLm9FcnJvckRpYWxvZ01hbmFnZXIgPSBpbmplY3Rvci5nZXQoT0Vycm9yRGlhbG9nTWFuYWdlcik7XG4gIH1cblxuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uRGF0YUxvYWQuYWRkKHRoaXMub25EYXRhTG9hZGVkLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmNEYXRhSW5kZXgoZmFsc2UpKSk7XG5cbiAgICB0aGlzLmNhY2hlUXVlcmllZCA9IGZhbHNlO1xuICAgIHRoaXMuY29sQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5jb2x1bW5zLCB0cnVlKTtcblxuICAgIHRoaXMudmlzaWJsZUNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMudmlzaWJsZUNvbHVtbnMsIHRydWUpO1xuICAgIGlmIChVdGlsLmlzQXJyYXlFbXB0eSh0aGlzLnZpc2libGVDb2xBcnJheSkpIHtcbiAgICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBhc3NpbmcgdmFsdWUgdG8gdmlzaWJsZUNvbHVtbnMgdG8gcHJvcGFnYXRlIHRoZSBwYXJhbWV0ZXIuXG4gICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgICAgdGhpcy52aXNpYmxlQ29sQXJyYXkgPSB0aGlzLmNvbEFycmF5O1xuICAgIH1cblxuICAgIHRoaXMuZGVzY3JpcHRpb25Db2xBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmRlc2NyaXB0aW9uQ29sdW1ucyk7XG4gICAgaWYgKFV0aWwuaXNBcnJheUVtcHR5KHRoaXMuZGVzY3JpcHRpb25Db2xBcnJheSkpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb25Db2xBcnJheSA9IHRoaXMudmlzaWJsZUNvbEFycmF5O1xuICAgIH1cblxuICAgIGNvbnN0IHBrQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5wYXJlbnRLZXlzKTtcbiAgICB0aGlzLl9wS2V5c0VxdWl2ID0gVXRpbC5wYXJzZVBhcmVudEtleXNFcXVpdmFsZW5jZXMocGtBcnJheSk7XG5cbiAgICBjb25zdCBzZXRWYWx1ZVNldEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMuc2V0VmFsdWVPblZhbHVlQ2hhbmdlKTtcbiAgICB0aGlzLl9zZXRWYWx1ZU9uVmFsdWVDaGFuZ2VFcXVpdiA9IFV0aWwucGFyc2VQYXJlbnRLZXlzRXF1aXZhbGVuY2VzKHNldFZhbHVlU2V0QXJyYXkpO1xuXG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLnF1ZXJ5T25CaW5kKSB7XG4gICAgICB0aGlzLl9mb3JtRGF0YVN1YmNyaWJlID0gdGhpcy5mb3JtLm9uRGF0YUxvYWRlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5xdWVyeURhdGEoKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGljRGF0YSkge1xuICAgICAgdGhpcy5xdWVyeU9uQmluZCA9IGZhbHNlO1xuICAgICAgdGhpcy5xdWVyeU9uSW5pdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlcnlPbkV2ZW50ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5xdWVyeU9uRXZlbnQuc3Vic2NyaWJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucXVlcnlPbkV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5xdWVyeU9uRXZlbnQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoVXRpbC5pc0RlZmluZWQodmFsdWUpIHx8IHRoaXMucXVlcnlXaXRoTnVsbFBhcmVudEtleXMpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5RGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMucXVlcnlGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cblxuXG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICBpZiAodGhpcy5fZm9ybURhdGFTdWJjcmliZSkge1xuICAgICAgdGhpcy5fZm9ybURhdGFTdWJjcmliZS51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU9uRXZlbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucXVlcnlPbkV2ZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uRGF0YUxvYWQpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uRGF0YUxvYWQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdE9uVmFsdWVDaGFuZ2UodHlwZSwgbmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgc3VwZXIuZW1pdE9uVmFsdWVDaGFuZ2UodHlwZSwgbmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICAvLyBTZXQgdmFsdWUgZm9yICdzZXQtdmFsdWUtb24tdmFsdWUtY2hhbmdlJyBjb21wb25lbnRzXG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5nZXRTZWxlY3RlZFJlY29yZCgpO1xuICAgIHRoaXMub25TZXRWYWx1ZU9uVmFsdWVDaGFuZ2UuZW1pdChyZWNvcmQpO1xuICAgIGNvbnN0IHNldFZhbHVlU2V0S2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX3NldFZhbHVlT25WYWx1ZUNoYW5nZUVxdWl2KTtcbiAgICBpZiAoc2V0VmFsdWVTZXRLZXlzLmxlbmd0aCkge1xuICAgICAgY29uc3QgZm9ybUNvbXBvbmVudHMgPSB0aGlzLmZvcm0uZ2V0Q29tcG9uZW50cygpO1xuICAgICAgc2V0VmFsdWVTZXRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29tcCA9IGZvcm1Db21wb25lbnRzW3RoaXMuX3NldFZhbHVlT25WYWx1ZUNoYW5nZUVxdWl2W2tleV1dO1xuICAgICAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29tcCkpIHtcbiAgICAgICAgICBjb21wLnNldFZhbHVlKFV0aWwuaXNEZWZpbmVkKHJlY29yZCkgPyByZWNvcmRba2V5XSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qIFV0aWxpdHkgbWV0aG9kcyAqL1xuICBjb25maWd1cmVTZXJ2aWNlKCkge1xuICAgIGxldCBjb25maWd1cmVTZXJ2aWNlQXJnczogT0NvbmZpZ3VyZVNlcnZpY2VBcmdzID0geyBpbmplY3RvcjogdGhpcy5pbmplY3RvciwgYmFzZVNlcnZpY2U6IE9udGltaXplU2VydmljZSwgZW50aXR5OiB0aGlzLmVudGl0eSwgc2VydmljZTogdGhpcy5zZXJ2aWNlLCBzZXJ2aWNlVHlwZTogdGhpcy5zZXJ2aWNlVHlwZSB9O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmNvbmZpZ3VyZVNlcnZpY2VBcmdzKSkge1xuICAgICAgY29uZmlndXJlU2VydmljZUFyZ3MgPSB7IC4uLmNvbmZpZ3VyZVNlcnZpY2VBcmdzLCAuLi50aGlzLmNvbmZpZ3VyZVNlcnZpY2VBcmdzIH07XG4gICAgfVxuICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBGYWN0b3J5VXRpbC5jb25maWd1cmVTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2VBcmdzKTtcblxuICB9XG5cbiAgZ2V0QXR0cmlidXRlc1ZhbHVlc1RvUXVlcnkoY29sdW1ucz86IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCByZXN1bHQgPSBVdGlsLmlzRGVmaW5lZChjb2x1bW5zKSA/IGNvbHVtbnMgOiB0aGlzLmNvbEFycmF5O1xuICAgIGlmIChyZXN1bHQuaW5kZXhPZih0aGlzLnZhbHVlQ29sdW1uKSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMudmFsdWVDb2x1bW4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcXVlcnlEYXRhKGZpbHRlcj86IGFueSkge1xuICAgIGlmICghdGhpcy5kYXRhU2VydmljZSB8fCAhKHRoaXMucXVlcnlNZXRob2QgaW4gdGhpcy5kYXRhU2VydmljZSkgfHwgIXRoaXMuZW50aXR5KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NlcnZpY2Ugbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQhIGFib3J0aW5nIHF1ZXJ5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbHRlciA9IE9iamVjdC5hc3NpZ24oZmlsdGVyIHx8IHt9LCBTZXJ2aWNlVXRpbHMuZ2V0UGFyZW50S2V5c0Zyb21Gb3JtKHRoaXMuX3BLZXlzRXF1aXYsIHRoaXMuZm9ybSkpO1xuICAgIGlmICghU2VydmljZVV0aWxzLmZpbHRlckNvbnRhaW5zQWxsUGFyZW50S2V5cyhmaWx0ZXIsIHRoaXMuX3BLZXlzRXF1aXYpICYmICF0aGlzLnF1ZXJ5V2l0aE51bGxQYXJlbnRLZXlzKSB7XG4gICAgICB0aGlzLnNldERhdGFBcnJheShbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMucXVlcnlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbiA9IHRoaXMubG9hZCgpO1xuXG4gICAgICB0aGlzLnF1ZXJ5QXJndW1lbnRzID0gdGhpcy5nZXRRdWVyeUFyZ3VtZW50cyhmaWx0ZXIpO1xuICAgICAgdGhpcy5xdWVyeVN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeU1ldGhvZF0oLi4udGhpcy5kYXRhU2VydmljZS5yZXF1ZXN0QXJndW1lbnRBZGFwdGVyLnBhcnNlUXVlcnlQYXJhbWV0ZXJzKHRoaXMucXVlcnlBcmd1bWVudHMpKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVF1ZXJpZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhQXJyYXkocmVzcC5kYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucXVlcnlGYWxsYmFja0Z1bmN0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24oZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vRXJyb3JEaWFsb2dNYW5hZ2VyLm9wZW5FcnJvckRpYWxvZyhlcnIpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UXVlcnlBcmd1bWVudHMoZmlsdGVyOiBvYmplY3QsIG92cnJBcmdzOiBPUXVlcnlEYXRhQXJncyA9IHt9KTogT1F1ZXJ5UGFyYW1zIHtcbiAgICBjb25zdCBjb21wRmlsdGVyID0gZmlsdGVyO1xuICAgIGNvbnN0IHF1ZXJ5Q29scyA9IHRoaXMuZ2V0QXR0cmlidXRlc1ZhbHVlc1RvUXVlcnkoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IG92cnJBcmdzPy5zcWx0eXBlcyA/PyB0aGlzLmZvcm0/LmdldEF0dHJpYnV0ZXNTUUxUeXBlcygpID8/IHt9O1xuXG4gICAgcmV0dXJuIHsgZmlsdGVyOiBjb21wRmlsdGVyLCBjb2x1bW5zOiBxdWVyeUNvbHMsIGVudGl0eTogdGhpcy5lbnRpdHksIHNxbFR5cGVzOiBzcWxUeXBlcyB9O1xuICB9XG5cbiAgZ2V0RGF0YUFycmF5KCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhQXJyYXk7XG4gIH1cblxuICBzZXREYXRhQXJyYXkoZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShkYXRhKSkge1xuICAgICAgdGhpcy5kYXRhQXJyYXkgPSB0aGlzLnNvcnREYXRhKGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoVXRpbC5pc09iamVjdChkYXRhKSAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRhdGFBcnJheSA9IFtkYXRhXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgaGFzIHJlY2VpdmVkIG5vdCBzdXBwb3J0ZWQgc2VydmljZSBkYXRhLiBTdXBwb3J0ZWQgZGF0YSBhcmUgQXJyYXkgb3Igbm90IGVtcHR5IE9iamVjdCcpO1xuICAgICAgdGhpcy5kYXRhQXJyYXkgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5vbkRhdGFMb2FkZWQuZW1pdCh0aGlzLmRhdGFBcnJheSk7XG4gIH1cblxuICBzeW5jRGF0YUluZGV4KHF1ZXJ5SWZOb3RGb3VuZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLl9jdXJyZW50SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMudmFsdWUpICYmICF0aGlzLmlzRW1wdHkoKSAmJiB0aGlzLmRhdGFBcnJheSkge1xuICAgICAgdGhpcy5kYXRhQXJyYXkuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUudmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIHR