@glimmer/compiler
Version:
252 lines (210 loc) • 17.7 kB
JavaScript
import { assertPresent, isPresent, mapPresent } from '@glimmer/util';
export class ExpressionEncoder {
expr(expr) {
switch (expr.type) {
case 'Missing':
return undefined;
case 'Literal':
return this.Literal(expr);
case 'CallExpression':
return this.CallExpression(expr);
case 'DeprecatedCallExpression':
return this.DeprecatedCallExpression(expr);
case 'PathExpression':
return this.PathExpression(expr);
case 'Arg':
return [30
/* GetSymbol */
, expr.symbol];
case 'Local':
return this.Local(expr);
case 'This':
return [30
/* GetSymbol */
, 0];
case 'Free':
return [expr.resolution.resolution(), expr.symbol];
case 'HasBlock':
return this.HasBlock(expr);
case 'HasBlockParams':
return this.HasBlockParams(expr);
case 'Curry':
return this.Curry(expr);
case 'Not':
return this.Not(expr);
case 'IfInline':
return this.IfInline(expr);
case 'InterpolateExpression':
return this.InterpolateExpression(expr);
case 'GetDynamicVar':
return this.GetDynamicVar(expr);
case 'Log':
return this.Log(expr);
}
}
Literal({
value
}) {
if (value === undefined) {
return [27
/* Undefined */
];
} else {
return value;
}
}
Missing() {
return undefined;
}
HasBlock({
symbol
}) {
return [48
/* HasBlock */
, [30
/* GetSymbol */
, symbol]];
}
HasBlockParams({
symbol
}) {
return [49
/* HasBlockParams */
, [30
/* GetSymbol */
, symbol]];
}
Curry({
definition,
curriedType,
args
}) {
return [50
/* Curry */
, EXPR.expr(definition), curriedType, EXPR.Positional(args.positional), EXPR.NamedArguments(args.named)];
}
Local({
isTemplateLocal,
symbol
}) {
return [isTemplateLocal ? 32
/* GetTemplateSymbol */
: 30
/* GetSymbol */
, symbol];
}
GetWithResolver({
symbol
}) {
return [34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
, symbol];
}
PathExpression({
head,
tail
}) {
let getOp = EXPR.expr(head);
return [...getOp, EXPR.Tail(tail)];
}
InterpolateExpression({
parts
}) {
return [29
/* Concat */
, parts.map(e => EXPR.expr(e)).toArray()];
}
CallExpression({
callee,
args
}) {
return [28
/* Call */
, EXPR.expr(callee), ...EXPR.Args(args)];
}
DeprecatedCallExpression({
arg,
callee
}) {
return [99
/* GetFreeAsDeprecatedHelperHeadOrThisFallback */
, callee.symbol, [arg.chars]];
}
Tail({
members
}) {
return mapPresent(members, member => member.chars);
}
Args({
positional,
named
}) {
return [this.Positional(positional), this.NamedArguments(named)];
}
Positional({
list
}) {
return list.map(l => EXPR.expr(l)).toPresentArray();
}
NamedArgument({
key,
value
}) {
return [key.chars, EXPR.expr(value)];
}
NamedArguments({
entries: pairs
}) {
let list = pairs.toArray();
if (isPresent(list)) {
let names = [];
let values = [];
for (let pair of list) {
let [name, value] = EXPR.NamedArgument(pair);
names.push(name);
values.push(value);
}
assertPresent(names);
assertPresent(values);
return [names, values];
} else {
return null;
}
}
Not({
value
}) {
return [51
/* Not */
, EXPR.expr(value)];
}
IfInline({
condition,
truthy,
falsy
}) {
let expr = [52
/* IfInline */
, EXPR.expr(condition), EXPR.expr(truthy)];
if (falsy) {
expr.push(EXPR.expr(falsy));
}
return expr;
}
GetDynamicVar({
name
}) {
return [53
/* GetDynamicVar */
, EXPR.expr(name)];
}
Log({
positional
}) {
return [54
/* Log */
, this.Positional(positional)];
}
}
export const EXPR = new ExpressionEncoder();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMi1lbmNvZGluZy9leHByZXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxTQUFTLGFBQVQsRUFBd0IsU0FBeEIsRUFBbUMsVUFBbkMsUUFBcUQsZUFBckQ7QUFNQSxPQUFNLE1BQU8saUJBQVAsQ0FBd0I7QUFDNUIsRUFBQSxJQUFJLENBQUMsSUFBRCxFQUF5QjtBQUMzQixZQUFRLElBQUksQ0FBQyxJQUFiO0FBQ0UsV0FBSyxTQUFMO0FBQ0UsZUFBTyxTQUFQOztBQUNGLFdBQUssU0FBTDtBQUNFLGVBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixDQUFQOztBQUNGLFdBQUssZ0JBQUw7QUFDRSxlQUFPLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUFQOztBQUNGLFdBQUssMEJBQUw7QUFDRSxlQUFPLEtBQUssd0JBQUwsQ0FBOEIsSUFBOUIsQ0FBUDs7QUFDRixXQUFLLGdCQUFMO0FBQ0UsZUFBTyxLQUFLLGNBQUwsQ0FBb0IsSUFBcEIsQ0FBUDs7QUFDRixXQUFLLEtBQUw7QUFDRSxlQUFPLENBQUE7QUFBQTtBQUFBLFVBQXdCLElBQUksQ0FBQyxNQUE3QixDQUFQOztBQUNGLFdBQUssT0FBTDtBQUNFLGVBQU8sS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFQOztBQUNGLFdBQUssTUFBTDtBQUNFLGVBQU8sQ0FBQTtBQUFBO0FBQUEsVUFBd0IsQ0FBeEIsQ0FBUDs7QUFDRixXQUFLLE1BQUw7QUFDRSxlQUFPLENBQUMsSUFBSSxDQUFDLFVBQUwsQ0FBZ0IsVUFBaEIsRUFBRCxFQUErQixJQUFJLENBQUMsTUFBcEMsQ0FBUDs7QUFDRixXQUFLLFVBQUw7QUFDRSxlQUFPLEtBQUssUUFBTCxDQUFjLElBQWQsQ0FBUDs7QUFDRixXQUFLLGdCQUFMO0FBQ0UsZUFBTyxLQUFLLGNBQUwsQ0FBb0IsSUFBcEIsQ0FBUDs7QUFDRixXQUFLLE9BQUw7QUFDRSxlQUFPLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBUDs7QUFDRixXQUFLLEtBQUw7QUFDRSxlQUFPLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBUDs7QUFDRixXQUFLLFVBQUw7QUFDRSxlQUFPLEtBQUssUUFBTCxDQUFjLElBQWQsQ0FBUDs7QUFDRixXQUFLLHVCQUFMO0FBQ0UsZUFBTyxLQUFLLHFCQUFMLENBQTJCLElBQTNCLENBQVA7O0FBQ0YsV0FBSyxlQUFMO0FBQ0UsZUFBTyxLQUFLLGFBQUwsQ0FBbUIsSUFBbkIsQ0FBUDs7QUFDRixXQUFLLEtBQUw7QUFDRSxlQUFPLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBUDtBQWxDSjtBQW9DRDs7QUFFRCxFQUFBLE9BQU8sQ0FBQztBQUNOLElBQUE7QUFETSxHQUFELEVBRW1CO0FBQ3hCLFFBQUksS0FBSyxLQUFLLFNBQWQsRUFBeUI7QUFDdkIsYUFBTyxDQUFBO0FBQUE7QUFBQSxPQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxFQUFBLE9BQU8sR0FBQTtBQUNMLFdBQU8sU0FBUDtBQUNEOztBQUVELEVBQUEsUUFBUSxDQUFDO0FBQUUsSUFBQTtBQUFGLEdBQUQsRUFBeUI7QUFDL0IsV0FBTyxDQUFBO0FBQUE7QUFBQSxNQUF1QixDQUFBO0FBQUE7QUFBQSxNQUF3QixNQUF4QixDQUF2QixDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxjQUFjLENBQUM7QUFBRSxJQUFBO0FBQUYsR0FBRCxFQUErQjtBQUMzQyxXQUFPLENBQUE7QUFBQTtBQUFBLE1BQTZCLENBQUE7QUFBQTtBQUFBLE1BQXdCLE1BQXhCLENBQTdCLENBQVA7QUFDRDs7QUFFRCxFQUFBLEtBQUssQ0FBQztBQUFFLElBQUEsVUFBRjtBQUFjLElBQUEsV0FBZDtBQUEyQixJQUFBO0FBQTNCLEdBQUQsRUFBNkM7QUFDaEQsV0FBTyxDOztBQUFBLE1BRUwsSUFBSSxDQUFDLElBQUwsQ0FBVSxVQUFWLENBRkssRUFHTCxXQUhLLEVBSUwsSUFBSSxDQUFDLFVBQUwsQ0FBZ0IsSUFBSSxDQUFDLFVBQXJCLENBSkssRUFLTCxJQUFJLENBQUMsY0FBTCxDQUFvQixJQUFJLENBQUMsS0FBekIsQ0FMSyxDQUFQO0FBT0Q7O0FBRUQsRUFBQSxLQUFLLENBQUM7QUFDSixJQUFBLGVBREk7QUFFSixJQUFBO0FBRkksR0FBRCxFQUdxQjtBQUd4QixXQUFPLENBQUMsZUFBZSxHQUFFO0FBQUE7QUFBRixNQUFrQztBQUFBO0FBQWxELE1BQTBFLE1BQTFFLENBQVA7QUFDRDs7QUFFRCxFQUFBLGVBQWUsQ0FBQztBQUFFLElBQUE7QUFBRixHQUFELEVBQWdDO0FBQzdDLFdBQU8sQ0FBQTtBQUFBO0FBQUEsTUFBMkQsTUFBM0QsQ0FBUDtBQUNEOztBQUVELEVBQUEsY0FBYyxDQUFDO0FBQUUsSUFBQSxJQUFGO0FBQVEsSUFBQTtBQUFSLEdBQUQsRUFBbUM7QUFDL0MsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUwsQ0FBVSxJQUFWLENBQVo7QUFFQSxXQUFPLENBQUMsR0FBRyxLQUFKLEVBQVcsSUFBSSxDQUFDLElBQUwsQ0FBVSxJQUFWLENBQVgsQ0FBUDtBQUNEOztBQUVELEVBQUEscUJBQXFCLENBQUM7QUFBRSxJQUFBO0FBQUYsR0FBRCxFQUFxQztBQUN4RCxXQUFPLENBQUE7QUFBQTtBQUFBLE1BQXFCLEtBQUssQ0FBQyxHQUFOLENBQVcsQ0FBRCxJQUFPLElBQUksQ0FBQyxJQUFMLENBQVUsQ0FBVixDQUFqQixFQUErQixPQUEvQixFQUFyQixDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxjQUFjLENBQUM7QUFBRSxJQUFBLE1BQUY7QUFBVSxJQUFBO0FBQVYsR0FBRCxFQUFxQztBQUNqRCxXQUFPLENBQUE7QUFBQTtBQUFBLE1BQW1CLElBQUksQ0FBQyxJQUFMLENBQVUsTUFBVixDQUFuQixFQUFzQyxHQUFHLElBQUksQ0FBQyxJQUFMLENBQVUsSUFBVixDQUF6QyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSx3QkFBd0IsQ0FBQztBQUN2QixJQUFBLEdBRHVCO0FBRXZCLElBQUE7QUFGdUIsR0FBRCxFQUdPO0FBQzdCLFdBQU8sQ0FBQTtBQUFBO0FBQUEsTUFBMEQsTUFBTSxDQUFDLE1BQWpFLEVBQXlFLENBQUMsR0FBRyxDQUFDLEtBQUwsQ0FBekUsQ0FBUDtBQUNEOztBQUVELEVBQUEsSUFBSSxDQUFDO0FBQUUsSUFBQTtBQUFGLEdBQUQsRUFBc0I7QUFDeEIsV0FBTyxVQUFVLENBQUMsT0FBRCxFQUFXLE1BQUQsSUFBWSxNQUFNLENBQUMsS0FBN0IsQ0FBakI7QUFDRDs7QUFFRCxFQUFBLElBQUksQ0FBQztBQUFFLElBQUEsVUFBRjtBQUFjLElBQUE7QUFBZCxHQUFELEVBQWdDO0FBQ2xDLFdBQU8sQ0FBQyxLQUFLLFVBQUwsQ0FBZ0IsVUFBaEIsQ0FBRCxFQUE4QixLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsQ0FBOUIsQ0FBUDtBQUNEOztBQUVELEVBQUEsVUFBVSxDQUFDO0FBQUUsSUFBQTtBQUFGLEdBQUQsRUFBeUI7QUFDakMsV0FBTyxJQUFJLENBQUMsR0FBTCxDQUFVLENBQUQsSUFBTyxJQUFJLENBQUMsSUFBTCxDQUFVLENBQVYsQ0FBaEIsRUFBOEIsY0FBOUIsRUFBUDtBQUNEOztBQUVELEVBQUEsYUFBYSxDQUFDO0FBQUUsSUFBQSxHQUFGO0FBQU8sSUFBQTtBQUFQLEdBQUQsRUFBa0M7QUFDN0MsV0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFMLEVBQVksSUFBSSxDQUFDLElBQUwsQ0FBVSxLQUFWLENBQVosQ0FBUDtBQUNEOztBQUVELEVBQUEsY0FBYyxDQUFDO0FBQUUsSUFBQSxPQUFPLEVBQUU7QUFBWCxHQUFELEVBQXVDO0FBQ25ELFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFOLEVBQVg7O0FBRUEsUUFBSSxTQUFTLENBQUMsSUFBRCxDQUFiLEVBQXFCO0FBQ25CLFVBQUksS0FBSyxHQUFhLEVBQXRCO0FBQ0EsVUFBSSxNQUFNLEdBQTRCLEVBQXRDOztBQUVBLFdBQUssSUFBSSxJQUFULElBQWlCLElBQWpCLEVBQXVCO0FBQ3JCLFlBQUksQ0FBQyxJQUFELEVBQU8sS0FBUCxJQUFnQixJQUFJLENBQUMsYUFBTCxDQUFtQixJQUFuQixDQUFwQjtBQUNBLFFBQUEsS0FBSyxDQUFDLElBQU4sQ0FBVyxJQUFYO0FBQ0EsUUFBQSxNQUFNLENBQUMsSUFBUCxDQUFZLEtBQVo7QUFDRDs7QUFFRCxNQUFBLGFBQWEsQ0FBQyxLQUFELENBQWI7QUFDQSxNQUFBLGFBQWEsQ0FBQyxNQUFELENBQWI7QUFFQSxhQUFPLENBQUMsS0FBRCxFQUFRLE1BQVIsQ0FBUDtBQUNELEtBZEQsTUFjTztBQUNMLGFBQU8sSUFBUDtBQUNEO0FBQ0Y7O0FBRUQsRUFBQSxHQUFHLENBQUM7QUFBRSxJQUFBO0FBQUYsR0FBRCxFQUFtQjtBQUNwQixXQUFPLENBQUE7QUFBQTtBQUFBLE1BQWtCLElBQUksQ0FBQyxJQUFMLENBQVUsS0FBVixDQUFsQixDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLENBQUM7QUFBRSxJQUFBLFNBQUY7QUFBYSxJQUFBLE1BQWI7QUFBcUIsSUFBQTtBQUFyQixHQUFELEVBQTJDO0FBQ2pELFFBQUksSUFBSSxHQUFHLENBQUE7QUFBQTtBQUFBLE1BQXVCLElBQUksQ0FBQyxJQUFMLENBQVUsU0FBVixDQUF2QixFQUE2QyxJQUFJLENBQUMsSUFBTCxDQUFVLE1BQVYsQ0FBN0MsQ0FBWDs7QUFFQSxRQUFJLEtBQUosRUFBVztBQUNULE1BQUEsSUFBSSxDQUFDLElBQUwsQ0FBVSxJQUFJLENBQUMsSUFBTCxDQUFVLEtBQVYsQ0FBVjtBQUNEOztBQUVELFdBQU8sSUFBUDtBQUNEOztBQUVELEVBQUEsYUFBYSxDQUFDO0FBQUUsSUFBQTtBQUFGLEdBQUQsRUFBNEI7QUFDdkMsV0FBTyxDQUFBO0FBQUE7QUFBQSxNQUE0QixJQUFJLENBQUMsSUFBTCxDQUFVLElBQVYsQ0FBNUIsQ0FBUDtBQUNEOztBQUVELEVBQUEsR0FBRyxDQUFDO0FBQUUsSUFBQTtBQUFGLEdBQUQsRUFBd0I7QUFDekIsV0FBTyxDQUFBO0FBQUE7QUFBQSxNQUFrQixLQUFLLFVBQUwsQ0FBZ0IsVUFBaEIsQ0FBbEIsQ0FBUDtBQUNEOztBQXBLMkI7QUF1SzlCLE9BQU8sTUFBTSxJQUFJLEdBQUcsSUFBSSxpQkFBSixFQUFiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJlc2VudEFycmF5LCBTZXhwT3Bjb2RlcywgV2lyZUZvcm1hdCB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQVNUdjIgfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuaW1wb3J0IHsgYXNzZXJ0UHJlc2VudCwgaXNQcmVzZW50LCBtYXBQcmVzZW50IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCAqIGFzIG1pciBmcm9tICcuL21pcic7XG5cbmV4cG9ydCB0eXBlIEhhc2hQYWlyID0gW3N0cmluZywgV2lyZUZvcm1hdC5FeHByZXNzaW9uXTtcblxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25FbmNvZGVyIHtcbiAgZXhwcihleHByOiBtaXIuRXhwcmVzc2lvbk5vZGUpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24ge1xuICAgIHN3aXRjaCAoZXhwci50eXBlKSB7XG4gICAgICBjYXNlICdNaXNzaW5nJzpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5MaXRlcmFsKGV4cHIpO1xuICAgICAgY2FzZSAnQ2FsbEV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5DYWxsRXhwcmVzc2lvbihleHByKTtcbiAgICAgIGNhc2UgJ0RlcHJlY2F0ZWRDYWxsRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiB0aGlzLkRlcHJlY2F0ZWRDYWxsRXhwcmVzc2lvbihleHByKTtcbiAgICAgIGNhc2UgJ1BhdGhFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuUGF0aEV4cHJlc3Npb24oZXhwcik7XG4gICAgICBjYXNlICdBcmcnOlxuICAgICAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldFN5bWJvbCwgZXhwci5zeW1ib2xdO1xuICAgICAgY2FzZSAnTG9jYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5Mb2NhbChleHByKTtcbiAgICAgIGNhc2UgJ1RoaXMnOlxuICAgICAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldFN5bWJvbCwgMF07XG4gICAgICBjYXNlICdGcmVlJzpcbiAgICAgICAgcmV0dXJuIFtleHByLnJlc29sdXRpb24ucmVzb2x1dGlvbigpLCBleHByLnN5bWJvbF07XG4gICAgICBjYXNlICdIYXNCbG9jayc6XG4gICAgICAgIHJldHVybiB0aGlzLkhhc0Jsb2NrKGV4cHIpO1xuICAgICAgY2FzZSAnSGFzQmxvY2tQYXJhbXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5IYXNCbG9ja1BhcmFtcyhleHByKTtcbiAgICAgIGNhc2UgJ0N1cnJ5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3VycnkoZXhwcik7XG4gICAgICBjYXNlICdOb3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5Ob3QoZXhwcik7XG4gICAgICBjYXNlICdJZklubGluZSc6XG4gICAgICAgIHJldHVybiB0aGlzLklmSW5saW5lKGV4cHIpO1xuICAgICAgY2FzZSAnSW50ZXJwb2xhdGVFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSW50ZXJwb2xhdGVFeHByZXNzaW9uKGV4cHIpO1xuICAgICAgY2FzZSAnR2V0RHluYW1pY1Zhcic6XG4gICAgICAgIHJldHVybiB0aGlzLkdldER5bmFtaWNWYXIoZXhwcik7XG4gICAgICBjYXNlICdMb2cnOlxuICAgICAgICByZXR1cm4gdGhpcy5Mb2coZXhwcik7XG4gICAgfVxuICB9XG5cbiAgTGl0ZXJhbCh7XG4gICAgdmFsdWUsXG4gIH06IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uKTogV2lyZUZvcm1hdC5FeHByZXNzaW9ucy5WYWx1ZSB8IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuVW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5VbmRlZmluZWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgTWlzc2luZygpOiB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBIYXNCbG9jayh7IHN5bWJvbCB9OiBtaXIuSGFzQmxvY2spOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkhhc0Jsb2NrIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkhhc0Jsb2NrLCBbU2V4cE9wY29kZXMuR2V0U3ltYm9sLCBzeW1ib2xdXTtcbiAgfVxuXG4gIEhhc0Jsb2NrUGFyYW1zKHsgc3ltYm9sIH06IG1pci5IYXNCbG9ja1BhcmFtcyk6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuSGFzQmxvY2tQYXJhbXMge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuSGFzQmxvY2tQYXJhbXMsIFtTZXhwT3Bjb2Rlcy5HZXRTeW1ib2wsIHN5bWJvbF1dO1xuICB9XG5cbiAgQ3VycnkoeyBkZWZpbml0aW9uLCBjdXJyaWVkVHlwZSwgYXJncyB9OiBtaXIuQ3VycnkpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkN1cnJ5IHtcbiAgICByZXR1cm4gW1xuICAgICAgU2V4cE9wY29kZXMuQ3VycnksXG4gICAgICBFWFBSLmV4cHIoZGVmaW5pdGlvbiksXG4gICAgICBjdXJyaWVkVHlwZSxcbiAgICAgIEVYUFIuUG9zaXRpb25hbChhcmdzLnBvc2l0aW9uYWwpLFxuICAgICAgRVhQUi5OYW1lZEFyZ3VtZW50cyhhcmdzLm5hbWVkKSxcbiAgICBdO1xuICB9XG5cbiAgTG9jYWwoe1xuICAgIGlzVGVtcGxhdGVMb2NhbCxcbiAgICBzeW1ib2wsXG4gIH06IEFTVHYyLkxvY2FsVmFyUmVmZXJlbmNlKTpcbiAgICB8IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0U3ltYm9sXG4gICAgfCBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkdldFRlbXBsYXRlU3ltYm9sIHtcbiAgICByZXR1cm4gW2lzVGVtcGxhdGVMb2NhbCA/IFNleHBPcGNvZGVzLkdldFRlbXBsYXRlU3ltYm9sIDogU2V4cE9wY29kZXMuR2V0U3ltYm9sLCBzeW1ib2xdO1xuICB9XG5cbiAgR2V0V2l0aFJlc29sdmVyKHsgc3ltYm9sIH06IG1pci5HZXRXaXRoUmVzb2x2ZXIpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkdldENvbnRleHR1YWxGcmVlIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrLCBzeW1ib2xdO1xuICB9XG5cbiAgUGF0aEV4cHJlc3Npb24oeyBoZWFkLCB0YWlsIH06IG1pci5QYXRoRXhwcmVzc2lvbik6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0UGF0aCB7XG4gICAgbGV0IGdldE9wID0gRVhQUi5leHByKGhlYWQpIGFzIFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0VmFyO1xuXG4gICAgcmV0dXJuIFsuLi5nZXRPcCwgRVhQUi5UYWlsKHRhaWwpXTtcbiAgfVxuXG4gIEludGVycG9sYXRlRXhwcmVzc2lvbih7IHBhcnRzIH06IG1pci5JbnRlcnBvbGF0ZUV4cHJlc3Npb24pOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkNvbmNhdCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5Db25jYXQsIHBhcnRzLm1hcCgoZSkgPT4gRVhQUi5leHByKGUpKS50b0FycmF5KCldO1xuICB9XG5cbiAgQ2FsbEV4cHJlc3Npb24oeyBjYWxsZWUsIGFyZ3MgfTogbWlyLkNhbGxFeHByZXNzaW9uKTogV2lyZUZvcm1hdC5FeHByZXNzaW9ucy5IZWxwZXIge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuQ2FsbCwgRVhQUi5leHByKGNhbGxlZSksIC4uLkVYUFIuQXJncyhhcmdzKV07XG4gIH1cblxuICBEZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24oe1xuICAgIGFyZyxcbiAgICBjYWxsZWUsXG4gIH06IG1pci5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24pOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkdldFBhdGhGcmVlQXNEZXByZWNhdGVkSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldEZyZWVBc0RlcHJlY2F0ZWRIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2ssIGNhbGxlZS5zeW1ib2wsIFthcmcuY2hhcnNdXTtcbiAgfVxuXG4gIFRhaWwoeyBtZW1iZXJzIH06IG1pci5UYWlsKTogUHJlc2VudEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBtYXBQcmVzZW50KG1lbWJlcnMsIChtZW1iZXIpID0+IG1lbWJlci5jaGFycyk7XG4gIH1cblxuICBBcmdzKHsgcG9zaXRpb25hbCwgbmFtZWQgfTogbWlyLkFyZ3MpOiBXaXJlRm9ybWF0LkNvcmUuQXJncyB7XG4gICAgcmV0dXJuIFt0aGlzLlBvc2l0aW9uYWwocG9zaXRpb25hbCksIHRoaXMuTmFtZWRBcmd1bWVudHMobmFtZWQpXTtcbiAgfVxuXG4gIFBvc2l0aW9uYWwoeyBsaXN0IH06IG1pci5Qb3NpdGlvbmFsKTogV2lyZUZvcm1hdC5Db3JlLlBhcmFtcyB7XG4gICAgcmV0dXJuIGxpc3QubWFwKChsKSA9PiBFWFBSLmV4cHIobCkpLnRvUHJlc2VudEFycmF5KCk7XG4gIH1cblxuICBOYW1lZEFyZ3VtZW50KHsga2V5LCB2YWx1ZSB9OiBtaXIuTmFtZWRBcmd1bWVudCk6IEhhc2hQYWlyIHtcbiAgICByZXR1cm4gW2tleS5jaGFycywgRVhQUi5leHByKHZhbHVlKV07XG4gIH1cblxuICBOYW1lZEFyZ3VtZW50cyh7IGVudHJpZXM6IHBhaXJzIH06IG1pci5OYW1lZEFyZ3VtZW50cyk6IFdpcmVGb3JtYXQuQ29yZS5IYXNoIHtcbiAgICBsZXQgbGlzdCA9IHBhaXJzLnRvQXJyYXkoKTtcblxuICAgIGlmIChpc1ByZXNlbnQobGlzdCkpIHtcbiAgICAgIGxldCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCB2YWx1ZXM6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbltdID0gW107XG5cbiAgICAgIGZvciAobGV0IHBhaXIgb2YgbGlzdCkge1xuICAgICAgICBsZXQgW25hbWUsIHZhbHVlXSA9IEVYUFIuTmFtZWRBcmd1bWVudChwYWlyKTtcbiAgICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnRQcmVzZW50KG5hbWVzKTtcbiAgICAgIGFzc2VydFByZXNlbnQodmFsdWVzKTtcblxuICAgICAgcmV0dXJuIFtuYW1lcywgdmFsdWVzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgTm90KHsgdmFsdWUgfTogbWlyLk5vdCk6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuTm90IHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLk5vdCwgRVhQUi5leHByKHZhbHVlKV07XG4gIH1cblxuICBJZklubGluZSh7IGNvbmRpdGlvbiwgdHJ1dGh5LCBmYWxzeSB9OiBtaXIuSWZJbmxpbmUpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLklmSW5saW5lIHtcbiAgICBsZXQgZXhwciA9IFtTZXhwT3Bjb2Rlcy5JZklubGluZSwgRVhQUi5leHByKGNvbmRpdGlvbiksIEVYUFIuZXhwcih0cnV0aHkpXTtcblxuICAgIGlmIChmYWxzeSkge1xuICAgICAgZXhwci5wdXNoKEVYUFIuZXhwcihmYWxzeSkpO1xuICAgIH1cblxuICAgIHJldHVybiBleHByIGFzIFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuSWZJbmxpbmU7XG4gIH1cblxuICBHZXREeW5hbWljVmFyKHsgbmFtZSB9OiBtaXIuR2V0RHluYW1pY1Zhcik6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0RHluYW1pY1ZhciB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5HZXREeW5hbWljVmFyLCBFWFBSLmV4cHIobmFtZSldO1xuICB9XG5cbiAgTG9nKHsgcG9zaXRpb25hbCB9OiBtaXIuTG9nKTogV2lyZUZvcm1hdC5FeHByZXNzaW9ucy5Mb2cge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuTG9nLCB0aGlzLlBvc2l0aW9uYWwocG9zaXRpb25hbCldO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBFWFBSID0gbmV3IEV4cHJlc3Npb25FbmNvZGVyKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9