angular/modules/@angular/router/build/es6/src/recognize.js
2016-06-21 12:17:30 -07:00

163 lines
No EOL
25 KiB
JavaScript

import { flatten, first, merge } from './utils/collection';
import { TreeNode } from './utils/tree';
import { RouterStateSnapshot, ActivatedRouteSnapshot } from './router_state';
import { PRIMARY_OUTLET } from './shared';
import { Observable } from 'rxjs/Observable';
export function recognize(rootComponentType, config, url) {
try {
const match = new MatchResult(rootComponentType, config, [url.root], {}, url._root.children, [], PRIMARY_OUTLET, null, url.root);
const roots = constructActivatedRoute(match);
const res = new RouterStateSnapshot(roots[0], url.queryParameters, url.fragment);
return new Observable(obs => {
obs.next(res);
obs.complete();
});
}
catch (e) {
return new Observable(obs => obs.error(e));
}
}
function constructActivatedRoute(match) {
const activatedRoute = createActivatedRouteSnapshot(match);
const children = match.leftOverUrl.length > 0 ?
recognizeMany(match.children, match.leftOverUrl) : recognizeLeftOvers(match.children, match.lastUrlSegment);
checkOutletNameUniqueness(children);
children.sort((a, b) => {
if (a.value.outlet === PRIMARY_OUTLET)
return -1;
if (b.value.outlet === PRIMARY_OUTLET)
return 1;
return a.value.outlet.localeCompare(b.value.outlet);
});
return [new TreeNode(activatedRoute, children)];
}
function recognizeLeftOvers(config, lastUrlSegment) {
if (!config)
return [];
const mIndex = matchIndex(config, [], lastUrlSegment);
return mIndex ? constructActivatedRoute(mIndex) : [];
}
function recognizeMany(config, urls) {
return flatten(urls.map(url => recognizeOne(config, url)));
}
function createActivatedRouteSnapshot(match) {
return new ActivatedRouteSnapshot(match.consumedUrlSegments, match.parameters, match.outlet, match.component, match.route, match.lastUrlSegment);
}
function recognizeOne(config, url) {
const m = match(config, url);
const primary = constructActivatedRoute(m);
const secondary = recognizeMany(config, m.secondary);
const res = primary.concat(secondary);
checkOutletNameUniqueness(res);
return res;
}
function checkOutletNameUniqueness(nodes) {
let names = {};
nodes.forEach(n => {
let routeWithSameOutletName = names[n.value.outlet];
if (routeWithSameOutletName) {
const p = routeWithSameOutletName.urlSegments.map(s => s.toString()).join("/");
const c = n.value.urlSegments.map(s => s.toString()).join("/");
throw new Error(`Two segments cannot have the same outlet name: '${p}' and '${c}'.`);
}
names[n.value.outlet] = n.value;
});
return nodes;
}
function match(config, url) {
const m = matchNonIndex(config, url);
if (m)
return m;
const mIndex = matchIndex(config, [url], url.value);
if (mIndex)
return mIndex;
const availableRoutes = config.map(r => {
const outlet = !r.outlet ? '' : `${r.outlet}:`;
return `'${outlet}${r.path}'`;
}).join(", ");
throw new Error(`Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`);
}
function matchNonIndex(config, url) {
for (let r of config) {
let m = matchWithParts(r, url);
if (m)
return m;
}
return null;
}
function matchIndex(config, leftOverUrls, lastUrlSegment) {
for (let r of config) {
if (r.index) {
const outlet = r.outlet ? r.outlet : PRIMARY_OUTLET;
const children = r.children ? r.children : [];
return new MatchResult(r.component, children, [], lastUrlSegment.parameters, leftOverUrls, [], outlet, r, lastUrlSegment);
}
}
return null;
}
function matchWithParts(route, url) {
if (!route.path)
return null;
if ((route.outlet ? route.outlet : PRIMARY_OUTLET) !== url.value.outlet)
return null;
const path = route.path.startsWith("/") ? route.path.substring(1) : route.path;
if (path === "**") {
const consumedUrl = [];
let u = url;
while (u) {
consumedUrl.push(u.value);
u = first(u.children);
}
const last = consumedUrl[consumedUrl.length - 1];
return new MatchResult(route.component, [], consumedUrl, last.parameters, [], [], PRIMARY_OUTLET, route, last);
}
const parts = path.split("/");
const positionalParams = {};
const consumedUrlSegments = [];
let lastParent = null;
let lastSegment = null;
let current = url;
for (let i = 0; i < parts.length; ++i) {
if (!current)
return null;
const p = parts[i];
const isLastSegment = i === parts.length - 1;
const isLastParent = i === parts.length - 2;
const isPosParam = p.startsWith(":");
if (!isPosParam && p != current.value.path)
return null;
if (isLastSegment) {
lastSegment = current;
}
if (isLastParent) {
lastParent = current;
}
if (isPosParam) {
positionalParams[p.substring(1)] = current.value.path;
}
consumedUrlSegments.push(current.value);
current = first(current.children);
}
if (!lastSegment)
throw "Cannot be reached";
const p = lastSegment.value.parameters;
const parameters = merge(p, positionalParams);
const secondarySubtrees = lastParent ? lastParent.children.slice(1) : [];
const children = route.children ? route.children : [];
const outlet = route.outlet ? route.outlet : PRIMARY_OUTLET;
return new MatchResult(route.component, children, consumedUrlSegments, parameters, lastSegment.children, secondarySubtrees, outlet, route, lastSegment.value);
}
class MatchResult {
constructor(component, children, consumedUrlSegments, parameters, leftOverUrl, secondary, outlet, route, lastUrlSegment) {
this.component = component;
this.children = children;
this.consumedUrlSegments = consumedUrlSegments;
this.parameters = parameters;
this.leftOverUrl = leftOverUrl;
this.secondary = secondary;
this.outlet = outlet;
this.route = route;
this.lastUrlSegment = lastUrlSegment;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb2duaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlY29nbml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiT0FDTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CO09BQ25ELEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYztPQUNoQyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCO09BQ3JFLEVBQVUsY0FBYyxFQUFFLE1BQU0sVUFBVTtPQUcxQyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQjtBQUU1QywwQkFBMEIsaUJBQXVCLEVBQUUsTUFBb0IsRUFBRSxHQUFZO0lBQ25GLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pJLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBc0IsR0FBRztZQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBRTtJQUFBLEtBQUssQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixNQUFNLENBQUMsSUFB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akIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFjO1FBQ2pDLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQ25DLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUNuQyxjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUNqQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBWTtJQUMxQyxDQUFDO0FBQ04sQ0FBQztBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXJsVHJlZSwgVXJsU2VnbWVudCB9IGZyb20gJy4vdXJsX3RyZWUnO1xuaW1wb3J0IHsgZmxhdHRlbiwgZmlyc3QsIG1lcmdlIH0gZnJvbSAnLi91dGlscy9jb2xsZWN0aW9uJztcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi91dGlscy90cmVlJztcbmltcG9ydCB7IFJvdXRlclN0YXRlU25hcHNob3QsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICcuL3JvdXRlcl9zdGF0ZSc7XG5pbXBvcnQgeyBQYXJhbXMsIFBSSU1BUllfT1VUTEVUIH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHsgUm91dGVyQ29uZmlnLCBSb3V0ZSB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVjb2duaXplKHJvb3RDb21wb25lbnRUeXBlOiBUeXBlLCBjb25maWc6IFJvdXRlckNvbmZpZywgdXJsOiBVcmxUcmVlKTogT2JzZXJ2YWJsZTxSb3V0ZXJTdGF0ZVNuYXBzaG90PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgTWF0Y2hSZXN1bHQocm9vdENvbXBvbmVudFR5cGUsIGNvbmZpZywgW3VybC5yb290XSwge30sIHVybC5fcm9vdC5jaGlsZHJlbiwgW10sIFBSSU1BUllfT1VUTEVULCBudWxsLCB1cmwucm9vdCk7XG4gICAgY29uc3Qgcm9vdHMgPSBjb25zdHJ1Y3RBY3RpdmF0ZWRSb3V0ZShtYXRjaCk7XG4gICAgY29uc3QgcmVzID0gbmV3IFJvdXRlclN0YXRlU25hcHNob3Qocm9vdHNbMF0sIHVybC5xdWVyeVBhcmFtZXRlcnMsIHVybC5mcmFnbWVudCk7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJvdXRlclN0YXRlU25hcHNob3Q+KG9icyA9PiB7XG4gICAgICBvYnMubmV4dChyZXMpO1xuICAgICAgb2JzLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxSb3V0ZXJTdGF0ZVNuYXBzaG90PihvYnMgPT4gb2JzLmVycm9yKGUpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RBY3RpdmF0ZWRSb3V0ZShtYXRjaDogTWF0Y2hSZXN1bHQpOiBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PltdIHtcbiAgY29uc3QgYWN0aXZhdGVkUm91dGUgPSBjcmVhdGVBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KG1hdGNoKTtcbiAgY29uc3QgY2hpbGRyZW4gPSBtYXRjaC5sZWZ0T3ZlclVybC5sZW5ndGggPiAwID9cbiAgICByZWNvZ25pemVNYW55KG1hdGNoLmNoaWxkcmVuLCBtYXRjaC5sZWZ0T3ZlclVybCkgOiByZWNvZ25pemVMZWZ0T3ZlcnMobWF0Y2guY2hpbGRyZW4sIG1hdGNoLmxhc3RVcmxTZWdtZW50KTtcbiAgY2hlY2tPdXRsZXROYW1lVW5pcXVlbmVzcyhjaGlsZHJlbik7XG4gIGNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS52YWx1ZS5vdXRsZXQgPT09IFBSSU1BUllfT1VUTEVUKSByZXR1cm4gLTE7XG4gICAgaWYgKGIudmFsdWUub3V0bGV0ID09PSBQUklNQVJZX09VVExFVCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIGEudmFsdWUub3V0bGV0LmxvY2FsZUNvbXBhcmUoYi52YWx1ZS5vdXRsZXQpXG4gIH0pO1xuICByZXR1cm4gW25ldyBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PihhY3RpdmF0ZWRSb3V0ZSwgY2hpbGRyZW4pXTtcbn1cblxuZnVuY3Rpb24gcmVjb2duaXplTGVmdE92ZXJzKGNvbmZpZzogUm91dGVbXSwgbGFzdFVybFNlZ21lbnQ6IFVybFNlZ21lbnQpOiBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PltdIHtcbiAgaWYgKCFjb25maWcpIHJldHVybiBbXTtcbiAgY29uc3QgbUluZGV4ID0gbWF0Y2hJbmRleChjb25maWcsIFtdLCBsYXN0VXJsU2VnbWVudCk7XG4gIHJldHVybiBtSW5kZXggPyBjb25zdHJ1Y3RBY3RpdmF0ZWRSb3V0ZShtSW5kZXgpIDogW107XG59XG5cbmZ1bmN0aW9uIHJlY29nbml6ZU1hbnkoY29uZmlnOiBSb3V0ZVtdLCB1cmxzOiBUcmVlTm9kZTxVcmxTZWdtZW50PltdKTogVHJlZU5vZGU8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD5bXSB7XG4gIHJldHVybiBmbGF0dGVuKHVybHMubWFwKHVybCA9PiByZWNvZ25pemVPbmUoY29uZmlnLCB1cmwpKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFjdGl2YXRlZFJvdXRlU25hcHNob3QobWF0Y2g6IE1hdGNoUmVzdWx0KTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gIHJldHVybiBuZXcgQWN0aXZhdGVkUm91dGVTbmFwc2hvdChtYXRjaC5jb25zdW1lZFVybFNlZ21lbnRzLCBtYXRjaC5wYXJhbWV0ZXJzLCBtYXRjaC5vdXRsZXQsIG1hdGNoLmNvbXBvbmVudCwgbWF0Y2gucm91dGUsIG1hdGNoLmxhc3RVcmxTZWdtZW50KTtcbn1cblxuZnVuY3Rpb24gcmVjb2duaXplT25lKGNvbmZpZzogUm91dGVbXSwgdXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IFRyZWVOb2RlPEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+W10ge1xuICBjb25zdCBtID0gbWF0Y2goY29uZmlnLCB1cmwpO1xuICBjb25zdCBwcmltYXJ5ID0gY29uc3RydWN0QWN0aXZhdGVkUm91dGUobSk7XG4gIGNvbnN0IHNlY29uZGFyeSA9IHJlY29nbml6ZU1hbnkoY29uZmlnLCBtLnNlY29uZGFyeSk7XG4gIGNvbnN0IHJlcyA9IHByaW1hcnkuY29uY2F0KHNlY29uZGFyeSk7XG4gIGNoZWNrT3V0bGV0TmFtZVVuaXF1ZW5lc3MocmVzKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gY2hlY2tPdXRsZXROYW1lVW5pcXVlbmVzcyhub2RlczogVHJlZU5vZGU8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD5bXSk6IFRyZWVOb2RlPEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+W10ge1xuICBsZXQgbmFtZXMgPSB7fTtcbiAgbm9kZXMuZm9yRWFjaChuID0+IHtcbiAgICBsZXQgcm91dGVXaXRoU2FtZU91dGxldE5hbWUgPSBuYW1lc1tuLnZhbHVlLm91dGxldF07XG4gICAgaWYgKHJvdXRlV2l0aFNhbWVPdXRsZXROYW1lKSB7XG4gICAgICBjb25zdCBwID0gcm91dGVXaXRoU2FtZU91dGxldE5hbWUudXJsU2VnbWVudHMubWFwKHMgPT4gcy50b1N0cmluZygpKS5qb2luKFwiL1wiKTtcbiAgICAgIGNvbnN0IGMgPSBuLnZhbHVlLnVybFNlZ21lbnRzLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbihcIi9cIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR3byBzZWdtZW50cyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBvdXRsZXQgbmFtZTogJyR7cH0nIGFuZCAnJHtjfScuYCk7XG4gICAgfVxuICAgIG5hbWVzW24udmFsdWUub3V0bGV0XSA9IG4udmFsdWU7XG4gIH0pO1xuICByZXR1cm4gbm9kZXM7XG59XG5cbmZ1bmN0aW9uIG1hdGNoKGNvbmZpZzogUm91dGVbXSwgdXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IE1hdGNoUmVzdWx0IHtcbiAgY29uc3QgbSA9IG1hdGNoTm9uSW5kZXgoY29uZmlnLCB1cmwpO1xuICBpZiAobSkgcmV0dXJuIG07XG5cbiAgY29uc3QgbUluZGV4ID0gbWF0Y2hJbmRleChjb25maWcsIFt1cmxdLCB1cmwudmFsdWUpO1xuICBpZiAobUluZGV4KSByZXR1cm4gbUluZGV4O1xuXG4gIGNvbnN0IGF2YWlsYWJsZVJvdXRlcyA9IGNvbmZpZy5tYXAociA9PiB7XG4gICAgY29uc3Qgb3V0bGV0ID0gIXIub3V0bGV0ID8gJycgOiBgJHtyLm91dGxldH06YDtcbiAgICByZXR1cm4gYCcke291dGxldH0ke3IucGF0aH0nYDtcbiAgfSkuam9pbihcIiwgXCIpO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBtYXRjaCBhbnkgcm91dGVzLiBDdXJyZW50IHNlZ21lbnQ6ICcke3VybC52YWx1ZX0nLiBBdmFpbGFibGUgcm91dGVzOiBbJHthdmFpbGFibGVSb3V0ZXN9XS5gKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hOb25JbmRleChjb25maWc6IFJvdXRlW10sIHVybDogVHJlZU5vZGU8VXJsU2VnbWVudD4pOiBNYXRjaFJlc3VsdCB8IG51bGwge1xuICBmb3IgKGxldCByIG9mIGNvbmZpZykge1xuICAgIGxldCBtID0gbWF0Y2hXaXRoUGFydHMociwgdXJsKTtcbiAgICBpZiAobSkgcmV0dXJuIG07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hdGNoSW5kZXgoY29uZmlnOiBSb3V0ZVtdLCBsZWZ0T3ZlclVybHM6IFRyZWVOb2RlPFVybFNlZ21lbnQ+W10sIGxhc3RVcmxTZWdtZW50OiBVcmxTZWdtZW50KTogTWF0Y2hSZXN1bHQgfCBudWxsIHtcbiAgZm9yIChsZXQgciBvZiBjb25maWcpIHtcbiAgICBpZiAoci5pbmRleCkge1xuICAgICAgY29uc3Qgb3V0bGV0ID0gci5vdXRsZXQgPyByLm91dGxldCA6IFBSSU1BUllfT1VUTEVUO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSByLmNoaWxkcmVuID8gci5jaGlsZHJlbiA6IFtdO1xuICAgICAgcmV0dXJuIG5ldyBNYXRjaFJlc3VsdChyLmNvbXBvbmVudCwgY2hpbGRyZW4sIFtdLCBsYXN0VXJsU2VnbWVudC5wYXJhbWV0ZXJzLCBsZWZ0T3ZlclVybHMsIFtdLCBvdXRsZXQsIHIsIGxhc3RVcmxTZWdtZW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hdGNoV2l0aFBhcnRzKHJvdXRlOiBSb3V0ZSwgdXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IE1hdGNoUmVzdWx0IHwgbnVsbCB7XG4gIGlmICghcm91dGUucGF0aCkgcmV0dXJuIG51bGw7XG4gIGlmICgocm91dGUub3V0bGV0ID8gcm91dGUub3V0bGV0IDogUFJJTUFSWV9PVVRMRVQpICE9PSB1cmwudmFsdWUub3V0bGV0KSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBwYXRoID0gcm91dGUucGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHJvdXRlLnBhdGguc3Vic3RyaW5nKDEpIDogcm91dGUucGF0aDtcbiAgaWYgKHBhdGggPT09IFwiKipcIikge1xuICAgIGNvbnN0IGNvbnN1bWVkVXJsID0gW107XG4gICAgbGV0IHU6VHJlZU5vZGU8VXJsU2VnbWVudD58bnVsbCA9IHVybDtcbiAgICB3aGlsZSAodSkge1xuICAgICAgY29uc3VtZWRVcmwucHVzaCh1LnZhbHVlKTtcbiAgICAgIHUgPSBmaXJzdCh1LmNoaWxkcmVuKTtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IGNvbnN1bWVkVXJsW2NvbnN1bWVkVXJsLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBuZXcgTWF0Y2hSZXN1bHQocm91dGUuY29tcG9uZW50LCBbXSwgY29uc3VtZWRVcmwsIGxhc3QucGFyYW1ldGVycywgW10sIFtdLCBQUklNQVJZX09VVExFVCwgcm91dGUsIGxhc3QpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgcG9zaXRpb25hbFBhcmFtcyA9IHt9O1xuICBjb25zdCBjb25zdW1lZFVybFNlZ21lbnRzID0gW107XG5cbiAgbGV0IGxhc3RQYXJlbnQ6IFRyZWVOb2RlPFVybFNlZ21lbnQ+fG51bGwgPSBudWxsO1xuICBsZXQgbGFzdFNlZ21lbnQ6IFRyZWVOb2RlPFVybFNlZ21lbnQ+fG51bGwgPSBudWxsO1xuXG4gIGxldCBjdXJyZW50OiBUcmVlTm9kZTxVcmxTZWdtZW50PnxudWxsID0gdXJsO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHAgPSBwYXJ0c1tpXTtcbiAgICBjb25zdCBpc0xhc3RTZWdtZW50ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBpc0xhc3RQYXJlbnQgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAyO1xuICAgIGNvbnN0IGlzUG9zUGFyYW0gPSBwLnN0YXJ0c1dpdGgoXCI6XCIpO1xuXG4gICAgaWYgKCFpc1Bvc1BhcmFtICYmIHAgIT0gY3VycmVudC52YWx1ZS5wYXRoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXNMYXN0U2VnbWVudCkge1xuICAgICAgbGFzdFNlZ21lbnQgPSBjdXJyZW50O1xuICAgIH1cbiAgICBpZiAoaXNMYXN0UGFyZW50KSB7XG4gICAgICBsYXN0UGFyZW50ID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNQb3NQYXJhbSkge1xuICAgICAgcG9zaXRpb25hbFBhcmFtc1twLnN1YnN0cmluZygxKV0gPSBjdXJyZW50LnZhbHVlLnBhdGg7XG4gICAgfVxuXG4gICAgY29uc3VtZWRVcmxTZWdtZW50cy5wdXNoKGN1cnJlbnQudmFsdWUpO1xuXG4gICAgY3VycmVudCA9IGZpcnN0KGN1cnJlbnQuY2hpbGRyZW4pO1xuICB9XG5cbiAgaWYgKCFsYXN0U2VnbWVudCkgdGhyb3cgXCJDYW5ub3QgYmUgcmVhY2hlZFwiO1xuXG4gIGNvbnN0IHAgPSBsYXN0U2VnbWVudC52YWx1ZS5wYXJhbWV0ZXJzO1xuICBjb25zdCBwYXJhbWV0ZXJzID0gPHtba2V5OiBzdHJpbmddOiBzdHJpbmd9Pm1lcmdlKHAsIHBvc2l0aW9uYWxQYXJhbXMpO1xuICBjb25zdCBzZWNvbmRhcnlTdWJ0cmVlcyA9IGxhc3RQYXJlbnQgPyBsYXN0UGFyZW50LmNoaWxkcmVuLnNsaWNlKDEpIDogW107XG4gIGNvbnN0IGNoaWxkcmVuID0gcm91dGUuY2hpbGRyZW4gPyByb3V0ZS5jaGlsZHJlbiA6IFtdO1xuICBjb25zdCBvdXRsZXQgPSByb3V0ZS5vdXRsZXQgPyByb3V0ZS5vdXRsZXQgOiBQUklNQVJZX09VVExFVDtcblxuICByZXR1cm4gbmV3IE1hdGNoUmVzdWx0KHJvdXRlLmNvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnN1bWVkVXJsU2VnbWVudHMsIHBhcmFtZXRlcnMsIGxhc3RTZWdtZW50LmNoaWxkcmVuLFxuICAgIHNlY29uZGFyeVN1YnRyZWVzLCBvdXRsZXQsIHJvdXRlLCBsYXN0U2VnbWVudC52YWx1ZSk7XG59XG5cbmNsYXNzIE1hdGNoUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudDogVHlwZSB8IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIGNoaWxkcmVuOiBSb3V0ZVtdLFxuICAgICAgICAgICAgICBwdWJsaWMgY29uc3VtZWRVcmxTZWdtZW50czogVXJsU2VnbWVudFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgcGFyYW1ldGVyczoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgICAgICAgICAgIHB1YmxpYyBsZWZ0T3ZlclVybDogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSxcbiAgICAgICAgICAgICAgcHVibGljIHNlY29uZGFyeTogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSxcbiAgICAgICAgICAgICAgcHVibGljIG91dGxldDogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgcm91dGU6IFJvdXRlIHwgbnVsbCxcbiAgICAgICAgICAgICAgcHVibGljIGxhc3RVcmxTZWdtZW50OiBVcmxTZWdtZW50XG4gICkge31cbn0iXX0=