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

vipera-npm-registry / motif-web-admin-core   js

Repository URL to install this package:

Version: 0.3.1 

/ esm2015 / lib / sections / MainDashboard / components / main-dashboard-section-component.js

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { UsersInfoUpdater } from './../data/updaters/UsersInfoUpdater';
import { Component } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { Gridster } from 'web-console-ui-kit';
import { SecurityService } from '@wa-motif-open-api/security-service';
import { InfoService } from '@wa-motif-open-api/info-service';
import { ServerStatusUpdater } from '../data/updaters/ServerInfo/ServerStatusUpdater';
import { ServerInfoUpdater } from '../data/updaters/ServerInfo/ServerInfoUpdater';
import { OAuth2InfoUpdater } from '../data/updaters/OAuth2InfoUpdater';
/** @type {?} */
const LOG_TAG = '[MainDashboardSectionComponent]';
let MainDashboardSectionComponent = class MainDashboardSectionComponent {
    /**
     * @param {?} logger
     * @param {?} securityService
     * @param {?} infoService
     */
    constructor(logger, securityService, infoService) {
        this.logger = logger;
        this.securityService = securityService;
        this.infoService = infoService;
        this.motifServerInstanceNameItem = { cols: 8, rows: 2, y: 0, x: 0 };
        this.motifServerInstanceItem = { cols: 8, rows: 3, y: 2, x: 0 };
        this.processLoadGaugeItem = { cols: 3, rows: 3, y: 0, x: 8 };
        this.cpuLoadGaugeItem = { cols: 3, rows: 3, y: 0, x: 11 };
        this.memoryInfoGaugeItem = { cols: 3, rows: 3, y: 2, x: 8 };
        this.memoryInfoItem = { cols: 3, rows: 2, y: 2, x: 8 };
        this.usersInfoItem = { cols: 3, rows: 5, y: 0, x: 14 };
        this.oauth2InfoItem = { cols: 3, rows: 2, y: 0, x: 0 };
        this.diskInfoGaugeItem = { cols: 3, rows: 3, y: 2, x: 8 };
        this.logger.debug(LOG_TAG, 'Opening...');
        this.options = {
            itemChangeCallback: this.itemChange,
            itemResizeCallback: this.itemResize,
            gridType: Gridster.GridType.Fixed,
            compactType: Gridster.CompactType.None,
            draggable: {
                enabled: true
            },
            resizable: {
                enabled: true,
            },
            displayGrid: 'onDrag&Resize',
            minCols: 3,
            maxCols: 100,
            minRows: 3,
            maxRows: 100,
            maxItemCols: 100,
            minItemCols: 1,
            maxItemRows: 100,
            minItemRows: 1,
            maxItemArea: 2500,
            minItemArea: 1,
            defaultItemCols: 1,
            defaultItemRows: 1,
            fixedColWidth: 70,
            fixedRowHeight: 70
        };
    }
    /**
     * Angular ngOnInit
     * @return {?}
     */
    ngOnInit() {
        this.logger.debug(LOG_TAG, 'Initializing...');
        this.statusUpdater = new ServerStatusUpdater(this.logger, this.infoService);
        this.statusUpdater.start(4 * 1000);
        this.infoUpdater = new ServerInfoUpdater(this.logger, this.infoService);
        this.infoUpdater.start(60 * 1000);
        this.usersInfoUpdater = new UsersInfoUpdater(this.logger, this.infoService);
        this.usersInfoUpdater.start(30 * 1000);
        this.oauth2InfoUpdater = new OAuth2InfoUpdater(this.logger, this.infoService);
        this.oauth2InfoUpdater.start(5 * 1000);
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this.logger.debug(LOG_TAG, 'ngOnDestroy ');
        this.freeMem();
    }
    /**
     * @return {?}
     */
    freeMem() {
        this.statusUpdater.stop();
        this.infoUpdater.stop();
        this.usersInfoUpdater.stop();
        this.oauth2InfoUpdater.stop();
    }
    /**
     * @private
     * @param {?} item
     * @param {?} itemComponent
     * @return {?}
     */
    itemChange(item, itemComponent) {
        console.info('itemChanged', item, itemComponent);
    }
    /**
     * @private
     * @param {?} item
     * @param {?} itemComponent
     * @return {?}
     */
    itemResize(item, itemComponent) {
        console.info('itemResized', item, itemComponent);
    }
    /**
     * @return {?}
     */
    get serverStatus() {
        return this.statusUpdater.data;
    }
    /**
     * @return {?}
     */
    get serverInfo() {
        return this.infoUpdater.data;
    }
    /**
     * @return {?}
     */
    get usersInfo() {
        return this.usersInfoUpdater.data;
    }
    /**
     * @return {?}
     */
    get oauth2Info() {
        return this.oauth2InfoUpdater.data;
    }
};
MainDashboardSectionComponent.decorators = [
    { type: Component, args: [{
                selector: 'main-dashboard-section',
                template: "<wc-dashboard-header [title]=\"'Dashboard'\"></wc-dashboard-header>\n\n<div class=\"row fill\">\n\n    <gridster [options]=\"options\">\n\n        <gridster-item [item]=\"motifServerInstanceItem\">\n            <wc-panel [title]=\"'MOTIF Instance'\">\n                <wa-server-info-widget-panel></wa-server-info-widget-panel>\n            </wc-panel>\n        </gridster-item>\n\n        <gridster-item [item]=\"motifServerInstanceItem\">\n            <wc-panel [title]=\"'Current MOTIF Instance'\">\n                <wc-data-counter\n                    [class]=\"'serverInstanceInfo'\" \n                    [title]=\"serverInfo ? serverInfo.motifVersion : 'N/A'\" \n                    [value]=\"serverInfo ? serverInfo.instanceName : 'N/A'\"></wc-data-counter>\n            </wc-panel>\n        </gridster-item>\n\n        <gridster-item [item]=\"processLoadGaugeItem\">\n                <wc-panel [title]=\"'Process CPU Usage'\">\n                    <ngx-gauge [type]=\"'semi'\" \n                        [value]=\"serverStatus.processLoadPerc\" \n                        [label]=\"''\"  \n                        [append]=\"'%'\"\n                        [thick]=\"10\"\n                        [foregroundColor]=\"'#fc0'\"\n                        [cap]=\"'flat'\">\n                    </ngx-gauge>\n                </wc-panel>\n        </gridster-item>\n    \n        <gridster-item [item]=\"cpuLoadGaugeItem\">\n                <wc-panel [title]=\"'System CPU Load'\">\n                    <ngx-gauge [type]=\"'semi'\" \n                        [value]=\"serverStatus.systemLoadPerc\" \n                        [label]=\"''\"  \n                        [append]=\"'%'\"\n                        [thick]=\"10\"\n                        [foregroundColor]=\"'#fc0'\"\n                        [cap]=\"'flat'\">\n                    </ngx-gauge>\n                </wc-panel>\n        </gridster-item>\n\n        <gridster-item [item]=\"memoryInfoGaugeItem\">\n                <wc-panel [title]=\"'Memory - Used Heap'\">\n                    <ngx-gauge [type]=\"'semi'\" \n                        [value]=\"serverStatus.memoryUsage.heapUsedPerc\" \n                        [label]=\"''\"  \n                        [append]=\"'%'\"\n                        [thick]=\"10\"\n                        [foregroundColor]=\"'#fc0'\"\n                        [cap]=\"'flat'\">\n                    </ngx-gauge>\n                </wc-panel>\n        </gridster-item>\n\n        <gridster-item [item]=\"diskInfoGaugeItem\">\n                <wc-panel [title]=\"'Disk - Space Used'\">\n                    <ngx-gauge [type]=\"'semi'\" \n                        [value]=\"serverStatus.diskUsage.diskUsedPerc\" \n                        [label]=\"''\"  \n                        [append]=\"'%'\"\n                        [thick]=\"10\"\n                        [foregroundColor]=\"'#fc0'\"\n                        [cap]=\"'flat'\">\n                    </ngx-gauge>\n                </wc-panel>\n        </gridster-item>\n\n        <gridster-item [item]=\"memoryInfoItem\">\n                <wc-panel [title]=\"'Memory Info'\">\n                    <wa-memory-info-widget-panel [serverStatus]=\"serverStatus\" ></wa-memory-info-widget-panel>\n                </wc-panel>\n        </gridster-item>\n\n        <gridster-item [item]=\"usersInfoItem\">\n                <wc-panel [title]=\"'Users'\">\n                        <wa-users-info-widget-panel [usersInfo]=\"usersInfo\"></wa-users-info-widget-panel>\n                </wc-panel>\n        </gridster-item>\n        \n        <gridster-item [item]=\"oauth2InfoItem\">\n            <wc-panel [title]=\"'OAUTH2'\">\n                <wa-oauth2-info-widget-panel [oauth2Info]=\"oauth2Info\"></wa-oauth2-info-widget-panel>\n            </wc-panel>\n         </gridster-item>\n\n\n    </gridster>\n\n</div>\n",
                styles: [":host{display:flex;flex:1;flex-direction:column}.dashboard-item-label{text-align:center;padding:4px}.dashboard-item-label-primary{font-size:1rem}.dashboard-item-label-secondary{font-size:.8rem}wc-panel .serverInstanceInfo.counter .value{font-size:3rem!important;padding-bottom:20px!important}"]
            }] }
];
/** @nocollapse */
MainDashboardSectionComponent.ctorParameters = () => [
    { type: NGXLogger },
    { type: SecurityService },
    { type: InfoService }
];
MainDashboardSectionComponent = tslib_1.__decorate([
    PluginView('Dashboard', {
        iconName: 'wa-ico-dashboard',
        index: 10,
        userData: {
            acl: {
                permissions: ['com.vipera.osgi.foundation.scheduler.api.rest.InfoApiServiceRestApi:READ:getUsersInfo',
                    'com.vipera.osgi.foundation.scheduler.api.rest.InfoApiServiceRestApi:READ:getSessionsInfo',
                    'com.vipera.osgi.foundation.scheduler.api.rest.InfoApiServiceRestApi:READ:getServerStatus',
                    'com.vipera.osgi.foundation.scheduler.api.rest.InfoApiServiceRestApi:READ:getServerInfo',
                    'com.vipera.osgi.foundation.scheduler.api.rest.InfoApiServiceRestApi:READ:getOAuth2Info',
                    'com.vipera.osgi.foundation.scheduler.api.rest.InfoApiServiceRestApi:READ:getChannelInfo']
            }
        }
    }),
    tslib_1.__metadata("design:paramtypes", [NGXLogger,
        SecurityService,
        InfoService])
], MainDashboardSectionComponent);
export { MainDashboardSectionComponent };
if (false) {
    /** @type {?} */
    MainDashboardSectionComponent.prototype.model;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.options;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.statusUpdater;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.infoUpdater;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.usersInfoUpdater;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.oauth2InfoUpdater;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.refreshInterval;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.motifServerInstanceNameItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.motifServerInstanceItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.processLoadGaugeItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.cpuLoadGaugeItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.memoryInfoGaugeItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.memoryInfoItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.usersInfoItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.oauth2InfoItem;
    /** @type {?} */
    MainDashboardSectionComponent.prototype.diskInfoGaugeItem;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.logger;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.securityService;
    /**
     * @type {?}
     * @private
     */
    MainDashboardSectionComponent.prototype.infoService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1kYXNoYm9hcmQtc2VjdGlvbi1jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tb3RpZi13ZWItYWRtaW4tY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zZWN0aW9ucy9NYWluRGFzaGJvYXJkL2NvbXBvbmVudHMvbWFpbi1kYXNoYm9hcmQtc2VjdGlvbi1jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUd2RSxPQUFPLEVBQUUsU0FBUyxFQUFnQyxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFXLE1BQU0scUNBQXFDLENBQUE7QUFFOUUsT0FBTyxFQUFFLFdBQVcsRUFBbUQsTUFBTSxpQ0FBaUMsQ0FBQTtBQUM5RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUN0RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7TUFFakUsT0FBTyxHQUFHLGlDQUFpQztJQXNCcEMsNkJBQTZCLFNBQTdCLDZCQUE2Qjs7Ozs7O0lBYXRDLFlBQW9CLE1BQWlCLEVBQ3pCLGVBQWdDLEVBQ2hDLFdBQXdCO1FBRmhCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDekIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBa0NwQyxnQ0FBMkIsR0FBeUIsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FB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Z0VBQStFOztJQUMvRSw2REFBNEU7O0lBQzVFLHlEQUF5RTs7SUFDekUsNERBQTRFOztJQUM1RSx1REFBdUU7O0lBQ3ZFLHNEQUF1RTs7SUFDdkUsdURBQXVFOztJQUN2RSwwREFBMEU7Ozs7O0lBNUM5RCwrQ0FBeUI7Ozs7O0lBQ2pDLHdEQUF3Qzs7Ozs7SUFDeEMsb0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXNlcnNJbmZvVXBkYXRlciB9IGZyb20gJy4vLi4vZGF0YS91cGRhdGVycy9Vc2Vyc0luZm9VcGRhdGVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTW9kZWwgfSBmcm9tICcuLy4uL2RhdGEvZGFzaGJvYXJkLW1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGx1Z2luVmlldyB9IGZyb20gJ3dlYi1jb25zb2xlLWNvcmUnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IEdyaWRzdGVyIH0gZnJvbSAnd2ViLWNvbnNvbGUtdWkta2l0J1xuaW1wb3J0IHsgU2VjdXJpdHlTZXJ2aWNlLCBTZXNzaW9uIH0gZnJvbSAnQHdhLW1vdGlmLW9wZW4tYXBpL3NlY3VyaXR5LXNlcnZpY2UnXG5pbXBvcnQgeyBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5mb1NlcnZpY2UsIFNlcnZlckluZm8sIFNlcnZlclN0YXR1cywgVXNlcnNJbmZvLCBPQXV0aDJJbmZvIH0gZnJvbSAnQHdhLW1vdGlmLW9wZW4tYXBpL2luZm8tc2VydmljZSdcbmltcG9ydCB7IFNlcnZlclN0YXR1c1VwZGF0ZXIgfSBmcm9tICcuLi9kYXRhL3VwZGF0ZXJzL1NlcnZlckluZm8vU2VydmVyU3RhdHVzVXBkYXRlcic7XG5pbXBvcnQgeyBTZXJ2ZXJJbmZvVXBkYXRlciB9IGZyb20gJy4uL2RhdGEvdXBkYXRlcnMvU2VydmVySW5mby9TZXJ2ZXJJbmZvVXBkYXRlcic7XG5pbXBvcnQgeyBPQXV0aDJJbmZvVXBkYXRlciB9IGZyb20gJy4uL2RhdGEvdXBkYXRlcnMvT0F1dGgySW5mb1VwZGF0ZXInO1xuXG5jb25zdCBMT0dfVEFHID0gJ1tNYWluRGFzaGJvYXJkU2VjdGlvbkNvbXBvbmVudF0nO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbWFpbi1kYXNoYm9hcmQtc2VjdGlvbicsXG4gICAgc3R5bGVVcmxzOiBbICcuL21haW4tZGFzaGJvYXJkLXNlY3Rpb24tY29tcG9uZW50LnNjc3MnIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL21haW4tZGFzaGJvYXJkLXNlY3Rpb24tY29tcG9uZW50Lmh0bWwnXG4gIH0pXG4gIEBQbHVnaW5WaWV3KCdEYXNoYm9hcmQnLCB7XG4gICAgaWNvbk5hbWU6ICd3YS1pY28tZGFzaGJvYXJkJyxcbiAgICBpbmRleDogMTAsXG4gICAgdXNlckRhdGE6IHtcbiAgICAgICAgYWNsOiB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uczogWydjb20udmlwZXJhLm9zZ2kuZm91bmRhdGlvbi5zY2hlZHVsZXIuYXBpLnJlc3QuSW5mb0FwaVNlcnZpY2VSZXN0QXBpOlJFQUQ6Z2V0VXNlcnNJbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbS52aXBlcmEub3NnaS5mb3VuZGF0aW9uLnNjaGVkdWxlci5hcGkucmVzdC5JbmZvQXBpU2VydmljZVJlc3RBcGk6UkVBRDpnZXRTZXNzaW9uc0luZm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmZvdW5kYXRpb24uc2NoZWR1bGVyLmFwaS5yZXN0LkluZm9BcGlTZXJ2aWNlUmVzdEFwaTpSRUFEOmdldFNlcnZlclN0YXR1cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuZm91bmRhdGlvbi5zY2hlZHVsZXIuYXBpLnJlc3QuSW5mb0FwaVNlcnZpY2VSZXN0QXBpOlJFQUQ6Z2V0U2VydmVySW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuZm91bmRhdGlvbi5zY2hlZHVsZXIuYXBpLnJlc3QuSW5mb0FwaVNlcnZpY2VSZXN0QXBpOlJFQUQ6Z2V0T0F1dGgySW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuZm91bmRhdGlvbi5zY2hlZHVsZXIuYXBpLnJlc3QuSW5mb0FwaVNlcnZpY2VSZXN0QXBpOlJFQUQ6Z2V0Q2hhbm5lbEluZm8nXVxuICAgICAgICB9XG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBNYWluRGFzaGJvYXJkU2VjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIG1vZGVsOiBEYXNoYm9hcmRNb2RlbDtcblxuICAgIG9wdGlvbnM6IEdyaWRzdGVyLkdyaWRzdGVyQ29uZmlnO1xuXG4gICAgcHJpdmF0ZSBzdGF0dXNVcGRhdGVyOlNlcnZlclN0YXR1c1VwZGF0ZXI7XG4gICAgcHJpdmF0ZSBpbmZvVXBkYXRlcjpTZXJ2ZXJJbmZvVXBkYXRlcjtcbiAgICBwcml2YXRlIHVzZXJzSW5mb1VwZGF0ZXI6IFVzZXJzSW5mb1VwZGF0ZXI7XG4gICAgcHJpdmF0ZSBvYXV0aDJJbmZvVXBkYXRlcjogT0F1dGgySW5mb1VwZGF0ZXI7XG5cbiAgICBwcml2YXRlIHJlZnJlc2hJbnRlcnZhbDogYW55O1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgICAgIHByaXZhdGUgc2VjdXJpdHlTZXJ2aWNlOiBTZWN1cml0eVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgaW5mb1NlcnZpY2U6IEluZm9TZXJ2aWNlXG4gICAgICAgICkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ09wZW5pbmcuLi4nKTtcbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBpdGVtQ2hhbmdlQ2FsbGJhY2s6IHRoaXMuaXRlbUNoYW5nZSxcbiAgICAgICAgICAgIGl0ZW1SZXNpemVDYWxsYmFjazogdGhpcy5pdGVtUmVzaXplLFxuICAgICAgICAgICAgZ3JpZFR5cGU6IEdyaWRzdGVyLkdyaWRUeXBlLkZpeGVkLFxuICAgICAgICAgICAgY29tcGFjdFR5cGU6IEdyaWRzdGVyLkNvbXBhY3RUeXBlLk5vbmUsXG4gICAgICAgICAgICBkcmFnZ2FibGU6IHtcbiAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc2l6YWJsZToge1xuICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXlHcmlkOiAnb25EcmFnJlJlc2l6ZScsXG4gICAgICAgICAgICBtaW5Db2xzOiAzLFxuICAgICAgICAgICAgbWF4Q29sczogMTAwLFxuICAgICAgICAgICAgbWluUm93czogMyxcbiAgICAgICAgICAgIG1heFJvd3M6IDEwMCxcbiAgICAgICAgICAgIG1heEl0ZW1Db2xzOiAxMDAsXG4gICAgICAgICAgICBtaW5JdGVtQ29sczogMSxcbiAgICAgICAgICAgIG1heEl0ZW1Sb3dzOiAxMDAsXG4gICAgICAgICAgICBtaW5JdGVtUm93czogMSxcbiAgICAgICAgICAgIG1heEl0ZW1BcmVhOiAyNTAwLFxuICAgICAgICAgICAgbWluSXRlbUFyZWE6IDEsXG4gICAgICAgICAgICBkZWZhdWx0SXRlbUNvbHM6IDEsXG4gICAgICAgICAgICBkZWZhdWx0SXRlbVJvd3M6IDEsXG4gICAgICAgICAgICBmaXhlZENvbFdpZHRoOiA3MCxcbiAgICAgICAgICAgIGZpeGVkUm93SGVpZ2h0OiA3MFxuICAgICAgICAgIH07XG4gICAgfVxuXG4gICAgbW90aWZTZXJ2ZXJJbnN0YW5jZU5hbWVJdGVtOkdyaWRzdGVyLkdyaWRzdGVySXRlbSA9IHtjb2xzOiA4LCByb3dzOiAyLCB5OiAwLCB4OiAwfTtcbiAgICBtb3RpZlNlcnZlckluc3RhbmNlSXRlbTpHcmlkc3Rlci5Hcmlkc3Rlckl0ZW0gPSB7Y29sczogOCwgcm93czogMywgeTogMiwgeDogMH07XG4gICAgcHJvY2Vzc0xvYWRHYXVnZUl0ZW06R3JpZHN0ZXIuR3JpZHN0ZXJJdGVtID0ge2NvbHM6IDMsIHJvd3M6IDMsIHk6IDAsIHg6IDh9O1xuICAgIGNwdUxvYWRHYXVnZUl0ZW06R3JpZHN0ZXIuR3JpZHN0ZXJJdGVtID0ge2NvbHM6IDMsIHJvd3M6IDMsIHk6IDAsIHg6IDExfTtcbiAgICBtZW1vcnlJbmZvR2F1Z2VJdGVtOkdyaWRzdGVyLkdyaWRzdGVySXRlbSA9IHtjb2xzOiAzLCByb3dzOiAzLCB5OiAyLCB4OiA4IH07XG4gICAgbWVtb3J5SW5mb0l0ZW06R3JpZHN0ZXIuR3JpZHN0ZXJJdGVtID0ge2NvbHM6IDMsIHJvd3M6IDIsIHk6IDIsIHg6IDggfTtcbiAgICB1c2Vyc0luZm9JdGVtOkdyaWRzdGVyLkdyaWRzdGVySXRlbSA9IHtjb2xzOiAzLCByb3dzOiA1LCB5OiAwLCB4OiAxNCB9O1xuICAgIG9hdXRoMkluZm9JdGVtOkdyaWRzdGVyLkdyaWRzdGVySXRlbSA9IHtjb2xzOiAzLCByb3dzOiAyLCB5OiAwLCB4OiAwIH07XG4gICAgZGlza0luZm9HYXVnZUl0ZW06R3JpZHN0ZXIuR3JpZHN0ZXJJdGVtID0ge2NvbHM6IDMsIHJvd3M6IDMsIHk6IDIsIHg6IDggfTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBBbmd1bGFyIG5nT25Jbml0XG4gICAgICovXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnSW5pdGlhbGl6aW5nLi4uJyk7XG4gICAgICAgIHRoaXMuc3RhdHVzVXBkYXRlciA9IG5ldyBTZXJ2ZXJTdGF0dXNVcGRhdGVyKHRoaXMubG9nZ2VyLCB0aGlzLmluZm9TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5zdGF0dXNVcGRhdGVyLnN0YXJ0KDQgKiAxMDAwKTtcblxuICAgICAgICB0aGlzLmluZm9VcGRhdGVyID0gbmV3IFNlcnZlckluZm9VcGRhdGVyKHRoaXMubG9nZ2VyLCB0aGlzLmluZm9TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5pbmZvVXBkYXRlci5zdGFydCg2MCAqIDEwMDApO1xuXG4gICAgICAgIHRoaXMudXNlcnNJbmZvVXBkYXRlciA9ICBuZXcgVXNlcnNJbmZvVXBkYXRlcih0aGlzLmxvZ2dlciwgdGhpcy5pbmZvU2VydmljZSk7XG4gICAgICAgIHRoaXMudXNlcnNJbmZvVXBkYXRlci5zdGFydCgzMCAqIDEwMDApO1xuXG4gICAgICAgIHRoaXMub2F1dGgySW5mb1VwZGF0ZXIgPSBuZXcgT0F1dGgySW5mb1VwZGF0ZXIodGhpcy5sb2dnZXIsIHRoaXMuaW5mb1NlcnZpY2UpO1xuICAgICAgICB0aGlzLm9hdXRoMkluZm9VcGRhdGVyLnN0YXJ0KDUgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICduZ09uRGVzdHJveSAnKTtcbiAgICAgICAgdGhpcy5mcmVlTWVtKCk7XG4gICAgfVxuXG4gICAgZnJlZU1lbSgpIHtcbiAgICAgICAgdGhpcy5zdGF0dXNVcGRhdGVyLnN0b3AoKTtcbiAgICAgICAgdGhpcy5pbmZvVXBkYXRlci5zdG9wKCk7XG4gICAgICAgIHRoaXMudXNlcnNJbmZvVXBkYXRlci5zdG9wKCk7XG4gICAgICAgIHRoaXMub2F1dGgySW5mb1VwZGF0ZXIuc3RvcCgpO1xuICAgICAgfVxuXG5cbiAgICBwcml2YXRlIGl0ZW1DaGFuZ2UoaXRlbSwgaXRlbUNvbXBvbmVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ2l0ZW1DaGFuZ2VkJywgaXRlbSwgaXRlbUNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpdGVtUmVzaXplKGl0ZW0sIGl0ZW1Db21wb25lbnQpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdpdGVtUmVzaXplZCcsIGl0ZW0sIGl0ZW1Db21wb25lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VydmVyU3RhdHVzKCk6IGFueSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXNVcGRhdGVyLmRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZXJ2ZXJJbmZvKCk6IGFueSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmZvVXBkYXRlci5kYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlcnNJbmZvKCk6IFVzZXJzSW5mbyB7XG4gICAgICByZXR1cm4gdGhpcy51c2Vyc0luZm9VcGRhdGVyLmRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvYXV0aDJJbmZvKCk6IE9BdXRoMkluZm8ge1xuICAgICAgcmV0dXJuIHRoaXMub2F1dGgySW5mb1VwZGF0ZXIuZGF0YTtcbiAgICB9IFxuXG59XG4iXX0=