@glimmer/compiler
Version:
331 lines (270 loc) • 32.4 kB
JavaScript
import { dict, exhausted } from '@glimmer/util';
import { inflateAttrName, inflateTagName } from './utils';
export default class WireFormatDebugger {
constructor([_statements, symbols, _hasEval, upvars]) {
this.upvars = upvars;
this.symbols = symbols;
}
format(program) {
let out = [];
for (let statement of program[0]) {
out.push(this.formatOpcode(statement));
}
return out;
}
formatOpcode(opcode) {
if (Array.isArray(opcode)) {
switch (opcode[0]) {
case 1
/* Append */
:
return ['append', this.formatOpcode(opcode[1])];
case 2
/* TrustingAppend */
:
return ['trusting-append', this.formatOpcode(opcode[1])];
case 6
/* Block */
:
return ['block', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])];
case 40
/* InElement */
:
return ['in-element', opcode[1], this.formatOpcode(opcode[2]), opcode[3] ? this.formatOpcode(opcode[3]) : undefined];
case 10
/* OpenElement */
:
return ['open-element', inflateTagName(opcode[1])];
case 11
/* OpenElementWithSplat */
:
return ['open-element-with-splat', inflateTagName(opcode[1])];
case 13
/* CloseElement */
:
return ['close-element'];
case 12
/* FlushElement */
:
return ['flush-element'];
case 14
/* StaticAttr */
:
return ['static-attr', inflateAttrName(opcode[1]), opcode[2], opcode[3]];
case 24
/* StaticComponentAttr */
:
return ['static-component-attr', inflateAttrName(opcode[1]), opcode[2], opcode[3]];
case 15
/* DynamicAttr */
:
return ['dynamic-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 16
/* ComponentAttr */
:
return ['component-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 17
/* AttrSplat */
:
return ['attr-splat'];
case 18
/* Yield */
:
return ['yield', opcode[1], this.formatParams(opcode[2])];
case 20
/* DynamicArg */
:
return ['dynamic-arg', opcode[1], this.formatOpcode(opcode[2])];
case 21
/* StaticArg */
:
return ['static-arg', opcode[1], this.formatOpcode(opcode[2])];
case 22
/* TrustingDynamicAttr */
:
return ['trusting-dynamic-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 23
/* TrustingComponentAttr */
:
return ['trusting-component-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]];
case 26
/* Debugger */
:
return ['debugger', opcode[1]];
case 3
/* Comment */
:
return ['comment', opcode[1]];
case 4
/* Modifier */
:
return ['modifier', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3])];
case 8
/* Component */
:
return ['component', this.formatOpcode(opcode[1]), this.formatElementParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])];
case 48
/* HasBlock */
:
return ['has-block', this.formatOpcode(opcode[1])];
case 49
/* HasBlockParams */
:
return ['has-block-params', this.formatOpcode(opcode[1])];
case 50
/* Curry */
:
return ['curry', this.formatOpcode(opcode[1]), this.formatCurryType(opcode[2]), this.formatParams(opcode[3]), this.formatHash(opcode[4])];
case 27
/* Undefined */
:
return ['undefined'];
case 28
/* Call */
:
return ['call', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3])];
case 29
/* Concat */
:
return ['concat', this.formatParams(opcode[1])];
case 31
/* GetStrictFree */
:
return ['get-strict-free', this.upvars[opcode[1]], opcode[2]];
case 34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
:
return ['GetFreeAsComponentOrHelperHeadOrThisFallback', this.upvars[opcode[1]], opcode[2]];
case 35
/* GetFreeAsComponentOrHelperHead */
:
return ['GetFreeAsComponentOrHelperHead', this.upvars[opcode[1]], opcode[2]];
case 36
/* GetFreeAsHelperHeadOrThisFallback */
:
return ['GetFreeAsHelperHeadOrThisFallback', this.upvars[opcode[1]], opcode[2]];
case 99
/* GetFreeAsDeprecatedHelperHeadOrThisFallback */
:
return ['GetFreeAsDeprecatedHelperHeadOrThisFallback', this.upvars[opcode[1]]];
case 37
/* GetFreeAsHelperHead */
:
return ['GetFreeAsHelperHead', this.upvars[opcode[1]], opcode[2]];
case 39
/* GetFreeAsComponentHead */
:
return ['GetFreeAsComponentHead', this.upvars[opcode[1]], opcode[2]];
case 38
/* GetFreeAsModifierHead */
:
return ['GetFreeAsModifierHead', this.upvars[opcode[1]], opcode[2]];
case 30
/* GetSymbol */
:
{
if (opcode[1] === 0) {
return ['get-symbol', 'this', opcode[2]];
} else {
return ['get-symbol', this.symbols[opcode[1] - 1], opcode[2]];
}
}
case 32
/* GetTemplateSymbol */
:
{
return ['get-template-symbol', opcode[1], opcode[2]];
}
case 41
/* If */
:
return ['if', this.formatOpcode(opcode[1]), this.formatBlock(opcode[2]), opcode[3] ? this.formatBlock(opcode[3]) : null];
case 52
/* IfInline */
:
return ['if-inline'];
case 51
/* Not */
:
return ['not'];
case 42
/* Each */
:
return ['each', this.formatOpcode(opcode[1]), opcode[2] ? this.formatOpcode(opcode[2]) : null, this.formatBlock(opcode[3]), opcode[4] ? this.formatBlock(opcode[4]) : null];
case 43
/* With */
:
return ['with', this.formatOpcode(opcode[1]), this.formatBlock(opcode[2]), opcode[3] ? this.formatBlock(opcode[3]) : null];
case 44
/* Let */
:
return ['let', this.formatParams(opcode[1]), this.formatBlock(opcode[2])];
case 54
/* Log */
:
return ['log', this.formatParams(opcode[1])];
case 45
/* WithDynamicVars */
:
return ['-with-dynamic-vars', this.formatHash(opcode[1]), this.formatBlock(opcode[2])];
case 53
/* GetDynamicVar */
:
return ['-get-dynamic-vars', this.formatOpcode(opcode[1])];
case 46
/* InvokeComponent */
:
return ['component', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])];
}
} else {
return opcode;
}
}
formatCurryType(value) {
switch (value) {
case 0
/* Component */
:
return 'component';
case 1
/* Helper */
:
return 'helper';
case 2
/* Modifier */
:
return 'modifier';
default:
throw exhausted(value);
}
}
formatElementParams(opcodes) {
if (opcodes === null) return null;
return opcodes.map(o => this.formatOpcode(o));
}
formatParams(opcodes) {
if (opcodes === null) return null;
return opcodes.map(o => this.formatOpcode(o));
}
formatHash(hash) {
if (hash === null) return null;
return hash[0].reduce((accum, key, index) => {
accum[key] = this.formatOpcode(hash[1][index]);
return accum;
}, dict());
}
formatBlocks(blocks) {
if (blocks === null) return null;
return blocks[0].reduce((accum, key, index) => {
accum[key] = this.formatBlock(blocks[1][index]);
return accum;
}, dict());
}
formatBlock(block) {
return {
statements: block[0].map(s => this.formatOpcode(s)),
parameters: block[1]
};
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi93aXJlLWZvcm1hdC1kZWJ1Zy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxTQUFTLElBQVQsRUFBZSxTQUFmLFFBQWdDLGVBQWhDO0FBRUEsU0FBUyxlQUFULEVBQTBCLGNBQTFCLFFBQWdELFNBQWhEO0FBRUEsZUFBYyxNQUFPLGtCQUFQLENBQXlCO0FBSXJDLEVBQUEsV0FBQSxDQUFZLENBQUMsV0FBRCxFQUFjLE9BQWQsRUFBdUIsUUFBdkIsRUFBaUMsTUFBakMsQ0FBWixFQUE2RTtBQUMzRSxTQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEOztBQUVELEVBQUEsTUFBTSxDQUFDLE9BQUQsRUFBaUM7QUFDckMsUUFBSSxHQUFHLEdBQUcsRUFBVjs7QUFFQSxTQUFLLElBQUksU0FBVCxJQUFzQixPQUFPLENBQUMsQ0FBRCxDQUE3QixFQUFrQztBQUNoQyxNQUFBLEdBQUcsQ0FBQyxJQUFKLENBQVMsS0FBSyxZQUFMLENBQWtCLFNBQWxCLENBQVQ7QUFDRDs7QUFFRCxXQUFPLEdBQVA7QUFDRDs7QUFFRCxFQUFBLFlBQVksQ0FBQyxNQUFELEVBQTBCO0FBQ3BDLFFBQUksS0FBSyxDQUFDLE9BQU4sQ0FBYyxNQUFkLENBQUosRUFBMkI7QUFDekIsY0FBUSxNQUFNLENBQUMsQ0FBRCxDQUFkO0FBQ0UsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLFFBQUQsRUFBVyxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FBWCxDQUFQOztBQUNGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxpQkFBRCxFQUFvQixLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FBcEIsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQ0wsT0FESyxFQUVMLEtBQUssWUFB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QUFWLENBQWlCLENBQUMsS0FBRCxFQUFRLEdBQVIsRUFBYSxLQUFiLEtBQXNCO0FBQzVDLE1BQUEsS0FBSyxDQUFDLEdBQUQsQ0FBTCxHQUFhLEtBQUssV0FBTCxDQUFpQixNQUFNLENBQUMsQ0FBRCxDQUFOLENBQVUsS0FBVixDQUFqQixDQUFiO0FBQ0EsYUFBTyxLQUFQO0FBQ0QsS0FITSxFQUdKLElBQUksRUFIQSxDQUFQO0FBSUQ7O0FBRU8sRUFBQSxXQUFXLENBQUMsS0FBRCxFQUE2QjtBQUM5QyxXQUFPO0FBQ0wsTUFBQSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTLEdBQVQsQ0FBYyxDQUFELElBQU8sS0FBSyxZQUFMLENBQWtCLENBQWxCLENBQXBCLENBRFA7QUFFTCxNQUFBLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBRDtBQUZaLEtBQVA7QUFJRDs7QUE3U29DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ3VycmllZFR5cGUsXG4gIE9wdGlvbixcbiAgU2VyaWFsaXplZElubGluZUJsb2NrLFxuICBTZXJpYWxpemVkVGVtcGxhdGVCbG9jayxcbiAgU2V4cE9wY29kZXMgYXMgT3AsXG4gIFdpcmVGb3JtYXQsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZGljdCwgZXhoYXVzdGVkIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCB7IGluZmxhdGVBdHRyTmFtZSwgaW5mbGF0ZVRhZ05hbWUgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2lyZUZvcm1hdERlYnVnZ2VyIHtcbiAgcHJpdmF0ZSB1cHZhcnM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHN5bWJvbHM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKFtfc3RhdGVtZW50cywgc3ltYm9scywgX2hhc0V2YWwsIHVwdmFyc106IFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrKSB7XG4gICAgdGhpcy51cHZhcnMgPSB1cHZhcnM7XG4gICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scztcbiAgfVxuXG4gIGZvcm1hdChwcm9ncmFtOiBTZXJpYWxpemVkVGVtcGxhdGVCbG9jayk6IHVua25vd24ge1xuICAgIGxldCBvdXQgPSBbXTtcblxuICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBwcm9ncmFtWzBdKSB7XG4gICAgICBvdXQucHVzaCh0aGlzLmZvcm1hdE9wY29kZShzdGF0ZW1lbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZm9ybWF0T3Bjb2RlKG9wY29kZTogV2lyZUZvcm1hdC5TeW50YXgpOiB1bmtub3duIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcGNvZGUpKSB7XG4gICAgICBzd2l0Y2ggKG9wY29kZVswXSkge1xuICAgICAgICBjYXNlIE9wLkFwcGVuZDpcbiAgICAgICAgICByZXR1cm4gWydhcHBlbmQnLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pXTtcbiAgICAgICAgY2FzZSBPcC5UcnVzdGluZ0FwcGVuZDpcbiAgICAgICAgICByZXR1cm4gWyd0cnVzdGluZy1hcHBlbmQnLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLkJsb2NrOlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnYmxvY2snLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsyXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzNdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2tzKG9wY29kZVs0XSksXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkluRWxlbWVudDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2luLWVsZW1lbnQnLFxuICAgICAgICAgICAgb3Bjb2RlWzFdLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIG9wY29kZVszXSA/IHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVszXSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLk9wZW5FbGVtZW50OlxuICAgICAgICAgIHJldHVybiBbJ29wZW4tZWxlbWVudCcsIGluZmxhdGVUYWdOYW1lKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuT3BlbkVsZW1lbnRXaXRoU3BsYXQ6XG4gICAgICAgICAgcmV0dXJuIFsnb3Blbi1lbGVtZW50LXdpdGgtc3BsYXQnLCBpbmZsYXRlVGFnTmFtZShvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLkNsb3NlRWxlbWVudDpcbiAgICAgICAgICByZXR1cm4gWydjbG9zZS1lbGVtZW50J107XG5cbiAgICAgICAgY2FzZSBPcC5GbHVzaEVsZW1lbnQ6XG4gICAgICAgICAgcmV0dXJuIFsnZmx1c2gtZWxlbWVudCddO1xuXG4gICAgICAgIGNhc2UgT3AuU3RhdGljQXR0cjpcbiAgICAgICAgICByZXR1cm4gWydzdGF0aWMtYXR0cicsIGluZmxhdGVBdHRyTmFtZShvcGNvZGVbMV0pLCBvcGNvZGVbMl0sIG9wY29kZVszXV07XG5cbiAgICAgICAgY2FzZSBPcC5TdGF0aWNDb21wb25lbnRBdHRyOlxuICAgICAgICAgIHJldHVybiBbJ3N0YXRpYy1jb21wb25lbnQtYXR0cicsIGluZmxhdGVBdHRyTmFtZShvcGNvZGVbMV0pLCBvcGNvZGVbMl0sIG9wY29kZVszXV07XG5cbiAgICAgICAgY2FzZSBPcC5EeW5hbWljQXR0cjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2R5bmFtaWMtYXR0cicsXG4gICAgICAgICAgICBpbmZsYXRlQXR0ck5hbWUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkNvbXBvbmVudEF0dHI6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdjb21wb25lbnQtYXR0cicsXG4gICAgICAgICAgICBpbmZsYXRlQXR0ck5hbWUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkF0dHJTcGxhdDpcbiAgICAgICAgICByZXR1cm4gWydhdHRyLXNwbGF0J107XG5cbiAgICAgICAgY2FzZSBPcC5ZaWVsZDpcbiAgICAgICAgICByZXR1cm4gWyd5aWVsZCcsIG9wY29kZVsxXSwgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzJdKV07XG5cbiAgICAgICAgY2FzZSBPcC5EeW5hbWljQXJnOlxuICAgICAgICAgIHJldHVybiBbJ2R5bmFtaWMtYXJnJywgb3Bjb2RlWzFdLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLlN0YXRpY0FyZzpcbiAgICAgICAgICByZXR1cm4gWydzdGF0aWMtYXJnJywgb3Bjb2RlWzFdLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLlRydXN0aW5nRHluYW1pY0F0dHI6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd0cnVzdGluZy1keW5hbWljLWF0dHInLFxuICAgICAgICAgICAgaW5mbGF0ZUF0dHJOYW1lKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pLFxuICAgICAgICAgICAgb3Bjb2RlWzNdLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5UcnVzdGluZ0NvbXBvbmVudEF0dHI6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd0cnVzdGluZy1jb21wb25lbnQtYXR0cicsXG4gICAgICAgICAgICBpbmZsYXRlQXR0ck5hbWUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkRlYnVnZ2VyOlxuICAgICAgICAgIHJldHVybiBbJ2RlYnVnZ2VyJywgb3Bjb2RlWzFdXTtcblxuICAgICAgICBjYXNlIE9wLkNvbW1lbnQ6XG4gICAgICAgICAgcmV0dXJuIFsnY29tbWVudCcsIG9wY29kZVsxXV07XG5cbiAgICAgICAgY2FzZSBPcC5Nb2RpZmllcjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ21vZGlmaWVyJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdFBhcmFtcyhvcGNvZGVbMl0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRIYXNoKG9wY29kZVszXSksXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkNvbXBvbmVudDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRFbGVtZW50UGFyYW1zKG9wY29kZVsyXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzNdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2tzKG9wY29kZVs0XSksXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkhhc0Jsb2NrOlxuICAgICAgICAgIHJldHVybiBbJ2hhcy1ibG9jaycsIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuSGFzQmxvY2tQYXJhbXM6XG4gICAgICAgICAgcmV0dXJuIFsnaGFzLWJsb2NrLXBhcmFtcycsIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuQ3Vycnk6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdjdXJyeScsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRDdXJyeVR5cGUob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVszXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzRdKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuVW5kZWZpbmVkOlxuICAgICAgICAgIHJldHVybiBbJ3VuZGVmaW5lZCddO1xuXG4gICAgICAgIGNhc2UgT3AuQ2FsbDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NhbGwnLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsyXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzNdKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuQ29uY2F0OlxuICAgICAgICAgIHJldHVybiBbJ2NvbmNhdCcsIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsxXSBhcyBXaXJlRm9ybWF0LkNvcmUuUGFyYW1zKV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRTdHJpY3RGcmVlOlxuICAgICAgICAgIHJldHVybiBbJ2dldC1zdHJpY3QtZnJlZScsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNDb21wb25lbnRPckhlbHBlckhlYWRPclRoaXNGYWxsYmFjazpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ0dldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrJyxcbiAgICAgICAgICAgIHRoaXMudXB2YXJzW29wY29kZVsxXV0sXG4gICAgICAgICAgICBvcGNvZGVbMl0sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkdldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZDpcbiAgICAgICAgICByZXR1cm4gWydHZXRGcmVlQXNDb21wb25lbnRPckhlbHBlckhlYWQnLCB0aGlzLnVwdmFyc1tvcGNvZGVbMV1dLCBvcGNvZGVbMl1dO1xuXG4gICAgICAgIGNhc2UgT3AuR2V0RnJlZUFzSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc0hlbHBlckhlYWRPclRoaXNGYWxsYmFjaycsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNEZXByZWNhdGVkSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc0RlcHJlY2F0ZWRIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2snLCB0aGlzLnVwdmFyc1tvcGNvZGVbMV1dXTtcblxuICAgICAgICBjYXNlIE9wLkdldEZyZWVBc0hlbHBlckhlYWQ6XG4gICAgICAgICAgcmV0dXJuIFsnR2V0RnJlZUFzSGVscGVySGVhZCcsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNDb21wb25lbnRIZWFkOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc0NvbXBvbmVudEhlYWQnLCB0aGlzLnVwdmFyc1tvcGNvZGVbMV1dLCBvcGNvZGVbMl1dO1xuXG4gICAgICAgIGNhc2UgT3AuR2V0RnJlZUFzTW9kaWZpZXJIZWFkOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc01vZGlmaWVySGVhZCcsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRTeW1ib2w6IHtcbiAgICAgICAgICBpZiAob3Bjb2RlWzFdID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gWydnZXQtc3ltYm9sJywgJ3RoaXMnLCBvcGNvZGVbMl1dO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWydnZXQtc3ltYm9sJywgdGhpcy5zeW1ib2xzW29wY29kZVsxXSAtIDFdLCBvcGNvZGVbMl1dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgT3AuR2V0VGVtcGxhdGVTeW1ib2w6IHtcbiAgICAgICAgICByZXR1cm4gWydnZXQtdGVtcGxhdGUtc3ltYm9sJywgb3Bjb2RlWzFdLCBvcGNvZGVbMl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBPcC5JZjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2lmJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10gPyB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVszXSkgOiBudWxsLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5JZklubGluZTpcbiAgICAgICAgICByZXR1cm4gWydpZi1pbmxpbmUnXTtcblxuICAgICAgICBjYXNlIE9wLk5vdDpcbiAgICAgICAgICByZXR1cm4gWydub3QnXTtcblxuICAgICAgICBjYXNlIE9wLkVhY2g6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdlYWNoJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICBvcGNvZGVbMl0gPyB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pIDogbnVsbCxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzNdKSxcbiAgICAgICAgICAgIG9wY29kZVs0XSA/IHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzRdKSA6IG51bGwsXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLldpdGg6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd3aXRoJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10gPyB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVszXSkgOiBudWxsLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5MZXQ6XG4gICAgICAgICAgcmV0dXJuIFsnbGV0JywgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzFdKSwgdGhpcy5mb3JtYXRCbG9jayhvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLkxvZzpcbiAgICAgICAgICByZXR1cm4gWydsb2cnLCB0aGlzLmZvcm1hdFBhcmFtcyhvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLldpdGhEeW5hbWljVmFyczpcbiAgICAgICAgICByZXR1cm4gWyctd2l0aC1keW5hbWljLXZhcnMnLCB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzFdKSwgdGhpcy5mb3JtYXRCbG9jayhvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLkdldER5bmFtaWNWYXI6XG4gICAgICAgICAgcmV0dXJuIFsnLWdldC1keW5hbWljLXZhcnMnLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLkludm9rZUNvbXBvbmVudDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SGFzaChvcGNvZGVbM10pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRCbG9ja3Mob3Bjb2RlWzRdKSxcbiAgICAgICAgICBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3Bjb2RlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Q3VycnlUeXBlKHZhbHVlOiBDdXJyaWVkVHlwZSkge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgQ3VycmllZFR5cGUuQ29tcG9uZW50OlxuICAgICAgICByZXR1cm4gJ2NvbXBvbmVudCc7XG4gICAgICBjYXNlIEN1cnJpZWRUeXBlLkhlbHBlcjpcbiAgICAgICAgcmV0dXJuICdoZWxwZXInO1xuICAgICAgY2FzZSBDdXJyaWVkVHlwZS5Nb2RpZmllcjpcbiAgICAgICAgcmV0dXJuICdtb2RpZmllcic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBleGhhdXN0ZWQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RWxlbWVudFBhcmFtcyhvcGNvZGVzOiBPcHRpb248V2lyZUZvcm1hdC5FbGVtZW50UGFyYW1ldGVyW10+KTogT3B0aW9uPHVua25vd25bXT4ge1xuICAgIGlmIChvcGNvZGVzID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gb3Bjb2Rlcy5tYXAoKG8pID0+IHRoaXMuZm9ybWF0T3Bjb2RlKG8pKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGFyYW1zKG9wY29kZXM6IE9wdGlvbjxXaXJlRm9ybWF0LkV4cHJlc3Npb25bXT4pOiBPcHRpb248dW5rbm93bltdPiB7XG4gICAgaWYgKG9wY29kZXMgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBvcGNvZGVzLm1hcCgobykgPT4gdGhpcy5mb3JtYXRPcGNvZGUobykpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRIYXNoKGhhc2g6IFdpcmVGb3JtYXQuQ29yZS5IYXNoKTogT3B0aW9uPG9iamVjdD4ge1xuICAgIGlmIChoYXNoID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBoYXNoWzBdLnJlZHVjZSgoYWNjdW0sIGtleSwgaW5kZXgpID0+IHtcbiAgICAgIGFjY3VtW2tleV0gPSB0aGlzLmZvcm1hdE9wY29kZShoYXNoWzFdW2luZGV4XSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgZGljdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QmxvY2tzKGJsb2NrczogV2lyZUZvcm1hdC5Db3JlLkJsb2Nrcyk6IE9wdGlvbjxvYmplY3Q+IHtcbiAgICBpZiAoYmxvY2tzID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBibG9ja3NbMF0ucmVkdWNlKChhY2N1bSwga2V5LCBpbmRleCkgPT4ge1xuICAgICAgYWNjdW1ba2V5XSA9IHRoaXMuZm9ybWF0QmxvY2soYmxvY2tzWzFdW2luZGV4XSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgZGljdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QmxvY2soYmxvY2s6IFNlcmlhbGl6ZWRJbmxpbmVCbG9jayk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlbWVudHM6IGJsb2NrWzBdLm1hcCgocykgPT4gdGhpcy5mb3JtYXRPcGNvZGUocykpLFxuICAgICAgcGFyYW1ldGVyczogYmxvY2tbMV0sXG4gICAgfTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==