UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

158 lines • 20.6 kB
import { ViewContext } from '@c8y/ngx-components'; import { find, forEach, map, startsWith, unary } from 'lodash-es'; import { ReplaySubject } from 'rxjs'; export var ViewContextLegacyParameter; (function (ViewContextLegacyParameter) { ViewContextLegacyParameter["Device"] = "deviceId"; ViewContextLegacyParameter["Group"] = "groupId"; ViewContextLegacyParameter["User"] = "userId"; ViewContextLegacyParameter["Application"] = "applicationId"; ViewContextLegacyParameter["Microservice"] = "applicationId"; ViewContextLegacyParameter["SubscribedApplications"] = "applicationId"; ViewContextLegacyParameter["Tenant"] = "tenantId"; ViewContextLegacyParameter["Service"] = "deviceId"; ViewContextLegacyParameter["Simulators"] = "deviceId"; // required to hook the Alarms tab to a Simulator view })(ViewContextLegacyParameter || (ViewContextLegacyParameter = {})); function c8yViewsProvider($routeProvider, c8yTabsProvider, c8yPathUtils) { 'ngInject'; const viewMap = {}; const contextViews = new ReplaySubject(); return { when, $get() { return { contextViews, when(path, cfg) { return when(path, cfg, true); }, getByPath, prefixWithSlash }; } }; /** * @ngdoc function * @name when * @methodOf c8y.ui.provider:c8yViewsProvider * * @description * Defines a view for given route. * If multiple views are defined for a single route then there will be a separate tab for each view available when user visits that route. * * @param path Target route. * @param cfg View configuration object with the following properties: * * - **name** - `string` - View's name (in case of multiple views at single route this will be displayed as tab's title). * - **priority** - `integer` - View's priority (in case of multiple views at single route this will determine the position of view's tab in the tabs stack). * - **icon** - `string` - Font Awesome icon name for the view (displayed on the tab's header). * - **showIf** - `function` - Function returning boolean value indicating whether to show a tab for the view or not. * - **templateUrl** - `string` - Path to the template to use for displaying the view. * * You can also provide other view options - the same as available for standard {@link https://docs.angularjs.org/api/ngRoute/provider/$routeProvider $routeProvider} in AngularJS. * * ```html * The following example demonstrates how to add a new view to device details route * (which will be displayed as a tab if other views are assigned to the same route): * <pre> * c8yViewsProvider.when('/device/:deviceId', { * name: 'Tracking', * templateUrl: ':::PLUGIN_PATH:::/views/index.html', * icon: 'crosshairs', * showIf: ['$routeParams', 'c8yDevices', function ($routeParams, c8yDevices) { * var deviceId = $routeParams.deviceId; * return c8yDevices.detailCached(deviceId).then(function (res) { * var device = res.data; * return device && (device.c8y_MotionTracking || device.c8y_Geofence); * }); * }] * }); * </pre> * ``` */ function when(path, cfg, runPhase) { const newPath = prefixWithSlash(path); cfg.resolve = cfg.resolve || {}; // eslint-disable-next-line no-underscore-dangle cfg.resolve.__c8y_locales = [ 'c8yLocales', c8yLocales => { return c8yLocales.initDone; } ]; let currentCfg = viewMap[newPath]; const originalPath = newPath; if (!cfg.name) { // console.warn('View name not defined'); } if (!currentCfg) { viewMap[newPath] = []; currentCfg = viewMap[newPath]; } const upgradedContext = Object.keys(ViewContext) .map(key => ({ key, isUpgrade: prefixWithSlash(ViewContext[key].replace('id', ViewContextLegacyParameter[key])) === path })) .find(({ isUpgrade }) => isUpgrade); if (upgradedContext) { currentCfg.push(cfg); cfg.path = newPath; const p = c8yPathUtils.appendSegment(originalPath.replace(path, ''), cfg.name); contextViews.next({ ...cfg, path: cfg.name ? p.substring(1) : '', contextKey: upgradedContext.key, runPhase }); cfg.showIf = undefined; if (cfg.name) { cfg.path = c8yPathUtils.appendSegment(originalPath, cfg.name); } } else { if (currentCfg.length === 1) { const [existingConfig] = currentCfg; existingConfig.path = c8yPathUtils.appendSegment(originalPath, existingConfig.name); existingConfig.tab = createTab(originalPath, existingConfig); $routeProvider.when(existingConfig.path, existingConfig); } currentCfg.push(cfg); cfg.path = newPath; if (currentCfg.length > 1) { cfg.path = c8yPathUtils.appendSegment(originalPath, cfg.name); createTab(originalPath, cfg); $routeProvider.when(prefixWithSlash(originalPath), { resolveRedirectTo($route, $q, c8yUiUtil, c8yTabs, gettextCatalog) { 'ngInject'; const sortedCurrentCfg = c8yTabsProvider.sortTabsViews(currentCfg, gettextCatalog); const params = $route.current.pathParams; return $q .all(map(sortedCurrentCfg, unary(c8yUiUtil.configureVisibility))) .then(views => { const first = find(views, 'show'); let url = first.path; forEach(params, (val, key) => { url = url.replace(`:${key}`, val); }); c8yTabs.redirectedViewPath = url; return url; }); } }); } } return $routeProvider.when(prefixWithSlash(cfg.path), cfg); } function getByPath(path) { return viewMap[prefixWithSlash(path)]; } function createTab(path, cfg) { c8yTabsProvider.addTab(path, cfg); } function prefixWithSlash(path) { const prefix = startsWith(path, '/') ? '' : '/'; return prefix + path; } } export { c8yViewsProvider }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3MucHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi91cGdyYWRlL25nMS92aWV3cy5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVyQyxNQUFNLENBQU4sSUFBWSwwQkFVWDtBQVZELFdBQVksMEJBQTBCO0lBQ3BDLGlEQUFtQixDQUFBO0lBQ25CLCtDQUFpQixDQUFBO0lBQ2pCLDZDQUFlLENBQUE7SUFDZiwyREFBNkIsQ0FBQTtJQUM3Qiw0REFBOEIsQ0FBQTtJQUM5QixzRUFBd0MsQ0FBQTtJQUN4QyxpREFBbUIsQ0FBQTtJQUNuQixrREFBb0IsQ0FBQTtJQUNwQixxREFBdUIsQ0FBQSxDQUFDLHNEQUFzRDtBQUNoRixDQUFDLEVBVlcsMEJBQTBCLEtBQTFCLDBCQUEwQixRQVVyQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxZQUFZO0lBQ3JFLFVBQVUsQ0FBQztJQUVYLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNuQixNQUFNLFlBQVksR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBRXpDLE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSTtZQUNGLE9BQU87Z0JBQ0wsWUFBWTtnQkFDWixJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUc7b0JBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxTQUFTO2dCQUNULGVBQWU7YUFDaEIsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0lBRUY7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T0FBTyxHQUFHLENBQUM7d0JBQ2IsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFJO1FBQ3JCLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRztRQUMxQixlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsU0FBUyxlQUFlLENBQUMsSUFBSTtRQUMzQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNoRCxPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpZXdDb250ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBmaW5kLCBmb3JFYWNoLCBtYXAsIHN0YXJ0c1dpdGgsIHVuYXJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGVudW0gVmlld0NvbnRleHRMZWdhY3lQYXJhbWV0ZXIge1xuICBEZXZpY2UgPSAnZGV2aWNlSWQnLFxuICBHcm91cCA9ICdncm91cElkJyxcbiAgVXNlciA9ICd1c2VySWQnLFxuICBBcHBsaWNhdGlvbiA9ICdhcHBsaWNhdGlvbklkJyxcbiAgTWljcm9zZXJ2aWNlID0gJ2FwcGxpY2F0aW9uSWQnLFxuICBTdWJzY3JpYmVkQXBwbGljYXRpb25zID0gJ2FwcGxpY2F0aW9uSWQnLFxuICBUZW5hbnQgPSAndGVuYW50SWQnLFxuICBTZXJ2aWNlID0gJ2RldmljZUlkJywgLy8gdXNlICdkZXZpY2VJZCcgYXMgcGFyYW1ldGVyIG5hbWUgc28gdGhhdCBkZXZpY2Ugdmlld3MgKE1lYXN1cmVtZW50cywgRXZlbnRzLCBBbGFybXMpIGNhbiBiZSByZXVzZWQgZm9yIHNlcnZpY2VcbiAgU2ltdWxhdG9ycyA9ICdkZXZpY2VJZCcgLy8gcmVxdWlyZWQgdG8gaG9vayB0aGUgQWxhcm1zIHRhYiB0byBhIFNpbXVsYXRvciB2aWV3XG59XG5cbmZ1bmN0aW9uIGM4eVZpZXdzUHJvdmlkZXIoJHJvdXRlUHJvdmlkZXIsIGM4eVRhYnNQcm92aWRlciwgYzh5UGF0aFV0aWxzKSB7XG4gICduZ0luamVjdCc7XG5cbiAgY29uc3Qgdmlld01hcCA9IHt9O1xuICBjb25zdCBjb250ZXh0Vmlld3MgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gIHJldHVybiB7XG4gICAgd2hlbixcbiAgICAkZ2V0KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGV4dFZpZXdzLFxuICAgICAgICB3aGVuKHBhdGgsIGNmZykge1xuICAgICAgICAgIHJldHVybiB3aGVuKHBhdGgsIGNmZywgdHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEJ5UGF0aCxcbiAgICAgICAgcHJlZml4V2l0aFNsYXNoXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHdoZW5cbiAgICogQG1ldGhvZE9mIGM4eS51aS5wcm92aWRlcjpjOHlWaWV3c1Byb3ZpZGVyXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEZWZpbmVzIGEgdmlldyBmb3IgZ2l2ZW4gcm91dGUuXG4gICAqIElmIG11bHRpcGxlIHZpZXdzIGFyZSBkZWZpbmVkIGZvciBhIHNpbmdsZSByb3V0ZSB0aGVuIHRoZXJlIHdpbGwgYmUgYSBzZXBhcmF0ZSB0YWIgZm9yIGVhY2ggdmlldyBhdmFpbGFibGUgd2hlbiB1c2VyIHZpc2l0cyB0aGF0IHJvdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBUYXJnZXQgcm91dGUuXG4gICAqIEBwYXJhbSBjZmcgVmlldyBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogLSAqKm5hbWUqKiAtIGBzdHJpbmdgIC0gVmlldydzIG5hbWUgKGluIGNhc2Ugb2YgbXVsdGlwbGUgdmlld3MgYXQgc2luZ2xlIHJvdXRlIHRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgdGFiJ3MgdGl0bGUpLlxuICAgKiAtICoqcHJpb3JpdHkqKiAtIGBpbnRlZ2VyYCAtIFZpZXcncyBwcmlvcml0eSAoaW4gY2FzZSBvZiBtdWx0aXBsZSB2aWV3cyBhdCBzaW5nbGUgcm91dGUgdGhpcyB3aWxsIGRldGVybWluZSB0aGUgcG9zaXRpb24gb2YgdmlldydzIHRhYiBpbiB0aGUgdGFicyBzdGFjaykuXG4gICAqIC0gKippY29uKiogLSBgc3RyaW5nYCAtIEZvbnQgQXdlc29tZSBpY29uIG5hbWUgZm9yIHRoZSB2aWV3IChkaXNwbGF5ZWQgb24gdGhlIHRhYidzIGhlYWRlcikuXG4gICAqIC0gKipzaG93SWYqKiAtIGBmdW5jdGlvbmAgLSBGdW5jdGlvbiByZXR1cm5pbmcgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc2hvdyBhIHRhYiBmb3IgdGhlIHZpZXcgb3Igbm90LlxuICAgKiAtICoqdGVtcGxhdGVVcmwqKiAtIGBzdHJpbmdgIC0gUGF0aCB0byB0aGUgdGVtcGxhdGUgdG8gdXNlIGZvciBkaXNwbGF5aW5nIHRoZSB2aWV3LlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBvdGhlciB2aWV3IG9wdGlvbnMgLSB0aGUgc2FtZSBhcyBhdmFpbGFibGUgZm9yIHN0YW5kYXJkIHtAbGluayBodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmdSb3V0ZS9wcm92aWRlci8kcm91dGVQcm92aWRlciAkcm91dGVQcm92aWRlcn0gaW4gQW5ndWxhckpTLlxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGFkZCBhIG5ldyB2aWV3IHRvIGRldmljZSBkZXRhaWxzIHJvdXRlXG4gICAqICh3aGljaCB3aWxsIGJlIGRpc3BsYXllZCBhcyBhIHRhYiBpZiBvdGhlciB2aWV3cyBhcmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgcm91dGUpOlxuICAgKiA8cHJlPlxuICAgKiAgIGM4eVZpZXdzUHJvdmlkZXIud2hlbignL2RldmljZS86ZGV2aWNlSWQnLCB7XG4gICAqICAgICBuYW1lOiAnVHJhY2tpbmcnLFxuICAgKiAgICAgdGVtcGxhdGVVcmw6ICc6OjpQTFVHSU5fUEFUSDo6Oi92aWV3cy9pbmRleC5odG1sJyxcbiAgICogICAgIGljb246ICdjcm9zc2hhaXJzJyxcbiAgICogICAgIHNob3dJZjogWyckcm91dGVQYXJhbXMnLCAnYzh5RGV2aWNlcycsIGZ1bmN0aW9uICgkcm91dGVQYXJhbXMsIGM4eURldmljZXMpIHtcbiAgICogICAgICAgdmFyIGRldmljZUlkID0gJHJvdXRlUGFyYW1zLmRldmljZUlkO1xuICAgKiAgICAgICByZXR1cm4gYzh5RGV2aWNlcy5kZXRhaWxDYWNoZWQoZGV2aWNlSWQpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgKiAgICAgICAgIHZhciBkZXZpY2UgPSByZXMuZGF0YTtcbiAgICogICAgICAgICByZXR1cm4gZGV2aWNlICYmIChkZXZpY2UuYzh5X01vdGlvblRyYWNraW5nIHx8IGRldmljZS5jOHlfR2VvZmVuY2UpO1xuICAgKiAgICAgICB9KTtcbiAgICogICAgIH1dXG4gICAqICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKiBgYGBcbiAgICovXG4gIGZ1bmN0aW9uIHdoZW4ocGF0aCwgY2ZnLCBydW5QaGFzZSkge1xuICAgIGNvbnN0IG5ld1BhdGggPSBwcmVmaXhXaXRoU2xhc2gocGF0aCk7XG4gICAgY2ZnLnJlc29sdmUgPSBjZmcucmVzb2x2ZSB8fCB7fTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICBjZmcucmVzb2x2ZS5fX2M4eV9sb2NhbGVzID0gW1xuICAgICAgJ2M4eUxvY2FsZXMnLFxuICAgICAgYzh5TG9jYWxlcyA9PiB7XG4gICAgICAgIHJldHVybiBjOHlMb2NhbGVzLmluaXREb25lO1xuICAgICAgfVxuICAgIF07XG5cbiAgICBsZXQgY3VycmVudENmZyA9IHZpZXdNYXBbbmV3UGF0aF07XG4gICAgY29uc3Qgb3JpZ2luYWxQYXRoID0gbmV3UGF0aDtcblxuICAgIGlmICghY2ZnLm5hbWUpIHtcbiAgICAgIC8vIGNvbnNvbGUud2FybignVmlldyBuYW1lIG5vdCBkZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjdXJyZW50Q2ZnKSB7XG4gICAgICB2aWV3TWFwW25ld1BhdGhdID0gW107XG4gICAgICBjdXJyZW50Q2ZnID0gdmlld01hcFtuZXdQYXRoXTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGdyYWRlZENvbnRleHQgPSBPYmplY3Qua2V5cyhWaWV3Q29udGV4dClcbiAgICAgIC5tYXAoa2V5ID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgaXNVcGdyYWRlOlxuICAgICAgICAgIHByZWZpeFdpdGhTbGFzaChWaWV3Q29udGV4dFtrZXldLnJlcGxhY2UoJ2lkJywgVmlld0NvbnRleHRMZWdhY3lQYXJhbWV0ZXJba2V5XSkpID09PSBwYXRoXG4gICAgICB9KSlcbiAgICAgIC5maW5kKCh7IGlzVXBncmFkZSB9KSA9PiBpc1VwZ3JhZGUpO1xuXG4gICAgaWYgKHVwZ3JhZGVkQ29udGV4dCkge1xuICAgICAgY3VycmVudENmZy5wdXNoKGNmZyk7XG4gICAgICBjZmcucGF0aCA9IG5ld1BhdGg7XG5cbiAgICAgIGNvbnN0IHAgPSBjOHlQYXRoVXRpbHMuYXBwZW5kU2VnbWVudChvcmlnaW5hbFBhdGgucmVwbGFjZShwYXRoLCAnJyksIGNmZy5uYW1lKTtcbiAgICAgIGNvbnRleHRWaWV3cy5uZXh0KHtcbiAgICAgICAgLi4uY2ZnLFxuICAgICAgICBwYXRoOiBjZmcubmFtZSA/IHAuc3Vic3RyaW5nKDEpIDogJycsXG4gICAgICAgIGNvbnRleHRLZXk6IHVwZ3JhZGVkQ29udGV4dC5rZXksXG4gICAgICAgIHJ1blBoYXNlXG4gICAgICB9KTtcbiAgICAgIGNmZy5zaG93SWYgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2ZnLm5hbWUpIHtcbiAgICAgICAgY2ZnLnBhdGggPSBjOHlQYXRoVXRpbHMuYXBwZW5kU2VnbWVudChvcmlnaW5hbFBhdGgsIGNmZy5uYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnJlbnRDZmcubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IFtleGlzdGluZ0NvbmZpZ10gPSBjdXJyZW50Q2ZnO1xuICAgICAgICBleGlzdGluZ0NvbmZpZy5wYXRoID0gYzh5UGF0aFV0aWxzLmFwcGVuZFNlZ21lbnQob3JpZ2luYWxQYXRoLCBleGlzdGluZ0NvbmZpZy5uYW1lKTtcbiAgICAgICAgZXhpc3RpbmdDb25maWcudGFiID0gY3JlYXRlVGFiKG9yaWdpbmFsUGF0aCwgZXhpc3RpbmdDb25maWcpO1xuICAgICAgICAkcm91dGVQcm92aWRlci53aGVuKGV4aXN0aW5nQ29uZmlnLnBhdGgsIGV4aXN0aW5nQ29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudENmZy5wdXNoKGNmZyk7XG4gICAgICBjZmcucGF0aCA9IG5ld1BhdGg7XG5cbiAgICAgIGlmIChjdXJyZW50Q2ZnLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY2ZnLnBhdGggPSBjOHlQYXRoVXRpbHMuYXBwZW5kU2VnbWVudChvcmlnaW5hbFBhdGgsIGNmZy5uYW1lKTtcbiAgICAgICAgY3JlYXRlVGFiKG9yaWdpbmFsUGF0aCwgY2ZnKTtcblxuICAgICAgICAkcm91dGVQcm92aWRlci53aGVuKHByZWZpeFdpdGhTbGFzaChvcmlnaW5hbFBhdGgpLCB7XG4gICAgICAgICAgcmVzb2x2ZVJlZGlyZWN0VG8oJHJvdXRlLCAkcSwgYzh5VWlVdGlsLCBjOHlUYWJzLCBnZXR0ZXh0Q2F0YWxvZykge1xuICAgICAgICAgICAgJ25nSW5qZWN0JztcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkQ3VycmVudENmZyA9IGM4eVRhYnNQcm92aWRlci5zb3J0VGFic1ZpZXdzKGN1cnJlbnRDZmcsIGdldHRleHRDYXRhbG9nKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9ICRyb3V0ZS5jdXJyZW50LnBhdGhQYXJhbXM7XG5cbiAgICAgICAgICAgIHJldHVybiAkcVxuICAgICAgICAgICAgICAuYWxsKG1hcChzb3J0ZWRDdXJyZW50Q2ZnLCB1bmFyeShjOHlVaVV0aWwuY29uZmlndXJlVmlzaWJpbGl0eSkpKVxuICAgICAgICAgICAgICAudGhlbih2aWV3cyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBmaW5kKHZpZXdzLCAnc2hvdycpO1xuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBmaXJzdC5wYXRoO1xuICAgICAgICAgICAgICAgIGZvckVhY2gocGFyYW1zLCAodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGA6JHtrZXl9YCwgdmFsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjOHlUYWJzLnJlZGlyZWN0ZWRWaWV3UGF0aCA9IHVybDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJHJvdXRlUHJvdmlkZXIud2hlbihwcmVmaXhXaXRoU2xhc2goY2ZnLnBhdGgpLCBjZmcpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QnlQYXRoKHBhdGgpIHtcbiAgICByZXR1cm4gdmlld01hcFtwcmVmaXhXaXRoU2xhc2gocGF0aCldO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVGFiKHBhdGgsIGNmZykge1xuICAgIGM4eVRhYnNQcm92aWRlci5hZGRUYWIocGF0aCwgY2ZnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZpeFdpdGhTbGFzaChwYXRoKSB7XG4gICAgY29uc3QgcHJlZml4ID0gc3RhcnRzV2l0aChwYXRoLCAnLycpID8gJycgOiAnLyc7XG4gICAgcmV0dXJuIHByZWZpeCArIHBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IHsgYzh5Vmlld3NQcm92aWRlciB9O1xuIl19