@bespunky/angular-zen
Version:
The Angular tools you always wished were there.
59 lines • 14.4 kB
JavaScript
import { InjectionToken } from '@angular/core';
import { RouteComposer } from './route-composer/router-composer';
import { firstUpper } from './_utils/_string-utils';
import { _NavigatorXToken_, _RouteComposer_ } from './_navigation-x.symbols';
export const autoNavigatorNameSeparator = '';
function generateRouteComposerName(path) {
return path
.replace(/\/:/g, '/')
.split('/')
.map(firstUpper)
.join(autoNavigatorNameSeparator);
}
/**
* Creates a strongly-typed configurator for Angular routes.
*
* Call this with an entity, then generate a strongly typed Angular route config tree using one of the
* configurator's functions.
*
* Store the generated route somewhere and use `provideRouterX()` or `provideRoutesX()` to tell Angular about it.
*
* @export
* @template Entity The entity (or data structure) route arguments should match with.
* @return {RouteConfigurator<Entity>} An object which allows generating strongly typed routes.
*/
export function routeConfigFor() {
function combinePath(root, segment) {
return (segment ? `${root}/${segment}` : root);
}
function prefixedRouteCore(route, root) {
const path = combinePath(root, route.path);
const composerName = (route.friendlyName ?? generateRouteComposerName(path));
const composer = new RouteComposer(path, composerName);
const children = route.children?.map(child => prefixedRoute(child, path));
return {
...route,
children,
[_RouteComposer_]: composer
};
}
function prefixedRoute(route, root) {
return {
...prefixedRouteCore(route, root),
[_NavigatorXToken_]: new InjectionToken(`_ROUTER_X_NAVIGATION__${route.path}`)
};
}
function route(route) {
// When the `root` arg was optional with a default value of `''`, TS appended `${string}` (e.g. `${string}/theaters/:theaterId`)
// to the route template for some reason, which breaks the arg extraction later on.
// Passing `''` manually however, leaves the template as is should be (e.g. `/theaters/:theaterId`) and allows the string template to be interpreted well.
// `route()` and `prefixedRoute()` were seperated to allow the developer to call `route()` without providing `''`.
// The `prefixedRoute()` is exposed to the world as it might be usefull in the future (e.g. lazy loaded routes? maybe...?)
return prefixedRoute(route, '');
}
return {
route,
prefixedRoute
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi14LnJvdXRlLWNyZWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItemVuL3JvdXRlci14L25hdmlnYXRpb24vc3JjL2xpYi9uYXZpZ2F0aW9uLXgucm91dGUtY3JlYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTzdFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUU3QyxTQUFTLHlCQUF5QixDQUFzQixJQUFVO0lBRTlELE9BQU8sSUFBSTtTQUNOLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO1NBQ3BCLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsVUFBVSxDQUFDO1NBQ2YsSUFBSSxDQUFDLDBCQUEwQixDQUFxQyxDQUFDO0FBQzlFLENBQUM7QUFnREQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsY0FBYztJQUUxQixTQUFTLFdBQVcsQ0FBOEMsSUFBVSxFQUFFLE9BQWlCO1FBRTNGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUksSUFBSyxJQUFLLE9BQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQWdDLENBQUM7SUFDdEYsQ0FBQztJQUVELFNBQVMsaUJBQWlCLENBS3hCLEtBQXFELEVBQUUsSUFBVTtRQUUvRCxNQUFNLElBQUksR0FBVyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQWdDLENBQUM7UUFDbEYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFpRSxDQUFDO1FBRTdJLE1BQU0sUUFBUSxHQUFHLElBQUksYUFBYSxDQUFvRyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUosTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUM0QixDQUFDO1FBRXJHLE9BQU87WUFDSCxHQUFHLEtBQUs7WUFDUixRQUFRO1lBQ1IsQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRO1NBQ3JCLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxhQUFhLENBS3BCLEtBQXFELEVBQUUsSUFBVTtRQUUvRCxPQUFPO1lBQ0gsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2pDLENBQUUsaUJBQWlCLENBQUUsRUFBRSxJQUFJLGNBQWMsQ0FBdUQseUJBQTBCLEtBQUssQ0FBQyxJQUFLLEVBQUUsQ0FBQztTQUNsSSxDQUFDO0lBQ2YsQ0FBQztJQUVELFNBQVMsS0FBSyxDQUlaLEtBQXFEO1FBRW5ELGdJQUFnSTtRQUNoSSxtRkFBbUY7UUFDbkYsMEpBQTBKO1FBQzFKLGtIQUFrSDtRQUNsSCwwSEFBMEg7UUFDMUgsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPO1FBQ0gsS0FBSztRQUNMLGFBQWE7S0FDYSxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBKb2luLCBOb1RhaWwgfSBmcm9tICdAYmVzcHVua3kvdHlwZXNjcmlwdC11dGlscyc7XG5cbmltcG9ydCB7IFJvdXRlQ29tcG9zZXIgfSBmcm9tICcuL3JvdXRlLWNvbXBvc2VyL3JvdXRlci1jb21wb3Nlcic7XG5pbXBvcnQgeyBmaXJzdFVwcGVyIH0gZnJvbSAnLi9fdXRpbHMvX3N0cmluZy11dGlscyc7XG5pbXBvcnQgeyBfTmF2aWdhdG9yWFRva2VuXywgX1JvdXRlQ29tcG9zZXJfIH0gZnJvbSAnLi9fbmF2aWdhdGlvbi14LnN5bWJvbHMnO1xuXG5pbXBvcnQgdHlwZSB7IEF1dG9OYXZpZ2F0ZVJvdXRlTWV0aG9kcyB9IGZyb20gJy4vdHlwZXMvYXV0by1uYXZpZ2F0b3ItbWV0aG9kcy50eXBlcyc7XG5pbXBvcnQgdHlwZSB7IENvbXBvc2FibGVSb3V0ZSwgQ29tcG9zYWJsZVJvdXRlc0FycmF5LCBEZWVwUmVhZG9ubHlSb3V0ZUNoaWxkcmVuLCBSZWFkb25seVJvdXRlLCBXaXRoTmF2aWdhdGlvblggfSBmcm9tICcuL3R5cGVzL2NvbXBvc2FibGUtcm91dGVzLnR5cGVzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVkUm91dGVDb21wb3Nlck5hbWUsIFJvdXRlQ29tcG9zZXJOYW1lIH0gZnJvbSAnLi90eXBlcy9yb3V0ZS1jb21wb3Nlci50eXBlcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkUGF0aCwgUm91dGVTZWdtZW50cyB9IGZyb20gJy4vdHlwZXMvcm91dGUtcGF0aHMudHlwZXMnO1xuXG5leHBvcnQgY29uc3QgYXV0b05hdmlnYXRvck5hbWVTZXBhcmF0b3IgPSAnJztcblxuZnVuY3Rpb24gZ2VuZXJhdGVSb3V0ZUNvbXBvc2VyTmFtZTxQYXRoIGV4dGVuZHMgc3RyaW5nPihwYXRoOiBQYXRoKTogR2VuZXJhdGVkUm91dGVDb21wb3Nlck5hbWU8UGF0aD5cbntcbiAgICByZXR1cm4gcGF0aFxuICAgICAgICAucmVwbGFjZSgvXFwvOi9nLCAnLycpXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5tYXAoZmlyc3RVcHBlcilcbiAgICAgICAgLmpvaW4oYXV0b05hdmlnYXRvck5hbWVTZXBhcmF0b3IpIGFzIEdlbmVyYXRlZFJvdXRlQ29tcG9zZXJOYW1lPFBhdGg+O1xufVxuXG5pbnRlcmZhY2UgUm91dGVDb25maWd1cmF0b3I8RW50aXR5Plxue1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHN0cm9uZ2x5LXR5cGVkIG5hdmlnYXRpb24teCByb3V0ZS5cbiAgICAgKiBQYXNzIHRoZSByZXN1bHQgdG8gZWl0aGVyIGBwcm92aWRlUm91dGVyWCgpYCBvciBgcHJvdmlkZVJvdXRlc1goKWAgYW5kIHlvdSdsbCBiZSBhYmxlIHRvIGNhbGwgYHVzZU5hdmlnYXRpb25YKClgXG4gICAgICogd2l0aCB0aGUgcm91dGUgdHJlZSB5b3Ugc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICog4p2VIFJlbWVtYmVyIHRvIHBhc3MgdGhlIHJvdXRlIGNvbmZpZyBgYXMgY29uc3RgLlxuICAgICAqIFxuICAgICAqIEB0ZW1wbGF0ZSBTZWdtZW50IFRoZSBzdHJvbmctdHlwZWQgcGF0aCBwcm9wZXJ0eSBvZiB0aGUgcm91dGUgc2VnbWVudC5cbiAgICAgKiBAdGVtcGxhdGUgRnJpZW5kbHlOYW1lIFRoZSBzdHJvbmctdHlwZWQgZnJpZW5kbHkgbmFtZSBmb3IgdGhlIHJvdXRlIHNlZ21lbnQuIFRha2VuIGZyb20gdGhlIGBmcmllbmRseU5hbWVgIHByb2VwcnR5LlxuICAgICAqIEB0ZW1wbGF0ZSBDaGlsZHJlbiBUaGUgc3Ryb25nLXR5cGVkIGNoaWxkcmVuIG9mIHRoZSByb3V0ZSBzZWdtZW50LlxuICAgICAqIEBwYXJhbSB7UmVhZG9ubHlSb3V0ZTxTZWdtZW50LCBGcmllbmRseU5hbWUsIENoaWxkcmVuPn0gcm91dGUgVGhlIHJvdXRlIGNvbmZpZyB0byBzdHJvbmctdHlwZS4gUmVtZW1iZXIgdG8gcGFzcyBpdCBpbiB1c2UgYGFzIGNvbnN0YC5cbiAgICAgKiBAcmV0dXJuICBcbiAgICAgKi9cbiAgICAgcm91dGU6IDxcbiAgICAgICAgU2VnbWVudCBleHRlbmRzIHN0cmluZyxcbiAgICAgICAgRnJpZW5kbHlOYW1lIGV4dGVuZHMgc3RyaW5nLFxuICAgICAgICBDaGlsZHJlbiBleHRlbmRzIERlZXBSZWFkb25seVJvdXRlQ2hpbGRyZW4gfCB1bmRlZmluZWRcbiAgICA+KHJvdXRlOiBSZWFkb25seVJvdXRlPFNlZ21lbnQsIEZyaWVuZGx5TmFtZSwgQ2hpbGRyZW4+KSA9PlxuICAgICAgICBDb21wb3NhYmxlUm91dGU8dHlwZW9mIHJvdXRlLCBFbnRpdHksICcnPiAmIFdpdGhOYXZpZ2F0aW9uWDx0eXBlb2Ygcm91dGUsIEVudGl0eSwgJyc+O1xuICAgIFxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHN0cm9uZ2x5LXR5cGVkIG5hdmlnYXRpb24teCByb3V0ZSB3aXRoIGEgcHJlZGVmaW5lZCBwYXRoIHByZWZpeC5cbiAgICAgKiBQYXNzIHRoZSByZXN1bHQgdG8gZWl0aGVyIGBwcm92aWRlUm91dGVyWCgpYCBvciBgcHJvdmlkZVJvdXRlc1goKWAgYW5kIHlvdSdsbCBiZSBhYmxlIHRvIGNhbGwgYHVzZU5hdmlnYXRpb25YKClgXG4gICAgICogd2l0aCB0aGUgcm91dGUgdHJlZSB5b3Ugc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICog4p2VIFJlbWVtYmVyIHRvIHBhc3MgdGhlIHJvdXRlIGNvbmZpZyBgYXMgY29uc3RgLlxuICAgICAqIFxuICAgICAqIEB0ZW1wbGF0ZSBTZWdtZW50IFRoZSBzdHJvbmctdHlwZWQgcGF0aCBwcm9wZXJ0eSBvZiB0aGUgcm91dGUgc2VnbWVudC5cbiAgICAgKiBAdGVtcGxhdGUgRnJpZW5kbHlOYW1lIFRoZSBzdHJvbmctdHlwZWQgZnJpZW5kbHkgbmFtZSBmb3IgdGhlIHJvdXRlIHNlZ21lbnQuIFRha2VuIGZyb20gdGhlIGBmcmllbmRseU5hbWVgIHByb2VwcnR5LlxuICAgICAqIEB0ZW1wbGF0ZSBDaGlsZHJlbiBUaGUgc3Ryb25nLXR5cGVkIGNoaWxkcmVuIG9mIHRoZSByb3V0ZSBzZWdtZW50LlxuICAgICAqIEB0ZW1wbGF0ZSBSb290IFRoZSBzdHJvbmctdHlwZWQgdXJsIHByZWZpeCBmb3IgYWxsIHJvdXRlcyBpbiB0aGUgdHJlZS5cbiAgICAgKiBAcGFyYW0ge1JlYWRvbmx5Um91dGU8U2VnbWVudCwgRnJpZW5kbHlOYW1lLCBDaGlsZHJlbj59IHJvdXRlIFRoZSByb3V0ZSBjb25maWcgdG8gc3Ryb25nLXR5cGUuIFJlbWVtYmVyIHRvIHBhc3MgaXQgaW4gdXNlIGBhcyBjb25zdGAuXG4gICAgICogQHBhcmFtIHtSb290fSByb290IFRoZSB1cmwgcHJlZml4IGFsbCByb3V0ZXMgaW4gdGhpcyBjb25maWcgdHJlZSBzdGFydCBmcm9tLlxuICAgICAqIEByZXR1cm4gIFxuICAgICAqL1xuICAgIHByZWZpeGVkUm91dGU6IDxcbiAgICAgICAgU2VnbWVudCBleHRlbmRzIHN0cmluZyxcbiAgICAgICAgRnJpZW5kbHlOYW1lIGV4dGVuZHMgc3RyaW5nLFxuICAgICAgICBDaGlsZHJlbiBleHRlbmRzIERlZXBSZWFkb25seVJvdXRlQ2hpbGRyZW4gfCB1bmRlZmluZWQsXG4gICAgICAgIFJvb3QgZXh0ZW5kcyBzdHJpbmdcbiAgICA+KHJvdXRlOiBSZWFkb25seVJvdXRlPFNlZ21lbnQsIEZyaWVuZGx5TmFtZSwgQ2hpbGRyZW4+LCByb290OiBSb290KSA9PiBcbiAgICAgICAgQ29tcG9zYWJsZVJvdXRlPHR5cGVvZiByb3V0ZSwgRW50aXR5LCBSb290PiAmIFdpdGhOYXZpZ2F0aW9uWDx0eXBlb2Ygcm91dGUsIEVudGl0eSwgSm9pbjxOb1RhaWw8Um91dGVTZWdtZW50czxSb290Pj4gJiBzdHJpbmdbXSwgJy8nPj47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cm9uZ2x5LXR5cGVkIGNvbmZpZ3VyYXRvciBmb3IgQW5ndWxhciByb3V0ZXMuXG4gKiBcbiAqIENhbGwgdGhpcyB3aXRoIGFuIGVudGl0eSwgdGhlbiBnZW5lcmF0ZSBhIHN0cm9uZ2x5IHR5cGVkIEFuZ3VsYXIgcm91dGUgY29uZmlnIHRyZWUgdXNpbmcgb25lIG9mIHRoZVxuICogY29uZmlndXJhdG9yJ3MgZnVuY3Rpb25zLlxuICogXG4gKiBTdG9yZSB0aGUgZ2VuZXJhdGVkIHJvdXRlIHNvbWV3aGVyZSBhbmQgdXNlIGBwcm92aWRlUm91dGVyWCgpYCBvciBgcHJvdmlkZVJvdXRlc1goKWAgdG8gdGVsbCBBbmd1bGFyIGFib3V0IGl0LlxuICpcbiAqIEBleHBvcnRcbiAqIEB0ZW1wbGF0ZSBFbnRpdHkgVGhlIGVudGl0eSAob3IgZGF0YSBzdHJ1Y3R1cmUpIHJvdXRlIGFyZ3VtZW50cyBzaG91bGQgbWF0Y2ggd2l0aC5cbiAqIEByZXR1cm4ge1JvdXRlQ29uZmlndXJhdG9yPEVudGl0eT59IEFuIG9iamVjdCB3aGljaCBhbGxvd3MgZ2VuZXJhdGluZyBzdHJvbmdseSB0eXBlZCByb3V0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3V0ZUNvbmZpZ0ZvcjxFbnRpdHk+KCk6IFJvdXRlQ29uZmlndXJhdG9yPEVudGl0eT5cbntcbiAgICBmdW5jdGlvbiBjb21iaW5lUGF0aDxSb290IGV4dGVuZHMgc3RyaW5nLCBTZWdtZW50IGV4dGVuZHMgc3RyaW5nPihyb290OiBSb290LCBzZWdtZW50PzogU2VnbWVudClcbiAgICB7XG4gICAgICAgIHJldHVybiAoc2VnbWVudCA/IGAkeyByb290IH0vJHsgc2VnbWVudCB9YCA6IHJvb3QpIGFzIENvbWJpbmVkUGF0aDxSb290LCBTZWdtZW50PjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVmaXhlZFJvdXRlQ29yZTxcbiAgICAgICAgU2VnbWVudCAgICAgIGV4dGVuZHMgc3RyaW5nLFxuICAgICAgICBGcmllbmRseU5hbWUgZXh0ZW5kcyBzdHJpbmcsXG4gICAgICAgIENoaWxkcmVuICAgICBleHRlbmRzIERlZXBSZWFkb25seVJvdXRlQ2hpbGRyZW4gfCB1bmRlZmluZWQsXG4gICAgICAgIFJvb3QgICAgICAgICBleHRlbmRzIHN0cmluZ1xuICAgID4ocm91dGU6IFJlYWRvbmx5Um91dGU8U2VnbWVudCwgRnJpZW5kbHlOYW1lLCBDaGlsZHJlbj4sIHJvb3Q6IFJvb3QpLy86IENvbXBvc2FibGVSb3V0ZTx0eXBlb2Ygcm91dGUsIEVudGl0eSwgQ29tYmluZWRQYXRoPFJvb3QsIFNlZ21lbnQ+PlxuICAgIHtcbiAgICAgICAgY29uc3QgcGF0aCAgICAgICAgID0gY29tYmluZVBhdGgocm9vdCwgcm91dGUucGF0aCkgYXMgQ29tYmluZWRQYXRoPFJvb3QsIFNlZ21lbnQ+O1xuICAgICAgICBjb25zdCBjb21wb3Nlck5hbWUgPSAocm91dGUuZnJpZW5kbHlOYW1lID8/IGdlbmVyYXRlUm91dGVDb21wb3Nlck5hbWUocGF0aCkpIGFzIFJvdXRlQ29tcG9zZXJOYW1lPEZyaWVuZGx5TmFtZSwgQ29tYmluZWRQYXRoPFJvb3QsIFNlZ21lbnQ+PjtcblxuICAgICAgICBjb25zdCBjb21wb3NlciA9IG5ldyBSb3V0ZUNvbXBvc2VyPEVudGl0eSwgQ29tYmluZWRQYXRoPFJvb3QsIFNlZ21lbnQ+LCBSb3V0ZUNvbXBvc2VyTmFtZTxGcmllbmRseU5hbWUsIENvbWJpbmVkUGF0aDxSb290LCBTZWdtZW50Pj4+KHBhdGgsIGNvbXBvc2VyTmFtZSk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcm91dGUuY2hpbGRyZW4/Lm1hcChjaGlsZCA9PiBwcmVmaXhlZFJvdXRlKGNoaWxkLCBwYXRoKSkgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NhYmxlUm91dGVzQXJyYXk8Q2hpbGRyZW4sIEVudGl0eSwgQ29tYmluZWRQYXRoPFJvb3QsIFNlZ21lbnQ+PiB8IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucm91dGUsXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIFtfUm91dGVDb21wb3Nlcl9dOiBjb21wb3NlclxuICAgICAgICB9IGFzIGNvbnN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZWZpeGVkUm91dGU8XG4gICAgICAgIFNlZ21lbnQgICAgICBleHRlbmRzIHN0cmluZyxcbiAgICAgICAgRnJpZW5kbHlOYW1lIGV4dGVuZHMgc3RyaW5nLFxuICAgICAgICBDaGlsZHJlbiAgICAgZXh0ZW5kcyBEZWVwUmVhZG9ubHlSb3V0ZUNoaWxkcmVuIHwgdW5kZWZpbmVkLFxuICAgICAgICBSb290ICAgICAgICAgZXh0ZW5kcyBzdHJpbmdcbiAgICA+KHJvdXRlOiBSZWFkb25seVJvdXRlPFNlZ21lbnQsIEZyaWVuZGx5TmFtZSwgQ2hpbGRyZW4+LCByb290OiBSb290KS8vOiBDb21wb3NhYmxlUm9vdFJvdXRlPENvbXBvc2FibGVSb3V0ZTx0eXBlb2Ygcm91dGUsIEVudGl0eSwgQ29tYmluZWRQYXRoPFJvb3QsIFNlZ21lbnQ+Pj5cbiAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmVmaXhlZFJvdXRlQ29yZShyb3V0ZSwgcm9vdCksXG4gICAgICAgICAgICBbIF9OYXZpZ2F0b3JYVG9rZW5fIF06IG5ldyBJbmplY3Rpb25Ub2tlbjxBdXRvTmF2aWdhdGVSb3V0ZU1ldGhvZHM8dHlwZW9mIHJvdXRlLCBFbnRpdHksIFJvb3Q+PihgX1JPVVRFUl9YX05BVklHQVRJT05fXyR7IHJvdXRlLnBhdGggfWApXG4gICAgICAgIH0gYXMgY29uc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm91dGU8XG4gICAgICAgIFNlZ21lbnQgICAgICBleHRlbmRzIHN0cmluZyxcbiAgICAgICAgRnJpZW5kbHlOYW1lIGV4dGVuZHMgc3RyaW5nLFxuICAgICAgICBDaGlsZHJlbiAgICAgZXh0ZW5kcyBEZWVwUmVhZG9ubHlSb3V0ZUNoaWxkcmVuIHwgdW5kZWZpbmVkXG4gICAgPihyb3V0ZTogUmVhZG9ubHlSb3V0ZTxTZWdtZW50LCBGcmllbmRseU5hbWUsIENoaWxkcmVuPikvLzogQ29tcG9zYWJsZVJvb3RSb3V0ZTxDb21wb3NhYmxlUm91dGU8dHlwZW9mIHJvdXRlLCBFbnRpdHksIENvbWJpbmVkUGF0aDwnJywgU2VnbWVudD4+PlxuICAgIHtcbiAgICAgICAgLy8gV2hlbiB0aGUgYHJvb3RgIGFyZyB3YXMgb3B0aW9uYWwgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgYCcnYCwgVFMgYXBwZW5kZWQgYCR7c3RyaW5nfWAgKGUuZy4gYCR7c3RyaW5nfS90aGVhdGVycy86dGhlYXRlcklkYClcbiAgICAgICAgLy8gdG8gdGhlIHJvdXRlIHRlbXBsYXRlIGZvciBzb21lIHJlYXNvbiwgd2hpY2ggYnJlYWtzIHRoZSBhcmcgZXh0cmFjdGlvbiBsYXRlciBvbi5cbiAgICAgICAgLy8gUGFzc2luZyBgJydgIG1hbnVhbGx5IGhvd2V2ZXIsIGxlYXZlcyB0aGUgdGVtcGxhdGUgYXMgaXMgc2hvdWxkIGJlIChlLmcuIGAvdGhlYXRlcnMvOnRoZWF0ZXJJZGApIGFuZCBhbGxvd3MgdGhlIHN0cmluZyB0ZW1wbGF0ZSB0byBiZSBpbnRlcnByZXRlZCB3ZWxsLlxuICAgICAgICAvLyBgcm91dGUoKWAgYW5kIGBwcmVmaXhlZFJvdXRlKClgIHdlcmUgc2VwZXJhdGVkIHRvIGFsbG93IHRoZSBkZXZlbG9wZXIgdG8gY2FsbCBgcm91dGUoKWAgd2l0aG91dCBwcm92aWRpbmcgYCcnYC5cbiAgICAgICAgLy8gVGhlIGBwcmVmaXhlZFJvdXRlKClgIGlzIGV4cG9zZWQgdG8gdGhlIHdvcmxkIGFzIGl0IG1pZ2h0IGJlIHVzZWZ1bGwgaW4gdGhlIGZ1dHVyZSAoZS5nLiBsYXp5IGxvYWRlZCByb3V0ZXM/IG1heWJlLi4uPylcbiAgICAgICAgcmV0dXJuIHByZWZpeGVkUm91dGUocm91dGUsICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICByb3V0ZSxcbiAgICAgICAgcHJlZml4ZWRSb3V0ZVxuICAgIH0gYXMgUm91dGVDb25maWd1cmF0b3I8RW50aXR5Pjtcbn1cblxuIl19