@glimmer/compiler
Version:
807 lines (737 loc) • 70 kB
JavaScript
import { assertNever, dict, isPresent } from '@glimmer/util';
export var VariableKind;
(function (VariableKind) {
VariableKind["Local"] = "Local";
VariableKind["Free"] = "Free";
VariableKind["Arg"] = "Arg";
VariableKind["Block"] = "Block";
VariableKind["This"] = "This";
})(VariableKind || (VariableKind = {}));
export function normalizeStatement(statement) {
if (Array.isArray(statement)) {
if (statementIsExpression(statement)) {
return normalizeAppendExpression(statement);
} else if (isSugaryArrayStatement(statement)) {
return normalizeSugaryArrayStatement(statement);
} else {
return normalizeVerboseStatement(statement);
}
} else if (typeof statement === 'string') {
return normalizeAppendHead(normalizeDottedPath(statement), false);
} else {
throw assertNever(statement);
}
}
export function normalizeAppendHead(head, trusted) {
if (head.type === "GetPath"
/* GetPath */
) {
return {
kind: "AppendPath"
/* AppendPath */
,
path: head,
trusted
};
} else {
return {
kind: "AppendExpr"
/* AppendExpr */
,
expr: head,
trusted
};
}
}
function isSugaryArrayStatement(statement) {
if (Array.isArray(statement) && typeof statement[0] === 'string') {
switch (statement[0][0]) {
case '(':
case '#':
case '<':
case '!':
return true;
default:
return false;
}
}
return false;
}
export function normalizeSugaryArrayStatement(statement) {
let name = statement[0];
switch (name[0]) {
case '(':
{
let params = null;
let hash = null;
if (statement.length === 3) {
params = normalizeParams(statement[1]);
hash = normalizeHash(statement[2]);
} else if (statement.length === 2) {
if (Array.isArray(statement[1])) {
params = normalizeParams(statement[1]);
} else {
hash = normalizeHash(statement[1]);
}
}
return {
kind: "Call"
/* Call */
,
head: normalizeCallHead(name),
params,
hash,
trusted: false
};
}
case '#':
{
let {
head: path,
params,
hash,
blocks,
blockParams
} = normalizeBuilderBlockStatement(statement);
return {
kind: "Block"
/* Block */
,
head: path,
params,
hash,
blocks,
blockParams
};
}
case '!':
{
let name = statement[0].slice(1);
let {
params,
hash,
blocks,
blockParams
} = normalizeBuilderBlockStatement(statement);
return {
kind: "Keyword"
/* Keyword */
,
name,
params,
hash,
blocks,
blockParams
};
}
case '<':
{
let attrs = dict();
let block = [];
if (statement.length === 3) {
attrs = normalizeAttrs(statement[1]);
block = normalizeBlock(statement[2]);
} else if (statement.length === 2) {
if (Array.isArray(statement[1])) {
block = normalizeBlock(statement[1]);
} else {
attrs = normalizeAttrs(statement[1]);
}
}
return {
kind: "Element"
/* Element */
,
name: extractElement(name),
attrs,
block
};
}
default:
throw new Error(`Unreachable ${JSON.stringify(statement)} in normalizeSugaryArrayStatement`);
}
}
function normalizeVerboseStatement(statement) {
switch (statement[0]) {
case 0
/* Literal */
:
{
return {
kind: "Literal"
/* Literal */
,
value: statement[1]
};
}
case 2
/* Append */
:
{
return normalizeAppendExpression(statement[1], statement[2]);
}
case 3
/* Modifier */
:
{
return {
kind: "Modifier"
/* Modifier */
,
params: normalizeParams(statement[1]),
hash: normalizeHash(statement[2])
};
}
case 4
/* DynamicComponent */
:
{
return {
kind: "DynamicComponent"
/* DynamicComponent */
,
expr: normalizeExpression(statement[1]),
hash: normalizeHash(statement[2]),
block: normalizeBlock(statement[3])
};
}
case 1
/* Comment */
:
{
return {
kind: "Comment"
/* Comment */
,
value: statement[1]
};
}
}
}
function extractBlockHead(name) {
let result = /^(#|!)(.*)$/.exec(name);
if (result === null) {
throw new Error(`Unexpected missing # in block head`);
}
return normalizeDottedPath(result[2]);
}
function normalizeCallHead(name) {
let result = /^\((.*)\)$/.exec(name);
if (result === null) {
throw new Error(`Unexpected missing () in call head`);
}
return normalizeDottedPath(result[1]);
}
function normalizePath(head, tail = []) {
let pathHead = normalizePathHead(head);
if (isPresent(tail)) {
return {
type: "GetPath"
/* GetPath */
,
path: {
head: pathHead,
tail
}
};
} else {
return {
type: "GetVar"
/* GetVar */
,
variable: pathHead
};
}
}
function normalizeDottedPath(whole) {
let {
kind,
name: rest
} = normalizePathHead(whole);
let [name, ...tail] = rest.split('.');
let variable = {
kind,
name,
mode: 'loose'
};
if (isPresent(tail)) {
return {
type: "GetPath"
/* GetPath */
,
path: {
head: variable,
tail
}
};
} else {
return {
type: "GetVar"
/* GetVar */
,
variable
};
}
}
export function normalizePathHead(whole) {
let kind;
let name;
if (/^this(\.|$)/.exec(whole)) {
return {
kind: VariableKind.This,
name: whole,
mode: 'loose'
};
}
switch (whole[0]) {
case '^':
kind = VariableKind.Free;
name = whole.slice(1);
break;
case '@':
kind = VariableKind.Arg;
name = whole.slice(1);
break;
case '&':
kind = VariableKind.Block;
name = whole.slice(1);
break;
default:
kind = VariableKind.Local;
name = whole;
}
return {
kind,
name,
mode: 'loose'
};
}
export function normalizeBuilderBlockStatement(statement) {
let head = statement[0];
let blocks = dict();
let params = null;
let hash = null;
let blockParams = null;
if (statement.length === 2) {
blocks = normalizeBlocks(statement[1]);
} else if (statement.length === 3) {
if (Array.isArray(statement[1])) {
params = normalizeParams(statement[1]);
} else {
({
hash,
blockParams
} = normalizeBlockHash(statement[1]));
}
blocks = normalizeBlocks(statement[2]);
} else if (statement.length === 4) {
params = normalizeParams(statement[1]);
({
hash,
blockParams
} = normalizeBlockHash(statement[2]));
blocks = normalizeBlocks(statement[3]);
}
return {
head: extractBlockHead(head),
params,
hash,
blockParams,
blocks
};
}
function normalizeBlockHash(hash) {
if (hash === null) {
return {
hash: null,
blockParams: null
};
}
let out = null;
let blockParams = null;
entries(hash, (key, value) => {
if (key === 'as') {
blockParams = Array.isArray(value) ? value : [value];
} else {
out = out || dict();
out[key] = normalizeExpression(value);
}
});
return {
hash: out,
blockParams
};
}
export function entries(dict, callback) {
Object.keys(dict).forEach(key => {
let value = dict[key];
callback(key, value);
});
}
function normalizeBlocks(value) {
if (Array.isArray(value)) {
return {
default: normalizeBlock(value)
};
} else {
return mapObject(value, normalizeBlock);
}
}
function normalizeBlock(block) {
return block.map(s => normalizeStatement(s));
}
function normalizeAttrs(attrs) {
return mapObject(attrs, a => normalizeAttr(a).expr);
}
function normalizeAttr(attr) {
if (attr === 'splat') {
return {
expr: "Splat"
/* Splat */
,
trusted: false
};
} else {
let expr = normalizeExpression(attr);
return {
expr,
trusted: false
};
}
}
function mapObject(object, callback) {
let out = dict();
Object.keys(object).forEach(k => {
out[k] = callback(object[k], k);
});
return out;
}
export function isElement(input) {
let match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return !!match && !!match[1];
}
export function extractElement(input) {
let match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input);
return match ? match[1] : null;
}
export function extractAngleInvocation(input) {
let match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return match ? match[1] : null;
}
export function isAngleInvocation(input) {
// TODO Paths
let match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]);
return !!match && !!match[1];
}
export function isBlock(input) {
// TODO Paths
let match = /^#[^]?([a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)$/.exec(input[0]);
return !!match && !!match[1];
}
export function normalizeAppendExpression(expression, forceTrusted = false) {
if (expression === null || expression === undefined) {
return {
expr: {
type: "Literal"
/* Literal */
,
value: expression
},
kind: "AppendExpr"
/* AppendExpr */
,
trusted: false
};
} else if (Array.isArray(expression)) {
switch (expression[0]) {
case 0
/* Literal */
:
return {
expr: {
type: "Literal"
/* Literal */
,
value: expression[1]
},
kind: "AppendExpr"
/* AppendExpr */
,
trusted: false
};
case 5
/* Get */
:
{
return normalizeAppendHead(normalizePath(expression[1], expression[2]), forceTrusted);
}
case 6
/* Concat */
:
{
let expr = {
type: "Concat"
/* Concat */
,
params: normalizeParams(expression.slice(1))
};
return {
expr,
kind: "AppendExpr"
/* AppendExpr */
,
trusted: forceTrusted
};
}
case 7
/* HasBlock */
:
return {
expr: {
type: "HasBlock"
/* HasBlock */
,
name: expression[1]
},
kind: "AppendExpr"
/* AppendExpr */
,
trusted: forceTrusted
};
case 8
/* HasBlockParams */
:
return {
expr: {
type: "HasBlockParams"
/* HasBlockParams */
,
name: expression[1]
},
kind: "AppendExpr"
/* AppendExpr */
,
trusted: forceTrusted
};
default:
{
if (isBuilderCallExpression(expression)) {
return {
expr: normalizeCallExpression(expression),
kind: "AppendExpr"
/* AppendExpr */
,
trusted: forceTrusted
};
} else {
throw new Error(`Unexpected array in expression position (wasn't a tuple expression and ${expression[0]} isn't wrapped in parens, so it isn't a call): ${JSON.stringify(expression)}`);
}
}
// BuilderCallExpression
}
} else if (typeof expression !== 'object') {
switch (typeof expression) {
case 'string':
{
return normalizeAppendHead(normalizeDottedPath(expression), forceTrusted);
}
case 'boolean':
case 'number':
return {
expr: {
type: "Literal"
/* Literal */
,
value: expression
},
kind: "AppendExpr"
/* AppendExpr */
,
trusted: true
};
default:
throw assertNever(expression);
}
} else {
throw assertNever(expression);
}
}
export function normalizeExpression(expression) {
if (expression === null || expression === undefined) {
return {
type: "Literal"
/* Literal */
,
value: expression
};
} else if (Array.isArray(expression)) {
switch (expression[0]) {
case 0
/* Literal */
:
return {
type: "Literal"
/* Literal */
,
value: expression[1]
};
case 5
/* Get */
:
{
return normalizePath(expression[1], expression[2]);
}
case 6
/* Concat */
:
{
let expr = {
type: "Concat"
/* Concat */
,
params: normalizeParams(expression.slice(1))
};
return expr;
}
case 7
/* HasBlock */
:
return {
type: "HasBlock"
/* HasBlock */
,
name: expression[1]
};
case 8
/* HasBlockParams */
:
return {
type: "HasBlockParams"
/* HasBlockParams */
,
name: expression[1]
};
default:
{
if (isBuilderCallExpression(expression)) {
return normalizeCallExpression(expression);
} else {
throw new Error(`Unexpected array in expression position (wasn't a tuple expression and ${expression[0]} isn't wrapped in parens, so it isn't a call): ${JSON.stringify(expression)}`);
}
}
// BuilderCallExpression
}
} else if (typeof expression !== 'object') {
switch (typeof expression) {
case 'string':
{
return normalizeDottedPath(expression);
}
case 'boolean':
case 'number':
return {
type: "Literal"
/* Literal */
,
value: expression
};
default:
throw assertNever(expression);
}
} else {
throw assertNever(expression);
}
}
export function isBuilderExpression(expr) {
return Array.isArray(expr);
}
export function isLiteral(expr) {
return Array.isArray(expr) && expr[0] === 'literal';
}
export function statementIsExpression(statement) {
if (!Array.isArray(statement)) {
return false;
}
let name = statement[0];
if (typeof name === 'number') {
switch (name) {
case 0
/* Literal */
:
case 5
/* Get */
:
case 6
/* Concat */
:
case 7
/* HasBlock */
:
case 8
/* HasBlockParams */
:
return true;
default:
return false;
}
}
if (name[0] === '(') {
return true;
}
return false;
}
export function isBuilderCallExpression(value) {
return typeof value[0] === 'string' && value[0][0] === '(';
}
export function normalizeParams(input) {
return input.map(normalizeExpression);
}
export function normalizeHash(input) {
if (input === null) return null;
return mapObject(input, normalizeExpression);
}
export function normalizeCallExpression(expr) {
switch (expr.length) {
case 1:
return {
type: "Call"
/* Call */
,
head: normalizeCallHead(expr[0]),
params: null,
hash: null
};
case 2:
{
if (Array.isArray(expr[1])) {
return {
type: "Call"
/* Call */
,
head: normalizeCallHead(expr[0]),
params: normalizeParams(expr[1]),
hash: null
};
} else {
return {
type: "Call"
/* Call */
,
head: normalizeCallHead(expr[0]),
params: null,
hash: normalizeHash(expr[1])
};
}
}
case 3:
return {
type: "Call"
/* Call */
,
head: normalizeCallHead(expr[0]),
params: normalizeParams(expr[1]),
hash: normalizeHash(expr[2])
};
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXItaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQVMsV0FBVCxFQUFzQixJQUF0QixFQUFvQyxTQUFwQyxRQUFxRCxlQUFyRDtBQXlDQSxPQUFBLElBQVksWUFBWjs7QUFBQSxDQUFBLFVBQVksWUFBWixFQUF3QjtBQUN0QixFQUFBLFlBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQSxZQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBQTtBQUNBLEVBQUEsWUFBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFBO0FBQ0EsRUFBQSxZQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBQTtBQUNELENBTkQsRUFBWSxZQUFZLEtBQVosWUFBWSxHQUFBLEVBQUEsQ0FBeEI7O0FBa0ZBLE9BQU0sU0FBVSxrQkFBVixDQUE2QixTQUE3QixFQUF3RDtBQUM1RCxNQUFJLEtBQUssQ0FBQyxPQUFOLENBQWMsU0FBZCxDQUFKLEVBQThCO0FBQzVCLFFBQUkscUJBQXFCLENBQUMsU0FBRCxDQUF6QixFQUFzQztBQUNwQyxhQUFPLHlCQUF5QixDQUFDLFNBQUQsQ0FBaEM7QUFDRCxLQUZELE1BRU8sSUFBSSxzQkFBc0IsQ0FBQyxTQUFELENBQTFCLEVBQXVDO0FBQzVDLGFBQU8sNkJBQTZCLENBQUMsU0FBRCxDQUFwQztBQUNELEtBRk0sTUFFQTtBQUNMLGFBQU8seUJBQXlCLENBQUMsU0FBRCxDQUFoQztBQUNEO0FBQ0YsR0FSRCxNQVFPLElBQUksT0FBTyxTQUFQLEtBQXFCLFFBQXpCLEVBQW1DO0FBQ3hDLFdBQU8sbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsU0FBRCxDQUFwQixFQUFpQyxLQUFqQyxDQUExQjtBQUNELEdBRk0sTUFFQTtBQUNM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QUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFELENBQUw7QUFKZCxPQUFQO0FBM0JKO0FBa0NEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgRGljdFZhbHVlLCBPcHRpb24sIFByZXNlbnRBcnJheSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIGRpY3QsIGV4cGVjdCwgaXNQcmVzZW50IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmV4cG9ydCB0eXBlIEJ1aWxkZXJQYXJhbXMgPSBCdWlsZGVyRXhwcmVzc2lvbltdO1xuZXhwb3J0IHR5cGUgQnVpbGRlckhhc2ggPSBPcHRpb248RGljdDxCdWlsZGVyRXhwcmVzc2lvbj4+O1xuZXhwb3J0IHR5cGUgQnVpbGRlckJsb2NrSGFzaCA9IEJ1aWxkZXJIYXNoIHwgeyBhczogc3RyaW5nIHwgc3RyaW5nW10gfTtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJCbG9ja3MgPSBEaWN0PEJ1aWxkZXJCbG9jaz47XG5leHBvcnQgdHlwZSBCdWlsZGVyQXR0cnMgPSBEaWN0PEJ1aWxkZXJBdHRyPjtcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplZFBhcmFtcyA9IE5vcm1hbGl6ZWRFeHByZXNzaW9uW107XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkSGFzaCA9IERpY3Q8Tm9ybWFsaXplZEV4cHJlc3Npb24+O1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEJsb2NrID0gTm9ybWFsaXplZFN0YXRlbWVudFtdO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEJsb2NrcyA9IERpY3Q8Tm9ybWFsaXplZEJsb2NrPjtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRBdHRycyA9IERpY3Q8Tm9ybWFsaXplZEF0dHI+O1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEF0dHIgPSBIZWFkS2luZC5TcGxhdCB8IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRFbGVtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhdHRyczogT3B0aW9uPE5vcm1hbGl6ZWRBdHRycz47XG4gIGJsb2NrOiBPcHRpb248Tm9ybWFsaXplZEJsb2NrPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkQW5nbGVJbnZvY2F0aW9uIHtcbiAgaGVhZDogTm9ybWFsaXplZEV4cHJlc3Npb247XG4gIGF0dHJzOiBPcHRpb248Tm9ybWFsaXplZEF0dHJzPjtcbiAgYmxvY2s6IE9wdGlvbjxOb3JtYWxpemVkQmxvY2s+O1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBIZWFkS2luZCB7XG4gIEJsb2NrID0gJ0Jsb2NrJyxcbiAgQ2FsbCA9ICdDYWxsJyxcbiAgRWxlbWVudCA9ICdFbGVtZW50JyxcbiAgQXBwZW5kUGF0aCA9ICdBcHBlbmRQYXRoJyxcbiAgQXBwZW5kRXhwciA9ICdBcHBlbmRFeHByJyxcbiAgTGl0ZXJhbCA9ICdMaXRlcmFsJyxcbiAgTW9kaWZpZXIgPSAnTW9kaWZpZXInLFxuICBEeW5hbWljQ29tcG9uZW50ID0gJ0R5bmFtaWNDb21wb25lbnQnLFxuICBDb21tZW50ID0gJ0NvbW1lbnQnLFxuICBTcGxhdCA9ICdTcGxhdCcsXG4gIEtleXdvcmQgPSAnS2V5d29yZCcsXG59XG5cbmV4cG9ydCBlbnVtIFZhcmlhYmxlS2luZCB7XG4gIExvY2FsID0gJ0xvY2FsJyxcbiAgRnJlZSA9ICdGcmVlJyxcbiAgQXJnID0gJ0FyZycsXG4gIEJsb2NrID0gJ0Jsb2NrJyxcbiAgVGhpcyA9ICdUaGlzJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZSB7XG4gIGtpbmQ6IFZhcmlhYmxlS2luZDtcbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogRGlmZmVyZW5jZXM6XG4gICAqXG4gICAqIC0gc3RyaWN0IG1vZGUgdmFyaWFibGVzIGFsd2F5cyByZWZlciB0byBpbi1zY29wZSB2YXJpYWJsZXNcbiAgICogLSBsb29zZSBtb2RlIHZhcmlhYmxlcyB1c2UgdGhpcyBhbGdvcml0aG06XG4gICAqICAgMS4gb3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gYHRoaXMuPG5hbWU+YFxuICAgKi9cbiAgbW9kZTogJ2xvb3NlJyB8ICdzdHJpY3QnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGgge1xuICBoZWFkOiBWYXJpYWJsZTtcbiAgdGFpbDogUHJlc2VudEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwZW5kRXhwciB7XG4gIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZEV4cHI7XG4gIGV4cHI6IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuICB0cnVzdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGVuZFBhdGgge1xuICBraW5kOiBIZWFkS2luZC5BcHBlbmRQYXRoO1xuICBwYXRoOiBOb3JtYWxpemVkUGF0aDtcbiAgdHJ1c3RlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkS2V5d29yZFN0YXRlbWVudCB7XG4gIGtpbmQ6IEhlYWRLaW5kLktleXdvcmQ7XG4gIG5hbWU6IHN0cmluZztcbiAgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz47XG4gIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gIGJsb2NrUGFyYW1zOiBPcHRpb248c3RyaW5nW10+O1xuICBibG9ja3M6IE5vcm1hbGl6ZWRCbG9ja3M7XG59XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRTdGF0ZW1lbnQgPVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkNhbGw7XG4gICAgICBoZWFkOiBOb3JtYWxpemVkSGVhZDtcbiAgICAgIHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+O1xuICAgICAgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPjtcbiAgICAgIHRydXN0ZWQ6IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkJsb2NrO1xuICAgICAgaGVhZDogTm9ybWFsaXplZEhlYWQ7XG4gICAgICBwYXJhbXM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPjtcbiAgICAgIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gICAgICBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPjtcbiAgICAgIGJsb2NrczogTm9ybWFsaXplZEJsb2NrcztcbiAgICB9XG4gIHwgTm9ybWFsaXplZEtleXdvcmRTdGF0ZW1lbnRcbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5FbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgYXR0cnM6IE5vcm1hbGl6ZWRBdHRycztcbiAgICAgIGJsb2NrOiBOb3JtYWxpemVkQmxvY2s7XG4gICAgfVxuICB8IHsga2luZDogSGVhZEtpbmQuQ29tbWVudDsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiBIZWFkS2luZC5MaXRlcmFsOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCBBcHBlbmRQYXRoXG4gIHwgQXBwZW5kRXhwclxuICB8IHsga2luZDogSGVhZEtpbmQuTW9kaWZpZXI7IHBhcmFtczogTm9ybWFsaXplZFBhcmFtczsgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPiB9XG4gIHwge1xuICAgICAga2luZDogSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudDtcbiAgICAgIGV4cHI6IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuICAgICAgaGFzaDogT3B0aW9uPE5vcm1hbGl6ZWRIYXNoPjtcbiAgICAgIGJsb2NrOiBOb3JtYWxpemVkQmxvY2s7XG4gICAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0YXRlbWVudChzdGF0ZW1lbnQ6IEJ1aWxkZXJTdGF0ZW1lbnQpOiBOb3JtYWxpemVkU3RhdGVtZW50IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50KSkge1xuICAgIGlmIChzdGF0ZW1lbnRJc0V4cHJlc3Npb24oc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZUFwcGVuZEV4cHJlc3Npb24oc3RhdGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVN1Z2FyeUFycmF5U3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVWZXJib3NlU3RhdGVtZW50KHN0YXRlbWVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUFwcGVuZEhlYWQobm9ybWFsaXplRG90dGVkUGF0aChzdGF0ZW1lbnQpLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgYXNzZXJ0TmV2ZXIoc3RhdGVtZW50KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXBwZW5kSGVhZChcbiAgaGVhZDogTm9ybWFsaXplZEhlYWQsXG4gIHRydXN0ZWQ6IGJvb2xlYW5cbik6IEFwcGVuZEV4cHIgfCBBcHBlbmRQYXRoIHtcbiAgaWYgKGhlYWQudHlwZSA9PT0gRXhwcmVzc2lvbktpbmQuR2V0UGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBIZWFkS2luZC5BcHBlbmRQYXRoLFxuICAgICAgcGF0aDogaGVhZCxcbiAgICAgIHRydXN0ZWQsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogSGVhZEtpbmQuQXBwZW5kRXhwcixcbiAgICAgIGV4cHI6IGhlYWQsXG4gICAgICB0cnVzdGVkLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTdWdhcnlBcnJheVN0YXRlbWVudChzdGF0ZW1lbnQ6IEJ1aWxkZXJTdGF0ZW1lbnQpOiBzdGF0ZW1lbnQgaXMgU3VnYXJ5QXJyYXlTdGF0ZW1lbnQge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnQpICYmIHR5cGVvZiBzdGF0ZW1lbnRbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgc3dpdGNoIChzdGF0ZW1lbnRbMF1bMF0pIHtcbiAgICAgIGNhc2UgJygnOlxuICAgICAgY2FzZSAnIyc6XG4gICAgICBjYXNlICc8JzpcbiAgICAgIGNhc2UgJyEnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIFN1Z2FyeUFycmF5U3RhdGVtZW50ID0gQnVpbGRlckNhbGxFeHByZXNzaW9uIHwgQnVpbGRlckVsZW1lbnQgfCBCdWlsZGVyQmxvY2tTdGF0ZW1lbnQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdWdhcnlBcnJheVN0YXRlbWVudChcbiAgc3RhdGVtZW50OiBTdWdhcnlBcnJheVN0YXRlbWVudFxuKTogTm9ybWFsaXplZFN0YXRlbWVudCB7XG4gIGxldCBuYW1lID0gc3RhdGVtZW50WzBdO1xuXG4gIHN3aXRjaCAobmFtZVswXSkge1xuICAgIGNhc2UgJygnOiB7XG4gICAgICBsZXQgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz4gPSBudWxsO1xuICAgICAgbGV0IGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD4gPSBudWxsO1xuXG4gICAgICBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICBwYXJhbXMgPSBub3JtYWxpemVQYXJhbXMoc3RhdGVtZW50WzFdIGFzIFBhcmFtcyk7XG4gICAgICAgIGhhc2ggPSBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsyXSBhcyBIYXNoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnRbMV0pKSB7XG4gICAgICAgICAgcGFyYW1zID0gbm9ybWFsaXplUGFyYW1zKHN0YXRlbWVudFsxXSBhcyBQYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhc2ggPSBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsxXSBhcyBIYXNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5DYWxsLFxuICAgICAgICBoZWFkOiBub3JtYWxpemVDYWxsSGVhZChuYW1lKSxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoYXNoLFxuICAgICAgICB0cnVzdGVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnIyc6IHtcbiAgICAgIGxldCB7IGhlYWQ6IHBhdGgsIHBhcmFtcywgaGFzaCwgYmxvY2tzLCBibG9ja1BhcmFtcyB9ID0gbm9ybWFsaXplQnVpbGRlckJsb2NrU3RhdGVtZW50KFxuICAgICAgICBzdGF0ZW1lbnQgYXMgQnVpbGRlckJsb2NrU3RhdGVtZW50XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5CbG9jayxcbiAgICAgICAgaGVhZDogcGF0aCxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoYXNoLFxuICAgICAgICBibG9ja3MsXG4gICAgICAgIGJsb2NrUGFyYW1zLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICchJzoge1xuICAgICAgbGV0IG5hbWUgPSBzdGF0ZW1lbnRbMF0uc2xpY2UoMSk7XG4gICAgICBsZXQgeyBwYXJhbXMsIGhhc2gsIGJsb2NrcywgYmxvY2tQYXJhbXMgfSA9IG5vcm1hbGl6ZUJ1aWxkZXJCbG9ja1N0YXRlbWVudChcbiAgICAgICAgc3RhdGVtZW50IGFzIEJ1aWxkZXJCbG9ja1N0YXRlbWVudFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuS2V5d29yZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBoYXNoLFxuICAgICAgICBibG9ja3MsXG4gICAgICAgIGJsb2NrUGFyYW1zLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICc8Jzoge1xuICAgICAgbGV0IGF0dHJzOiBOb3JtYWxpemVkQXR0cnMgPSBkaWN0KCk7XG4gICAgICBsZXQgYmxvY2s6IE5vcm1hbGl6ZWRCbG9jayA9IFtdO1xuXG4gICAgICBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICBhdHRycyA9IG5vcm1hbGl6ZUF0dHJzKHN0YXRlbWVudFsxXSBhcyBCdWlsZGVyQXR0cnMpO1xuICAgICAgICBibG9jayA9IG5vcm1hbGl6ZUJsb2NrKHN0YXRlbWVudFsyXSBhcyBCdWlsZGVyQmxvY2spO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0YXRlbWVudFsxXSkpIHtcbiAgICAgICAgICBibG9jayA9IG5vcm1hbGl6ZUJsb2NrKHN0YXRlbWVudFsxXSBhcyBCdWlsZGVyQmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF0dHJzID0gbm9ybWFsaXplQXR0cnMoc3RhdGVtZW50WzFdIGFzIEJ1aWxkZXJBdHRycyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuRWxlbWVudCxcbiAgICAgICAgbmFtZTogZXhwZWN0KGV4dHJhY3RFbGVtZW50KG5hbWUpLCBgQlVHOiBleHBlY3RlZCAke25hbWV9IHRvIGxvb2sgbGlrZSBhIHRhZyBuYW1lYCksXG4gICAgICAgIGF0dHJzLFxuICAgICAgICBibG9jayxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWFjaGFibGUgJHtKU09OLnN0cmluZ2lmeShzdGF0ZW1lbnQpfSBpbiBub3JtYWxpemVTdWdhcnlBcnJheVN0YXRlbWVudGApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZlcmJvc2VTdGF0ZW1lbnQoc3RhdGVtZW50OiBWZXJib3NlU3RhdGVtZW50KTogTm9ybWFsaXplZFN0YXRlbWVudCB7XG4gIHN3aXRjaCAoc3RhdGVtZW50WzBdKSB7XG4gICAgY2FzZSBCdWlsZGVyLkxpdGVyYWw6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkxpdGVyYWwsXG4gICAgICAgIHZhbHVlOiBzdGF0ZW1lbnRbMV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgQnVpbGRlci5BcHBlbmQ6IHtcbiAgICAgIHJldHVybiBub3JtYWxpemVBcHBlbmRFeHByZXNzaW9uKHN0YXRlbWVudFsxXSwgc3RhdGVtZW50WzJdKTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuTW9kaWZpZXI6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLk1vZGlmaWVyLFxuICAgICAgICBwYXJhbXM6IG5vcm1hbGl6ZVBhcmFtcyhzdGF0ZW1lbnRbMV0pLFxuICAgICAgICBoYXNoOiBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsyXSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgQnVpbGRlci5EeW5hbWljQ29tcG9uZW50OiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5EeW5hbWljQ29tcG9uZW50LFxuICAgICAgICBleHByOiBub3JtYWxpemVFeHByZXNzaW9uKHN0YXRlbWVudFsxXSksXG4gICAgICAgIGhhc2g6IG5vcm1hbGl6ZUhhc2goc3RhdGVtZW50WzJdKSxcbiAgICAgICAgYmxvY2s6IG5vcm1hbGl6ZUJsb2NrKHN0YXRlbWVudFszXSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgQnVpbGRlci5Db21tZW50OiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5Db21tZW50LFxuICAgICAgICB2YWx1ZTogc3RhdGVtZW50WzFdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEJsb2NrSGVhZChuYW1lOiBzdHJpbmcpOiBOb3JtYWxpemVkSGVhZCB7XG4gIGxldCByZXN1bHQgPSAvXigjfCEpKC4qKSQvLmV4ZWMobmFtZSk7XG5cbiAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBtaXNzaW5nICMgaW4gYmxvY2sgaGVhZGApO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZURvdHRlZFBhdGgocmVzdWx0WzJdKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ2FsbEhlYWQobmFtZTogc3RyaW5nKTogTm9ybWFsaXplZEhlYWQge1xuICBsZXQgcmVzdWx0ID0gL15cXCgoLiopXFwpJC8uZXhlYyhuYW1lKTtcblxuICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG1pc3NpbmcgKCkgaW4gY2FsbCBoZWFkYCk7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplRG90dGVkUGF0aChyZXN1bHRbMV0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKGhlYWQ6IHN0cmluZywgdGFpbDogc3RyaW5nW10gPSBbXSk6IE5vcm1hbGl6ZWRIZWFkIHtcbiAgbGV0IHBhdGhIZWFkID0gbm9ybWFsaXplUGF0aEhlYWQoaGVhZCk7XG5cbiAgaWYgKGlzUHJlc2VudCh0YWlsKSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBFeHByZXNzaW9uS2luZC5HZXRQYXRoLFxuICAgICAgcGF0aDoge1xuICAgICAgICBoZWFkOiBwYXRoSGVhZCxcbiAgICAgICAgdGFpbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogRXhwcmVzc2lvbktpbmQuR2V0VmFyLFxuICAgICAgdmFyaWFibGU6IHBhdGhIZWFkLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRG90dGVkUGF0aCh3aG9sZTogc3RyaW5nKTogTm9ybWFsaXplZEhlYWQge1xuICBsZXQgeyBraW5kLCBuYW1lOiByZXN0IH0gPSBub3JtYWxpemVQYXRoSGVhZCh3aG9sZSk7XG5cbiAgbGV0IFtuYW1lLCAuLi50YWlsXSA9IHJlc3Quc3BsaXQoJy4nKTtcblxuICBsZXQgdmFyaWFibGU6IFZhcmlhYmxlID0geyBraW5kLCBuYW1lLCBtb2RlOiAnbG9vc2UnIH07XG5cbiAgaWYgKGlzUHJlc2VudCh0YWlsKSkge1xuICAgIHJldHVybiB7IHR5cGU6IEV4cHJlc3Npb25LaW5kLkdldFBhdGgsIHBhdGg6IHsgaGVhZDogdmFyaWFibGUsIHRhaWwgfSB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IHR5cGU6IEV4cHJlc3Npb25LaW5kLkdldFZhciwgdmFyaWFibGUgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGF0aEhlYWQod2hvbGU6IHN0cmluZyk6IFZhcmlhYmxlIHtcbiAgbGV0IGtpbmQ6IFZhcmlhYmxlS2luZDtcbiAgbGV0IG5hbWU6IHN0cmluZztcblxuICBpZiAoL150aGlzKFxcLnwkKS8uZXhlYyh3aG9sZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogVmFyaWFibGVLaW5kLlRoaXMsXG4gICAgICBuYW1lOiB3aG9sZSxcbiAgICAgIG1vZGU6ICdsb29zZScsXG4gICAgfTtcbiAgfVxuXG4gIHN3aXRjaCAod2hvbGVbMF0pIHtcbiAgICBjYXNlICdeJzpcbiAgICAgIGtpbmQgPSBWYX