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 

/ esm5 / lib / services / ServiceCatalogService.js

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { DomainsService, ApplicationsService, } from '@wa-motif-open-api/platform-service';
import { ServicesService, OperationsService } from '@wa-motif-open-api/catalog-service';
import { ApplicationsService as AppService } from '@wa-motif-open-api/catalog-service';
import { Observable } from 'rxjs';
import { NGXLogger } from 'web-console-core';
/** @type {?} */
var LOG_TAG = '[ServiceCatalogService]';
var ServiceCatalogService = /** @class */ (function () {
    function ServiceCatalogService(domainService, applicationService, appService, servicesService, operationsService, logger) {
        this.domainService = domainService;
        this.applicationService = applicationService;
        this.appService = appService;
        this.servicesService = servicesService;
        this.operationsService = operationsService;
        this.logger = logger;
    }
    /**
     * Returns a JSON with the Service Catalog Structure
     */
    /**
     * Returns a JSON with the Service Catalog Structure
     * @return {?}
     */
    ServiceCatalogService.prototype.getServiceCatalog = /**
     * Returns a JSON with the Service Catalog Structure
     * @return {?}
     */
    function () {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'getServiceCatalog called');
            /** @type {?} */
            var serviceCatalog = [];
            _this.domainService.getDomains().subscribe((/**
             * @param {?} domains
             * @return {?}
             */
            function (domains) {
                var e_1, _a;
                /** @type {?} */
                var domainsCount = domains.length;
                /** @type {?} */
                var processedDomains = 0;
                var _loop_1 = function (domain) {
                    /** @type {?} */
                    var domainInfo = domain;
                    domainInfo.applications = [];
                    serviceCatalog.push(domainInfo);
                    _this.applicationService.getApplications(domain.name).subscribe((/**
                     * @param {?} applications
                     * @return {?}
                     */
                    function (applications) {
                        var e_2, _a;
                        /** @type {?} */
                        var appCount = applications.length;
                        /** @type {?} */
                        var processedApps = 0;
                        if (appCount === 0) {
                            processedDomains++;
                            if (processedDomains === domainsCount) {
                                observer.next(serviceCatalog);
                                observer.complete();
                                _this.logger.debug(LOG_TAG, 'getServiceCatalog completed');
                            }
                        }
                        var _loop_2 = function (application) {
                            /** @type {?} */
                            var applicationInfo = application;
                            _this.appService.getServiceList(domain.name, application.name).subscribe((/**
                             * @param {?} services
                             * @return {?}
                             */
                            function (services) {
                                applicationInfo.services = services;
                                // tslint:disable-next-line:max-line-length
                                _this.logger.debug(LOG_TAG, 'getServiceCatalog services[' + application.name + '@' + domain.name + ']:', services);
                            }), (/**
                             * @param {?} error
                             * @return {?}
                             */
                            function (error) {
                                _this.logger.error(LOG_TAG, 'getServiceCatalog error:', error);
                                observer.error(error);
                            }), (/**
                             * @return {?}
                             */
                            function () {
                                processedApps++;
                                if (processedApps === appCount) {
                                    processedDomains++;
                                }
                                if (processedDomains === domainsCount) {
                                    observer.next(serviceCatalog);
                                    observer.complete();
                                    _this.logger.debug(LOG_TAG, 'getServiceCatalog completed');
                                }
                            }));
                            domainInfo.applications.push(applicationInfo);
                        };
                        try {
                            for (var applications_1 = tslib_1.__values(applications), applications_1_1 = applications_1.next(); !applications_1_1.done; applications_1_1 = applications_1.next()) {
                                var application = applications_1_1.value;
                                _loop_2(application);
                            }
                        }
                        catch (e_2_1) { e_2 = { error: e_2_1 }; }
                        finally {
                            try {
                                if (applications_1_1 && !applications_1_1.done && (_a = applications_1.return)) _a.call(applications_1);
                            }
                            finally { if (e_2) throw e_2.error; }
                        }
                    }), (/**
                     * @param {?} error
                     * @return {?}
                     */
                    function (error) {
                        _this.logger.error(LOG_TAG, 'getServiceCatalog error:', error);
                        observer.error(error);
                    }));
                    if (processedDomains === domainsCount) {
                        observer.next(serviceCatalog);
                        observer.complete();
                        _this.logger.debug(LOG_TAG, 'getServiceCatalog completed');
                    }
                };
                try {
                    for (var domains_1 = tslib_1.__values(domains), domains_1_1 = domains_1.next(); !domains_1_1.done; domains_1_1 = domains_1.next()) {
                        var domain = domains_1_1.value;
                        _loop_1(domain);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (domains_1_1 && !domains_1_1.done && (_a = domains_1.return)) _a.call(domains_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                _this.logger.error(LOG_TAG, 'getServiceCatalog error:', error);
                observer.error(error);
            }));
        }));
    };
    /**
     * @return {?}
     */
    ServiceCatalogService.prototype.getServices = /**
     * @return {?}
     */
    function () {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'getServices called');
            /** @type {?} */
            var services = [];
            _this.getServiceCatalog().subscribe((/**
             * @param {?} serviceCatalog
             * @return {?}
             */
            function (serviceCatalog) {
                _this.logger.debug(LOG_TAG, 'getServices rawData:', serviceCatalog);
                serviceCatalog.forEach((/**
                 * @param {?} domain
                 * @return {?}
                 */
                function (domain) {
                    if (domain.applications) {
                        for (var i = 0; i < domain.applications.length; i++) {
                            /** @type {?} */
                            var application = domain.applications[i];
                            if (application.services) {
                                for (var y = 0; y < application.services.length; y++) {
                                    /** @type {?} */
                                    var service = application.services[y];
                                    if (service.serviceOperationList) {
                                        for (var z = 0; z < service.serviceOperationList.length; z++) {
                                            /** @type {?} */
                                            var operation = service.serviceOperationList[z];
                                            /** @type {?} */
                                            var serviceEntry = {
                                                domain: domain.name,
                                                application: application.name,
                                                service: service.name,
                                                serviceEnabled: service.enabled,
                                                channel: service.channel,
                                                name: operation.name,
                                                description: operation.description,
                                                type: 'Operation'
                                            };
                                            services.push(serviceEntry);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }));
                observer.next(services);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                _this.logger.error(LOG_TAG, 'getServices error:', error);
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} domainName
     * @return {?}
     */
    ServiceCatalogService.prototype.createNewDomain = /**
     * @param {?} domainName
     * @return {?}
     */
    function (domainName) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'createNewDomain called for ', domainName);
            /** @type {?} */
            var domainCreate = { name: domainName, description: 'Description of ' + domainName };
            _this.domainService.createDomain(domainCreate).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} domain
     * @param {?} applicationName
     * @return {?}
     */
    ServiceCatalogService.prototype.createNewApplication = /**
     * @param {?} domain
     * @param {?} applicationName
     * @return {?}
     */
    function (domain, applicationName) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'createNewApplication called for ', domain, applicationName);
            /** @type {?} */
            var appCreate = { name: applicationName, description: 'Description of ' + applicationName };
            _this.applicationService.createApplication(domain, appCreate).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} domain
     * @param {?} application
     * @param {?} serviceName
     * @param {?} channel
     * @return {?}
     */
    ServiceCatalogService.prototype.createNewService = /**
     * @param {?} domain
     * @param {?} application
     * @param {?} serviceName
     * @param {?} channel
     * @return {?}
     */
    function (domain, application, serviceName, channel) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'createNewService called for ', domain, application, serviceName, channel);
            /** @type {?} */
            var serviceCreate = {
                name: serviceName
            };
            _this.servicesService.createService(channel, domain, application, serviceCreate).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} channel
     * @param {?} domain
     * @param {?} application
     * @param {?} service
     * @param {?} operationName
     * @param {?} description
     * @param {?} pluginName
     * @param {?} encrypted
     * @param {?} secure
     * @param {?} counted
     * @param {?} sessionless
     * @param {?} inputParams
     * @param {?} outputParams
     * @return {?}
     */
    ServiceCatalogService.prototype.createNewOperation = /**
     * @param {?} channel
     * @param {?} domain
     * @param {?} application
     * @param {?} service
     * @param {?} operationName
     * @param {?} description
     * @param {?} pluginName
     * @param {?} encrypted
     * @param {?} secure
     * @param {?} counted
     * @param {?} sessionless
     * @param {?} inputParams
     * @param {?} outputParams
     * @return {?}
     */
    function (channel, domain, application, service, operationName, description, pluginName, encrypted, secure, counted, sessionless, inputParams, outputParams) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'createNewOperation called for ', domain, application, service, operationName);
            /** @type {?} */
            var serviceOperation = {
                counted: counted,
                encryptActive: encrypted,
                inputParams: inputParams,
                outputParams: outputParams,
                pluginName: pluginName,
                secure: secure,
                sessionless: sessionless,
                name: operationName,
                description: description
            };
            _this.operationsService.createServiceOperation(channel, domain, application, service, serviceOperation).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} domainName
     * @return {?}
     */
    ServiceCatalogService.prototype.deleteDomain = /**
     * @param {?} domainName
     * @return {?}
     */
    function (domainName) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'deleteDomain called for ', domainName);
            _this.domainService.deleteDomain(domainName).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} domainName
     * @param {?} applicationName
     * @return {?}
     */
    ServiceCatalogService.prototype.deleteApplication = /**
     * @param {?} domainName
     * @param {?} applicationName
     * @return {?}
     */
    function (domainName, applicationName) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'deleteApplication called for ', domainName, applicationName);
            _this.applicationService.deleteApplication(domainName, applicationName).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} channel
     * @param {?} domainName
     * @param {?} applicationName
     * @param {?} serviceName
     * @return {?}
     */
    ServiceCatalogService.prototype.deleteService = /**
     * @param {?} channel
     * @param {?} domainName
     * @param {?} applicationName
     * @param {?} serviceName
     * @return {?}
     */
    function (channel, domainName, applicationName, serviceName) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'deleteService called for ', domainName, applicationName, serviceName);
            _this.servicesService.deleteService(channel, domainName, applicationName, serviceName).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    /**
     * @param {?} channel
     * @param {?} domainName
     * @param {?} applicationName
     * @param {?} serviceName
     * @param {?} operationName
     * @return {?}
     */
    ServiceCatalogService.prototype.deleteOperation = /**
     * @param {?} channel
     * @param {?} domainName
     * @param {?} applicationName
     * @param {?} serviceName
     * @param {?} operationName
     * @return {?}
     */
    function (channel, domainName, applicationName, serviceName, operationName) {
        var _this = this;
        return new Observable((/**
         * @param {?} observer
         * @return {?}
         */
        function (observer) {
            _this.logger.debug(LOG_TAG, 'deleteOperation called for ', domainName, applicationName, serviceName, operationName);
            _this.operationsService.deleteServiceOperation(channel, domainName, applicationName, serviceName, operationName).subscribe((/**
             * @param {?} data
             * @return {?}
             */
            function (data) {
                observer.next(data);
                observer.complete();
            }), (/**
             * @param {?} error
             * @return {?}
             */
            function (error) {
                observer.error(error);
            }));
        }));
    };
    ServiceCatalogService.decorators = [
        { type: Injectable }
    ];
    /** @nocollapse */
    ServiceCatalogService.ctorParameters = function () { return [
        { type: DomainsService },
        { type: ApplicationsService },
        { type: AppService },
        { type: ServicesService },
        { type: OperationsService },
        { type: NGXLogger }
    ]; };
    return ServiceCatalogService;
}());
export { ServiceCatalogService };
if (false) {
    /**
     * @type {?}
     * @private
     */
    ServiceCatalogService.prototype.domainsList;
    /**
     * @type {?}
     * @private
     */
    ServiceCatalogService.prototype.domainService;
    /**
     * @type {?}
     * @private
     */
    ServiceCatalogService.prototype.applicationService;
    /**
     * @type {?}
     * @private
     */
    ServiceCatalogService.prototype.appService;
    /**
     * @type {?}
     * @private
     */
    ServiceCatalogService.prototype.servicesService;
    /**
     * @type {?}
     * @private
     */
    ServiceCatalogService.prototype.operationsService;
    /**
     * @type {?}
     * @private
     */
    ServiceCatalogService.prototype.logger;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmljZUNhdGFsb2dTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbW90aWYtd2ViLWFkbWluLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvU2VydmljZUNhdGFsb2dTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUVkLG1CQUFtQixHQUdqQixNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBR3BCLGlCQUFpQixFQUNDLE1BQU0sb0NBQW9DLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixJQUFJLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztJQUV2QyxPQUFPLEdBQUcseUJBQXlCO0FBRXpDO0lBS0ksK0JBQW9CLGFBQTZCLEVBQ3JDLGtCQUF1QyxFQUN2QyxVQUFzQixFQUN0QixlQUFnQyxFQUNoQyxpQkFBb0MsRUFDcEMsTUFBaUI7UUFMVCxrQkFBYSxHQUFiLGFBQWEsQ0FBZ0I7UUFDckMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFxQjtRQUN2QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVc7SUFDN0IsQ0FBQztJQUVEOztPQUVHOzs7OztJQUNJLGlEQUFpQjs7OztJQUF4QjtRQUFBLGlCQXVFQztRQXRFRyxPQUFPLElBQUksVUFBVTs7OztRQUFDLFVBQUMsUUFBUTtZQUUzQixLQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsMEJBQTBCLENBQUUsQ0FB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LEtBQUs7Z0JBQ0wsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDLEVBQUMsQ0FBQztRQUNQLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7Z0JBL1JKLFVBQVU7Ozs7Z0JBbEJGLGNBQWM7Z0JBRWQsbUJBQW1CO2dCQVNJLFVBQVU7Z0JBTGpDLGVBQWU7Z0JBR3BCLGlCQUFpQjtnQkFLWixTQUFTOztJQXFTbEIsNEJBQUM7Q0FBQSxBQWpTRCxJQWlTQztTQWhTWSxxQkFBcUI7Ozs7OztJQUU5Qiw0Q0FBbUM7Ozs7O0lBRXZCLDhDQUFxQzs7Ozs7SUFDN0MsbURBQStDOzs7OztJQUMvQywyQ0FBOEI7Ozs7O0lBQzlCLGdEQUF3Qzs7Ozs7SUFDeEMsa0RBQTRDOzs7OztJQUM1Qyx1Q0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21haW5zU2VydmljZSxcbiAgICAgICAgIERvbWFpbiwgRG9tYWluQ3JlYXRlLFxuICAgICAgICAgQXBwbGljYXRpb25zU2VydmljZSxcbiAgICAgICAgIEFwcGxpY2F0aW9uLFxuICAgICAgICAgQXBwbGljYXRpb25DcmVhdGUsXG4gICAgICAgICAgfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvcGxhdGZvcm0tc2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlc1NlcnZpY2UsXG4gICAgU2VydmljZSxcbiAgICBTZXJ2aWNlQ3JlYXRlLFxuICAgIE9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIFNlcnZpY2VPcGVyYXRpb24gfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvY2F0YWxvZy1zZXJ2aWNlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uc1NlcnZpY2UgYXMgQXBwU2VydmljZSB9IGZyb20gJ0B3YS1tb3RpZi1vcGVuLWFwaS9jYXRhbG9nLXNlcnZpY2UnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcblxuY29uc3QgTE9HX1RBRyA9ICdbU2VydmljZUNhdGFsb2dTZXJ2aWNlXSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlQ2F0YWxvZ1NlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBkb21haW5zTGlzdDogQXJyYXk8RG9tYWluPjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZG9tYWluU2VydmljZTogRG9tYWluc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXBwbGljYXRpb25TZXJ2aWNlOiBBcHBsaWNhdGlvbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwcFNlcnZpY2U6IEFwcFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2VydmljZXNTZXJ2aWNlOiBTZXJ2aWNlc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgb3BlcmF0aW9uc1NlcnZpY2U6IE9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gd2l0aCB0aGUgU2VydmljZSBDYXRhbG9nIFN0cnVjdHVyZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZXJ2aWNlQ2F0YWxvZygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdnZXRTZXJ2aWNlQ2F0YWxvZyBjYWxsZWQnICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VDYXRhbG9nID0gW107XG5cbiAgICAgICAgICAgIHRoaXMuZG9tYWluU2VydmljZS5nZXREb21haW5zKCkuc3Vic2NyaWJlKCggZG9tYWluczogQXJyYXk8RG9tYWluPiApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb21haW5zQ291bnQgPSBkb21haW5zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgcHJvY2Vzc2VkRG9tYWlucyA9IDA7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBkb21haW5zKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9tYWluSW5mbzogYW55ID0gZG9tYWluO1xuICAgICAgICAgICAgICAgICAgICBkb21haW5JbmZvLmFwcGxpY2F0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2F0YWxvZy5wdXNoKGRvbWFpbkluZm8pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9ucyhkb21haW4ubmFtZSkuc3Vic2NyaWJlKCggYXBwbGljYXRpb25zOiBBcnJheTxBcHBsaWNhdGlvbj4gKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcENvdW50ID0gYXBwbGljYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9jZXNzZWRBcHBzID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRG9tYWlucysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJvY2Vzc2VkRG9tYWlucyA9PT0gZG9tYWluc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoIHNlcnZpY2VDYXRhbG9nICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdnZXRTZXJ2aWNlQ2F0YWxvZyBjb21wbGV0ZWQnICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFwcGxpY2F0aW9uIG9mIGFwcGxpY2F0aW9ucyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBsaWNhdGlvbkluZm86IGFueSA9IGFwcGxpY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwU2VydmljZS5nZXRTZXJ2aWNlTGlzdChkb21haW4ubmFtZSwgYXBwbGljYXRpb24ubmFtZSkuc3Vic2NyaWJlKCAoIHNlcnZpY2VzOiBBcnJheTxTZXJ2aWNlPiApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JbmZvLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2dldFNlcnZpY2VDYXRhbG9nIHNlcnZpY2VzWycgKyBhcHBsaWNhdGlvbi5uYW1lICsgJ0AnICsgZG9tYWluLm5hbWUgKyAnXTonLCBzZXJ2aWNlcyApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICggZXJyb3IgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdnZXRTZXJ2aWNlQ2F0YWxvZyBlcnJvcjonICwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRBcHBzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWRBcHBzID09PSBhcHBDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRG9tYWlucysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHJvY2Vzc2VkRG9tYWlucyA9PT0gZG9tYWluc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KCBzZXJ2aWNlQ2F0YWxvZyApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdnZXRTZXJ2aWNlQ2F0YWxvZyBjb21wbGV0ZWQnICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5JbmZvLmFwcGxpY2F0aW9ucy5wdXNoKGFwcGxpY2F0aW9uSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSwgKCBlcnJvciApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdnZXRTZXJ2aWNlQ2F0YWxvZyBlcnJvcjonICwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIHByb2Nlc3NlZERvbWFpbnMgPT09IGRvbWFpbnNDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCggc2VydmljZUNhdGFsb2cgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnZ2V0U2VydmljZUNhdGFsb2cgY29tcGxldGVkJyApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHLCAnZ2V0U2VydmljZUNhdGFsb2cgZXJyb3I6JyAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlcnZpY2VzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2dldFNlcnZpY2VzIGNhbGxlZCcgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VydmljZXM6IGFueSA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmdldFNlcnZpY2VDYXRhbG9nKCkuc3Vic2NyaWJlKChzZXJ2aWNlQ2F0YWxvZykgPT4ge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2dldFNlcnZpY2VzIHJhd0RhdGE6Jywgc2VydmljZUNhdGFsb2cgKTtcblxuICAgICAgICAgICAgICAgIHNlcnZpY2VDYXRhbG9nLmZvckVhY2goZG9tYWluID0+IHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYWluLmFwcGxpY2F0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAgOyBpIDwgZG9tYWluLmFwcGxpY2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcGxpY2F0aW9uID0gZG9tYWluLmFwcGxpY2F0aW9uc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbi5zZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGFwcGxpY2F0aW9uLnNlcnZpY2VzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gYXBwbGljYXRpb24uc2VydmljZXNbeV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLnNlcnZpY2VPcGVyYXRpb25MaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBzZXJ2aWNlLnNlcnZpY2VPcGVyYXRpb25MaXN0Lmxlbmd0aDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHNlcnZpY2Uuc2VydmljZU9wZXJhdGlvbkxpc3Rbel07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZUVudHJ5OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IGRvbWFpbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb246IGFwcGxpY2F0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRW5hYmxlZCA6IHNlcnZpY2UuZW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IHNlcnZpY2UuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wZXJhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG9wZXJhdGlvbi5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdPcGVyYXRpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goc2VydmljZUVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCggc2VydmljZXMgKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHLCAnZ2V0U2VydmljZXMgZXJyb3I6JyAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlTmV3RG9tYWluKGRvbWFpbk5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8RG9tYWluPiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2NyZWF0ZU5ld0RvbWFpbiBjYWxsZWQgZm9yICcsIGRvbWFpbk5hbWUpO1xuXG4gICAgICAgICAgICBjb25zdCBkb21haW5DcmVhdGU6IERvbWFpbkNyZWF0ZSA9IHsgbmFtZTogZG9tYWluTmFtZSwgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbiBvZiAnICsgZG9tYWluTmFtZSB9O1xuXG4gICAgICAgICAgICB0aGlzLmRvbWFpblNlcnZpY2UuY3JlYXRlRG9tYWluKGRvbWFpbkNyZWF0ZSkuc3Vic2NyaWJlKChkYXRhOiBEb21haW4pID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZU5ld0FwcGxpY2F0aW9uKGRvbWFpbjogc3RyaW5nLCBhcHBsaWNhdGlvbk5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8QXBwbGljYXRpb24+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnY3JlYXRlTmV3QXBwbGljYXRpb24gY2FsbGVkIGZvciAnLCBkb21haW4sIGFwcGxpY2F0aW9uTmFtZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFwcENyZWF0ZTogQXBwbGljYXRpb25DcmVhdGUgPSB7IG5hbWU6IGFwcGxpY2F0aW9uTmFtZSwgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbiBvZiAnICsgYXBwbGljYXRpb25OYW1lIH07XG5cbiAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmNyZWF0ZUFwcGxpY2F0aW9uKGRvbWFpbiwgYXBwQ3JlYXRlKS5zdWJzY3JpYmUoKGRhdGE6IEFwcGxpY2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVOZXdTZXJ2aWNlKGRvbWFpbjogc3RyaW5nLCBhcHBsaWNhdGlvbjogc3RyaW5nLCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBjaGFubmVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlcnZpY2U+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnY3JlYXRlTmV3U2VydmljZSBjYWxsZWQgZm9yICcsIGRvbWFpbiwgYXBwbGljYXRpb24sIHNlcnZpY2VOYW1lLCBjaGFubmVsKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUNyZWF0ZTogU2VydmljZUNyZWF0ZSA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlTmFtZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1NlcnZpY2UuY3JlYXRlU2VydmljZShjaGFubmVsLCBkb21haW4sIGFwcGxpY2F0aW9uLCBzZXJ2aWNlQ3JlYXRlKS5zdWJzY3JpYmUoKGRhdGE6IFNlcnZpY2UpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZU5ld09wZXJhdGlvbihjaGFubmVsOiBzdHJpbmcsXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxuICAgICAgICBhcHBsaWNhdGlvbjogc3RyaW5nLFxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICAgICBlbmNyeXB0ZWQ6IGJvb2xlYW4sXG4gICAgICAgIHNlY3VyZTogYm9vbGVhbixcbiAgICAgICAgY291bnRlZDogYm9vbGVhbixcbiAgICAgICAgc2Vzc2lvbmxlc3M6IGJvb2xlYW4sXG4gICAgICAgIGlucHV0UGFyYW1zOiBzdHJpbmcsXG4gICAgICAgIG91dHB1dFBhcmFtczogc3RyaW5nXG4gICAgICAgICk6IE9ic2VydmFibGU8U2VydmljZU9wZXJhdGlvbj4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdjcmVhdGVOZXdPcGVyYXRpb24gY2FsbGVkIGZvciAnLCBkb21haW4sIGFwcGxpY2F0aW9uLCBzZXJ2aWNlLCBvcGVyYXRpb25OYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VPcGVyYXRpb246IFNlcnZpY2VPcGVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgY291bnRlZDogY291bnRlZCxcbiAgICAgICAgICAgICAgICBlbmNyeXB0QWN0aXZlOiBlbmNyeXB0ZWQsXG4gICAgICAgICAgICAgICAgaW5wdXRQYXJhbXM6IGlucHV0UGFyYW1zLFxuICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtczogb3V0cHV0UGFyYW1zLFxuICAgICAgICAgICAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbk5hbWUsXG4gICAgICAgICAgICAgICAgc2VjdXJlOiBzZWN1cmUsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbmxlc3M6IHNlc3Npb25sZXNzLFxuICAgICAgICAgICAgICAgIG5hbWU6IG9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLm9wZXJhdGlvbnNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2VPcGVyYXRpb24oY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBkb21haW4sIGFwcGxpY2F0aW9uLCBzZXJ2aWNlLCBzZXJ2aWNlT3BlcmF0aW9uKS4gc3Vic2NyaWJlKChkYXRhOiBTZXJ2aWNlT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBkZWxldGVEb21haW4oZG9tYWluTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2RlbGV0ZURvbWFpbiBjYWxsZWQgZm9yICcsIGRvbWFpbk5hbWUpO1xuICAgICAgICAgICAgdGhpcy5kb21haW5TZXJ2aWNlLmRlbGV0ZURvbWFpbihkb21haW5OYW1lKS5zdWJzY3JpYmUoKGRhdGE6IERvbWFpbikgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlQXBwbGljYXRpb24oZG9tYWluTmFtZTogc3RyaW5nLCBhcHBsaWNhdGlvbk5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdkZWxldGVBcHBsaWNhdGlvbiBjYWxsZWQgZm9yICcsIGRvbWFpbk5hbWUsIGFwcGxpY2F0aW9uTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5kZWxldGVBcHBsaWNhdGlvbihkb21haW5OYW1lLCBhcHBsaWNhdGlvbk5hbWUpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlU2VydmljZShjaGFubmVsOiBzdHJpbmcsIGRvbWFpbk5hbWU6IHN0cmluZywgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnZGVsZXRlU2VydmljZSBjYWxsZWQgZm9yICcsIGRvbWFpbk5hbWUsIGFwcGxpY2F0aW9uTmFtZSwgc2VydmljZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlc1NlcnZpY2UuZGVsZXRlU2VydmljZShjaGFubmVsLCBkb21haW5OYW1lLCBhcHBsaWNhdGlvbk5hbWUsIHNlcnZpY2VOYW1lKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZU9wZXJhdGlvbihjaGFubmVsOiBzdHJpbmcsXG4gICAgICAgIGRvbWFpbk5hbWU6IHN0cmluZyxcbiAgICAgICAgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcsXG4gICAgICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdkZWxldGVPcGVyYXRpb24gY2FsbGVkIGZvciAnLCBkb21haW5OYW1lLCBhcHBsaWNhdGlvbk5hbWUsIHNlcnZpY2VOYW1lLCBvcGVyYXRpb25OYW1lKTtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uc1NlcnZpY2UuZGVsZXRlU2VydmljZU9wZXJhdGlvbihjaGFubmVsLFxuICAgICAgICAgICAgICAgIGRvbWFpbk5hbWUsIGFwcGxpY2F0aW9uTmFtZSwgc2VydmljZU5hbWUsIG9wZXJhdGlvbk5hbWUpLiBzdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbn1cblxuXG5cbiJdfQ==