@glimmer/compiler
Version:
780 lines (666 loc) • 63.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.buildStatements = buildStatements;
exports.buildNormalizedStatements = buildNormalizedStatements;
exports.buildStatement = buildStatement;
exports.s = s;
exports.c = c;
exports.unicode = unicode;
exports.buildAngleInvocation = buildAngleInvocation;
exports.buildElementParams = buildElementParams;
exports.extractNamespace = extractNamespace;
exports.buildAttributeValue = buildAttributeValue;
exports.buildExpression = buildExpression;
exports.buildCallHead = buildCallHead;
exports.buildGetPath = buildGetPath;
exports.buildVar = buildVar;
exports.expressionContextOp = expressionContextOp;
exports.buildParams = buildParams;
exports.buildConcat = buildConcat;
exports.buildHash = buildHash;
exports.buildBlocks = buildBlocks;
exports.NEWLINE = exports.ProgramSymbols = void 0;
var _util = require("@glimmer/util");
var _builderInterface = require("./builder-interface");
class ProgramSymbols {
constructor() {
this._freeVariables = [];
this._symbols = ['this'];
this.top = this;
}
toSymbols() {
return this._symbols.slice(1);
}
toUpvars() {
return this._freeVariables;
}
freeVar(name) {
return addString(this._freeVariables, name);
}
block(name) {
return this.symbol(name);
}
arg(name) {
return addString(this._symbols, name);
}
local(name) {
throw new Error(`No local ${name} was found. Maybe you meant ^${name} for upvar, or !${name} for keyword?`);
}
this() {
return 0;
}
hasLocal(_name) {
return false;
} // any symbol
symbol(name) {
return addString(this._symbols, name);
}
child(locals) {
return new LocalSymbols(this, locals);
}
}
exports.ProgramSymbols = ProgramSymbols;
class LocalSymbols {
constructor(parent, locals) {
this.parent = parent;
this.locals = (0, _util.dict)();
for (let local of locals) {
this.locals[local] = parent.top.symbol(local);
}
}
get paramSymbols() {
return (0, _util.values)(this.locals);
}
get top() {
return this.parent.top;
}
freeVar(name) {
return this.parent.freeVar(name);
}
arg(name) {
return this.parent.arg(name);
}
block(name) {
return this.parent.block(name);
}
local(name) {
if (name in this.locals) {
return this.locals[name];
} else {
return this.parent.local(name);
}
}
this() {
return this.parent.this();
}
hasLocal(name) {
if (name in this.locals) {
return true;
} else {
return this.parent.hasLocal(name);
}
}
child(locals) {
return new LocalSymbols(this, locals);
}
}
function addString(array, item) {
let index = array.indexOf(item);
if (index === -1) {
index = array.length;
array.push(item);
return index;
} else {
return index;
}
}
function unimpl(message) {
return new Error(`unimplemented ${message}`);
}
function buildStatements(statements, symbols) {
let out = [];
statements.forEach(s => out.push(...buildStatement((0, _builderInterface.normalizeStatement)(s), symbols)));
return out;
}
function buildNormalizedStatements(statements, symbols) {
let out = [];
statements.forEach(s => out.push(...buildStatement(s, symbols)));
return out;
}
function buildStatement(normalized, symbols = new ProgramSymbols()) {
switch (normalized.kind) {
case "AppendPath"
/* AppendPath */
:
{
return [[normalized.trusted ? 2
/* TrustingAppend */
: 1
/* Append */
, buildGetPath(normalized.path, symbols)]];
}
case "AppendExpr"
/* AppendExpr */
:
{
return [[normalized.trusted ? 2
/* TrustingAppend */
: 1
/* Append */
, buildExpression(normalized.expr, normalized.trusted ? 'TrustedAppend' : 'Append', symbols)]];
}
case "Call"
/* Call */
:
{
let {
head: path,
params,
hash,
trusted
} = normalized;
let builtParams = params ? buildParams(params, symbols) : null;
let builtHash = hash ? buildHash(hash, symbols) : null;
let builtExpr = buildCallHead(path, trusted ? 3
/* AmbiguousInvoke */
: 2
/* AmbiguousAppendInvoke */
, symbols);
return [[trusted ? 2
/* TrustingAppend */
: 1
/* Append */
, [28
/* Call */
, builtExpr, builtParams, builtHash]]];
}
case "Literal"
/* Literal */
:
{
return [[1
/* Append */
, normalized.value]];
}
case "Comment"
/* Comment */
:
{
return [[3
/* Comment */
, normalized.value]];
}
case "Block"
/* Block */
:
{
let blocks = buildBlocks(normalized.blocks, normalized.blockParams, symbols);
let hash = buildHash(normalized.hash, symbols);
let params = buildParams(normalized.params, symbols);
let path = buildCallHead(normalized.head, 7
/* ResolveAsComponentHead */
, symbols);
return [[6
/* Block */
, path, params, hash, blocks]];
}
case "Keyword"
/* Keyword */
:
{
return [buildKeyword(normalized, symbols)];
}
case "Element"
/* Element */
:
return buildElement(normalized, symbols);
case "Modifier"
/* Modifier */
:
throw unimpl('modifier');
case "DynamicComponent"
/* DynamicComponent */
:
throw unimpl('dynamic component');
default:
throw (0, _util.assertNever)(normalized);
}
}
function s(arr, ...interpolated) {
let result = arr.reduce((result, string, i) => result + `${string}${interpolated[i] ? String(interpolated[i]) : ''}`, '');
return [0
/* Literal */
, result];
}
function c(arr, ...interpolated) {
let result = arr.reduce((result, string, i) => result + `${string}${interpolated[i] ? String(interpolated[i]) : ''}`, '');
return [1
/* Comment */
, result];
}
function unicode(charCode) {
return String.fromCharCode(parseInt(charCode, 16));
}
const NEWLINE = '\n';
exports.NEWLINE = NEWLINE;
function buildKeyword(normalized, symbols) {
let {
name
} = normalized;
let params = buildParams(normalized.params, symbols);
let childSymbols = symbols.child(normalized.blockParams || []);
let block = buildBlock(normalized.blocks.default, childSymbols, childSymbols.paramSymbols);
let inverse = normalized.blocks.else ? buildBlock(normalized.blocks.else, symbols, []) : null;
switch (name) {
case 'with':
return [43
/* With */
, params[0], block, inverse];
case 'if':
return [41
/* If */
, params[0], block, inverse];
case 'each':
let keyExpr = normalized.hash ? normalized.hash['key'] : null;
let key = keyExpr ? buildExpression(keyExpr, 'Strict', symbols) : null;
return [42
/* Each */
, params[0], key, block, inverse];
default:
throw new Error('unimplemented keyword');
}
}
function buildElement({
name,
attrs,
block
}, symbols) {
let out = [hasSplat(attrs) ? [11
/* OpenElementWithSplat */
, name] : [10
/* OpenElement */
, name]];
if (attrs) {
let {
params,
args
} = buildElementParams(attrs, symbols);
out.push(...params);
false && (0, _util.assert)(args === null, `Can't pass args to a simple element`);
}
out.push([12
/* FlushElement */
]);
if (Array.isArray(block)) {
block.forEach(s => out.push(...buildStatement(s, symbols)));
} else if (block === null) {// do nothing
} else {
throw (0, _util.assertNever)(block);
}
out.push([13
/* CloseElement */
]);
return out;
}
function hasSplat(attrs) {
if (attrs === null) return false;
return Object.keys(attrs).some(a => attrs[a] === "Splat"
/* Splat */
);
}
function buildAngleInvocation({
attrs,
block,
head
}, symbols) {
let paramList = [];
let args = null;
let blockList = [];
if (attrs) {
let built = buildElementParams(attrs, symbols);
paramList = built.params;
args = built.args;
}
if (block) blockList = buildNormalizedStatements(block, symbols);
return [8
/* Component */
, buildExpression(head, 7
/* ResolveAsComponentHead */
, symbols), (0, _util.isPresent)(paramList) ? paramList : null, args, [['default'], [[blockList, []]]]];
}
function buildElementParams(attrs, symbols) {
let params = [];
let keys = [];
let values = [];
Object.keys(attrs).forEach(key => {
let value = attrs[key];
if (value === "Splat"
/* Splat */
) {
params.push([17
/* AttrSplat */
, symbols.block('&attrs')]);
} else if (key[0] === '@') {
keys.push(key);
values.push(buildExpression(value, 'Strict', symbols));
} else {
params.push(...buildAttributeValue(key, value, // TODO: extract namespace from key
extractNamespace(key), symbols));
}
});
return {
params,
args: (0, _util.isPresent)(keys) && (0, _util.isPresent)(values) ? [keys, values] : null
};
}
function extractNamespace(name) {
if (name === 'xmlns') {
return "http://www.w3.org/2000/xmlns/"
/* XMLNS */
;
}
let match = /^([^:]*):([^:]*)$/.exec(name);
if (match === null) {
return null;
}
let namespace = match[1];
switch (namespace) {
case 'xlink':
return "http://www.w3.org/1999/xlink"
/* XLink */
;
case 'xml':
return "http://www.w3.org/XML/1998/namespace"
/* XML */
;
case 'xmlns':
return "http://www.w3.org/2000/xmlns/"
/* XMLNS */
;
}
return null;
}
function buildAttributeValue(name, value, namespace, symbols) {
switch (value.type) {
case "Literal"
/* Literal */
:
{
let val = value.value;
if (val === false) {
return [];
} else if (val === true) {
return [[14
/* StaticAttr */
, name, '', namespace !== null && namespace !== void 0 ? namespace : undefined]];
} else if (typeof val === 'string') {
return [[14
/* StaticAttr */
, name, val, namespace !== null && namespace !== void 0 ? namespace : undefined]];
} else {
throw new Error(`Unexpected/unimplemented literal attribute ${JSON.stringify(val)}`);
}
}
default:
return [[15
/* DynamicAttr */
, name, buildExpression(value, 'AttrValue', symbols), namespace !== null && namespace !== void 0 ? namespace : undefined]];
}
}
function varContext(context, bare) {
switch (context) {
case 'Append':
return bare ? 'AppendBare' : 'AppendInvoke';
case 'TrustedAppend':
return bare ? 'TrustedAppendBare' : 'TrustedAppendInvoke';
case 'AttrValue':
return bare ? 'AttrValueBare' : 'AttrValueInvoke';
default:
return context;
}
}
function buildExpression(expr, context, symbols) {
switch (expr.type) {
case "GetPath"
/* GetPath */
:
{
return buildGetPath(expr, symbols);
}
case "GetVar"
/* GetVar */
:
{
return buildVar(expr.variable, varContext(context, true), symbols);
}
case "Concat"
/* Concat */
:
{
return [29
/* Concat */
, buildConcat(expr.params, symbols)];
}
case "Call"
/* Call */
:
{
let builtParams = buildParams(expr.params, symbols);
let builtHash = buildHash(expr.hash, symbols);
let builtExpr = buildCallHead(expr.head, context === 'Strict' ? 'SubExpression' : varContext(context, false), symbols);
return [28
/* Call */
, builtExpr, builtParams, builtHash];
}
case "HasBlock"
/* HasBlock */
:
{
return [48
/* HasBlock */
, buildVar({
kind: _builderInterface.VariableKind.Block,
name: expr.name,
mode: 'loose'
}, 0
/* Strict */
, symbols)];
}
case "HasBlockParams"
/* HasBlockParams */
:
{
return [49
/* HasBlockParams */
, buildVar({
kind: _builderInterface.VariableKind.Block,
name: expr.name,
mode: 'loose'
}, 0
/* Strict */
, symbols)];
}
case "Literal"
/* Literal */
:
{
if (expr.value === undefined) {
return [27
/* Undefined */
];
} else {
return expr.value;
}
}
default:
(0, _util.assertNever)(expr);
}
}
function buildCallHead(callHead, context, symbols) {
if (callHead.type === "GetVar"
/* GetVar */
) {
return buildVar(callHead.variable, context, symbols);
} else {
return buildGetPath(callHead, symbols);
}
}
function buildGetPath(head, symbols) {
return buildVar(head.path.head, 0
/* Strict */
, symbols, head.path.tail);
}
function buildVar(head, context, symbols, path) {
let op = 30
/* GetSymbol */
;
let sym;
switch (head.kind) {
case _builderInterface.VariableKind.Free:
if (context === 'Strict') {
op = 31
/* GetStrictFree */
;
} else if (context === 'AppendBare') {
op = 34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
;
} else if (context === 'AppendInvoke') {
op = 35
/* GetFreeAsComponentOrHelperHead */
;
} else if (context === 'TrustedAppendBare') {
op = 36
/* GetFreeAsHelperHeadOrThisFallback */
;
} else if (context === 'TrustedAppendInvoke') {
op = 37
/* GetFreeAsHelperHead */
;
} else if (context === 'AttrValueBare') {
op = 36
/* GetFreeAsHelperHeadOrThisFallback */
;
} else if (context === 'AttrValueInvoke') {
op = 37
/* GetFreeAsHelperHead */
;
} else if (context === 'SubExpression') {
op = 37
/* GetFreeAsHelperHead */
;
} else {
op = expressionContextOp(context);
}
sym = symbols.freeVar(head.name);
break;
default:
op = 30
/* GetSymbol */
;
sym = getSymbolForVar(head.kind, symbols, head.name);
}
if (path === undefined || path.length === 0) {
return [op, sym];
} else {
return [op, sym, path];
}
}
function getSymbolForVar(kind, symbols, name) {
switch (kind) {
case _builderInterface.VariableKind.Arg:
return symbols.arg(name);
case _builderInterface.VariableKind.Block:
return symbols.block(name);
case _builderInterface.VariableKind.Local:
return symbols.local(name);
case _builderInterface.VariableKind.This:
return symbols.this();
default:
return (0, _util.exhausted)(kind);
}
}
function expressionContextOp(context) {
switch (context) {
case 0
/* Strict */
:
return 31
/* GetStrictFree */
;
case 1
/* AmbiguousAppend */
:
return 34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
;
case 2
/* AmbiguousAppendInvoke */
:
return 35
/* GetFreeAsComponentOrHelperHead */
;
case 3
/* AmbiguousInvoke */
:
return 36
/* GetFreeAsHelperHeadOrThisFallback */
;
case 5
/* ResolveAsCallHead */
:
return 37
/* GetFreeAsHelperHead */
;
case 6
/* ResolveAsModifierHead */
:
return 38
/* GetFreeAsModifierHead */
;
case 7
/* ResolveAsComponentHead */
:
return 39
/* GetFreeAsComponentHead */
;
default:
return (0, _util.exhausted)(context);
}
}
function buildParams(exprs, symbols) {
if (exprs === null || !(0, _util.isPresent)(exprs)) return null;
return exprs.map(e => buildExpression(e, 'Strict', symbols));
}
function buildConcat(exprs, symbols) {
return exprs.map(e => buildExpression(e, 'AttrValue', symbols));
}
function buildHash(exprs, symbols) {
if (exprs === null) return null;
let out = [[], []];
Object.keys(exprs).forEach(key => {
out[0].push(key);
out[1].push(buildExpression(exprs[key], 'Strict', symbols));
});
return out;
}
function buildBlocks(blocks, blockParams, parent) {
let keys = [];
let values = [];
Object.keys(blocks).forEach(name => {
keys.push(name);
if (name === 'default') {
let symbols = parent.child(blockParams || []);
values.push(buildBlock(blocks[name], symbols, symbols.paramSymbols));
} else {
values.push(buildBlock(blocks[name], parent, []));
}
});
return [keys, values];
}
function buildBlock(block, symbols, locals = []) {
return [buildNormalizedStatements(block, symbols), locals];
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQTs7QUFHQTs7QUFzQ00sTUFBQSxjQUFBLENBQXFCO0FBQTNCLEVBQUEsV0FBQSxHQUFBO0FBQ0UsU0FBQSxjQUFBLEdBQUEsRUFBQTtBQUNBLFNBQUEsUUFBQSxHQUFxQixDQUFyQixNQUFxQixDQUFyQjtBQUVBLFNBQUEsR0FBQSxHQUFBLElBQUE7QUE0Q0Q7O0FBMUNDLEVBQUEsU0FBUyxHQUFBO0FBQ1AsV0FBTyxLQUFBLFFBQUEsQ0FBQSxLQUFBLENBQVAsQ0FBTyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLEdBQUE7QUFDTixXQUFPLEtBQVAsY0FBQTtBQUNEOztBQUVELEVBQUEsT0FBTyxDQUFBLElBQUEsRUFBYTtBQUNsQixXQUFPLFNBQVMsQ0FBQyxLQUFELGNBQUEsRUFBaEIsSUFBZ0IsQ0FBaEI7QUFDRDs7QUFFRCxFQUFBLEtBQUssQ0FBQSxJQUFBLEVBQWE7QUFDaEIsV0FBTyxLQUFBLE1BQUEsQ0FBUCxJQUFPLENBQVA7QUFDRDs7QUFFRCxFQUFBLEdBQUcsQ0FBQSxJQUFBLEVBQWE7QUFDZCxXQUFPLFNBQVMsQ0FBQyxLQUFELFFBQUEsRUFBaEIsSUFBZ0IsQ0FBaEI7QUFDRDs7QUFFRCxFQUFBLEtBQUssQ0FBQSxJQUFBLEVBQWE7QUFDaEIsVUFBTSxJQUFBLEtBQUEsQ0FDSixZQUFZLElBQUksZ0NBQWdDLElBQUksbUJBQW1CLElBRHpFLGVBQU0sQ0FBTjtBQUdEOztBQUVELEVBQUEsSUFBSSxHQUFBO0FBQ0YsV0FBQSxDQUFBO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLENBQUEsS0FBQSxFQUFjO0FBQ3BCLFdBQUEsS0FBQTtBQXJDdUIsR0FBQSxDQXdDekI7OztBQUNBLEVBQUEsTUFBTSxDQUFBLElBQUEsRUFBYTtBQUNq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LEVBQUEsUUFBQSxFQUEzQixPQUEyQixDQUEzQjtBQUZGLEdBQUE7QUFLQSxTQUFBLEdBQUE7QUFDRDs7QUFFSyxTQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQUEsV0FBQSxFQUFBLE1BQUEsRUFHVztBQUVmLE1BQUksSUFBSSxHQUFSLEVBQUE7QUFDQSxNQUFJLE1BQU0sR0FBVixFQUFBO0FBRUEsRUFBQSxNQUFNLENBQU4sSUFBQSxDQUFBLE1BQUEsRUFBQSxPQUFBLENBQTZCLElBQUQsSUFBUztBQUNuQyxJQUFBLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQTs7QUFFQSxRQUFJLElBQUksS0FBUixTQUFBLEVBQXdCO0FBQ3RCLFVBQUksT0FBTyxHQUFHLE1BQU0sQ0FBTixLQUFBLENBQWEsV0FBVyxJQUF0QyxFQUFjLENBQWQ7QUFFQSxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxPQUFBLEVBQXdCLE9BQU8sQ0FBckQsWUFBc0IsQ0FBdEI7QUFIRixLQUFBLE1BSU87QUFDTCxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxNQUFBLEVBQXRCLEVBQXNCLENBQXRCO0FBQ0Q7QUFUSCxHQUFBO0FBWUEsU0FBTyxDQUFBLElBQUEsRUFBUCxNQUFPLENBQVA7QUFDRDs7QUFFRCxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBQUEsT0FBQSxFQUdFLE1BQUEsR0FIRixFQUFBLEVBR3VCO0FBRXJCLFNBQU8sQ0FBQyx5QkFBeUIsQ0FBQSxLQUFBLEVBQTFCLE9BQTBCLENBQTFCLEVBQVAsTUFBTyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaWN0LFxuICBFeHByZXNzaW9ucyxcbiAgR2V0Q29udGV4dHVhbEZyZWVPcCxcbiAgT3B0aW9uLFxuICBQcmVzZW50QXJyYXksXG4gIFNleHBPcGNvZGVzLFxuICBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LFxuICBXaXJlRm9ybWF0LFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0TmV2ZXIsIGRpY3QsIGV4aGF1c3RlZCwgZXhwZWN0LCBpc1ByZXNlbnQsIHZhbHVlcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQXR0ck5hbWVzcGFjZSwgTmFtZXNwYWNlIH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcblxuaW1wb3J0IHtcbiAgQnVpbGRlcixcbiAgQnVpbGRlckNvbW1lbnQsXG4gIEJ1aWxkZXJTdGF0ZW1lbnQsXG4gIEV4cHJlc3Npb25LaW5kLFxuICBIZWFkS2luZCxcbiAgTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbixcbiAgTm9ybWFsaXplZEF0dHJzLFxuICBOb3JtYWxpemVkQmxvY2ssXG4gIE5vcm1hbGl6ZWRCbG9ja3MsXG4gIE5vcm1hbGl6ZWRFbGVtZW50LFxuICBOb3JtYWxpemVkRXhwcmVzc2lvbixcbiAgTm9ybWFsaXplZEhhc2gsXG4gIE5vcm1hbGl6ZWRIZWFkLFxuICBOb3JtYWxpemVkS2V5d29yZFN0YXRlbWVudCxcbiAgTm9ybWFsaXplZFBhcmFtcyxcbiAgTm9ybWFsaXplZFBhdGgsXG4gIE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIG5vcm1hbGl6ZVN0YXRlbWVudCxcbiAgVmFyaWFibGUsXG4gIFZhcmlhYmxlS2luZCxcbn0gZnJvbSAnLi9idWlsZGVyLWludGVyZmFjZSc7XG5cbmltcG9ydCBPcCA9IFdpcmVGb3JtYXQuU2V4cE9wY29kZXM7XG5cbmludGVyZmFjZSBTeW1ib2xzIHtcbiAgdG9wOiBQcm9ncmFtU3ltYm9scztcbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgbG9jYWwobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICB0aGlzKCk6IG51bWJlcjtcblxuICBoYXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIGNoaWxkKHBhcmFtczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHM7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmFtU3ltYm9scyBpbXBsZW1lbnRzIFN5bWJvbHMge1xuICBfZnJlZVZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgX3N5bWJvbHM6IHN0cmluZ1tdID0gWyd0aGlzJ107XG5cbiAgdG9wID0gdGhpcztcblxuICB0b1N5bWJvbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9zeW1ib2xzLnNsaWNlKDEpO1xuICB9XG5cbiAgdG9VcHZhcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcmVlVmFyaWFibGVzO1xuICB9XG5cbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fZnJlZVZhcmlhYmxlcywgbmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbChuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fc3ltYm9scywgbmFtZSk7XG4gIH1cblxuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBuZXZlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIGxvY2FsICR7bmFtZX0gd2FzIGZvdW5kLiBNYXliZSB5b3UgbWVhbnQgXiR7bmFtZX0gZm9yIHVwdmFyLCBvciAhJHtuYW1lfSBmb3Iga2V5d29yZD9gXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGhhc0xvY2FsKF9uYW1lOiBzdHJpbmcpOiBmYWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gYW55IHN5bWJvbFxuICBzeW1ib2wobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYWRkU3RyaW5nKHRoaXMuX3N5bWJvbHMsIG5hbWUpO1xuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5jbGFzcyBMb2NhbFN5bWJvbHMgaW1wbGVtZW50cyBTeW1ib2xzIHtcbiAgcHJpdmF0ZSBsb2NhbHM6IERpY3Q8bnVtYmVyPiA9IGRpY3QoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudDogU3ltYm9scywgbG9jYWxzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGxvY2FsIG9mIGxvY2Fscykge1xuICAgICAgdGhpcy5sb2NhbHNbbG9jYWxdID0gcGFyZW50LnRvcC5zeW1ib2wobG9jYWwpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXJhbVN5bWJvbHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB2YWx1ZXModGhpcy5sb2NhbHMpO1xuICB9XG5cbiAgZ2V0IHRvcCgpOiBQcm9ncmFtU3ltYm9scyB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnRvcDtcbiAgfVxuXG4gIGZyZWVWYXIobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZnJlZVZhcihuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hcmcobmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5ibG9jayhuYW1lKTtcbiAgfVxuXG4gIGxvY2FsKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2Fsc1tuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmxvY2FsKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQudGhpcygpO1xuICB9XG5cbiAgaGFzTG9jYWwobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuaGFzTG9jYWwobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTdHJpbmcoYXJyYXk6IHN0cmluZ1tdLCBpdGVtOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBpbmRleCA9IGFycmF5Lmxlbmd0aDtcbiAgICBhcnJheS5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpbmRleDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyR2V0RnJlZSB7XG4gIHR5cGU6ICdHZXRGcmVlJztcbiAgaGVhZDogc3RyaW5nO1xuICB0YWlsOiBzdHJpbmdbXTtcbn1cblxuZnVuY3Rpb24gdW5pbXBsKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke21lc3NhZ2V9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRlbWVudHMoXG4gIHN0YXRlbWVudHM6IEJ1aWxkZXJTdGF0ZW1lbnRbXSxcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIGxldCBvdXQ6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10gPSBbXTtcblxuICBzdGF0ZW1lbnRzLmZvckVhY2goKHMpID0+IG91dC5wdXNoKC4uLmJ1aWxkU3RhdGVtZW50KG5vcm1hbGl6ZVN0YXRlbWVudChzKSwgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkU3RhdGVtZW50cyhcbiAgc3RhdGVtZW50czogTm9ybWFsaXplZFN0YXRlbWVudFtdLFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtdO1xuXG4gIHN0YXRlbWVudHMuZm9yRWFjaCgocykgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIHN5bWJvbHM6IFN5bWJvbHMgPSBuZXcgUHJvZ3JhbVN5bWJvbHMoKVxuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIHN3aXRjaCAobm9ybWFsaXplZC5raW5kKSB7XG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRQYXRoOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgbm9ybWFsaXplZC50cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsXG4gICAgICAgICAgYnVpbGRHZXRQYXRoKG5vcm1hbGl6ZWQucGF0aCwgc3ltYm9scyksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQXBwZW5kRXhwcjoge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgW1xuICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/IE9wLlRydXN0aW5nQXBwZW5kIDogT3AuQXBwZW5kLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbihcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQuZXhwcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/ICdUcnVzdGVkQXBwZW5kJyA6ICdBcHBlbmQnLFxuICAgICAgICAgICAgc3ltYm9sc1xuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQ2FsbDoge1xuICAgICAgbGV0IHsgaGVhZDogcGF0aCwgcGFyYW1zLCBoYXNoLCB0cnVzdGVkIH0gPSBub3JtYWxpemVkO1xuICAgICAgbGV0IGJ1aWx0UGFyYW1zOiBPcHRpb248V2lyZUZvcm1hdC5Db3JlLlBhcmFtcz4gPSBwYXJhbXNcbiAgICAgICAgPyBidWlsZFBhcmFtcyhwYXJhbXMsIHN5bWJvbHMpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGxldCBidWlsdEhhc2g6IFdpcmVGb3JtYXQuQ29yZS5IYXNoID0gaGFzaCA/IGJ1aWxkSGFzaChoYXNoLCBzeW1ib2xzKSA6IG51bGw7XG4gICAgICBsZXQgYnVpbHRFeHByOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24gPSBidWlsZENhbGxIZWFkKFxuICAgICAgICBwYXRoLFxuICAgICAgICB0cnVzdGVkXG4gICAgICAgICAgPyBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LkFtYmlndW91c0ludm9rZVxuICAgICAgICAgIDogVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5BbWJpZ3VvdXNBcHBlbmRJbnZva2UsXG4gICAgICAgIHN5bWJvbHNcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIFt0cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsIFtPcC5DYWxsLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4gW1tPcC5BcHBlbmQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNvbW1lbnQ6IHtcbiAgICAgIHJldHVybiBbW09wLkNvbW1lbnQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkJsb2NrOiB7XG4gICAgICBsZXQgYmxvY2tzID0gYnVpbGRCbG9ja3Mobm9ybWFsaXplZC5ibG9ja3MsIG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGhhc2ggPSBidWlsZEhhc2gobm9ybWFsaXplZC5oYXNoLCBzeW1ib2xzKTtcbiAgICAgIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gICAgICBsZXQgcGF0aCA9IGJ1aWxkQ2FsbEhlYWQoXG4gICAgICAgIG5vcm1hbGl6ZWQuaGVhZCxcbiAgICAgICAgVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5SZXNvbHZlQXNDb21wb25lbnRIZWFkLFxuICAgICAgICBzeW1ib2xzXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gW1tPcC5CbG9jaywgcGF0aCwgcGFyYW1zLCBoYXNoLCBibG9ja3NdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLktleXdvcmQ6IHtcbiAgICAgIHJldHVybiBbYnVpbGRLZXl3b3JkKG5vcm1hbGl6ZWQsIHN5bWJvbHMpXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkVsZW1lbnQ6XG4gICAgICByZXR1cm4gYnVpbGRFbGVtZW50KG5vcm1hbGl6ZWQsIHN5bWJvbHMpO1xuXG4gICAgY2FzZSBIZWFkS2luZC5Nb2RpZmllcjpcbiAgICAgIHRocm93IHVuaW1wbCgnbW9kaWZpZXInKTtcblxuICAgIGNhc2UgSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudDpcbiAgICAgIHRocm93IHVuaW1wbCgnZHluYW1pYyBjb21wb25lbnQnKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBhc3NlcnROZXZlcihub3JtYWxpemVkKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcyhcbiAgYXJyOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgLi4uaW50ZXJwb2xhdGVkOiB1bmtub3duW11cbik6IFtCdWlsZGVyLkxpdGVyYWwsIHN0cmluZ10ge1xuICBsZXQgcmVzdWx0ID0gYXJyLnJlZHVjZShcbiAgICAocmVzdWx0LCBzdHJpbmcsIGkpID0+IHJlc3VsdCArIGAke3N0cmluZ30ke2ludGVycG9sYXRlZFtpXSA/IFN0cmluZyhpbnRlcnBvbGF0ZWRbaV0pIDogJyd9YCxcbiAgICAnJ1xuICApO1xuXG4gIHJldHVybiBbQnVpbGRlci5MaXRlcmFsLCByZXN1bHRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYyhhcnI6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi5pbnRlcnBvbGF0ZWQ6IHVua25vd25bXSk6IEJ1aWxkZXJDb21tZW50IHtcbiAgbGV0IHJlc3VsdCA9IGFyci5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgc3RyaW5nLCBpKSA9PiByZXN1bHQgKyBgJHtzdHJpbmd9JHtpbnRlcnBvbGF0ZWRbaV0gPyBTdHJpbmcoaW50ZXJwb2xhdGVkW2ldKSA6ICcnfWAsXG4gICAgJydcbiAgKTtcblxuICByZXR1cm4gW0J1aWxkZXIuQ29tbWVudCwgcmVzdWx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWNvZGUoY2hhckNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNoYXJDb2RlLCAxNikpO1xufVxuXG5leHBvcnQgY29uc3QgTkVXTElORSA9ICdcXG4nO1xuXG5mdW5jdGlvbiBidWlsZEtleXdvcmQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRLZXl3b3JkU3RhdGVtZW50LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudCB7XG4gIGxldCB7IG5hbWUgfSA9IG5vcm1hbGl6ZWQ7XG4gIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gIGxldCBjaGlsZFN5bWJvbHMgPSBzeW1ib2xzLmNoaWxkKG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMgfHwgW10pO1xuXG4gIGxldCBibG9jayA9IGJ1aWxkQmxvY2sobm9ybWFsaXplZC5ibG9ja3MuZGVmYXVsdCwgY2hpbGRTeW1ib2xzLCBjaGlsZFN5bWJvbHMucGFyYW1TeW1ib2xzKTtcbiAgbGV0IGludmVyc2UgPSBub3JtYWxpemVkLmJsb2Nrcy5lbHNlID8gYnVpbGRCbG9jayhub3JtYWxpemVkLmJsb2Nrcy5lbHNlLCBzeW1ib2xzLCBbXSkgOiBudWxsO1xuXG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ3dpdGgnOlxuICAgICAgcmV0dXJuIFtPcC5XaXRoLCBleHBlY3QocGFyYW1zLCAnd2l0aCByZXF1aXJlcyBwYXJhbXMnKVswXSwgYmxvY2ssIGludmVyc2VdO1xuICAgIGNhc2UgJ2lmJzpcbiAgICAgIHJldHVybiBbT3AuSWYsIGV4cGVjdChwYXJhbXMsICdpZiByZXF1aXJlcyBwYXJhbXMnKVswXSwgYmxvY2ssIGludmVyc2VdO1xuICAgIGNhc2UgJ2VhY2gnOlxuICAgICAgbGV0IGtleUV4cHIgPSBub3JtYWxpemVkLmhhc2ggPyBub3JtYWxpemVkLmhhc2hbJ2tleSddIDogbnVsbDtcbiAgICAgIGxldCBrZXkgPSBrZXlFeHByID8gYnVpbGRFeHByZXNzaW9uKGtleUV4cHIsICdTdHJpY3QnLCBzeW1ib2xzKSA6IG51bGw7XG5cbiAgICAgIHJldHVybiBbT3AuRWFjaCwgZXhwZWN0KHBhcmFtcywgJ2lmIHJlcXVpcmVzIHBhcmFtcycpWzBdLCBrZXksIGJsb2NrLCBpbnZlcnNlXTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGtleXdvcmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnQoXG4gIHsgbmFtZSwgYXR0cnMsIGJsb2NrIH06IE5vcm1hbGl6ZWRFbGVtZW50LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtcbiAgICBoYXNTcGxhdChhdHRycykgPyBbT3AuT3BlbkVsZW1lbnRXaXRoU3BsYXQsIG5hbWVdIDogW09wLk9wZW5FbGVtZW50LCBuYW1lXSxcbiAgXTtcbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IHsgcGFyYW1zLCBhcmdzIH0gPSBidWlsZEVsZW1lbnRQYXJhbXMoYXR0cnMsIHN5bWJvbHMpO1xuICAgIG91dC5wdXNoKC4uLnBhcmFtcyk7XG4gICAgYXNzZXJ0KGFyZ3MgPT09IG51bGwsIGBDYW4ndCBwYXNzIGFyZ3MgdG8gYSBzaW1wbGUgZWxlbWVudGApO1xuICB9XG4gIG91dC5wdXNoKFtPcC5GbHVzaEVsZW1lbnRdKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShibG9jaykpIHtcbiAgICBibG9jay5mb3JFYWNoKChzKSA9PiBvdXQucHVzaCguLi5idWlsZFN0YXRlbWVudChzLCBzeW1ib2xzKSkpO1xuICB9IGVsc2UgaWYgKGJsb2NrID09PSBudWxsKSB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9IGVsc2Uge1xuICAgIHRocm93IGFzc2VydE5ldmVyKGJsb2NrKTtcbiAgfVxuXG4gIG91dC5wdXNoKFtPcC5DbG9zZUVsZW1lbnRdKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBoYXNTcGxhdChhdHRyczogT3B0aW9uPE5vcm1hbGl6ZWRBdHRycz4pOiBib29sZWFuIHtcbiAgaWYgKGF0dHJzID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKS5zb21lKChhKSA9PiBhdHRyc1thXSA9PT0gSGVhZEtpbmQuU3BsYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmdsZUludm9jYXRpb24oXG4gIHsgYXR0cnMsIGJsb2NrLCBoZWFkIH06IE5vcm1hbGl6ZWRBbmdsZUludm9jYXRpb24sXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5Db21wb25lbnQge1xuICBsZXQgcGFyYW1MaXN0OiBXaXJlRm9ybWF0LkVsZW1lbnRQYXJhbWV0ZXJbXSA9IFtdO1xuICBsZXQgYXJnczogV2lyZUZvcm1hdC5Db3JlLkhhc2ggPSBudWxsO1xuICBsZXQgYmxvY2tMaXN0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IGJ1aWx0ID0gYnVpbGRFbGVtZW50UGFyYW1zKGF0dHJzLCBzeW1ib2xzKTtcbiAgICBwYXJhbUxpc3QgPSBidWlsdC5wYXJhbXM7XG4gICAgYXJncyA9IGJ1aWx0LmFyZ3M7XG4gIH1cblxuICBpZiAoYmxvY2spIGJsb2NrTGlzdCA9IGJ1aWxkTm9ybWFsaXplZFN0YXRlbWVudHMoYmxvY2ssIHN5bWJvbHMpO1xuXG4gIHJldHVy