UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

578 lines (447 loc) 53.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _env = require("@glimmer/env"); var _globalContext = require("@glimmer/global-context"); var _reference = require("@glimmer/reference"); var _util = require("@glimmer/util"); var _validator = require("@glimmer/validator"); var _vm = require("@glimmer/vm"); var _destroyable = require("@glimmer/destroyable"); var _vm2 = require("../compiled/opcodes/vm"); var _opcodes = require("../opcodes"); var _scope = require("../scope"); var _symbols = require("../symbols"); var _arguments = require("./arguments"); var _lowLevel = _interopRequireDefault(require("./low-level")); var _renderResult = _interopRequireDefault(require("./render-result")); var _stack = _interopRequireDefault(require("./stack")); var _update = require("./update"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var _a, _b; var Stacks = function Stacks() { this.scope = new _util.Stack(); this.dynamicScope = new _util.Stack(); this.updating = new _util.Stack(); this.cache = new _util.Stack(); this.list = new _util.Stack(); }; var VM = /*#__PURE__*/function () { /** * End of migrated. */ function VM(runtime, _ref, elementStack, context) { var _this = this; var pc = _ref.pc, scope = _ref.scope, dynamicScope = _ref.dynamicScope, stack = _ref.stack; this.runtime = runtime; this.elementStack = elementStack; this.context = context; this[_a] = new Stacks(); this[_b] = new _util.Stack(); this.s0 = null; this.s1 = null; this.t0 = null; this.t1 = null; this.v0 = null; this.resume = initVM(this.context); if (_env.DEBUG) { (0, _globalContext.assertGlobalContextWasSet)(); } var evalStack = _stack.default.restore(stack); false && (0, _util.assert)(typeof pc === 'number', 'pc is a number'); evalStack[_symbols.REGISTERS][_vm.$pc] = pc; evalStack[_symbols.REGISTERS][_vm.$sp] = stack.length - 1; evalStack[_symbols.REGISTERS][_vm.$fp] = -1; this[_symbols.HEAP] = this.program.heap; this[_symbols.CONSTANTS] = this.program.constants; this.elementStack = elementStack; this[_symbols.STACKS].scope.push(scope); this[_symbols.STACKS].dynamicScope.push(dynamicScope); this[_symbols.ARGS] = new _arguments.VMArgumentsImpl(); this[_symbols.INNER_VM] = new _lowLevel.default(evalStack, this[_symbols.HEAP], runtime.program, { debugBefore: function debugBefore(opcode) { return _opcodes.APPEND_OPCODES.debugBefore(_this, opcode); }, debugAfter: function debugAfter(state) { _opcodes.APPEND_OPCODES.debugAfter(_this, state); } }, evalStack[_symbols.REGISTERS]); this.destructor = {}; this[_symbols.DESTROYABLE_STACK].push(this.destructor); } var _proto = VM.prototype; // Fetch a value from a register onto the stack _proto.fetch = function fetch(register) { var value = this.fetchValue(register); this.stack.push(value); } // Load a value from the stack into a register ; _proto.load = function load(register) { var value = this.stack.pop(); this.loadValue(register, value); }; _proto.fetchValue = function fetchValue(register) { if ((0, _vm.isLowLevelRegister)(register)) { return this[_symbols.INNER_VM].fetchRegister(register); } switch (register) { case _vm.$s0: return this.s0; case _vm.$s1: return this.s1; case _vm.$t0: return this.t0; case _vm.$t1: return this.t1; case _vm.$v0: return this.v0; } } // Load a value into a register ; _proto.loadValue = function loadValue(register, value) { if ((0, _vm.isLowLevelRegister)(register)) { this[_symbols.INNER_VM].loadRegister(register, value); } switch (register) { case _vm.$s0: this.s0 = value; break; case _vm.$s1: this.s1 = value; break; case _vm.$t0: this.t0 = value; break; case _vm.$t1: this.t1 = value; break; case _vm.$v0: this.v0 = value; break; } } /** * Migrated to Inner */ // Start a new frame and save $ra and $fp on the stack ; _proto.pushFrame = function pushFrame() { this[_symbols.INNER_VM].pushFrame(); } // Restore $ra, $sp and $fp ; _proto.popFrame = function popFrame() { this[_symbols.INNER_VM].popFrame(); } // Jump to an address in `program` ; _proto["goto"] = function goto(offset) { this[_symbols.INNER_VM]["goto"](offset); } // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS) ; _proto.call = function call(handle) { this[_symbols.INNER_VM].call(handle); } // Put a specific `program` address in $ra ; _proto.returnTo = function returnTo(offset) { this[_symbols.INNER_VM].returnTo(offset); } // Return to the `program` address stored in $ra ; _proto["return"] = function _return() { this[_symbols.INNER_VM]["return"](); }; VM.initial = function initial(runtime, context, _ref2) { var handle = _ref2.handle, self = _ref2.self, dynamicScope = _ref2.dynamicScope, treeBuilder = _ref2.treeBuilder, numSymbols = _ref2.numSymbols, owner = _ref2.owner; var scope = _scope.PartialScopeImpl.root(self, numSymbols, owner); var state = vmState(runtime.program.heap.getaddr(handle), scope, dynamicScope); var vm = initVM(context)(runtime, state, treeBuilder); vm.pushUpdating(); return vm; }; VM.empty = function empty(runtime, _ref3, context) { var handle = _ref3.handle, treeBuilder = _ref3.treeBuilder, dynamicScope = _ref3.dynamicScope, owner = _ref3.owner; var vm = initVM(context)(runtime, vmState(runtime.program.heap.getaddr(handle), _scope.PartialScopeImpl.root(_reference.UNDEFINED_REFERENCE, 0, owner), dynamicScope), treeBuilder); vm.pushUpdating(); return vm; }; _proto.compile = function compile(block) { var handle = (0, _util.unwrapHandle)(block.compile(this.context)); return handle; }; _proto.captureState = function captureState(args, pc) { if (pc === void 0) { pc = this[_symbols.INNER_VM].fetchRegister(_vm.$pc); } return { pc: pc, scope: this.scope(), dynamicScope: this.dynamicScope(), stack: this.stack.capture(args) }; }; _proto.capture = function capture(args, pc) { if (pc === void 0) { pc = this[_symbols.INNER_VM].fetchRegister(_vm.$pc); } return new _update.ResumableVMStateImpl(this.captureState(args, pc), this.resume); }; _proto.beginCacheGroup = function beginCacheGroup(name) { var opcodes = this.updating(); var guard = new _vm2.JumpIfNotModifiedOpcode(); opcodes.push(guard); opcodes.push(new _vm2.BeginTrackFrameOpcode(name)); this[_symbols.STACKS].cache.push(guard); (0, _validator.beginTrackFrame)(name); }; _proto.commitCacheGroup = function commitCacheGroup() { var opcodes = this.updating(); var guard = this[_symbols.STACKS].cache.pop(); var tag = (0, _validator.endTrackFrame)(); opcodes.push(new _vm2.EndTrackFrameOpcode(guard)); guard.finalize(tag, opcodes.length); }; _proto.enter = function enter(args) { var updating = []; var state = this.capture(args); var block = this.elements().pushUpdatableBlock(); var tryOpcode = new _update.TryOpcode(state, this.runtime, block, updating); this.didEnter(tryOpcode); }; _proto.enterItem = function enterItem(_ref4) { var key = _ref4.key, value = _ref4.value, memo = _ref4.memo; var stack = this.stack; var valueRef = (0, _reference.createIteratorItemRef)(value); var memoRef = (0, _reference.createIteratorItemRef)(memo); stack.push(valueRef); stack.push(memoRef); var state = this.capture(2); var block = this.elements().pushUpdatableBlock(); var opcode = new _update.ListItemOpcode(state, this.runtime, block, key, memoRef, valueRef); this.didEnter(opcode); return opcode; }; _proto.registerItem = function registerItem(opcode) { this.listBlock().initializeChild(opcode); }; _proto.enterList = function enterList(iterableRef, offset) { var updating = []; var addr = this[_symbols.INNER_VM].target(offset); var state = this.capture(0, addr); var list = this.elements().pushBlockList(updating); var opcode = new _update.ListBlockOpcode(state, this.runtime, list, updating, iterableRef); this[_symbols.STACKS].list.push(opcode); this.didEnter(opcode); }; _proto.didEnter = function didEnter(opcode) { this.associateDestroyable(opcode); this[_symbols.DESTROYABLE_STACK].push(opcode); this.updateWith(opcode); this.pushUpdating(opcode.children); }; _proto.exit = function exit() { this[_symbols.DESTROYABLE_STACK].pop(); this.elements().popBlock(); this.popUpdating(); }; _proto.exitList = function exitList() { this.exit(); this[_symbols.STACKS].list.pop(); }; _proto.pushUpdating = function pushUpdating(list) { if (list === void 0) { list = []; } this[_symbols.STACKS].updating.push(list); }; _proto.popUpdating = function popUpdating() { return this[_symbols.STACKS].updating.pop(); }; _proto.updateWith = function updateWith(opcode) { this.updating().push(opcode); }; _proto.listBlock = function listBlock() { return this[_symbols.STACKS].list.current; }; _proto.associateDestroyable = function associateDestroyable(child) { var parent = this[_symbols.DESTROYABLE_STACK].current; (0, _destroyable.associateDestroyableChild)(parent, child); }; _proto.tryUpdating = function tryUpdating() { return this[_symbols.STACKS].updating.current; }; _proto.updating = function updating() { return this[_symbols.STACKS].updating.current; }; _proto.elements = function elements() { return this.elementStack; }; _proto.scope = function scope() { return this[_symbols.STACKS].scope.current; }; _proto.dynamicScope = function dynamicScope() { return this[_symbols.STACKS].dynamicScope.current; }; _proto.pushChildScope = function pushChildScope() { this[_symbols.STACKS].scope.push(this.scope().child()); }; _proto.pushDynamicScope = function pushDynamicScope() { var child = this.dynamicScope().child(); this[_symbols.STACKS].dynamicScope.push(child); return child; }; _proto.pushRootScope = function pushRootScope(size, owner) { var scope = _scope.PartialScopeImpl.sized(size, owner); this[_symbols.STACKS].scope.push(scope); return scope; }; _proto.pushScope = function pushScope(scope) { this[_symbols.STACKS].scope.push(scope); }; _proto.popScope = function popScope() { this[_symbols.STACKS].scope.pop(); }; _proto.popDynamicScope = function popDynamicScope() { this[_symbols.STACKS].dynamicScope.pop(); } /// SCOPE HELPERS ; _proto.getOwner = function getOwner() { return this.scope().owner; }; _proto.getSelf = function getSelf() { return this.scope().getSelf(); }; _proto.referenceForSymbol = function referenceForSymbol(symbol) { return this.scope().getSymbol(symbol); } /// EXECUTION ; _proto.execute = function execute(initialize) { if (_env.DEBUG) { var hasErrored = true; try { var value = this._execute(initialize); // using a boolean here to avoid breaking ergonomics of "pause on uncaught exceptions" // which would happen with a `catch` + `throw` hasErrored = false; return value; } finally { if (hasErrored) { // If any existing blocks are open, due to an error or something like // that, we need to close them all and clean things up properly. var elements = this.elements(); while (elements.hasBlocks) { elements.popBlock(); } // eslint-disable-next-line no-console console.error("\n\nError occurred:\n\n" + (0, _validator.resetTracking)() + "\n\n"); } } } else { return this._execute(initialize); } }; _proto._execute = function _execute(initialize) { if (false /* LOCAL_SHOULD_LOG */ ) { _util.LOCAL_LOGGER.log("EXECUTING FROM " + this[_symbols.INNER_VM].fetchRegister(_vm.$pc)); } if (initialize) initialize(this); var result; while (true) { result = this.next(); if (result.done) break; } return result.value; }; _proto.next = function next() { var env = this.env, elementStack = this.elementStack; var opcode = this[_symbols.INNER_VM].nextStatement(); var result; if (opcode !== null) { this[_symbols.INNER_VM].evaluateOuter(opcode, this); result = { done: false, value: null }; } else { // Unload the stack this.stack.reset(); result = { done: true, value: new _renderResult.default(env, this.popUpdating(), elementStack.popBlock(), this.destructor) }; } return result; }; _proto.bindDynamicScope = function bindDynamicScope(names) { var scope = this.dynamicScope(); for (var i = names.length - 1; i >= 0; i--) { var name = names[i]; scope.set(name, this.stack.pop()); } }; _createClass(VM, [{ key: "stack", get: function get() { return this[_symbols.INNER_VM].stack; } /* Registers */ }, { key: "pc", get: function get() { return this[_symbols.INNER_VM].fetchRegister(_vm.$pc); } }, { key: "program", get: function get() { return this.runtime.program; } }, { key: "env", get: function get() { return this.runtime.env; } }]); return VM; }(); exports.default = VM; _a = _symbols.STACKS, _b = _symbols.DESTROYABLE_STACK; function vmState(pc, scope, dynamicScope) { return { pc: pc, scope: scope, dynamicScope: dynamicScope, stack: [] }; } function initVM(context) { return function (runtime, state, builder) { return new VM(runtime, state, builder, context); }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FwcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBd0JBOztBQU9BOztBQUNBOztBQUNBOztBQWNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUZBLE0sR0FBQSxTQUFBLE1BQUEsR0FBQTtBQUNXLE9BQUEsS0FBQSxHQUFRLElBQVIsV0FBUSxFQUFSO0FBQ0EsT0FBQSxZQUFBLEdBQWUsSUFBZixXQUFlLEVBQWY7QUFDQSxPQUFBLFFBQUEsR0FBVyxJQUFYLFdBQVcsRUFBWDtBQUNBLE9BQUEsS0FBQSxHQUFRLElBQVIsV0FBUSxFQUFSO0FBQ0EsT0FBQSxJQUFBLEdBQU8sSUFBUCxXQUFPLEVBQVA7OztJQUdHLEU7QUF5SFo7OztBQUlBLFdBQUEsRUFBQSxDQUFBLE9BQUEsRUFBQSxJQUFBLEVBQUEsWUFBQSxFQUFBLE9BQUEsRUFJaUQ7QUFBQSxRQUFBLEtBQUEsR0FBQSxJQUFBOztBQUFBLFFBRi9DLEVBRStDLEdBQUEsSUFBQSxDQUYvQyxFQUUrQztBQUFBLFFBRi9DLEtBRStDLEdBQUEsSUFBQSxDQUYvQyxLQUUrQztBQUFBLFFBRi9DLFlBRStDLEdBQUEsSUFBQSxDQUYvQyxZQUUrQztBQUFBLFFBRnBCLEtBRW9CLEdBQUEsSUFBQSxDQUZwQixLQUVvQjtBQUh0QyxTQUFBLE9BQUEsR0FBQSxPQUFBO0FBRVEsU0FBQSxZQUFBLEdBQUEsWUFBQTtBQUNSLFNBQUEsT0FBQSxHQUFBLE9BQUE7QUFoSU0sU0FBQSxFQUFBLElBQVcsSUFBWCxNQUFXLEVBQVg7QUFHQSxTQUFBLEVBQUEsSUFBc0IsSUFBdEIsV0FBc0IsRUFBdEI7QUFlVixTQUFBLEVBQUEsR0FBQSxJQUFBO0FBQ0EsU0FBQSxFQUFBLEdBQUEsSUFBQTtBQUNB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cEIsU0FBQSxPQUFBLENBQUEsRUFBQSxFQUFBLEtBQUEsRUFBQSxZQUFBLEVBQXFFO0FBQ25FLFNBQU87QUFDTCxJQUFBLEVBREssRUFBQSxFQUFBO0FBRUwsSUFBQSxLQUZLLEVBQUEsS0FBQTtBQUdMLElBQUEsWUFISyxFQUFBLFlBQUE7QUFJTCxJQUFBLEtBQUssRUFBRTtBQUpGLEdBQVA7QUFNRDs7QUFxQkQsU0FBQSxNQUFBLENBQUEsT0FBQSxFQUFzRDtBQUNwRCxTQUFPLFVBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxPQUFBLEVBQUE7QUFBQSxXQUE2QixJQUFBLEVBQUEsQ0FBQSxPQUFBLEVBQUEsS0FBQSxFQUFBLE9BQUEsRUFBcEMsT0FBb0MsQ0FBN0I7QUFBUCxHQUFBO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBhc3NlcnRHbG9iYWxDb250ZXh0V2FzU2V0IH0gZnJvbSAnQGdsaW1tZXIvZ2xvYmFsLWNvbnRleHQnO1xuaW1wb3J0IHtcbiAgQ29tcGlsYWJsZVRlbXBsYXRlLFxuICBEZXN0cm95YWJsZSxcbiAgRHluYW1pY1Njb3BlLFxuICBFbGVtZW50QnVpbGRlcixcbiAgRW52aXJvbm1lbnQsXG4gIE9wdGlvbixcbiAgUGFydGlhbFNjb3BlLFxuICBSZW5kZXJSZXN1bHQsXG4gIFJpY2hJdGVyYXRvclJlc3VsdCxcbiAgUnVudGltZUNvbnN0YW50cyxcbiAgUnVudGltZUNvbnRleHQsXG4gIFJ1bnRpbWVIZWFwLFxuICBSdW50aW1lUHJvZ3JhbSxcbiAgU2NvcGUsXG4gIENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICBWTSBhcyBQdWJsaWNWTSxcbiAgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIE93bmVyLFxuICBVcGRhdGluZ09wY29kZSxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMT0NBTF9TSE9VTERfTE9HIH0gZnJvbSAnQGdsaW1tZXIvbG9jYWwtZGVidWctZmxhZ3MnO1xuaW1wb3J0IHsgUnVudGltZU9wSW1wbCB9IGZyb20gJ0BnbGltbWVyL3Byb2dyYW0nO1xuaW1wb3J0IHtcbiAgY3JlYXRlSXRlcmF0b3JJdGVtUmVmLFxuICBPcGFxdWVJdGVyYXRpb25JdGVtLFxuICBPcGFxdWVJdGVyYXRvcixcbiAgUmVmZXJlbmNlLFxuICBVTkRFRklORURfUkVGRVJFTkNFLFxufSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgYXNzZXJ0LCBleHBlY3QsIExPQ0FMX0xPR0dFUiwgU3RhY2ssIHVud3JhcEhhbmRsZSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgYmVnaW5UcmFja0ZyYW1lLCBlbmRUcmFja0ZyYW1lLCByZXNldFRyYWNraW5nIH0gZnJvbSAnQGdsaW1tZXIvdmFsaWRhdG9yJztcbmltcG9ydCB7XG4gICRmcCxcbiAgJHBjLFxuICAkczAsXG4gICRzMSxcbiAgJHNwLFxuICAkdDAsXG4gICR0MSxcbiAgJHYwLFxuICBpc0xvd0xldmVsUmVnaXN0ZXIsXG4gIE1hY2hpbmVSZWdpc3RlcixcbiAgUmVnaXN0ZXIsXG4gIFN5c2NhbGxSZWdpc3Rlcixcbn0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZCB9IGZyb20gJ0BnbGltbWVyL2Rlc3Ryb3lhYmxlJztcbmltcG9ydCB7XG4gIEJlZ2luVHJhY2tGcmFtZU9wY29kZSxcbiAgRW5kVHJhY2tGcmFtZU9wY29kZSxcbiAgSnVtcElmTm90TW9kaWZpZWRPcGNvZGUsXG59IGZyb20gJy4uL2NvbXBpbGVkL29wY29kZXMvdm0nO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMsIERlYnVnU3RhdGUgfSBmcm9tICcuLi9vcGNvZGVzJztcbmltcG9ydCB7IFBhcnRpYWxTY29wZUltcGwgfSBmcm9tICcuLi9zY29wZSc7XG5pbXBvcnQgeyBBUkdTLCBDT05TVEFOVFMsIERFU1RST1lBQkxFX1NUQUNLLCBIRUFQLCBJTk5FUl9WTSwgUkVHSVNURVJTLCBTVEFDS1MgfSBmcm9tICcuLi9zeW1ib2xzJztcbmltcG9ydCB7IFZNQXJndW1lbnRzSW1wbCB9IGZyb20gJy4vYXJndW1lbnRzJztcbmltcG9ydCB7IExpdmVCbG9ja0xpc3QgfSBmcm9tICcuL2VsZW1lbnQtYnVpbGRlcic7XG5pbXBvcnQgTG93TGV2ZWxWTSBmcm9tICcuL2xvdy1sZXZlbCc7XG5pbXBvcnQgUmVuZGVyUmVzdWx0SW1wbCBmcm9tICcuL3JlbmRlci1yZXN1bHQnO1xuaW1wb3J0IEV2YWx1YXRpb25TdGFja0ltcGwsIHsgRXZhbHVhdGlvblN0YWNrIH0gZnJvbSAnLi9zdGFjayc7XG5pbXBvcnQge1xuICBCbG9ja09wY29kZSxcbiAgTGlzdEJsb2NrT3Bjb2RlLFxuICBMaXN0SXRlbU9wY29kZSxcbiAgUmVzdW1hYmxlVk1TdGF0ZSxcbiAgUmVzdW1hYmxlVk1TdGF0ZUltcGwsXG4gIFRyeU9wY29kZSxcbiAgVk1TdGF0ZSxcbn0gZnJvbSAnLi91cGRhdGUnO1xuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaW50ZXJuYWwgb3Bjb2RlcywgYW5kIGlzIG1vcmUgc3RhYmxlIHRoYW5cbiAqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBwZW5kIFZNIGl0c2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcm5hbFZNIHtcbiAgcmVhZG9ubHkgW0NPTlNUQU5UU106IFJ1bnRpbWVDb25zdGFudHMgJiBSZXNvbHV0aW9uVGltZUNvbnN0YW50cztcbiAgcmVhZG9ubHkgW0FSR1NdOiBWTUFyZ3VtZW50c0ltcGw7XG5cbiAgcmVhZG9ubHkgZW52OiBFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgc3RhY2s6IEV2YWx1YXRpb25TdGFjaztcbiAgcmVhZG9ubHkgcnVudGltZTogUnVudGltZUNvbnRleHQ7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0O1xuXG4gIGxvYWRWYWx1ZShyZWdpc3RlcjogTWFjaGluZVJlZ2lzdGVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcbiAgbG9hZFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3RlciwgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBsb2FkVmFsdWUocmVnaXN0ZXI6IFJlZ2lzdGVyIHwgTWFjaGluZVJlZ2lzdGVyLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cbiAgZmV0Y2hWYWx1ZShyZWdpc3RlcjogTWFjaGluZVJlZ2lzdGVyLnJhIHwgTWFjaGluZVJlZ2lzdGVyLnBjKTogbnVtYmVyO1xuICAvLyBUT0RPOiBTb21ldGhpbmcgYmV0dGVyIHRoYW4gYSB0eXBlIGFzc2VydGlvbj9cbiAgZmV0Y2hWYWx1ZTxUPihyZWdpc3RlcjogUmVnaXN0ZXIpOiBUO1xuICBmZXRjaFZhbHVlKHJlZ2lzdGVyOiBSZWdpc3Rlcik6IHVua25vd247XG5cbiAgbG9hZChyZWdpc3RlcjogUmVnaXN0ZXIpOiB2b2lkO1xuICBmZXRjaChyZWdpc3RlcjogUmVnaXN0ZXIpOiB2b2lkO1xuXG4gIGNvbXBpbGUoYmxvY2s6IENvbXBpbGFibGVUZW1wbGF0ZSk6IG51bWJlcjtcblxuICBzY29wZSgpOiBTY29wZTtcbiAgZWxlbWVudHMoKTogRWxlbWVudEJ1aWxkZXI7XG5cbiAgZ2V0T3duZXIoKTogT3duZXI7XG4gIGdldFNlbGYoKTogUmVmZXJlbmNlO1xuXG4gIHVwZGF0ZVdpdGgob3Bjb2RlOiBVcGRhdGluZ09wY29kZSk6IHZvaWQ7XG5cbiAgYXNzb2NpYXRlRGVzdHJveWFibGUoZDogRGVzdHJveWFibGUpOiB2b2lkO1xuXG4gIGJlZ2luQ2FjaGVHcm91cChuYW1lPzogc3RyaW5nKTogdm9pZDtcbiAgY29tbWl0Q2FjaGVHcm91cCgpOiB2b2lkO1xuXG4gIC8vLyBJdGVyYXRpb24gLy8vXG5cbiAgZW50ZXJMaXN0KGl0ZXJhYmxlUmVmOiBSZWZlcmVuY2U8T3BhcXVlSXRlcmF0b3I+LCBvZmZzZXQ6IG51bWJlcik6IHZvaWQ7XG4gIGV4aXRMaXN0KCk6IHZvaWQ7XG4gIGVudGVySXRlbShpdGVtOiBPcGFxdWVJdGVyYXRpb25JdGVtKTogTGlzdEl0ZW1PcGNvZGU7XG4gIHJlZ2lzdGVySXRlbShpdGVtOiBMaXN0SXRlbU9wY29kZSk6IHZvaWQ7XG5cbiAgcHVzaFJvb3RTY29wZShzaXplOiBudW1iZXIsIG93bmVyOiBPd25lcik6IFBhcnRpYWxTY29wZTtcbiAgcHVzaENoaWxkU2NvcGUoKTogdm9pZDtcbiAgcG9wU2NvcGUoKTogdm9pZDtcbiAgcHVzaFNjb3BlKHNjb3BlOiBTY29wZSk6IHZvaWQ7XG5cbiAgZHluYW1pY1Njb3BlKCk6IER5bmFtaWNTY29wZTtcbiAgYmluZER5bmFtaWNTY29wZShuYW1lczogc3RyaW5nW10pOiB2b2lkO1xuICBwdXNoRHluYW1pY1Njb3BlKCk6IHZvaWQ7XG4gIHBvcER5bmFtaWNTY29wZSgpOiB2b2lkO1xuXG4gIGVudGVyKGFyZ3M6IG51bWJlcik6IHZvaWQ7XG4gIGV4aXQoKTogdm9pZDtcblxuICBnb3RvKHBjOiBudW1iZXIpOiB2b2lkO1xuICBjYWxsKGhhbmRsZTogbnVtYmVyKTogdm9pZDtcbiAgcHVzaEZyYW1lKCk6IHZvaWQ7XG5cbiAgcmVmZXJlbmNlRm9yU3ltYm9sKHN5bWJvbDogbnVtYmVyKTogUmVmZXJlbmNlO1xuXG4gIGV4ZWN1dGUoaW5pdGlhbGl6ZT86ICh2bTogdGhpcykgPT4gdm9pZCk6IFJlbmRlclJlc3VsdDtcbiAgcHVzaFVwZGF0aW5nKGxpc3Q/OiBVcGRhdGluZ09wY29kZVtdKTogdm9pZDtcbiAgbmV4dCgpOiBSaWNoSXRlcmF0b3JSZXN1bHQ8bnVsbCwgUmVuZGVyUmVzdWx0Pjtcbn1cblxuY2xhc3MgU3RhY2tzIHtcbiAgcmVhZG9ubHkgc2NvcGUgPSBuZXcgU3RhY2s8U2NvcGU+KCk7XG4gIHJlYWRvbmx5IGR5bmFtaWNTY29wZSA9IG5ldyBTdGFjazxEeW5hbWljU2NvcGU+KCk7XG4gIHJlYWRvbmx5IHVwZGF0aW5nID0gbmV3IFN0YWNrPFVwZGF0aW5nT3Bjb2RlW10+KCk7XG4gIHJlYWRvbmx5IGNhY2hlID0gbmV3IFN0YWNrPEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlPigpO1xuICByZWFkb25seSBsaXN0ID0gbmV3IFN0YWNrPExpc3RCbG9ja09wY29kZT4oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVk0gaW1wbGVtZW50cyBQdWJsaWNWTSwgSW50ZXJuYWxWTSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgW1NUQUNLU10gPSBuZXcgU3RhY2tzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgW0hFQVBdOiBSdW50aW1lSGVhcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cnVjdG9yOiBvYmplY3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgW0RFU1RST1lBQkxFX1NUQUNLXSA9IG5ldyBTdGFjazxvYmplY3Q+KCk7XG4gIHJlYWRvbmx5IFtDT05TVEFOVFNdOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHM7XG4gIHJlYWRvbmx5IFtBUkdTXTogVk1Bcmd1bWVudHNJbXBsO1xuICByZWFkb25seSBbSU5ORVJfVk1dOiBMb3dMZXZlbFZNO1xuXG4gIGdldCBzdGFjaygpOiBFdmFsdWF0aW9uU3RhY2sge1xuICAgIHJldHVybiB0aGlzW0lOTkVSX1ZNXS5zdGFjayBhcyBFdmFsdWF0aW9uU3RhY2s7XG4gIH1cblxuICAvKiBSZWdpc3RlcnMgKi9cblxuICBnZXQgcGMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcigkcGMpO1xuICB9XG5cbiAgcHVibGljIHMwOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHMxOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHQwOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHQxOiB1bmtub3duID0gbnVsbDtcbiAgcHVibGljIHYwOiB1bmtub3duID0gbnVsbDtcblxuICAvLyBGZXRjaCBhIHZhbHVlIGZyb20gYSByZWdpc3RlciBvbnRvIHRoZSBzdGFja1xuICBmZXRjaChyZWdpc3RlcjogU3lzY2FsbFJlZ2lzdGVyKTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5mZXRjaFZhbHVlKHJlZ2lzdGVyKTtcblxuICAgIHRoaXMuc3RhY2sucHVzaCh2YWx1ZSk7XG4gIH1cblxuICAvLyBMb2FkIGEgdmFsdWUgZnJvbSB0aGUgc3RhY2sgaW50byBhIHJlZ2lzdGVyXG4gIGxvYWQocmVnaXN0ZXI6IFN5c2NhbGxSZWdpc3Rlcikge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuc3RhY2sucG9wKCk7XG5cbiAgICB0aGlzLmxvYWRWYWx1ZShyZWdpc3RlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gRmV0Y2ggYSB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXJcbiAgZmV0Y2hWYWx1ZShyZWdpc3RlcjogTWFjaGluZVJlZ2lzdGVyKTogbnVtYmVyO1xuICBmZXRjaFZhbHVlPFQ+KHJlZ2lzdGVyOiBSZWdpc3Rlcik6IFQ7XG4gIGZldGNoVmFsdWUocmVnaXN0ZXI6IFJlZ2lzdGVyIHwgTWFjaGluZVJlZ2lzdGVyKTogdW5rbm93biB7XG4gICAgaWYgKGlzTG93TGV2ZWxSZWdpc3RlcihyZWdpc3RlcikpIHtcbiAgICAgIHJldHVybiB0aGlzW0lOTkVSX1ZNXS5mZXRjaFJlZ2lzdGVyKHJlZ2lzdGVyKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlZ2lzdGVyKSB7XG4gICAgICBjYXNlICRzMDpcbiAgICAgICAgcmV0dXJuIHRoaXMuczA7XG4gICAgICBjYXNlICRzMTpcbiAgICAgICAgcmV0dXJuIHRoaXMuczE7XG4gICAgICBjYXNlICR0MDpcbiAgICAgICAgcmV0dXJuIHRoaXMudDA7XG4gICAgICBjYXNlICR0MTpcbiAgICAgICAgcmV0dXJuIHRoaXMudDE7XG4gICAgICBjYXNlICR2MDpcbiAgICAgICAgcmV0dXJuIHRoaXMudjA7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBhIHZhbHVlIGludG8gYSByZWdpc3RlclxuXG4gIGxvYWRWYWx1ZTxUPihyZWdpc3RlcjogUmVnaXN0ZXIgfCBNYWNoaW5lUmVnaXN0ZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKGlzTG93TGV2ZWxSZWdpc3RlcihyZWdpc3RlcikpIHtcbiAgICAgIHRoaXNbSU5ORVJfVk1dLmxvYWRSZWdpc3RlcihyZWdpc3RlciwgKHZhbHVlIGFzIGFueSkgYXMgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlZ2lzdGVyKSB7XG4gICAgICBjYXNlICRzMDpcbiAgICAgICAgdGhpcy5zMCA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJHMxOlxuICAgICAgICB0aGlzLnMxID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAkdDA6XG4gICAgICAgIHRoaXMudDAgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICR0MTpcbiAgICAgICAgdGhpcy50MSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJHYwOlxuICAgICAgICB0aGlzLnYwID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlZCB0byBJbm5lclxuICAgKi9cblxuICAvLyBTdGFydCBhIG5ldyBmcmFtZSBhbmQgc2F2ZSAkcmEgYW5kICRmcCBvbiB0aGUgc3RhY2tcbiAgcHVzaEZyYW1lKCkge1xuICAgIHRoaXNbSU5ORVJfVk1dLnB1c2hGcmFtZSgpO1xuICB9XG5cbiAgLy8gUmVzdG9yZSAkcmEsICRzcCBhbmQgJGZwXG4gIHBvcEZyYW1lKCkge1xuICAgIHRoaXNbSU5ORVJfVk1dLnBvcEZyYW1lKCk7XG4gIH1cblxuICAvLyBKdW1wIHRvIGFuIGFkZHJlc3MgaW4gYHByb2dyYW1gXG4gIGdvdG8ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzW0lOTkVSX1ZNXS5nb3RvKG9mZnNldCk7XG4gIH1cblxuICAvLyBTYXZlICRwYyBpbnRvICRyYSwgdGhlbiBqdW1wIHRvIGEgbmV3IGFkZHJlc3MgaW4gYHByb2dyYW1gIChqYWwgaW4gTUlQUylcbiAgY2FsbChoYW5kbGU6IG51bWJlcikge1xuICAgIHRoaXNbSU5ORVJfVk1dLmNhbGwoaGFuZGxlKTtcbiAgfVxuXG4gIC8vIFB1dCBhIHNwZWNpZmljIGBwcm9ncmFtYCBhZGRyZXNzIGluICRyYVxuICByZXR1cm5UbyhvZmZzZXQ6IG51bWJlcikge1xuICAgIHRoaXNbSU5ORVJfVk1dLnJldHVyblRvKG9mZnNldCk7XG4gIH1cblxuICAvLyBSZXR1cm4gdG8gdGhlIGBwcm9ncmFtYCBhZGRyZXNzIHN0b3JlZCBpbiAkcmFcbiAgcmV0dXJuKCkge1xuICAgIHRoaXNbSU5ORVJfVk1dLnJldHVybigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCBvZiBtaWdyYXRlZC5cbiAgICovXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVudGltZTogUnVudGltZUNvbnRleHQsXG4gICAgeyBwYywgc2NvcGUsIGR5bmFtaWNTY29wZSwgc3RhY2sgfTogVk1TdGF0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRTdGFjazogRWxlbWVudEJ1aWxkZXIsXG4gICAgcmVhZG9ubHkgY29udGV4dDogQ29tcGlsZVRpbWVDb21waWxhdGlvbkNvbnRleHRcbiAgKSB7XG4gICAgaWYgKERFQlVHKSB7XG4gICAgICBhc3NlcnRHbG9iYWxDb250ZXh0V2FzU2V0ISgpO1xuICAgIH1cblxuICAgIGxldCBldmFsU3RhY2sgPSBFdmFsdWF0aW9uU3RhY2tJbXBsLnJlc3RvcmUoc3RhY2spO1xuXG4gICAgYXNzZXJ0KHR5cGVvZiBwYyA9PT0gJ251bWJlcicsICdwYyBpcyBhIG51bWJlcicpO1xuXG4gICAgZXZhbFN0YWNrW1JFR0lTVEVSU11bJHBjXSA9IHBjO1xuICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdWyRzcF0gPSBzdGFjay5sZW5ndGggLSAxO1xuICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdWyRmcF0gPSAtMTtcblxuICAgIHRoaXNbSEVBUF0gPSB0aGlzLnByb2dyYW0uaGVhcDtcbiAgICB0aGlzW0NPTlNUQU5UU10gPSB0aGlzLnByb2dyYW0uY29uc3RhbnRzO1xuICAgIHRoaXMuZWxlbWVudFN0YWNrID0gZWxlbWVudFN0YWNrO1xuICAgIHRoaXNbU1RBQ0tTXS5zY29wZS5wdXNoKHNjb3BlKTtcbiAgICB0aGlzW1NUQUNLU10uZHluYW1pY1Njb3BlLnB1c2goZHluYW1pY1Njb3BlKTtcbiAgICB0aGlzW0FSR1NdID0gbmV3IFZNQXJndW1lbnRzSW1wbCgpO1xuICAgIHRoaXNbSU5ORVJfVk1dID0gbmV3IExvd0xldmVsVk0oXG4gICAgICBldmFsU3RhY2ssXG4gICAgICB0aGlzW0hFQVBdLFxuICAgICAgcnVudGltZS5wcm9ncmFtLFxuICAgICAge1xuICAgICAgICBkZWJ1Z0JlZm9yZTogKG9wY29kZTogUnVudGltZU9wSW1wbCk6IERlYnVnU3RhdGUgPT4ge1xuICAgICAgICAgIHJldHVybiBBUFBFTkRfT1BDT0RFUy5kZWJ1Z0JlZm9yZSh0aGlzLCBvcGNvZGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRlYnVnQWZ0ZXI6IChzdGF0ZTogRGVidWdTdGF0ZSk6IHZvaWQgPT4ge1xuICAgICAgICAgIEFQUEVORF9PUENPREVTLmRlYnVnQWZ0ZXIodGhpcywgc3RhdGUpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGV2YWxTdGFja1tSRUdJU1RFUlNdXG4gICAgKTtcblxuICAgIHRoaXMuZGVzdHJ1Y3RvciA9IHt9O1xuICAgIHRoaXNbREVTVFJPWUFCTEVfU1RBQ0tdLnB1c2godGhpcy5kZXN0cnVjdG9yKTtcbiAgfVxuXG4gIHN0YXRpYyBpbml0aWFsKFxuICAgIHJ1bnRpbWU6IFJ1bnRpbWVDb250ZXh0LFxuICAgIGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICAgIHsgaGFuZGxlLCBzZWxmLCBkeW5hbWljU2NvcGUsIHRyZWVCdWlsZGVyLCBudW1TeW1ib2xzLCBvd25lciB9OiBJbml0T3B0aW9uc1xuICApIHtcbiAgICBsZXQgc2NvcGUgPSBQYXJ0aWFsU2NvcGVJbXBsLnJvb3Qoc2VsZiwgbnVtU3ltYm9scywgb3duZXIpO1xuICAgIGxldCBzdGF0ZSA9IHZtU3RhdGUocnVudGltZS5wcm9ncmFtLmhlYXAuZ2V0YWRkcihoYW5kbGUpLCBzY29wZSwgZHluYW1pY1Njb3BlKTtcbiAgICBsZXQgdm0gPSBpbml0Vk0oY29udGV4dCkocnVudGltZSwgc3RhdGUsIHRyZWVCdWlsZGVyKTtcbiAgICB2bS5wdXNoVXBkYXRpbmcoKTtcbiAgICByZXR1cm4gdm07XG4gIH1cblxuICBzdGF0aWMgZW1wdHkoXG4gICAgcnVudGltZTogUnVudGltZUNvbnRleHQsXG4gICAgeyBoYW5kbGUsIHRyZWVCdWlsZGVyLCBkeW5hbWljU2NvcGUsIG93bmVyIH06IE1pbmltYWxJbml0T3B0aW9ucyxcbiAgICBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dFxuICApIHtcbiAgICBsZXQgdm0gPSBpbml0Vk0oY29udGV4dCkoXG4gICAgICBydW50aW1lLFxuICAgICAgdm1TdGF0ZShcbiAgICAgICAgcnVudGltZS5wcm9ncmFtLmhlYXAuZ2V0YWRkcihoYW5kbGUpLFxuICAgICAgICBQYXJ0aWFsU2NvcGVJbXBsLnJvb3QoVU5ERUZJTkVEX1JFRkVSRU5DRSwgMCwgb3duZXIpLFxuICAgICAgICBkeW5hbWljU2NvcGVcbiAgICAgICksXG4gICAgICB0cmVlQnVpbGRlclxuICAgICk7XG4gICAgdm0ucHVzaFVwZGF0aW5nKCk7XG4gICAgcmV0dXJuIHZtO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN1bWU6IFZtSW5pdENhbGxiYWNrID0gaW5pdFZNKHRoaXMuY29udGV4dCk7XG5cbiAgY29tcGlsZShibG9jazogQ29tcGlsYWJsZVRlbXBsYXRlKTogbnVtYmVyIHtcbiAgICBsZXQgaGFuZGxlID0gdW53cmFwSGFuZGxlKGJsb2NrLmNvbXBpbGUodGhpcy5jb250ZXh0KSk7XG5cbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG5cbiAgZ2V0IHByb2dyYW0oKTogUnVudGltZVByb2dyYW0ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWUucHJvZ3JhbTtcbiAgfVxuXG4gIGdldCBlbnYoKTogRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWUuZW52O1xuICB9XG5cbiAgY2FwdHVyZVN0YXRlKGFyZ3M6IG51bWJlciwgcGMgPSB0aGlzW0lOTkVSX1ZNXS5mZXRjaFJlZ2lzdGVyKCRwYykpOiBWTVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGMsXG4gICAgICBzY29wZTogdGhpcy5zY29wZSgpLFxuICAgICAgZHluYW1pY1Njb3BlOiB0aGlzLmR5bmFtaWNTY29wZSgpLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2suY2FwdHVyZShhcmdzKSxcbiAgICB9O1xuICB9XG5cbiAgY2FwdHVyZShhcmdzOiBudW1iZXIsIHBjID0gdGhpc1tJTk5FUl9WTV0uZmV0Y2hSZWdpc3RlcigkcGMpKTogUmVzdW1hYmxlVk1TdGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bWFibGVWTVN0YXRlSW1wbCh0aGlzLmNhcHR1cmVTdGF0ZShhcmdzLCBwYyksIHRoaXMucmVzdW1lKTtcbiAgfVxuXG4gIGJlZ2luQ2FjaGVHcm91cChuYW1lPzogc3RyaW5nKSB7XG4gICAgbGV0IG9wY29kZXMgPSB0aGlzLnVwZGF0aW5nKCk7XG4gICAgbGV0IGd1YXJkID0gbmV3IEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlKCk7XG5cbiAgICBvcGNvZGVzLnB1c2goZ3VhcmQpO1xuICAgIG9wY29kZXMucHVzaChuZXcgQmVnaW5UcmFja0ZyYW1lT3Bjb2RlKG5hbWUpKTtcbiAgICB0aGlzW1NUQUNLU10uY2FjaGUucHVzaChndWFyZCk7XG5cbiAgICBiZWdpblRyYWNrRnJhbWUobmFtZSk7XG4gIH1cblxuICBjb21taXRDYWNoZUdyb3VwKCkge1xuICAgIGxldCBvcGNvZGVzID0gdGhpcy51cGRhdGluZygpO1xuICAgIGxldCBndWFyZCA9IGV4cGVjdCh0aGlzW1NUQUNLU10uY2FjaGUucG9wKCksICdWTSBCVUc6IEV4cGVjdGVkIGEgY2FjaGUgZ3JvdXAnKTtcblxuICAgIGxldCB0YWcgPSBlbmRUcmFja0ZyYW1lKCk7XG4gICAgb3Bjb2Rlcy5wdXNoKG5ldyBFbmRUcmFja0ZyYW1lT3Bjb2RlKGd1YXJkKSk7XG5cbiAgICBndWFyZC5maW5hbGl6ZSh0YWcsIG9wY29kZXMubGVuZ3RoKTtcbiAgfVxuXG4gIGVudGVyKGFyZ3M6IG51bWJlcikge1xuICAgIGxldCB1cGRhdGluZzogVXBkYXRpbmdPcGNvZGVbXSA9IFtdO1xuXG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKGFyZ3MpO1xuICAgIGxldCBibG9jayA9IHRoaXMuZWxlbWVudHMoKS5wdXNoVXBkYXRhYmxlQmxvY2soKTtcblxuICAgIGxldCB0cnlPcGNvZGUgPSBuZXcgVHJ5T3Bjb2RlKHN0YXRlLCB0aGlzLnJ1bnRpbWUsIGJsb2NrLCB1cGRhdGluZyk7XG5cbiAgICB0aGlzLmRpZEVudGVyKHRyeU9wY29kZSk7XG4gIH1cblxuICBlbnRlckl0ZW0oeyBrZXksIHZhbHVlLCBtZW1vIH06IE9wYXF1ZUl0ZXJhdGlvbkl0ZW0pOiBMaXN0SXRlbU9wY29kZSB7XG4gICAgbGV0IHsgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICBsZXQgdmFsdWVSZWYgPSBjcmVhdGVJdGVyYXRvckl0ZW1SZWYodmFsdWUpO1xuICAgIGxldCBtZW1vUmVmID0gY3JlYXRlSXRlcmF0b3JJdGVtUmVmKG1lbW8pO1xuXG4gICAgc3RhY2sucHVzaCh2YWx1ZVJlZik7XG4gICAgc3RhY2sucHVzaChtZW1vUmVmKTtcblxuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZSgyKTtcbiAgICBsZXQgYmxvY2sgPSB0aGlzLmVsZW1lbnRzKCkucHVzaFVwZGF0YWJsZUJsb2NrKCk7XG5cbiAgICBsZXQgb3Bjb2RlID0gbmV3IExpc3RJdGVtT3Bjb2RlKHN0YXRlLCB0aGlzLnJ1bnRpbWUsIGJsb2NrLCBrZXksIG1lbW9SZWYsIHZhbHVlUmVmKTtcbiAgICB0aGlzLmRpZEVudGVyKG9wY29kZSk7XG5cbiAgICByZXR1cm4gb3Bjb2RlO1xuICB9XG5cbiAgcmVnaXN0ZXJJdGVtKG9wY29kZTogTGlzdEl0ZW1PcGNvZGUpIHtcbiAgICB0aGlzLmxpc3RCbG9jaygpLmluaXRpYWxpemVDaGlsZChvcGNvZGUpO1xuICB9XG5cbiAgZW50ZXJMaXN0KGl0ZXJhYmxlUmVmOiBSZWZlcmVuY2U8T3BhcXVlSXRlcmF0b3I+LCBvZmZzZXQ6IG51bWJlcikge1xuICAgIGxldCB1cGRhdGluZzogTGlzdEl0ZW1PcGNvZGVbXSA9IFtdO1xuXG4gICAgbGV0IGFkZHIgPSB0aGlzW0lOTkVSX1ZNXS50YXJnZXQob2Zmc2V0KTtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNhcHR1cmUoMCwgYWRkcik7XG4gICAgbGV0IGxpc3QgPSB0aGlzLmVsZW1lbnRzKCkucHVzaEJsb2NrTGlzdCh1cGRhdGluZykgYXMgTGl2ZUJsb2NrTGlzdDtcblxuICAgIGxldCBvcGNvZGUgPSBuZXcgTGlzdEJsb2NrT3Bjb2RlKHN0YXRlLCB0aGlzLnJ1bnRpbWUsIGxpc3QsIHVwZGF0aW5nLCBpdGVyYWJsZVJlZik7XG5cbiAgICB0aGlzW1NUQUNLU10ubGlzdC5wdXNoKG9wY29kZSk7XG5cbiAgICB0aGlzLmRpZEVudGVyKG9wY29kZSk7XG4gIH1cblxuICBwcml2YXRlIGRpZEVudGVyKG9wY29kZTogQmxvY2tPcGNvZGUpIHtcbiAgICB0aGlzLmFzc29jaWF0ZURlc3Ryb3lhYmxlKG9wY29kZSk7XG4gICAgdGhpc1tERVNUUk9ZQUJMRV9TVEFDS10ucHVzaChvcGNvZGUpO1xuICAgIHRoaXMudXBkYXRlV2l0aChvcGNvZGUpO1xuICAgIHRoaXMucHVzaFVwZGF0aW5nKG9wY29kZS5jaGlsZHJlbik7XG4gIH1cblxuICBleGl0KCkge1xuICAgIHRoaXNbREVTVFJPWUFCTEVfU1RBQ0tdLnBvcCgpO1xuICAgIHRoaXMuZWxlbWVudHMoKS5wb3BCbG9jaygpO1xuICAgIHRoaXMucG9wVXBkYXRpbmcoKTtcbiAgfVxuXG4gIGV4aXRMaXN0KCkge1xuICAgIHRoaXMuZXhpdCgpO1xuICAgIHRoaXNbU1RBQ0tTXS5saXN0LnBvcCgpO1xuICB9XG5cbiAgcHVzaFVwZGF0aW5nKGxpc3Q6IFVwZGF0aW5nT3Bjb2RlW10gPSBbXSk6IHZvaWQge1xuICAgIHRoaXNbU1RBQ0tTXS51cGRhdGluZy5wdXNoKGxpc3QpO1xuICB9XG5cbiAgcG9wVXBkYXRpbmcoKTogVXBkYXRpbmdPcGNvZGVbXSB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzW1NUQUNLU10udXBkYXRpbmcucG9wKCksIFwiY2FuJ3QgcG9wIGFuIGVtcHR5IHN0YWNrXCIpO1xuICB9XG5cbiAgdXBkYXRlV2l0aChvcGNvZGU6IFVwZGF0aW5nT3Bjb2RlKSB7XG4gICAgdGhpcy51cGRhdGluZygpLnB1c2gob3Bjb2RlKTtcbiAgfVxuXG4gIGxpc3RCbG9jaygpOiBMaXN0QmxvY2tPcGNvZGUge1xuICAgIHJldHVybiBleHBlY3QodGhpc1tTVEFDS1NdLmxpc3QuY3VycmVudCwgJ2V4cGVjdGVkIGEgbGlzdCBibG9jaycpO1xuICB9XG5cbiAgYXNzb2NpYXRlRGVzdHJveWFibGUoY2hpbGQ6IERlc3Ryb3lhYmxlKTogdm9pZCB7XG4gICAgbGV0IHBhcmVudCA9IGV4cGVjdCh0aGlzW0RFU1RST1lBQkxFX1NUQUNLXS5jdXJyZW50LCAnRXhwZWN0ZWQgZGVzdHJ1Y3RvciBwYXJlbnQnKTtcbiAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgdHJ5VXBkYXRpbmcoKTogT3B0aW9uPFVwZGF0aW5nT3Bjb2RlW10+IHtcbiAgICByZXR1cm4gdGhpc1tTVEFDS1NdLnVwZGF0aW5nLmN1cnJlbnQ7XG4gIH1cblxuICB1cGRhdGluZygpOiBVcGRhdGluZ09wY29kZVtdIHtcbiAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgdGhpc1tTVEFDS1NdLnVwZGF0aW5nLmN1cnJlbnQsXG4gICAgICAnZXhwZWN0ZWQgdXBkYXRpbmcgb3Bjb2RlIG9uIHRoZSB1cGRhdGluZyBvcGNvZGUgc3RhY2snXG4gICAgKTtcbiAgfVxuXG4gIGVsZW1lbnRzKCk6IEVsZW1lbnRCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50U3RhY2s7XG4gIH1cblxuICBzY29wZSgpOiBTY29wZSB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzW1NUQUNLU10uc2NvcGUuY3VycmVudCwgJ2V4cGVjdGVkIHNjb3BlIG9uIHRoZSBzY29wZSBzdGFjaycpO1xuICB9XG5cbiAgZHluYW1pY1Njb3BlKCk6IER5bmFtaWNTY29wZSB7XG4gICAgcmV0dXJuIGV4cGVjdChcbiAgICAgIHRoaXNbU1RBQ0tTXS5keW5hbWljU2NvcGUuY3VycmVudCxcbiAgICAgICdleHBlY3RlZCBkeW5hbWljIHNjb3BlIG9uIHRoZSBkeW5hbWljIHNjb3BlIHN0YWNrJ1xuICAgICk7XG4gIH1cblxuICBwdXNoQ2hpbGRTY29wZSgpIHtcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucHVzaCh0aGlzLnNjb3BlKCkuY2hpbGQoKSk7XG4gIH1cblxuICBwdXNoRHluYW1pY1Njb3BlKCk6IER5bmFtaWNTY29wZSB7XG4gICAgbGV0IGNoaWxkID0gdGhpcy5keW5hbWljU2NvcGUoKS5jaGlsZCgpO1xuICAgIHRoaXNbU1RBQ0tTXS5keW5hbWljU2NvcGUucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHVzaFJvb3RTY29wZShzaXplOiBudW1iZXIsIG93bmVyOiBPd25lcik6IFBhcnRpYWxTY29wZSB7XG4gICAgbGV0IHNjb3BlID0gUGFydGlhbFNjb3BlSW1wbC5zaXplZChzaXplLCBvd25lcik7XG4gICAgdGhpc1tTVEFDS1NdLnNjb3BlLnB1c2goc2NvcGUpO1xuICAgIHJldHVybiBzY29wZTtcbiAgfVxuXG4gIHB1c2hTY29wZShzY29wZTogU2NvcGUpIHtcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucHVzaChzY29wZSk7XG4gIH1cblxuICBwb3BTY29wZSgpIHtcbiAgICB0aGlzW1NUQUNLU10uc2NvcGUucG9wKCk7XG4gIH1cblxuICBwb3BEeW5hbWljU2NvcGUoKSB7XG4gICAgdGhpc1tTVEFDS1NdLmR5bmFtaWNTY29wZS5wb3AoKTtcbiAgfVxuXG4gIC8vLyBTQ09QRSBIRUxQRVJTXG5cbiAgZ2V0T3duZXIoKTogT3duZXIge1xuICAgIHJldHVybiB0aGlzLnNjb3BlKCkub3duZXI7XG4gIH1cblxuICBnZXRTZWxmKCk6IFJlZmVyZW5jZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zY29wZSgpLmdldFNlbGYoKTtcbiAgfVxuXG4gIHJlZmVyZW5jZUZvclN5bWJvbChzeW1ib2w6IG51bWJlcik6IFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUoKS5nZXRTeW1ib2woc3ltYm9sKTtcbiAgfVxuXG4gIC8vLyBFWEVDVVRJT05cblxuICBleGVjdXRlKGluaXRpYWxpemU/OiAodm06IHRoaXMpID0+IHZvaWQpOiBSZW5kZXJSZXN1bHQge1xuICAgIGlmIChERUJVRykge1xuICAgICAgbGV0IGhhc0Vycm9yZWQgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fZXhlY3V0ZShpbml0aWFsaXplKTtcblxuICAgICAgICAvLyB1c2luZyBhIGJvb2xlYW4gaGVyZSB0byBhdm9pZCBicmVha2luZyBlcmdvbm9taWNzIG9mIFwicGF1c2Ugb24gdW5jYXVnaHQgZXhjZXB0aW9uc1wiXG4gICAgICAgIC8vIHdoaWNoIHdvdWxkIGhhcHBlbiB3aXRoIGEgYGNhdGNoYCArIGB0aHJvd2BcbiAgICAgICAgaGFzRXJyb3JlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChoYXNFcnJvcmVkKSB7XG4gICAgICAgICAgLy8gSWYgYW55IGV4aXN0aW5nIGJsb2NrcyBhcmUgb3BlbiwgZHVlIHRvIGFuIGVycm9yIG9yIHNvbWV0aGluZyBsaWtlXG4gICAgICAgICAgLy8gdGhhdCwgd2UgbmVlZCB0byBjbG9zZSB0aGVtIGFsbCBhbmQgY2xlYW4gdGhpbmdzIHVwIHByb3Blcmx5LlxuICAgICAgICAgIGxldCBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHMoKTtcblxuICAgIC