UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

240 lines • 32.6 kB
/*! * 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==