devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
240 lines • 32.6 kB
JavaScript
/*!
* devextreme-angular
* Version: 20.2.5
* Build date: Fri Jan 15 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file in the root of the project for details.
*
* https://github.com/DevExpress/devextreme-angular
*/
import * as tslib_1 from "tslib";
import { ElementRef, NgZone, PLATFORM_ID, Inject, EventEmitter } from '@angular/core';
import { isPlatformServer } from '@angular/common';
import { TransferState, makeStateKey } from '@angular/platform-browser';
import { DxTemplateHost } from './template-host';
import { EmitterHelper, NgEventsStrategy } from './events-strategy';
import { WatcherHelper } from './watcher-helper';
import * as domAdapter from 'devextreme/core/dom_adapter';
import * as events from 'devextreme/events';
import { CollectionNestedOptionContainerImpl } from './nested-option';
var serverStateKey;
export var getServerStateKey = function () {
if (!serverStateKey) {
serverStateKey = makeStateKey('DX_isPlatformServer');
}
return serverStateKey;
};
var DxComponent = /** @class */ (function () {
function DxComponent(element, ngZone, templateHost, watcherHelper, transferState, platformId) {
this.element = element;
this.ngZone = ngZone;
this.watcherHelper = watcherHelper;
this.transferState = transferState;
this.platformId = platformId;
this._initialOptions = {};
this._optionsToUpdate = {};
this.optionChangedHandlers = new EventEmitter();
this.isLinked = true;
this.changedOptions = {};
this.removedNestedComponents = [];
this.widgetUpdateLocked = false;
this.templates = [];
templateHost.setHost(this);
this._collectionContainerImpl = new CollectionNestedOptionContainerImpl(this._setOption.bind(this));
this.eventHelper = new EmitterHelper(ngZone, this);
}
DxComponent.prototype._initTemplates = function () {
if (this.templates.length) {
var initialTemplates_1 = {};
this.templates.forEach(function (template) {
initialTemplates_1[template.name] = template;
});
this.instance.option('integrationOptions.templates', initialTemplates_1);
}
};
DxComponent.prototype._initEvents = function () {
var _this = this;
this.instance.on('optionChanged', function (e) {
_this.changedOptions[e.name] = e.value;
var value = e.name === e.fullName ? e.value : e.component.option(e.name);
_this.eventHelper.fireNgEvent(e.name + 'Change', [value]);
_this.optionChangedHandlers.emit(e);
});
};
DxComponent.prototype._initOptions = function () {
this._initialOptions.integrationOptions.watchMethod = this.watcherHelper.getWatchMethod();
};
DxComponent.prototype._initPlatform = function () {
if (this.transferState.hasKey(getServerStateKey())) {
this._initialOptions.integrationOptions.renderedOnServer = this.transferState.get(getServerStateKey(), null);
}
else if (isPlatformServer(this.platformId)) {
this.transferState.set(getServerStateKey(), true);
}
};
DxComponent.prototype._createEventEmitters = function (events) {
var _this = this;
var zone = this.ngZone;
this.eventHelper.createEmitters(events);
this._initialOptions.eventsStrategy = function (instance) {
var strategy = new NgEventsStrategy(instance, zone);
events.filter(function (event) { return event.subscribe; }).forEach(function (event) {
strategy.addEmitter(event.subscribe, _this[event.emit]);
});
return strategy;
};
this._initialOptions.nestedComponentOptions = function (component) {
return {
eventsStrategy: function (instance) { return new NgEventsStrategy(instance, zone); },
nestedComponentOptions: component.option('nestedComponentOptions')
};
};
};
DxComponent.prototype._shouldOptionChange = function (name, value) {
if (this.changedOptions.hasOwnProperty(name)) {
var prevValue = this.changedOptions[name];
delete this.changedOptions[name];
return value !== prevValue;
}
return true;
};
DxComponent.prototype.clearChangedOptions = function () {
this.changedOptions = {};
};
DxComponent.prototype._getOption = function (name) {
return this.instance ?
this.instance.option(name) :
this._initialOptions[name];
};
DxComponent.prototype.lockWidgetUpdate = function () {
if (!this.widgetUpdateLocked && this.instance) {
this.instance.beginUpdate();
this.widgetUpdateLocked = true;
}
};
DxComponent.prototype.unlockWidgetUpdate = function () {
if (this.widgetUpdateLocked) {
this.widgetUpdateLocked = false;
this.instance.endUpdate();
}
};
DxComponent.prototype._setOption = function (name, value) {
this.lockWidgetUpdate();
if (!this._shouldOptionChange(name, value)) {
return;
}
if (this.instance) {
this.instance.option(name, value);
}
else {
this._initialOptions[name] = value;
}
};
DxComponent.prototype._createWidget = function (element) {
this._initialOptions.integrationOptions = {};
this._initPlatform();
this._initOptions();
this._initialOptions.onInitializing = function () {
this.beginUpdate();
};
this.instance = this._createInstance(element, this._initialOptions);
this._initEvents();
this._initialOptions = {};
};
DxComponent.prototype._destroyWidget = function () {
this.removedNestedComponents = [];
if (this.instance) {
var element = this.instance.element();
events.triggerHandler(element, 'dxremove', { _angularIntegration: true });
this.instance.dispose();
domAdapter.removeElement(element);
}
};
DxComponent.prototype.ngOnChanges = function (changes) {
for (var key in changes) {
var change = changes[key];
if (change.currentValue !== this[key]) {
this._optionsToUpdate[key] = changes[key].currentValue;
}
}
};
DxComponent.prototype.ngOnInit = function () {
this._createWidget(this.element.nativeElement);
};
DxComponent.prototype.ngDoCheck = function () {
this.applyOptions();
};
DxComponent.prototype.ngAfterContentChecked = function () {
this.applyOptions();
this.resetOptions();
this.unlockWidgetUpdate();
};
DxComponent.prototype.ngAfterViewInit = function () {
this._initTemplates();
this.instance.endUpdate();
this.recreatedNestedComponents = [];
};
DxComponent.prototype.applyOptions = function () {
if (Object.keys(this._optionsToUpdate).length) {
if (this.instance) {
this.instance.option(this._optionsToUpdate);
}
this._optionsToUpdate = {};
}
};
DxComponent.prototype.resetOptions = function (collectionName) {
var _this = this;
if (this.instance) {
this.removedNestedComponents.filter(function (option) { return option &&
!_this.isRecreated(option) &&
collectionName ? option.startsWith(collectionName) : true; })
.forEach(function (option) {
_this.instance.resetOption(option);
});
this.removedNestedComponents = [];
this.recreatedNestedComponents = [];
}
};
DxComponent.prototype.isRecreated = function (name) {
return this.recreatedNestedComponents &&
this.recreatedNestedComponents.some(function (nestedComponent) { return nestedComponent.getOptionPath() === name; });
};
DxComponent.prototype.setTemplate = function (template) {
this.templates.push(template);
};
DxComponent.prototype.setChildren = function (propertyName, items) {
this.resetOptions(propertyName);
return this._collectionContainerImpl.setChildren(propertyName, items);
};
DxComponent = tslib_1.__decorate([
tslib_1.__param(5, Inject(PLATFORM_ID)),
tslib_1.__metadata("design:paramtypes", [ElementRef,
NgZone,
DxTemplateHost,
WatcherHelper,
TransferState, Object])
], DxComponent);
return DxComponent;
}());
export { DxComponent };
var DxComponentExtension = /** @class */ (function (_super) {
tslib_1.__extends(DxComponentExtension, _super);
function DxComponentExtension() {
return _super !== null && _super.apply(this, arguments) || this;
}
DxComponentExtension.prototype.createInstance = function (element) {
this._createWidget(element);
};
DxComponentExtension.prototype.ngOnInit = function () {
};
DxComponentExtension.prototype.ngAfterViewInit = function () {
this._createWidget(this.element.nativeElement);
this.instance.endUpdate();
};
return DxComponentExtension;
}(DxComponent));
export { DxComponentExtension };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGV2ZXh0cmVtZS1hbmd1bGFyL2NvcmUvIiwic291cmNlcyI6WyJjb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7O0FBRUgsT0FBTyxFQUNILFVBQVUsRUFDVixNQUFNLEVBR04sV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLEVBT2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd4RSxPQUFPLEVBQW1CLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxLQUFLLFVBQVUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFDO0FBRTVDLE9BQU8sRUFJSCxtQ0FBbUMsRUFDdEMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixJQUFJLGNBQWMsQ0FBQztBQUNuQixNQUFNLENBQUMsSUFBTSxpQkFBaUIsR0FBRztJQUMvQixJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ25CLGNBQWMsR0FBRyxZQUFZLENBQU0scUJBQXFCLENBQUMsQ0FBQztLQUMzRDtJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQUVGO0lBOElJLHFCQUFzQixPQUFtQixFQUM3QixNQUFjLEVBQ3RCLFlBQTRCLEVBQ3BCLGFBQTRCLEVBQzVCLGFBQTRCLEVBQ1AsVUFBZTtRQUwxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxrQkFB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dkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsdUNBQVEsR0FBUjtJQUNBLENBQUM7SUFFRCw4Q0FBZSxHQUFmO1FBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNMLDJCQUFDO0FBQUQsQ0FBQyxBQVpELENBQW1ELFdBQVcsR0FZN0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGRldmV4dHJlbWUtYW5ndWxhclxuICogVmVyc2lvbjogMjAuMi41XG4gKiBCdWlsZCBkYXRlOiBGcmkgSmFuIDE1IDIwMjFcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDIxIERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuaW1wb3J0IHtcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgUExBVEZPUk1fSUQsXHJcbiAgICBJbmplY3QsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25Jbml0LFxyXG4gICAgRG9DaGVjayxcclxuICAgIEFmdGVyQ29udGVudENoZWNrZWQsXHJcbiAgICBBZnRlclZpZXdJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgVHJhbnNmZXJTdGF0ZSwgbWFrZVN0YXRlS2V5IH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5pbXBvcnQgeyBEeFRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi90ZW1wbGF0ZSc7XHJcbmltcG9ydCB7IElEeFRlbXBsYXRlSG9zdCwgRHhUZW1wbGF0ZUhvc3QgfSBmcm9tICcuL3RlbXBsYXRlLWhvc3QnO1xyXG5pbXBvcnQgeyBFbWl0dGVySGVscGVyLCBOZ0V2ZW50c1N0cmF0ZWd5IH0gZnJvbSAnLi9ldmVudHMtc3RyYXRlZ3knO1xyXG5pbXBvcnQgeyBXYXRjaGVySGVscGVyIH0gZnJvbSAnLi93YXRjaGVyLWhlbHBlcic7XHJcbmltcG9ydCAqIGFzIGRvbUFkYXB0ZXIgZnJvbSAnZGV2ZXh0cmVtZS9jb3JlL2RvbV9hZGFwdGVyJztcclxuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2RldmV4dHJlbWUvZXZlbnRzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLFxyXG4gICAgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24sXHJcbiAgICBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lcixcclxuICAgIENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsXHJcbn0gZnJvbSAnLi9uZXN0ZWQtb3B0aW9uJztcclxuXHJcbmxldCBzZXJ2ZXJTdGF0ZUtleTtcclxuZXhwb3J0IGNvbnN0IGdldFNlcnZlclN0YXRlS2V5ID0gKCkgPT4ge1xyXG4gIGlmICghc2VydmVyU3RhdGVLZXkpIHtcclxuICAgIHNlcnZlclN0YXRlS2V5ID0gbWFrZVN0YXRlS2V5PGFueT4oJ0RYX2lzUGxhdGZvcm1TZXJ2ZXInKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBzZXJ2ZXJTdGF0ZUtleTtcclxufTtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBEb0NoZWNrLCBBZnRlckNvbnRlbnRDaGVja2VkLCBBZnRlclZpZXdJbml0LFxyXG4gICAgSU5lc3RlZE9wdGlvbkNvbnRhaW5lciwgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXIsIElEeFRlbXBsYXRlSG9zdCB7XHJcbiAgICBwcml2YXRlIF9pbml0aWFsT3B0aW9uczogYW55ID0ge307XHJcbiAgICBwcm90ZWN0ZWQgX29wdGlvbnNUb1VwZGF0ZTogYW55ID0ge307XHJcbiAgICBwcml2YXRlIF9jb2xsZWN0aW9uQ29udGFpbmVySW1wbDogSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXI7XHJcbiAgICBldmVudEhlbHBlcjogRW1pdHRlckhlbHBlcjtcclxuICAgIG9wdGlvbkNoYW5nZWRIYW5kbGVyczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0ZW1wbGF0ZXM6IER4VGVtcGxhdGVEaXJlY3RpdmVbXTtcclxuICAgIGluc3RhbmNlOiBhbnk7XHJcbiAgICBpc0xpbmtlZCA9IHRydWU7XHJcbiAgICBjaGFuZ2VkT3B0aW9ucyA9IHt9O1xyXG4gICAgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSBbXTtcclxuICAgIHJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHM6IGFueVtdO1xyXG4gICAgd2lkZ2V0VXBkYXRlTG9ja2VkID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfaW5pdFRlbXBsYXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxldCBpbml0aWFsVGVtcGxhdGVzID0ge307XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW5pdGlhbFRlbXBsYXRlc1t0ZW1wbGF0ZS5uYW1lXSA9IHRlbXBsYXRlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5vcHRpb24oJ2ludGVncmF0aW9uT3B0aW9ucy50ZW1wbGF0ZXMnLCBpbml0aWFsVGVtcGxhdGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaW5pdEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmluc3RhbmNlLm9uKCdvcHRpb25DaGFuZ2VkJywgKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkT3B0aW9uc1tlLm5hbWVdID0gZS52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZS5uYW1lID09PSBlLmZ1bGxOYW1lID8gZS52YWx1ZSA6IGUuY29tcG9uZW50Lm9wdGlvbihlLm5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGVscGVyLmZpcmVOZ0V2ZW50KGUubmFtZSArICdDaGFuZ2UnLCBbdmFsdWVdKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25DaGFuZ2VkSGFuZGxlcnMuZW1pdChlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbml0T3B0aW9ucygpIHtcclxuICAgICAgICB0aGlzLl9pbml0aWFsT3B0aW9ucy5pbnRlZ3JhdGlvbk9wdGlvbnMud2F0Y2hNZXRob2QgPSB0aGlzLndhdGNoZXJIZWxwZXIuZ2V0V2F0Y2hNZXRob2QoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbml0UGxhdGZvcm0oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNmZXJTdGF0ZS5oYXNLZXkoZ2V0U2VydmVyU3RhdGVLZXkoKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaW50ZWdyYXRpb25PcHRpb25zLnJlbmRlcmVkT25TZXJ2ZXIgPSB0aGlzLnRyYW5zZmVyU3RhdGUuZ2V0KGdldFNlcnZlclN0YXRlS2V5KCksIG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNmZXJTdGF0ZS5zZXQoZ2V0U2VydmVyU3RhdGVLZXkoKSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfY3JlYXRlRXZlbnRFbWl0dGVycyhldmVudHMpIHtcclxuICAgICAgICBjb25zdCB6b25lID0gdGhpcy5uZ1pvbmU7XHJcbiAgICAgICAgdGhpcy5ldmVudEhlbHBlci5jcmVhdGVFbWl0dGVycyhldmVudHMpO1xyXG5cclxuICAgICAgICB0aGlzLl9pbml0aWFsT3B0aW9ucy5ldmVudHNTdHJhdGVneSA9IChpbnN0YW5jZSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RyYXRlZ3kgPSBuZXcgTmdFdmVudHNTdHJhdGVneShpbnN0YW5jZSwgem9uZSk7XHJcblxyXG4gICAgICAgICAgICBldmVudHMuZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnN1YnNjcmliZSkuZm9yRWFjaChldmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBzdHJhdGVneS5hZGRFbWl0dGVyKGV2ZW50LnN1YnNjcmliZSwgdGhpc1tldmVudC5lbWl0XSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5O1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLm5lc3RlZENvbXBvbmVudE9wdGlvbnMgPSBmdW5jdGlvbihjb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50c1N0cmF0ZWd5OiAoaW5zdGFuY2UpID0+IHsgcmV0dXJuIG5ldyBOZ0V2ZW50c1N0cmF0ZWd5KGluc3RhbmNlLCB6b25lKTsgfSxcclxuICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudE9wdGlvbnM6IGNvbXBvbmVudC5vcHRpb24oJ25lc3RlZENvbXBvbmVudE9wdGlvbnMnKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgX3Nob3VsZE9wdGlvbkNoYW5nZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5jaGFuZ2VkT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgICAgICBjb25zdCBwcmV2VmFsdWUgPSB0aGlzLmNoYW5nZWRPcHRpb25zW25hbWVdO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jaGFuZ2VkT3B0aW9uc1tuYW1lXTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gcHJldlZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckNoYW5nZWRPcHRpb25zKCkge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2dldE9wdGlvbihuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSA/XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKG5hbWUpIDpcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnNbbmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgbG9ja1dpZGdldFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMud2lkZ2V0VXBkYXRlTG9ja2VkICYmIHRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5iZWdpblVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLndpZGdldFVwZGF0ZUxvY2tlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja1dpZGdldFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy53aWRnZXRVcGRhdGVMb2NrZWQpIHtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRVcGRhdGVMb2NrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5lbmRVcGRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXRPcHRpb24obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5sb2NrV2lkZ2V0VXBkYXRlKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fc2hvdWxkT3B0aW9uQ2hhbmdlKG5hbWUsIHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLm9wdGlvbihuYW1lLCB2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IF9jcmVhdGVJbnN0YW5jZShlbGVtZW50LCBvcHRpb25zKVxyXG5cclxuICAgIHByb3RlY3RlZCBfY3JlYXRlV2lkZ2V0KGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLmludGVncmF0aW9uT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2luaXRQbGF0Zm9ybSgpO1xyXG4gICAgICAgIHRoaXMuX2luaXRPcHRpb25zKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLm9uSW5pdGlhbGl6aW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmJlZ2luVXBkYXRlKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlID0gdGhpcy5fY3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgdGhpcy5faW5pdGlhbE9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuX2luaXRFdmVudHMoKTtcclxuICAgICAgICB0aGlzLl9pbml0aWFsT3B0aW9ucyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGVzdHJveVdpZGdldCgpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmluc3RhbmNlLmVsZW1lbnQoKTtcclxuICAgICAgICAgICAgZXZlbnRzLnRyaWdnZXJIYW5kbGVyKGVsZW1lbnQsICdkeHJlbW92ZScsIHsgX2FuZ3VsYXJJbnRlZ3JhdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIGRvbUFkYXB0ZXIucmVtb3ZlRWxlbWVudChlbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgICAgICB0ZW1wbGF0ZUhvc3Q6IER4VGVtcGxhdGVIb3N0LFxyXG4gICAgICAgIHByaXZhdGUgd2F0Y2hlckhlbHBlcjogV2F0Y2hlckhlbHBlcixcclxuICAgICAgICBwcml2YXRlIHRyYW5zZmVyU3RhdGU6IFRyYW5zZmVyU3RhdGUsXHJcbiAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlcyA9IFtdO1xyXG4gICAgICAgIHRlbXBsYXRlSG9zdC5zZXRIb3N0KHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25Db250YWluZXJJbXBsID0gbmV3IENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsKHRoaXMuX3NldE9wdGlvbi5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLmV2ZW50SGVscGVyID0gbmV3IEVtaXR0ZXJIZWxwZXIobmdab25lLCB0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgbGV0IGNoYW5nZSA9IGNoYW5nZXNba2V5XTtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZS5jdXJyZW50VmFsdWUgIT09IHRoaXNba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9uc1RvVXBkYXRlW2tleV0gPSBjaGFuZ2VzW2tleV0uY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZVdpZGdldCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdEb0NoZWNrKCkge1xyXG4gICAgICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xyXG4gICAgICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XHJcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnMoKTtcclxuICAgICAgICB0aGlzLnVubG9ja1dpZGdldFVwZGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLl9pbml0VGVtcGxhdGVzKCk7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5lbmRVcGRhdGUoKTtcclxuICAgICAgICB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseU9wdGlvbnMoKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX29wdGlvbnNUb1VwZGF0ZSkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLm9wdGlvbih0aGlzLl9vcHRpb25zVG9VcGRhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNUb1VwZGF0ZSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXNldE9wdGlvbnMoY29sbGVjdGlvbk5hbWU/OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uICYmXHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pc1JlY3JlYXRlZChvcHRpb24pICYmXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uTmFtZSA/IG9wdGlvbi5zdGFydHNXaXRoKGNvbGxlY3Rpb25OYW1lKSA6IHRydWUpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnJlc2V0T3B0aW9uKG9wdGlvbik7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc1JlY3JlYXRlZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMuc29tZShuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LmdldE9wdGlvblBhdGgoKSA9PT0gbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGVtcGxhdGUodGVtcGxhdGU6IER4VGVtcGxhdGVEaXJlY3RpdmUpIHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlcy5wdXNoKHRlbXBsYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRDaGlsZHJlbjxUIGV4dGVuZHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24+KHByb3BlcnR5TmFtZTogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFQ+KSB7XHJcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnMocHJvcGVydHlOYW1lKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbkNvbnRhaW5lckltcGwuc2V0Q2hpbGRyZW4ocHJvcGVydHlOYW1lLCBpdGVtcyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeENvbXBvbmVudEV4dGVuc2lvbiBleHRlbmRzIER4Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICAgIGNyZWF0ZUluc3RhbmNlKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZVdpZGdldChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlV2lkZ2V0KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlLmVuZFVwZGF0ZSgpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==