ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
368 lines • 55.1 kB
JavaScript
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