Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
motif-web-admin-core / esm2015 / lib / sections / Plugins / components / plugins-section-component.js
Size: Mime:
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Component, ViewChild } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { RegistryService } from '@wa-motif-open-api/plugin-registry-service';
import { process } from '@progress/kendo-data-query';
import { WCSubscriptionHandler } from '../../../components/Commons/wc-subscription-handler';
import * as _ from 'lodash';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { faPuzzlePiece } from '@fortawesome/free-solid-svg-icons';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import { UninstallConfirmationDialogComponent } from '../dialogs/uninstall-confirmation-dialog-component';
/** @type {?} */
const LOG_TAG = '[PluginsSection]';
let PluginsSectionComponent = class PluginsSectionComponent {
    /**
     * @param {?} logger
     * @param {?} registryService
     * @param {?} notificationCenter
     */
    constructor(logger, registryService, notificationCenter) {
        this.logger = logger;
        this.registryService = registryService;
        this.notificationCenter = notificationCenter;
        this.faPuzzlePiece = faPuzzlePiece;
        this._subHandler = new WCSubscriptionHandler();
        this.statsModel = { items: [] };
        this.state = {};
        this.logger.debug(LOG_TAG, 'Opening...');
    }
    /**
     * Angular ngOnInit
     * @return {?}
     */
    ngOnInit() {
        this.logger.debug(LOG_TAG, 'Initializing...');
        this.refreshData();
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.logger.debug(LOG_TAG, 'ngOnDestroy ');
        this.freeMem();
    }
    /**
     * @return {?}
     */
    freeMem() {
        this.data = null;
        this.gridData = null;
        this._subHandler.unsubscribe();
        this._subHandler = null;
    }
    /**
     * @return {?}
     */
    onRefreshClicked() {
        this.logger.debug(LOG_TAG, 'Refresh clicked');
        this.refreshData();
    }
    /**
     * @return {?}
     */
    refreshData() {
        this.logger.debug(LOG_TAG, 'refreshData called.');
        this.loading = true;
        this._subHandler.add(this.registryService.getPlugins(true, 'REGISTERED').subscribe((/**
         * @param {?} data
         * @return {?}
         */
        (data) => {
            this.data = data;
            this.displayData();
            this.rebuildStatsInfo();
            this.loading = false;
            // console.log("refreshData: ", data);
        }), (/**
         * @param {?} error
         * @return {?}
         */
        (error) => {
            this.clearStatsInfo();
            // console.error("refreshData error: ", error);
            this.gridData = process([], this.state);
            this.loading = false;
        })));
    }
    /**
     * @private
     * @return {?}
     */
    clearStatsInfo() {
        this.statsModel = { items: [] };
    }
    /**
     * @private
     * @return {?}
     */
    rebuildStatsInfo() {
        /** @type {?} */
        const active = _.sumBy(this.data, (/**
         * @param {?} __0
         * @return {?}
         */
        ({ status }) => Number(status === "ACTIVE")));
        /** @type {?} */
        const inactive = _.sumBy(this.data, (/**
         * @param {?} __0
         * @return {?}
         */
        ({ status }) => Number(status === "RESOLVED")));
        /** @type {?} */
        const inError = _.sumBy(this.data, (/**
         * @param {?} __0
         * @return {?}
         */
        ({ status }) => Number(status === "INSTALLED")));
        this.statsModel = {
            //cssClass:"green-stats-info"
            items: [
                { label: "active", value: active, cssClass: "stats-info-primary" },
                { label: "inactive", value: inactive, cssClass: "stats-info-default" },
                { label: "in error", value: inError, cssClass: "stats-info-ko" }
            ]
        };
    }
    /**
     * @param {?} plugin
     * @return {?}
     */
    statusColorCode(plugin) {
        if (plugin.status === 'ACTIVE') {
            return '#1ab31a';
        }
        else {
            return 'inherit';
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onFilterChange(event) {
        this.filterValue = event.srcElement['value'];
        this.displayData();
    }
    /**
     * @private
     * @return {?}
     */
    displayData() {
        this.logger.debug(LOG_TAG, 'displayData called.');
        /** @type {?} */
        let filteredData;
        if (this.filterValue) {
            filteredData = _.filter(this.data, (/**
             * @param {?} o
             * @return {?}
             */
            (o) => {
                /** @type {?} */
                const matcher = this.buildRegExp(this.filterValue);
                return matcher.test(o.name);
            }));
        }
        else {
            filteredData = this.data;
        }
        this.gridData = process(filteredData, this.state);
    }
    /**
     * @private
     * @param {?} filter
     * @return {?}
     */
    buildRegExp(filter) {
        /** @type {?} */
        const wildcarded = '*' + filter + '*';
        return new RegExp('^' + wildcarded.split('*').join('.*') + '$');
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onUninstallOKPressed(event) {
        this.logger.debug(LOG_TAG, 'onUninstallOKPressed pressed for: ', event);
        /** @type {?} */
        let pluginName = event.name;
        /** @type {?} */
        let version = event.version;
        this._uninstallConfirmationDialog.show(pluginName, version);
    }
    /**
     * @param {?} pluginName
     * @param {?} deleteConfig
     * @return {?}
     */
    doUninstallPlugin(pluginName, deleteConfig) {
        this.logger.debug(LOG_TAG, 'doUninstallPlugin called for:', pluginName);
        this.loading = true;
        this._subHandler.add(this.registryService.uninstallPlugin(pluginName, { removeConfig: true }).subscribe((/**
         * @param {?} results
         * @return {?}
         */
        (results) => {
            this.displayData();
            this.rebuildStatsInfo();
            this.loading = false; // console.log("refreshData: ", data);
        }), (/**
         * @param {?} error
         * @return {?}
         */
        (error) => {
            this.gridData = process([], this.state);
            this.loading = false;
        })));
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onUninstallConfirmed(event) {
        this.doUninstallPlugin(event.pluginName, event.deleteConfig);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onInstallPlugin(event) {
        this.logger.debug(LOG_TAG, 'onInstallPlugin event:', event);
        this.notificationCenter.post({
            name: 'InstallPlugin',
            title: 'Plugin Install',
            message: 'Installing plugin...',
            type: NotificationType.Info
        });
        this._subHandler.add(this.registryService.installPlugin(event.file, this.overwriteExisting).subscribe((/**
         * @param {?} data
         * @return {?}
         */
        (data) => {
            this.logger.info(LOG_TAG, 'Plugin installation done:', data);
            this.notificationCenter.post({
                name: 'InstallPlugin',
                title: 'Plugin Install',
                message: 'Plugin installed successfully.',
                type: NotificationType.Success
            });
            this.refreshData();
        }), (/**
         * @param {?} error
         * @return {?}
         */
        (error) => {
            this.logger.error(LOG_TAG, 'Import license error:', error);
            this.notificationCenter.post({
                name: 'InstallPluginError',
                title: 'Plugin Install',
                message: 'Error installing plugin:',
                type: NotificationType.Error,
                error: error,
                closable: true
            });
        })));
    }
    /**
     * @param {?} error
     * @return {?}
     */
    onInstallPluginError(error) {
        this.logger.error(LOG_TAG, 'onInstallPluginError error:', error);
        this.notificationCenter.post({
            name: 'InstallPluginError',
            title: 'Install Plugin',
            message: 'Error installing plugin:',
            type: NotificationType.Error,
            error: error,
            closable: true
        });
    }
};
PluginsSectionComponent.decorators = [
    { type: Component, args: [{
                selector: 'app-plugins-section',
                template: "<wc-dashboard-header [title]=\"'Plugins'\"></wc-dashboard-header>\n\n<wc-stats-info-component [model]=\"statsModel\"></wc-stats-info-component>\n\n<wa-uninstall-confirmation-dialog-component #uninstallConfirmationDialog (confirm)=\"onUninstallConfirmed($event)\"></wa-uninstall-confirmation-dialog-component>\n\n<wc-loading-overlay [visible]='loading'></wc-loading-overlay>\n\n<div class=\"row spread\" >\n\n    <div class=\"flex-toolbar\" style=\"display:flex;align-items: center;\">\n        <kendo-textbox-container floatingLabel=\"Filter\">\n            <input #filterInput kendoTextBox  (afterValueChanged)=\"onFilterChange($event)\"/>\n        </kendo-textbox-container>\n        <div>\n            <label>&nbsp;</label>\n            <kendo-buttongroup look=\"flat\">\n                <button kendoButton \n                    motif-acl=\"com.vipera.osgi.core.registry.api.rest.RegistryApi:UPDATE:installPlugin\"\n                    [toggleable]=\"false\" \n                    (click)=\"installPluginSlideDownPanel.toggle()\">\n                    <fa-icon [icon]=\"faPuzzlePiece\"></fa-icon>Install Plugin\n                </button>\n            </kendo-buttongroup>\n        </div>\n    </div>\n\n    <div class=\"flex-cmd\">\n        <kendo-buttongroup look=\"flat\">\n            <button kendoButton [toggleable]=\"false\" [icon]=\"'refresh'\" (click)=\"onRefreshClicked()\">Refresh</button>\n        </kendo-buttongroup>\n    </div>\n\n</div>\n\n<div class=\"row fill\">\n\n    <div style=\"height: 98%;\">\n\n        <wc-upload-panel #installPluginSlideDownPanel [confirmationTitle]=\"'Do install plugin?'\" (upload)=\"onInstallPlugin($event)\" (uploadError)=\"onInstallPluginError($event)\">\n            <div style=\"padding-top:8px;display: flex;\">\n                <label class=\"switch-control-label\" style=\"padding-top: 0.3rem;padding-right: 10px;\"> \n                    Overwrite Existing\n                </label>\n                <p-inputSwitch [styleClass]=\"'mini-switch'\" [(ngModel)]=\"overwriteExisting\"></p-inputSwitch>\n            </div>\n        </wc-upload-panel>\n\n        <kendo-grid #datagrid [data]=\"gridData\" style=\"height: 100%;\"> \n\n                <kendo-grid-column\n                    field=\"name\" title=\"Name\" >\n                </kendo-grid-column>\n\n                <kendo-grid-column field=\"version\" title=\"Version\" width=\"150\">\n                    </kendo-grid-column>\n\n                <kendo-grid-column field=\"status\" title=\"Status\" width=\"150\">\n                        <ng-template kendoGridCellTemplate let-dataItem>\n                                <span class=\"whole-cell\" [style.color]=\"statusColorCode(dataItem)\">\n                                  {{ dataItem.status }}\n                                </span>\n                              </ng-template>\n                </kendo-grid-column>\n\n                <kendo-grid-column title=\"\" width=\"150\" minResizableWidth=\"140\">\n                    <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n                            <wc-grid-editor-command \n                                motif-acl=\"com.vipera.osgi.core.registry.api.rest.RegistryApi:DELETE:uninstallPlugin\"\n                                motif-acl-hidden=\"true\"\n                                [alignMode]=\"'end'\"\n                                [hasConfirmation]=\"true\"\n                                [confirmationTitle]=\"'Uninstall ?'\"\n                                [rowIndex]=\"rowIndex\" \n                                [columnIndex]=\"columnIndex\" \n                                [column]=\"column\" \n                                [commandIcon]=\"'wa-ico-no'\"\n                                [dataItem]=\"dataItem\"\n                                (commandConfirm)=\"onUninstallOKPressed(dataItem)\"  \n                                >\n                            </wc-grid-editor-command>\n                    </ng-template>\n                </kendo-grid-column>\n    \n    \n            </kendo-grid>\n        </div>\n\n</div>",
                styles: [":host{display:flex;flex:1;flex-direction:column}.log-pane{white-space:pre}.editor.slidedown>div>kendo-daterange>div>label,.editor.slidedown>div>label{padding-bottom:5px}"]
            }] }
];
/** @nocollapse */
PluginsSectionComponent.ctorParameters = () => [
    { type: NGXLogger },
    { type: RegistryService },
    { type: WCNotificationCenter }
];
PluginsSectionComponent.propDecorators = {
    _uninstallConfirmationDialog: [{ type: ViewChild, args: ['uninstallConfirmationDialog',] }]
};
PluginsSectionComponent = tslib_1.__decorate([
    PluginView('Plugins', {
        iconName: 'wa-ico-plugins',
        userData: {
            acl: {
                permissions: ["com.vipera.osgi.core.registry.api.rest.RegistryApi:READ:getPlugins"]
            }
        }
    }),
    tslib_1.__metadata("design:paramtypes", [NGXLogger,
        RegistryService,
        WCNotificationCenter])
], PluginsSectionComponent);
export { PluginsSectionComponent };
if (false) {
    /** @type {?} */
    PluginsSectionComponent.prototype.faPuzzlePiece;
    /** @type {?} */
    PluginsSectionComponent.prototype.data;
    /** @type {?} */
    PluginsSectionComponent.prototype.gridData;
    /** @type {?} */
    PluginsSectionComponent.prototype.loading;
    /**
     * @type {?}
     * @private
     */
    PluginsSectionComponent.prototype.filterValue;
    /**
     * @type {?}
     * @private
     */
    PluginsSectionComponent.prototype._subHandler;
    /** @type {?} */
    PluginsSectionComponent.prototype.overwriteExisting;
    /** @type {?} */
    PluginsSectionComponent.prototype._uninstallConfirmationDialog;
    /** @type {?} */
    PluginsSectionComponent.prototype.statsModel;
    /** @type {?} */
    PluginsSectionComponent.prototype.state;
    /**
     * @type {?}
     * @private
     */
    PluginsSectionComponent.prototype.logger;
    /**
     * @type {?}
     * @private
     */
    PluginsSectionComponent.prototype.registryService;
    /**
     * @type {?}
     * @private
     */
    PluginsSectionComponent.prototype.notificationCenter;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy1zZWN0aW9uLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vdGlmLXdlYi1hZG1pbi1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlY3Rpb25zL1BsdWdpbnMvY29tcG9uZW50cy9wbHVnaW5zLXNlY3Rpb24tY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBVSxNQUFNLDRDQUE0QyxDQUFDO0FBRXJGLE9BQU8sRUFBRSxPQUFPLEVBQVMsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM1RixPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJbEUsT0FBTyxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLHdDQUF3QyxDQUFDO0FBT2hELE9BQU8sRUFBRSxvQ0FBb0MsRUFBeUIsTUFBTSxvREFBb0QsQ0FBQzs7TUFHM0gsT0FBTyxHQUFHLGtCQUFrQjtJQWVyQix1QkFBdUIsU0FBdkIsdUJBQXVCOzs7Ozs7SUFrQmhDLFlBQW9CLE1BQWlCLEVBQ3pCLGVBQWdDLEVBQ2hDLGtCQUF3QztRQUZoQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ3pCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBbEJwRCxrQkFBYSxHQUFHLGFBQWEs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WC9CLHVCQUF1QjtJQVJqQyxVQUFVLENBQUMsU0FBUyxFQUFFO1FBQ3JCLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsUUFBUSxFQUFFO1lBQ04sR0FBRyxFQUFFO2dCQUNELFdBQVcsRUFBRSxDQUFDLG9FQUFvRSxDQUFDO2FBQ3RGO1NBQ0o7S0FDSixDQUFDOzZDQW1COEIsU0FBUztRQUNSLGVBQWU7UUFDWixvQkFBb0I7R0FwQjNDLHVCQUF1QixDQWdNbkM7U0FoTVksdUJBQXVCOzs7SUFFaEMsZ0RBQThCOztJQUU5Qix1Q0FBMkI7O0lBQzNCLDJDQUFnQzs7SUFDaEMsMENBQXdCOzs7OztJQUN4Qiw4Q0FBNEI7Ozs7O0lBQzVCLDhDQUF5RTs7SUFDekUsb0RBQTJCOztJQUUzQiwrREFBNkc7O0lBRTdHLDZDQUE2Qzs7SUFFN0Msd0NBQ0U7Ozs7O0lBRVUseUNBQXlCOzs7OztJQUNqQyxrREFBd0M7Ozs7O0lBQ3hDLHFEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGx1Z2luVmlldyB9IGZyb20gJ3dlYi1jb25zb2xlLWNvcmUnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IFJlZ2lzdHJ5U2VydmljZSwgUGx1Z2luIH0gZnJvbSAnQHdhLW1vdGlmLW9wZW4tYXBpL3BsdWdpbi1yZWdpc3RyeS1zZXJ2aWNlJztcbmltcG9ydCB7IFNhZmVTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgcHJvY2VzcywgU3RhdGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeSc7XG5pbXBvcnQgeyBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbW1vbnMvd2Mtc3Vic2NyaXB0aW9uLWhhbmRsZXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBXQ05vdGlmaWNhdGlvbkNlbnRlciwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJ3dlYi1jb25zb2xlLXVpLWtpdCc7XG5pbXBvcnQgeyBmYVB1enpsZVBpZWNlIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcblxuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvZGVib3VuY2VUaW1lJztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvZGlzdGluY3RVbnRpbENoYW5nZWQnO1xuXG5pbXBvcnQge1xuICAgIEdyaWREYXRhUmVzdWx0XG59IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWQnO1xuXG5pbXBvcnQgeyBXQ1N0YXRzSW5mb01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9TdGF0cy9zdGF0cy1pbmZvLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBVbmluc3RhbGxDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIFVuaW5zdGFsbERpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uL2RpYWxvZ3MvdW5pbnN0YWxsLWNvbmZpcm1hdGlvbi1kaWFsb2ctY29tcG9uZW50JztcbmltcG9ydCB7IFdDVXBsb2FkUGFuZWxFdmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuXG5jb25zdCBMT0dfVEFHID0gJ1tQbHVnaW5zU2VjdGlvbl0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1wbHVnaW5zLXNlY3Rpb24nLFxuICAgIHN0eWxlVXJsczogWyAnLi9wbHVnaW5zLXNlY3Rpb24tY29tcG9uZW50LnNjc3MnIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3BsdWdpbnMtc2VjdGlvbi1jb21wb25lbnQuaHRtbCdcbiAgfSlcbiAgQFBsdWdpblZpZXcoJ1BsdWdpbnMnLCB7XG4gICAgaWNvbk5hbWU6ICd3YS1pY28tcGx1Z2lucycsXG4gICAgdXNlckRhdGE6IHtcbiAgICAgICAgYWNsOiB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1wiY29tLnZpcGVyYS5vc2dpLmNvcmUucmVnaXN0cnkuYXBpLnJlc3QuUmVnaXN0cnlBcGk6UkVBRDpnZXRQbHVnaW5zXCJdXG4gICAgICAgIH1cbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFBsdWdpbnNTZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgZmFQdXp6bGVQaWVjZSA9IGZhUHV6emxlUGllY2U7XG5cbiAgICBwdWJsaWMgZGF0YTogQXJyYXk8UGx1Z2luPjtcbiAgICBwdWJsaWMgZ3JpZERhdGE6IEdyaWREYXRhUmVzdWx0OyAvLyA9IHByb2Nlc3Moc2FtcGxlUHJvZHVjdHMsIHRoaXMuc3RhdGUpO1xuICAgIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmlsdGVyVmFsdWU6IHN0cmluZztcbiAgICBwcml2YXRlIF9zdWJIYW5kbGVyOiBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgPSBuZXcgV0NTdWJzY3JpcHRpb25IYW5kbGVyKCk7XG4gICAgb3ZlcndyaXRlRXhpc3Rpbmc6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkKCd1bmluc3RhbGxDb25maXJtYXRpb25EaWFsb2cnKSBfdW5pbnN0YWxsQ29uZmlybWF0aW9uRGlhbG9nOiBVbmluc3RhbGxDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQ7XG5cbiAgICBzdGF0c01vZGVsOiBXQ1N0YXRzSW5mb01vZGVsID0geyBpdGVtczogW10gfTtcblxuICAgIHB1YmxpYyBzdGF0ZTogU3RhdGUgPSB7XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgICAgIHByaXZhdGUgcmVnaXN0cnlTZXJ2aWNlOiBSZWdpc3RyeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbm90aWZpY2F0aW9uQ2VudGVyOiBXQ05vdGlmaWNhdGlvbkNlbnRlcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ09wZW5pbmcuLi4nKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgbmdPbkluaXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdJbml0aWFsaXppbmcuLi4nKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ25nT25EZXN0cm95ICcpO1xuICAgICAgICB0aGlzLmZyZWVNZW0oKTtcbiAgICB9XG5cbiAgICBmcmVlTWVtKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmdyaWREYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlci51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZWZyZXNoQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdSZWZyZXNoIGNsaWNrZWQnKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoRGF0YSgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdyZWZyZXNoRGF0YSBjYWxsZWQuJyk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMucmVnaXN0cnlTZXJ2aWNlLmdldFBsdWdpbnModHJ1ZSwgJ1JFR0lTVEVSRUQnKS5zdWJzY3JpYmUoKGRhdGE6IEFycmF5PFBsdWdpbj4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhKCk7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRTdGF0c0luZm8oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWZyZXNoRGF0YTogXCIsIGRhdGEpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGF0c0luZm8oKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoXCJyZWZyZXNoRGF0YSBlcnJvcjogXCIsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBwcm9jZXNzKFtdLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhclN0YXRzSW5mbygpe1xuICAgICAgICB0aGlzLnN0YXRzTW9kZWwgPSB7IGl0ZW1zOiBbXSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVidWlsZFN0YXRzSW5mbygpe1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBfLnN1bUJ5KFxuICAgICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgICAgKHsgc3RhdHVzIH0pID0+IE51bWJlcihzdGF0dXMgPT09IFwiQUNUSVZFXCIpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluYWN0aXZlID0gXy5zdW1CeShcbiAgICAgICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgICAgICh7IHN0YXR1cyB9KSA9PiBOdW1iZXIoc3RhdHVzID09PSBcIlJFU09MVkVEXCIpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluRXJyb3IgPSBfLnN1bUJ5KFxuICAgICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgICAgKHsgc3RhdHVzIH0pID0+IE51bWJlcihzdGF0dXMgPT09IFwiSU5TVEFMTEVEXCIpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RhdHNNb2RlbCA9IHsgLy9jc3NDbGFzczpcImdyZWVuLXN0YXRzLWluZm9cIlxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcImFjdGl2ZVwiLCB2YWx1ZTogYWN0aXZlLCBjc3NDbGFzczpcInN0YXRzLWluZm8tcHJpbWFyeVwiIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogXCJpbmFjdGl2ZVwiLCB2YWx1ZTogaW5hY3RpdmUsIGNzc0NsYXNzOlwic3RhdHMtaW5mby1kZWZhdWx0XCIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcImluIGVycm9yXCIsIHZhbHVlOiBpbkVycm9yLCBjc3NDbGFzczpcInN0YXRzLWluZm8ta29cIiB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXR1c0NvbG9yQ29kZShwbHVnaW46IFBsdWdpbik6IFNhZmVTdHlsZSB7XG4gICAgICAgIGlmIChwbHVnaW4uc3RhdHVzID09PSAnQUNUSVZFJykge1xuICAgICAgICAgICAgcmV0dXJuICcjMWFiMzFhJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnaW5oZXJpdCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZmlsdGVyVmFsdWUgPSBldmVudC5zcmNFbGVtZW50Wyd2YWx1ZSddO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwbGF5RGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdkaXNwbGF5RGF0YSBjYWxsZWQuJyk7XG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGE7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBfLmZpbHRlcih0aGlzLmRhdGEsIChvKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMuYnVpbGRSZWdFeHAodGhpcy5maWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIudGVzdChvLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3MoZmlsdGVyZWREYXRhLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkUmVnRXhwKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHdpbGRjYXJkZWQgPSAnKicgKyBmaWx0ZXIgKyAnKic7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKCdeJyArIHdpbGRjYXJkZWQuc3BsaXQoJyonKS5qb2luKCcuKicpICsgJyQnKTtcbiAgICB9XG5cbiAgICBvblVuaW5zdGFsbE9LUHJlc3NlZChldmVudCl7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25Vbmluc3RhbGxPS1ByZXNzZWQgcHJlc3NlZCBmb3I6ICcsIGV2ZW50KTtcbiAgICAgICAgbGV0IHBsdWdpbk5hbWUgPSBldmVudC5uYW1lO1xuICAgICAgICBsZXQgdmVyc2lvbiA9IGV2ZW50LnZlcnNpb247XG4gICAgICAgIHRoaXMuX3VuaW5zdGFsbENvbmZpcm1hdGlvbkRpYWxvZy5zaG93KHBsdWdpbk5hbWUsIHZlcnNpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkb1VuaW5zdGFsbFBsdWdpbihwbHVnaW5OYW1lOnN0cmluZywgZGVsZXRlQ29uZmlnOmJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdkb1VuaW5zdGFsbFBsdWdpbiBjYWxsZWQgZm9yOicsIHBsdWdpbk5hbWUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLnJlZ2lzdHJ5U2VydmljZS51bmluc3RhbGxQbHVnaW4ocGx1Z2luTmFtZSwgeyByZW1vdmVDb25maWc6IHRydWUgfSkuc3Vic2NyaWJlKChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhKCk7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRTdGF0c0luZm8oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOyAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVmcmVzaERhdGE6IFwiLCBkYXRhKTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gcHJvY2VzcyhbXSwgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9uVW5pbnN0YWxsQ29uZmlybWVkKGV2ZW50OiBVbmluc3RhbGxEaWFsb2dSZXN1bHQpe1xuICAgICAgICB0aGlzLmRvVW5pbnN0YWxsUGx1Z2luKGV2ZW50LnBsdWdpbk5hbWUsIGV2ZW50LmRlbGV0ZUNvbmZpZyk7XG4gICAgfVxuXG5cbiAgICBvbkluc3RhbGxQbHVnaW4oZXZlbnQ6IFdDVXBsb2FkUGFuZWxFdmVudCl7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25JbnN0YWxsUGx1Z2luIGV2ZW50OicsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFBsdWdpbicsXG4gICAgICAgICAgICB0aXRsZTogJ1BsdWdpbiBJbnN0YWxsJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnN0YWxsaW5nIHBsdWdpbi4uLicsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkluZm9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMucmVnaXN0cnlTZXJ2aWNlLmluc3RhbGxQbHVnaW4oZXZlbnQuZmlsZSwgdGhpcy5vdmVyd3JpdGVFeGlzdGluZykuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKExPR19UQUcgLCAnUGx1Z2luIGluc3RhbGxhdGlvbiBkb25lOicsIGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxQbHVnaW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnUGx1Z2luIEluc3RhbGwnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQbHVnaW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHLCAnSW1wb3J0IGxpY2Vuc2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxQbHVnaW5FcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdQbHVnaW4gSW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGluc3RhbGxpbmcgcGx1Z2luOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7ICAgIFxuICAgIH0gXG4gICAgXG4gICAgb25JbnN0YWxsUGx1Z2luRXJyb3IoZXJyb3Ipe1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHICwgJ29uSW5zdGFsbFBsdWdpbkVycm9yIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFBsdWdpbkVycm9yJyxcbiAgICAgICAgICAgIHRpdGxlOiAnSW5zdGFsbCBQbHVnaW4nLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGluc3RhbGxpbmcgcGx1Z2luOicsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG4iXX0=