@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
143 lines (109 loc) • 17.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.APPEND_OPCODES = exports.AppendOpcodes = void 0;
var _reference = require("@glimmer/reference");
var _util = require("@glimmer/util");
var _vm = require("@glimmer/vm");
var _scope = require("./scope");
var _symbols = require("./symbols");
var _elementBuilder = require("./vm/element-builder");
var AppendOpcodes = /*#__PURE__*/function () {
function AppendOpcodes() {
this.evaluateOpcode = (0, _util.fillNulls)(104
/* Size */
).slice();
}
var _proto = AppendOpcodes.prototype;
_proto.add = function add(name, evaluate, kind) {
if (kind === void 0) {
kind = 'syscall';
}
this.evaluateOpcode[name] = {
syscall: kind !== 'machine',
evaluate: evaluate
};
};
_proto.debugBefore = function debugBefore(vm, opcode) {
var params = undefined;
var opName = undefined;
if (false
/* LOCAL_SHOULD_LOG */
) {
var pos = vm[_symbols.INNER_VM].fetchRegister(_vm.$pc) - opcode.size;
var _ref = [];
opName = _ref[0];
params = _ref[1]; // console.log(`${typePos(vm['pc'])}.`);
_util.LOCAL_LOGGER.log(pos + ". ");
var debugParams = [];
for (var prop in params) {
debugParams.push(prop, '=', params[prop]);
}
_util.LOCAL_LOGGER.log.apply(_util.LOCAL_LOGGER, debugParams);
}
var sp;
if (false
/* LOCAL_DEBUG */
) {
sp = vm.fetchValue(_vm.$sp);
}
return {
sp: sp,
pc: vm.fetchValue(_vm.$pc),
name: opName,
params: params,
type: opcode.type,
isMachine: opcode.isMachine,
size: opcode.size,
state: undefined
};
};
_proto.debugAfter = function debugAfter(vm, pre) {
var sp = pre.sp,
type = pre.type,
isMachine = pre.isMachine,
pc = pre.pc;
if (false
/* LOCAL_DEBUG */
) {
var meta = type;
var actualChange = vm.fetchValue(_vm.$sp) - sp;
if (meta && meta.check && typeof meta.stackChange === 'number' && meta.stackChange !== actualChange) {
throw new Error("Error in " + pre.name + ":\n\n" + pc + ". " + "\n\nStack changed by " + actualChange + ", expected " + meta.stackChange);
}
if (false
/* LOCAL_SHOULD_LOG */
) {
_util.LOCAL_LOGGER.log('%c -> pc: %d, ra: %d, fp: %d, sp: %d, s0: %O, s1: %O, t0: %O, t1: %O, v0: %O', 'color: orange', vm[_symbols.INNER_VM].registers[_vm.$pc], vm[_symbols.INNER_VM].registers[_vm.$ra], vm[_symbols.INNER_VM].registers[_vm.$fp], vm[_symbols.INNER_VM].registers[_vm.$sp], vm['s0'], vm['s1'], vm['t0'], vm['t1'], vm['v0']);
_util.LOCAL_LOGGER.log('%c -> eval stack', 'color: red', vm.stack.toArray());
_util.LOCAL_LOGGER.log('%c -> block stack', 'color: magenta', vm.elements().debugBlocks());
_util.LOCAL_LOGGER.log('%c -> destructor stack', 'color: violet', vm[_symbols.DESTROYABLE_STACK].toArray());
if (vm[_symbols.STACKS].scope.current === null) {
_util.LOCAL_LOGGER.log('%c -> scope', 'color: green', 'null');
} else {
_util.LOCAL_LOGGER.log('%c -> scope', 'color: green', vm.scope().slots.map(function (s) {
return (0, _scope.isScopeReference)(s) ? (0, _reference.valueForRef)(s) : s;
}));
}
_util.LOCAL_LOGGER.log('%c -> elements', 'color: blue', vm.elements()[_elementBuilder.CURSOR_STACK].current.element);
_util.LOCAL_LOGGER.log('%c -> constructing', 'color: aqua', vm.elements()['constructing']);
}
}
};
_proto.evaluate = function evaluate(vm, opcode, type) {
var operation = this.evaluateOpcode[type];
if (operation.syscall) {
false && (0, _util.assert)(!opcode.isMachine, "BUG: Mismatch between operation.syscall (" + operation.syscall + ") and opcode.isMachine (" + opcode.isMachine + ") for " + opcode.type);
operation.evaluate(vm, opcode);
} else {
false && (0, _util.assert)(opcode.isMachine, "BUG: Mismatch between operation.syscall (" + operation.syscall + ") and opcode.isMachine (" + opcode.isMachine + ") for " + opcode.type);
operation.evaluate(vm[_symbols.INNER_VM], opcode);
}
};
return AppendOpcodes;
}();
exports.AppendOpcodes = AppendOpcodes;
var APPEND_OPCODES = new AppendOpcodes();
exports.APPEND_OPCODES = APPEND_OPCODES;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL29wY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQWlDQSxJQUFNLGFBQU4sR0FBQSxhQUFBLFlBQUE7QUFBQSxXQUFBLGFBQUEsR0FBQTtBQUNVLFNBQUEsY0FBQSxHQUE2QixxQkFBUztBQUFBO0FBQVQsTUFBN0IsS0FBNkIsRUFBN0I7QUFpSVQ7O0FBbElELE1BQUEsTUFBQSxHQUFBLGFBQUEsQ0FBQSxTQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsR0FLRSxTQUFBLEdBQUEsQ0FBQSxJQUFBLEVBQUEsUUFBQSxFQUFBLElBQUEsRUFBb0Y7QUFBQSxRQUFoQixJQUFnQixLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQWhCLE1BQUEsSUFBZ0IsR0FBakYsU0FBaUU7QUFBZ0I7O0FBQ2xGLFNBQUEsY0FBQSxDQUFBLElBQUEsSUFBc0M7QUFDcEMsTUFBQSxPQUFPLEVBQUUsSUFBSSxLQUR1QixTQUFBO0FBRXBDLE1BQUEsUUFBQSxFQUFBO0FBRm9DLEtBQXRDO0FBTkosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxXQUFBLEdBWUUsU0FBQSxXQUFBLENBQUEsRUFBQSxFQUFBLE1BQUEsRUFBcUM7QUFDbkMsUUFBSSxNQUFNLEdBQVYsU0FBQTtBQUNBLFFBQUksTUFBTSxHQUFWLFNBQUE7O0FBRUEsUUFBQTtBQUFBO0FBQUEsTUFBc0I7QUFDcEIsWUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFGLGlCQUFFLENBQUYsQ0FBQSxhQUFBLENBQUEsT0FBQSxJQUFrQyxNQUFNLENBQWxELElBQUE7QUFEb0IsWUFBQSxJQUFBLEdBQUEsRUFBQTtBQUdwQixRQUFBLE1BSG9CLEdBQUEsSUFBQSxDQUFBLENBQUEsQ0FHcEI7QUFBQSxRQUFBLE1BSG9CLEdBQUEsSUFBQSxDQUFBLENBQUEsQ0FHcEIsQ0FIb0IsQ0FLcEI7O0FBQ0EsMkJBQUEsR0FBQSxDQUFBLEdBQUEsR0FBQSxJQUFBOztBQUVBLFlBQUksV0FBVyxHQUFmLEVBQUE7O0FBQ0EsYUFBSyxJQUFMLElBQUEsSUFBQSxNQUFBLEVBQXlCO0FBQ3ZCLFVBQUEsV0FBVyxDQUFYLElBQUEsQ0FBQSxJQUFBLEVBQUEsR0FBQSxFQUE0QixNQUFNLENBQWxDLElBQWtDLENBQWxDO0FBQ0Q7O0FBRUQsMkJBQUEsR0FBQSxDQUFBLEtBQUEsQ0FBQSxrQkFBQSxFQUFBLFdBQUE7QUFDRDs7QUFFRCxRQUFBLEVBQUE7O0FBRUEsUUFBQTtBQUFBO0FBQUEsTUFBaUI7QUFDZixRQUFBLEVBQUUsR0FBRyxFQUFFLENBQUYsVUFBQSxDQUFMLE9BQUssQ0FBTDtBQUNEOztBQUdELFdBQU87QUFDTCxNQUFBLEVBQUUsRUFERyxFQUFBO0FBRUwsTUFBQSxFQUFFLEVBQUUsRUFBRSxDQUFGLFVBQUEsQ0FGQyxPQUVELENBRkM7QUFHTCxNQUFBLElBQUksRUFIQyxNQUFBO0FBSUwsTUFBQSxNQUpLLEVBQUEsTUFBQTtBQUtMLE1BQUEsSUFBSSxFQUFFLE1BQU0sQ0FMUCxJQUFBO0FBTUwsTUFBQSxTQUFTLEVBQUUsTUFBTSxDQU5aLFNBQUE7QUFPTCxNQUFBLElBQUksRUFBRSxNQUFNLENBUFAsSUFBQTtBQVFMLE1BQUEsS0FBSyxFQUFFO0FBUkYsS0FBUDtBQXZDSixHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLFVBQUEsR0FtREUsU0FBQSxVQUFBLENBQUEsRUFBQSxFQUFBLEdBQUEsRUFBa0M7QUFBQSxRQUM1QixFQUQ0QixHQUNoQyxHQURnQyxDQUFBLEVBQUE7QUFBQSxRQUM1QixJQUQ0QixHQUNoQyxHQURnQyxDQUFBLElBQUE7QUFBQSxRQUM1QixTQUQ0QixHQUNoQyxHQURnQyxDQUFBLFNBQUE7QUFBQSxRQUNMLEVBREssR0FDaEMsR0FEZ0MsQ0FBQSxFQUFBOztBQUdoQyxRQUFBO0FBQUE7QUFBQSxNQUFpQjtBQUNmLFlBQUksSUFBSSxHQUFSLElBQUE7QUFDQSxZQUFJLFlBQVksR0FBRyxFQUFFLENBQUYsVUFBQSxDQUFBLE9BQUEsSUFBbkIsRUFBQTs7QUFDQSxZQUNFLElBQUksSUFDSixJQUFJLENBREosS0FBQSxJQUVBLE9BQU8sSUFBSSxDQUFYLFdBQUEsS0FGQSxRQUFBLElBR0EsSUFBSSxDQUFKLFdBQUEsS0FKRixZQUFBLEVBS0U7QUFDQSxnQkFBTSxJQUFBLEtBQUEsQ0FBQSxjQUNRLEdBQUcsQ0FEWCxJQUFBLEdBQUEsT0FBQSxHQUFBLEVBQUEsR0FBQSxJQUFBLEdBQUEsdUJBQUEsR0FBQSxZQUFBLEdBQUEsYUFBQSxHQUkrQyxJQUFJLENBSnpELFdBQU0sQ0FBTjtBQU1EOztBQUVELFlBQUE7QUFBQTtBQUFBLFVBQXNCO0FBQ3BCLCtCQUFBLEdBQUEsQ0FBQSw4RUFBQSxFQUFBLGVBQUEsRUFHRSxFQUFFLENBQUYsaUJBQUUsQ0FBRixDQUFBLFNBQUEsQ0FIRixPQUdFLENBSEYsRUFJRSxFQUFFLENBQUYsaUJBQUUsQ0FBRixDQUFBLFNBQUEsQ0FKRixPQUlFLENBSkYsRUFLRSxFQUFFLENBQUYsaUJBQUUsQ0FBRixDQUFBLFNBQUEsQ0FMRixPQUtFLENBTEYsRUFNRSxFQUFFLENBQUYsaUJBQUUsQ0FBRixDQUFBLFNBQUEsQ0FORixPQU1FLENBTkYsRUFPRSxFQUFFLENBUEosSUFPSSxDQVBKLEVBUUUsRUFBRSxDQVJKLElBUUksQ0FSSixFQVNFLEVBQUUsQ0FUSixJQVNJLENBVEosRUFVRSxFQUFFLENBVkosSUFVSSxDQVZKLEVBV0UsRUFBRSxDQVhKLElBV0ksQ0FYSjs7QUFhQSwrQkFBQSxHQUFBLENBQUEsa0JBQUEsRUFBQSxZQUFBLEVBQW1ELEVBQUUsQ0FBRixLQUFBLENBQW5ELE9BQW1ELEVBQW5EOztBQUNBLCtCQUFBLEdBQUEsQ0FBQSxtQkFBQSxFQUFBLGdCQUFBLEVBQXdELEVBQUUsQ0FBRixRQUFBLEdBQXhELFdBQXdELEVBQXhEOztBQUNBLCtCQUFBLEdBQUEsQ0FBQSx3QkFBQSxFQUFBLGVBQUEsRUFHRSxFQUFFLENBQUYsMEJBQUUsQ0FBRixDQUhGLE9BR0UsRUFIRjs7QUFLQSxnQkFBSSxFQUFFLENBQUYsZUFBRSxDQUFGLENBQUEsS0FBQSxDQUFBLE9BQUEsS0FBSixJQUFBLEVBQXVDO0FBQ3JDLGlDQUFBLEdBQUEsQ0FBQSxhQUFBLEVBQUEsY0FBQSxFQUFBLE1BQUE7QUFERixhQUFBLE1BRU87QUFDTCxpQ0FBQSxHQUFBLENBQUEsYUFBQSxFQUFBLGNBQUEsRUFHRSxFQUFFLENBQUYsS0FBQSxHQUFBLEtBQUEsQ0FBQSxHQUFBLENBQXNCLFVBQUQsQ0FBQyxFQUFEO0FBQUEsdUJBQVEsNkJBQUEsQ0FBQSxJQUFzQiw0QkFBdEIsQ0FBc0IsQ0FBdEIsR0FIL0IsQ0FHdUI7QUFIdkIsZUFHRSxDQUhGO0FBS0Q7O0FBRUQsK0JBQUEsR0FBQSxDQUFBLGdCQUFBLEVBQUEsYUFBQSxFQUdFLEVBQUUsQ0FBRixRQUFBLEdBQUEsNEJBQUEsRUFBQSxPQUFBLENBSEYsT0FBQTs7QUFNQSwrQkFBQSxHQUFBLENBQUEsb0JBQUEsRUFBQSxhQUFBLEVBQXNELEVBQUUsQ0FBRixRQUFBLEdBQXRELGNBQXNELENBQXREO0FBQ0Q7QUFDRjtBQTlHTCxHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLFFBQUEsR0FpSEUsU0FBQSxRQUFBLENBQUEsRUFBQSxFQUFBLE1BQUEsRUFBQSxJQUFBLEVBQWdEO0FBQzlDLFFBQUksU0FBUyxHQUFHLEtBQUEsY0FBQSxDQUFoQixJQUFnQixDQUFoQjs7QUFFQSxRQUFJLFNBQVMsQ0FBYixPQUFBLEVBQXVCO0FBQUEsZUFDckIsa0JBQ0UsQ0FBQyxNQUFNLENBREgsU0FBTixFQUFNLDhDQUV3QyxTQUFTLENBRmpELE9BQUEsR0FBQSwwQkFBQSxHQUVvRixNQUFNLENBRjFGLFNBQUEsR0FBQSxRQUFBLEdBRTZHLE1BQU0sQ0FIcEcsSUFDckIsQ0FEcUI7QUFLckIsTUFBQSxTQUFTLENBQVQsUUFBQSxDQUFBLEVBQUEsRUFBQSxNQUFBO0FBTEYsS0FBQSxNQU1PO0FBQUEsZUFDTCxrQkFDRSxNQUFNLENBREYsU0FBTixFQUFNLDhDQUV3QyxTQUFTLENBRmpELE9BQUEsR0FBQSwwQkFBQSxHQUVvRixNQUFNLENBRjFGLFNBQUEsR0FBQSxRQUFBLEdBRTZHLE1BQU0sQ0FIcEgsSUFDTCxDQURLO0FBS0wsTUFBQSxTQUFTLENBQVQsUUFBQSxDQUFtQixFQUFFLENBQXJCLGlCQUFxQixDQUFyQixFQUFBLE1BQUE7QUFDRDtBQWhJTCxHQUFBOztBQUFBLFNBQUEsYUFBQTtBQUFBLENBQUEsRUFBQTs7O0FBb0lPLElBQU0sY0FBYyxHQUFHLElBQXZCLGFBQXVCLEVBQXZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVidWcsIGxvZ09wY29kZSwgb3Bjb2RlTWV0YWRhdGEsIHJlY29yZFN0YWNrU2l6ZSB9IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7IERpY3QsIE1heWJlLCBPcCwgT3B0aW9uLCBSdW50aW1lT3AgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExPQ0FMX0RFQlVHLCBMT0NBTF9TSE9VTERfTE9HIH0gZnJvbSAnQGdsaW1tZXIvbG9jYWwtZGVidWctZmxhZ3MnO1xuaW1wb3J0IHsgdmFsdWVGb3JSZWYgfSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgYXNzZXJ0LCBmaWxsTnVsbHMsIExPQ0FMX0xPR0dFUiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgJGZwLCAkcGMsICRyYSwgJHNwIH0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgaXNTY29wZVJlZmVyZW5jZSB9IGZyb20gJy4vc2NvcGUnO1xuaW1wb3J0IHsgQ09OU1RBTlRTLCBERVNUUk9ZQUJMRV9TVEFDSywgSU5ORVJfVk0sIFNUQUNLUyB9IGZyb20gJy4vc3ltYm9scyc7XG5pbXBvcnQgeyBMb3dMZXZlbFZNLCBWTSB9IGZyb20gJy4vdm0nO1xuaW1wb3J0IHsgSW50ZXJuYWxWTSB9IGZyb20gJy4vdm0vYXBwZW5kJztcbmltcG9ydCB7IENVUlNPUl9TVEFDSyB9IGZyb20gJy4vdm0vZWxlbWVudC1idWlsZGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBPcGNvZGVKU09OIHtcbiAgdHlwZTogbnVtYmVyIHwgc3RyaW5nO1xuICBndWlkPzogT3B0aW9uPG51bWJlcj47XG4gIGRlb3B0ZWQ/OiBib29sZWFuO1xuICBhcmdzPzogc3RyaW5nW107XG4gIGRldGFpbHM/OiBEaWN0PE9wdGlvbjxzdHJpbmc+PjtcbiAgY2hpbGRyZW4/OiBPcGNvZGVKU09OW107XG59XG5cbmV4cG9ydCB0eXBlIE9wZXJhbmQxID0gbnVtYmVyO1xuZXhwb3J0IHR5cGUgT3BlcmFuZDIgPSBudW1iZXI7XG5leHBvcnQgdHlwZSBPcGVyYW5kMyA9IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgU3lzY2FsbCA9ICh2bTogSW50ZXJuYWxWTSwgb3Bjb2RlOiBSdW50aW1lT3ApID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBNYWNoaW5lT3Bjb2RlID0gKHZtOiBMb3dMZXZlbFZNLCBvcGNvZGU6IFJ1bnRpbWVPcCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgRXZhbHVhdGUgPVxuICB8IHsgc3lzY2FsbDogdHJ1ZTsgZXZhbHVhdGU6IFN5c2NhbGwgfVxuICB8IHsgc3lzY2FsbDogZmFsc2U7IGV2YWx1YXRlOiBNYWNoaW5lT3Bjb2RlIH07XG5cbmV4cG9ydCB0eXBlIERlYnVnU3RhdGUgPSB7XG4gIHBjOiBudW1iZXI7XG4gIHNwOiBudW1iZXI7XG4gIHR5cGU6IG51bWJlcjtcbiAgaXNNYWNoaW5lOiAwIHwgMTtcbiAgc2l6ZTogbnVtYmVyO1xuICBwYXJhbXM/OiBNYXliZTxEaWN0PjtcbiAgbmFtZT86IHN0cmluZztcbiAgc3RhdGU6IHVua25vd247XG59O1xuXG5leHBvcnQgY2xhc3MgQXBwZW5kT3Bjb2RlcyB7XG4gIHByaXZhdGUgZXZhbHVhdGVPcGNvZGU6IEV2YWx1YXRlW10gPSBmaWxsTnVsbHM8RXZhbHVhdGU+KE9wLlNpemUpLnNsaWNlKCk7XG5cbiAgYWRkPE5hbWUgZXh0ZW5kcyBPcD4obmFtZTogTmFtZSwgZXZhbHVhdGU6IFN5c2NhbGwpOiB2b2lkO1xuICBhZGQ8TmFtZSBleHRlbmRzIE9wPihuYW1lOiBOYW1lLCBldmFsdWF0ZTogTWFjaGluZU9wY29kZSwga2luZDogJ21hY2hpbmUnKTogdm9pZDtcbiAgYWRkPE5hbWUgZXh0ZW5kcyBPcD4obmFtZTogTmFtZSwgZXZhbHVhdGU6IFN5c2NhbGwgfCBNYWNoaW5lT3Bjb2RlLCBraW5kID0gJ3N5c2NhbGwnKTogdm9pZCB7XG4gICAgdGhpcy5ldmFsdWF0ZU9wY29kZVtuYW1lIGFzIG51bWJlcl0gPSB7XG4gICAgICBzeXNjYWxsOiBraW5kICE9PSAnbWFjaGluZScsXG4gICAgICBldmFsdWF0ZSxcbiAgICB9IGFzIEV2YWx1YXRlO1xuICB9XG5cbiAgZGVidWdCZWZvcmUodm06IFZNLCBvcGNvZGU6IFJ1bnRpbWVPcCk6IERlYnVnU3RhdGUge1xuICAgIGxldCBwYXJhbXM6IE1heWJlPERpY3Q+ID0gdW5kZWZpbmVkO1xuICAgIGxldCBvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChMT0NBTF9TSE9VTERfTE9HKSB7XG4gICAgICBsZXQgcG9zID0gdm1bSU5ORVJfVk1dLmZldGNoUmVnaXN0ZXIoJHBjKSAtIG9wY29kZS5zaXplO1xuXG4gICAgICBbb3BOYW1lLCBwYXJhbXNdID0gZGVidWcodm1bQ09OU1RBTlRTXSwgb3Bjb2RlLCBvcGNvZGUuaXNNYWNoaW5lKSE7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKGAke3R5cGVQb3Modm1bJ3BjJ10pfS5gKTtcbiAgICAgIExPQ0FMX0xPR0dFUi5sb2coYCR7cG9zfS4gJHtsb2dPcGNvZGUob3BOYW1lLCBwYXJhbXMpfWApO1xuXG4gICAgICBsZXQgZGVidWdQYXJhbXMgPSBbXTtcbiAgICAgIGZvciAobGV0IHByb3AgaW4gcGFyYW1zKSB7XG4gICAgICAgIGRlYnVnUGFyYW1zLnB1c2gocHJvcCwgJz0nLCBwYXJhbXNbcHJvcF0pO1xuICAgICAgfVxuXG4gICAgICBMT0NBTF9MT0dHRVIubG9nKC4uLmRlYnVnUGFyYW1zKTtcbiAgICB9XG5cbiAgICBsZXQgc3A6IG51bWJlcjtcblxuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgc3AgPSB2bS5mZXRjaFZhbHVlKCRzcCk7XG4gICAgfVxuXG4gICAgcmVjb3JkU3RhY2tTaXplKHZtLmZldGNoVmFsdWUoJHNwKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNwOiBzcCEsXG4gICAgICBwYzogdm0uZmV0Y2hWYWx1ZSgkcGMpLFxuICAgICAgbmFtZTogb3BOYW1lLFxuICAgICAgcGFyYW1zLFxuICAgICAgdHlwZTogb3Bjb2RlLnR5cGUsXG4gICAgICBpc01hY2hpbmU6IG9wY29kZS5pc01hY2hpbmUsXG4gICAgICBzaXplOiBvcGNvZGUuc2l6ZSxcbiAgICAgIHN0YXRlOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGRlYnVnQWZ0ZXIodm06IFZNLCBwcmU6IERlYnVnU3RhdGUpIHtcbiAgICBsZXQgeyBzcCwgdHlwZSwgaXNNYWNoaW5lLCBwYyB9ID0gcHJlO1xuXG4gICAgaWYgKExPQ0FMX0RFQlVHKSB7XG4gICAgICBsZXQgbWV0YSA9IG9wY29kZU1ldGFkYXRhKHR5cGUsIGlzTWFjaGluZSk7XG4gICAgICBsZXQgYWN0dWFsQ2hhbmdlID0gdm0uZmV0Y2hWYWx1ZSgkc3ApIC0gc3AhO1xuICAgICAgaWYgKFxuICAgICAgICBtZXRhICYmXG4gICAgICAgIG1ldGEuY2hlY2sgJiZcbiAgICAgICAgdHlwZW9mIG1ldGEuc3RhY2tDaGFuZ2UhID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBtZXRhLnN0YWNrQ2hhbmdlISAhPT0gYWN0dWFsQ2hhbmdlXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFcnJvciBpbiAke3ByZS5uYW1lfTpcXG5cXG4ke3BjfS4gJHtsb2dPcGNvZGUoXG4gICAgICAgICAgICBwcmUubmFtZSEsXG4gICAgICAgICAgICBwcmUucGFyYW1zIVxuICAgICAgICAgICl9XFxuXFxuU3RhY2sgY2hhbmdlZCBieSAke2FjdHVhbENoYW5nZX0sIGV4cGVjdGVkICR7bWV0YS5zdGFja0NoYW5nZSF9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoTE9DQUxfU0hPVUxEX0xPRykge1xuICAgICAgICBMT0NBTF9MT0dHRVIubG9nKFxuICAgICAgICAgICclYyAtPiBwYzogJWQsIHJhOiAlZCwgZnA6ICVkLCBzcDogJWQsIHMwOiAlTywgczE6ICVPLCB0MDogJU8sIHQxOiAlTywgdjA6ICVPJyxcbiAgICAgICAgICAnY29sb3I6IG9yYW5nZScsXG4gICAgICAgICAgdm1bSU5ORVJfVk1dLnJlZ2lzdGVyc1skcGNdLFxuICAgICAgICAgIHZtW0lOTkVSX1ZNXS5yZWdpc3RlcnNbJHJhXSxcbiAgICAgICAgICB2bVtJTk5FUl9WTV0ucmVnaXN0ZXJzWyRmcF0sXG4gICAgICAgICAgdm1bSU5ORVJfVk1dLnJlZ2lzdGVyc1skc3BdLFxuICAgICAgICAgIHZtWydzMCddLFxuICAgICAgICAgIHZtWydzMSddLFxuICAgICAgICAgIHZtWyd0MCddLFxuICAgICAgICAgIHZtWyd0MSddLFxuICAgICAgICAgIHZtWyd2MCddXG4gICAgICAgICk7XG4gICAgICAgIExPQ0FMX0xPR0dFUi5sb2coJyVjIC0+IGV2YWwgc3RhY2snLCAnY29sb3I6IHJlZCcsIHZtLnN0YWNrLnRvQXJyYXkoKSk7XG4gICAgICAgIExPQ0FMX0xPR0dFUi5sb2coJyVjIC0+IGJsb2NrIHN0YWNrJywgJ2NvbG9yOiBtYWdlbnRhJywgdm0uZWxlbWVudHMoKS5kZWJ1Z0Jsb2NrcygpKTtcbiAgICAgICAgTE9DQUxfTE9HR0VSLmxvZyhcbiAgICAgICAgICAnJWMgLT4gZGVzdHJ1Y3RvciBzdGFjaycsXG4gICAgICAgICAgJ2NvbG9yOiB2aW9sZXQnLFxuICAgICAgICAgIHZtW0RFU1RST1lBQkxFX1NUQUNLXS50b0FycmF5KClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHZtW1NUQUNLU10uc2NvcGUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIExPQ0FMX0xPR0dFUi5sb2coJyVjIC0+IHNjb3BlJywgJ2NvbG9yOiBncmVlbicsICdudWxsJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTE9DQUxfTE9HR0VSLmxvZyhcbiAgICAgICAgICAgICclYyAtPiBzY29wZScsXG4gICAgICAgICAgICAnY29sb3I6IGdyZWVuJyxcbiAgICAgICAgICAgIHZtLnNjb3BlKCkuc2xvdHMubWFwKChzKSA9PiAoaXNTY29wZVJlZmVyZW5jZShzKSA/IHZhbHVlRm9yUmVmKHMpIDogcykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIExPQ0FMX0xPR0dFUi5sb2coXG4gICAgICAgICAgJyVjIC0+IGVsZW1lbnRzJyxcbiAgICAgICAgICAnY29sb3I6IGJsdWUnLFxuICAgICAgICAgIHZtLmVsZW1lbnRzKClbQ1VSU09SX1NUQUNLXS5jdXJyZW50IS5lbGVtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgTE9DQUxfTE9HR0VSLmxvZygnJWMgLT4gY29uc3RydWN0aW5nJywgJ2NvbG9yOiBhcXVhJywgdm0uZWxlbWVudHMoKVsnY29uc3RydWN0aW5nJ10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBWTSwgb3Bjb2RlOiBSdW50aW1lT3AsIHR5cGU6IG51bWJlcikge1xuICAgIGxldCBvcGVyYXRpb24gPSB0aGlzLmV2YWx1YXRlT3Bjb2RlW3R5cGVdO1xuXG4gICAgaWYgKG9wZXJhdGlvbi5zeXNjYWxsKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgICFvcGNvZGUuaXNNYWNoaW5lLFxuICAgICAgICBgQlVHOiBNaXNtYXRjaCBiZXR3ZWVuIG9wZXJhdGlvbi5zeXNjYWxsICgke29wZXJhdGlvbi5zeXNjYWxsfSkgYW5kIG9wY29kZS5pc01hY2hpbmUgKCR7b3Bjb2RlLmlzTWFjaGluZX0pIGZvciAke29wY29kZS50eXBlfWBcbiAgICAgICk7XG4gICAgICBvcGVyYXRpb24uZXZhbHVhdGUodm0sIG9wY29kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgb3Bjb2RlLmlzTWFjaGluZSxcbiAgICAgICAgYEJVRzogTWlzbWF0Y2ggYmV0d2VlbiBvcGVyYXRpb24uc3lzY2FsbCAoJHtvcGVyYXRpb24uc3lzY2FsbH0pIGFuZCBvcGNvZGUuaXNNYWNoaW5lICgke29wY29kZS5pc01hY2hpbmV9KSBmb3IgJHtvcGNvZGUudHlwZX1gXG4gICAgICApO1xuICAgICAgb3BlcmF0aW9uLmV2YWx1YXRlKHZtW0lOTkVSX1ZNXSwgb3Bjb2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEFQUEVORF9PUENPREVTID0gbmV3IEFwcGVuZE9wY29kZXMoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=