UNPKG

relution-sdk

Version:

Relution Software Development Kit for TypeScript and JavaScript

129 lines 14.2 kB
/* * @file web/urls.ts * Relution SDK * * Created by Thomas Beckmann on 08.06.2016 * Copyright 2016 M-Way Solutions GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @module web */ /** */ "use strict"; var url = require('url'); var _ = require('lodash'); var init = require('../core/init'); var server = require('../security/server'); /** * computes a server url from a given path. * * @param path path to resolve, relative or absolute. * @param options of server in effect. * @return {string} absolute URL of server. */ function resolveServer(path, options) { if (options === void 0) { options = {}; } var serverUrl = options.serverUrl || init.initOptions.serverUrl; if (path) { if (serverUrl) { path = url.resolve(serverUrl, path); } } else { path = serverUrl; } return url.resolve(path, '/'); } exports.resolveServer = resolveServer; /** * computes a url from a given path. * * - absolute URLs are used as is, e.g. * ``http://192.168.0.10:8080/mway/myapp/api/v1/some_endpoint`` stays as is, * - machine-relative URLs beginning with ``/`` are resolved against the Relution server logged * into, so that ``/gofer/.../rest/...``-style URLs work as expected, for example * ``/mway/myapp/api/v1/some_endpoint`` resolves as above when logged into * ``http://192.168.0.10:8080``, * - context-relative URLs such as ``api/v1/...`` are resolved using the Relution server logged in, * the ``uniqueName`` of the ``currentOrganization`` and the application name, for example * ``api/v1/some_endpoint`` resolves as above when application myapp logged into * ``http://192.168.0.10:8080`` using a user of organization mway provided currentOrganization * was not changed explicitly to something else. * * @param path path to resolve. * @param options of server in effect. * @return {string} absolute URL of path on current server. */ function resolveUrl(path, options) { if (options === void 0) { options = {}; } var serverUrl = resolveServer(path, options); if (!serverUrl) { return path; } if (path.charAt(0) !== '/') { // construct full application url var tenantOrga = options.tenantOrga; if (!tenantOrga) { // following extracts the tenantOrga set on the specific server var serverObj = server.Server.getInstance(serverUrl); tenantOrga = serverObj.applyOptions({ serverUrl: serverUrl }).tenantOrga; if (!tenantOrga) { tenantOrga = init.initOptions.tenantOrga; if (!tenantOrga) { var organization = serverObj.organization; if (organization) { tenantOrga = organization.uniqueName; } } } } var application = options.application || init.initOptions.application; serverUrl = url.resolve(serverUrl, '/' + tenantOrga + '/' + application + '/'); } return url.resolve(serverUrl, path); } exports.resolveUrl = resolveUrl; /** * computes the basepath of a BaaS application. * * @param baseAliasOrNameOrApp baseAlias of application, may be name when baseAlias is not changed * by developer or application metadata object of Relution server. * @param options of server in effect. * @return {string} absolute URL of application alias on current server. */ function resolveApp(baseAliasOrNameOrApp, options) { if (options === void 0) { options = {}; } // defaults on arguments given var url; if (!baseAliasOrNameOrApp) { url = options.application || init.initOptions.application; } else if (_.isString(baseAliasOrNameOrApp)) { url = baseAliasOrNameOrApp; } else { url = baseAliasOrNameOrApp.baseAlias || baseAliasOrNameOrApp.name; } // application must not include the leading slash for resolveUrl to do the job url = url.replace(/\/?(.*)/, '$1'); // resolve local path against application return resolveUrl('.', _.defaults({ application: url }, options)); } exports.resolveApp = resolveApp; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWIvdXJscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0g7O0dBRUc7QUFDSCxNQUFNOztBQUVOLElBQVksR0FBRyxXQUFNLEtBQUssQ0FBQyxDQUFBO0FBQzNCLElBQVksQ0FBQyxXQUFNLFFBQVEsQ0FBQyxDQUFBO0FBRTVCLElBQVksSUFBSSxXQUFNLGNBQWMsQ0FBQyxDQUFBO0FBQ3JDLElBQVksTUFBTSxXQUFNLG9CQUFvQixDQUFDLENBQUE7QUFFN0M7Ozs7OztHQU1HO0FBQ0gsdUJBQThCLElBQVksRUFBRSxPQUFtQztJQUFuQyx1QkFBbUMsR0FBbkMsWUFBbUM7SUFDN0UsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUNoRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ1QsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFWZSxxQkFBYSxnQkFVNUIsQ0FBQTtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxvQkFBMkIsSUFBWSxFQUFFLE9BQW1DO0lBQW5DLHVCQUFtQyxHQUFuQyxZQUFtQztJQUMxRSxJQUFJLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLGlDQUFpQztRQUNqQyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNoQiwrREFBK0Q7WUFDL0QsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkQsVUFBVSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLFNBQVMsRUFBRSxTQUFTO2FBQ3JCLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztnQkFDekMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUNoQixJQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO29CQUM1QyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNqQixVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztvQkFDdkMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO1FBQ3RFLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBOUJlLGtCQUFVLGFBOEJ6QixDQUFBO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILG9CQUEyQixvQkFBeUIsRUFBRSxPQUFtQztJQUFuQyx1QkFBbUMsR0FBbkMsWUFBbUM7SUFDdkYsOEJBQThCO0lBQzlCLElBQUksR0FBVyxDQUFDO0lBQ2hCLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO0lBQzVELENBQUM7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxHQUFHLEdBQUcsb0JBQW9CLENBQUM7SUFDN0IsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sR0FBRyxHQUFHLG9CQUFvQixDQUFDLFNBQVMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7SUFDcEUsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFbkMseUNBQXlDO0lBQ3pDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDaEMsV0FBVyxFQUFFLEdBQUc7S0FDakIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQWxCZSxrQkFBVSxhQWtCekIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBAZmlsZSB3ZWIvdXJscy50c1xuICogUmVsdXRpb24gU0RLXG4gKlxuICogQ3JlYXRlZCBieSBUaG9tYXMgQmVja21hbm4gb24gMDguMDYuMjAxNlxuICogQ29weXJpZ2h0IDIwMTYgTS1XYXkgU29sdXRpb25zIEdtYkhcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAbW9kdWxlIHdlYlxuICovXG4vKiogKi9cblxuaW1wb3J0ICogYXMgdXJsIGZyb20gJ3VybCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCAqIGFzIGluaXQgZnJvbSAnLi4vY29yZS9pbml0JztcbmltcG9ydCAqIGFzIHNlcnZlciBmcm9tICcuLi9zZWN1cml0eS9zZXJ2ZXInO1xuXG4vKipcbiAqIGNvbXB1dGVzIGEgc2VydmVyIHVybCBmcm9tIGEgZ2l2ZW4gcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGF0aCBwYXRoIHRvIHJlc29sdmUsIHJlbGF0aXZlIG9yIGFic29sdXRlLlxuICogQHBhcmFtIG9wdGlvbnMgb2Ygc2VydmVyIGluIGVmZmVjdC5cbiAqIEByZXR1cm4ge3N0cmluZ30gYWJzb2x1dGUgVVJMIG9mIHNlcnZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZXJ2ZXIocGF0aDogc3RyaW5nLCBvcHRpb25zOiBpbml0LlNlcnZlclVybE9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIGxldCBzZXJ2ZXJVcmwgPSBvcHRpb25zLnNlcnZlclVybCB8fCBpbml0LmluaXRPcHRpb25zLnNlcnZlclVybDtcbiAgaWYgKHBhdGgpIHtcbiAgICBpZiAoc2VydmVyVXJsKSB7XG4gICAgICBwYXRoID0gdXJsLnJlc29sdmUoc2VydmVyVXJsLCBwYXRoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGF0aCA9IHNlcnZlclVybDtcbiAgfVxuICByZXR1cm4gdXJsLnJlc29sdmUocGF0aCwgJy8nKTtcbn1cblxuLyoqXG4gKiBjb21wdXRlcyBhIHVybCBmcm9tIGEgZ2l2ZW4gcGF0aC5cbiAqXG4gKiAtIGFic29sdXRlIFVSTHMgYXJlIHVzZWQgYXMgaXMsIGUuZy5cbiAqICAgYGBodHRwOi8vMTkyLjE2OC4wLjEwOjgwODAvbXdheS9teWFwcC9hcGkvdjEvc29tZV9lbmRwb2ludGBgIHN0YXlzIGFzIGlzLFxuICogLSBtYWNoaW5lLXJlbGF0aXZlIFVSTHMgYmVnaW5uaW5nIHdpdGggYGAvYGAgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIFJlbHV0aW9uIHNlcnZlciBsb2dnZWRcbiAqICAgaW50bywgc28gdGhhdCBgYC9nb2Zlci8uLi4vcmVzdC8uLi5gYC1zdHlsZSBVUkxzIHdvcmsgYXMgZXhwZWN0ZWQsIGZvciBleGFtcGxlXG4gKiAgIGBgL213YXkvbXlhcHAvYXBpL3YxL3NvbWVfZW5kcG9pbnRgYCByZXNvbHZlcyBhcyBhYm92ZSB3aGVuIGxvZ2dlZCBpbnRvXG4gKiAgIGBgaHR0cDovLzE5Mi4xNjguMC4xMDo4MDgwYGAsXG4gKiAtIGNvbnRleHQtcmVsYXRpdmUgVVJMcyBzdWNoIGFzIGBgYXBpL3YxLy4uLmBgIGFyZSByZXNvbHZlZCB1c2luZyB0aGUgUmVsdXRpb24gc2VydmVyIGxvZ2dlZCBpbixcbiAqICAgdGhlIGBgdW5pcXVlTmFtZWBgIG9mIHRoZSBgYGN1cnJlbnRPcmdhbml6YXRpb25gYCBhbmQgdGhlIGFwcGxpY2F0aW9uIG5hbWUsIGZvciBleGFtcGxlXG4gKiAgIGBgYXBpL3YxL3NvbWVfZW5kcG9pbnRgYCByZXNvbHZlcyBhcyBhYm92ZSB3aGVuIGFwcGxpY2F0aW9uIG15YXBwIGxvZ2dlZCBpbnRvXG4gKiAgIGBgaHR0cDovLzE5Mi4xNjguMC4xMDo4MDgwYGAgdXNpbmcgYSB1c2VyIG9mIG9yZ2FuaXphdGlvbiBtd2F5IHByb3ZpZGVkIGN1cnJlbnRPcmdhbml6YXRpb25cbiAqICAgd2FzIG5vdCBjaGFuZ2VkIGV4cGxpY2l0bHkgdG8gc29tZXRoaW5nIGVsc2UuXG4gKlxuICogQHBhcmFtIHBhdGggcGF0aCB0byByZXNvbHZlLlxuICogQHBhcmFtIG9wdGlvbnMgb2Ygc2VydmVyIGluIGVmZmVjdC5cbiAqIEByZXR1cm4ge3N0cmluZ30gYWJzb2x1dGUgVVJMIG9mIHBhdGggb24gY3VycmVudCBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXJsKHBhdGg6IHN0cmluZywgb3B0aW9uczogaW5pdC5TZXJ2ZXJVcmxPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICBsZXQgc2VydmVyVXJsID0gcmVzb2x2ZVNlcnZlcihwYXRoLCBvcHRpb25zKTtcbiAgaWYgKCFzZXJ2ZXJVcmwpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuXG4gIGlmIChwYXRoLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgLy8gY29uc3RydWN0IGZ1bGwgYXBwbGljYXRpb24gdXJsXG4gICAgbGV0IHRlbmFudE9yZ2EgPSBvcHRpb25zLnRlbmFudE9yZ2E7XG4gICAgaWYgKCF0ZW5hbnRPcmdhKSB7XG4gICAgICAvLyBmb2xsb3dpbmcgZXh0cmFjdHMgdGhlIHRlbmFudE9yZ2Egc2V0IG9uIHRoZSBzcGVjaWZpYyBzZXJ2ZXJcbiAgICAgIGNvbnN0IHNlcnZlck9iaiA9IHNlcnZlci5TZXJ2ZXIuZ2V0SW5zdGFuY2Uoc2VydmVyVXJsKTtcbiAgICAgIHRlbmFudE9yZ2EgPSBzZXJ2ZXJPYmouYXBwbHlPcHRpb25zKHtcbiAgICAgICAgc2VydmVyVXJsOiBzZXJ2ZXJVcmxcbiAgICAgIH0pLnRlbmFudE9yZ2E7XG4gICAgICBpZiAoIXRlbmFudE9yZ2EpIHtcbiAgICAgICAgdGVuYW50T3JnYSA9IGluaXQuaW5pdE9wdGlvbnMudGVuYW50T3JnYTtcbiAgICAgICAgaWYgKCF0ZW5hbnRPcmdhKSB7XG4gICAgICAgICAgY29uc3Qgb3JnYW5pemF0aW9uID0gc2VydmVyT2JqLm9yZ2FuaXphdGlvbjtcbiAgICAgICAgICBpZiAob3JnYW5pemF0aW9uKSB7XG4gICAgICAgICAgICB0ZW5hbnRPcmdhID0gb3JnYW5pemF0aW9uLnVuaXF1ZU5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBhcHBsaWNhdGlvbiA9IG9wdGlvbnMuYXBwbGljYXRpb24gfHwgaW5pdC5pbml0T3B0aW9ucy5hcHBsaWNhdGlvbjtcbiAgICBzZXJ2ZXJVcmwgPSB1cmwucmVzb2x2ZShzZXJ2ZXJVcmwsICcvJyArIHRlbmFudE9yZ2EgKyAnLycgKyBhcHBsaWNhdGlvbiArICcvJyk7XG4gIH1cblxuICByZXR1cm4gdXJsLnJlc29sdmUoc2VydmVyVXJsLCBwYXRoKTtcbn1cblxuLyoqXG4gKiBjb21wdXRlcyB0aGUgYmFzZXBhdGggb2YgYSBCYWFTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBiYXNlQWxpYXNPck5hbWVPckFwcCBiYXNlQWxpYXMgb2YgYXBwbGljYXRpb24sIG1heSBiZSBuYW1lIHdoZW4gYmFzZUFsaWFzIGlzIG5vdCBjaGFuZ2VkXG4gKiAgICBieSBkZXZlbG9wZXIgb3IgYXBwbGljYXRpb24gbWV0YWRhdGEgb2JqZWN0IG9mIFJlbHV0aW9uIHNlcnZlci5cbiAqIEBwYXJhbSBvcHRpb25zIG9mIHNlcnZlciBpbiBlZmZlY3QuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGFic29sdXRlIFVSTCBvZiBhcHBsaWNhdGlvbiBhbGlhcyBvbiBjdXJyZW50IHNlcnZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBcHAoYmFzZUFsaWFzT3JOYW1lT3JBcHA6IGFueSwgb3B0aW9uczogaW5pdC5TZXJ2ZXJVcmxPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAvLyBkZWZhdWx0cyBvbiBhcmd1bWVudHMgZ2l2ZW5cbiAgbGV0IHVybDogc3RyaW5nO1xuICBpZiAoIWJhc2VBbGlhc09yTmFtZU9yQXBwKSB7XG4gICAgdXJsID0gb3B0aW9ucy5hcHBsaWNhdGlvbiB8fCBpbml0LmluaXRPcHRpb25zLmFwcGxpY2F0aW9uO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoYmFzZUFsaWFzT3JOYW1lT3JBcHApKSB7XG4gICAgdXJsID0gYmFzZUFsaWFzT3JOYW1lT3JBcHA7XG4gIH0gZWxzZSB7XG4gICAgdXJsID0gYmFzZUFsaWFzT3JOYW1lT3JBcHAuYmFzZUFsaWFzIHx8IGJhc2VBbGlhc09yTmFtZU9yQXBwLm5hbWU7XG4gIH1cblxuICAvLyBhcHBsaWNhdGlvbiBtdXN0IG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nIHNsYXNoIGZvciByZXNvbHZlVXJsIHRvIGRvIHRoZSBqb2JcbiAgdXJsID0gdXJsLnJlcGxhY2UoL1xcLz8oLiopLywgJyQxJyk7XG5cbiAgLy8gcmVzb2x2ZSBsb2NhbCBwYXRoIGFnYWluc3QgYXBwbGljYXRpb25cbiAgcmV0dXJuIHJlc29sdmVVcmwoJy4nLCBfLmRlZmF1bHRzKHtcbiAgICBhcHBsaWNhdGlvbjogdXJsXG4gIH0sIG9wdGlvbnMpKTtcbn1cbiJdfQ==