UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

535 lines (421 loc) 49.4 kB
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } 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; import { assert, Stack, symbol } from '@glimmer/util'; import { clear, ConcreteBounds, CursorImpl, SingleNodeBounds } from '../bounds'; import { destroy, registerDestructor } from '@glimmer/destroyable'; import { dynamicAttribute } from './attributes/dynamic'; var First = /*#__PURE__*/function () { function First(node) { this.node = node; } var _proto = First.prototype; _proto.firstNode = function firstNode() { return this.node; }; return First; }(); var Last = /*#__PURE__*/function () { function Last(node) { this.node = node; } var _proto2 = Last.prototype; _proto2.lastNode = function lastNode() { return this.node; }; return Last; }(); export var Fragment = /*#__PURE__*/function () { function Fragment(bounds) { this.bounds = bounds; } var _proto3 = Fragment.prototype; _proto3.parentElement = function parentElement() { return this.bounds.parentElement(); }; _proto3.firstNode = function firstNode() { return this.bounds.firstNode(); }; _proto3.lastNode = function lastNode() { return this.bounds.lastNode(); }; return Fragment; }(); export var CURSOR_STACK = symbol('CURSOR_STACK'); export var NewElementBuilder = /*#__PURE__*/function () { function NewElementBuilder(env, parentNode, nextSibling) { this.constructing = null; this.operations = null; this[_a] = new Stack(); this.modifierStack = new Stack(); this.blockStack = new Stack(); this.pushElement(parentNode, nextSibling); this.env = env; this.dom = env.getAppendOperations(); this.updateOperations = env.getDOM(); } NewElementBuilder.forInitialRender = function forInitialRender(env, cursor) { return new this(env, cursor.element, cursor.nextSibling).initialize(); }; NewElementBuilder.resume = function resume(env, block) { var parentNode = block.parentElement(); var nextSibling = block.reset(env); var stack = new this(env, parentNode, nextSibling).initialize(); stack.pushLiveBlock(block); return stack; }; var _proto4 = NewElementBuilder.prototype; _proto4.initialize = function initialize() { this.pushSimpleBlock(); return this; }; _proto4.debugBlocks = function debugBlocks() { return this.blockStack.toArray(); }; _proto4.block = function block() { return this.blockStack.current; }; _proto4.popElement = function popElement() { this[CURSOR_STACK].pop(); this[CURSOR_STACK].current; }; _proto4.pushSimpleBlock = function pushSimpleBlock() { return this.pushLiveBlock(new SimpleLiveBlock(this.element)); }; _proto4.pushUpdatableBlock = function pushUpdatableBlock() { return this.pushLiveBlock(new UpdatableBlockImpl(this.element)); }; _proto4.pushBlockList = function pushBlockList(list) { return this.pushLiveBlock(new LiveBlockList(this.element, list)); }; _proto4.pushLiveBlock = function pushLiveBlock(block, isRemote) { if (isRemote === void 0) { isRemote = false; } var current = this.blockStack.current; if (current !== null) { if (!isRemote) { current.didAppendBounds(block); } } this.__openBlock(); this.blockStack.push(block); return block; }; _proto4.popBlock = function popBlock() { this.block().finalize(this); this.__closeBlock(); return this.blockStack.pop(); }; _proto4.__openBlock = function __openBlock() {}; _proto4.__closeBlock = function __closeBlock() {} // todo return seems unused ; _proto4.openElement = function openElement(tag) { var element = this.__openElement(tag); this.constructing = element; return element; }; _proto4.__openElement = function __openElement(tag) { return this.dom.createElement(tag, this.element); }; _proto4.flushElement = function flushElement(modifiers) { var parent = this.element; var element = this.constructing; this.__flushElement(parent, element); this.constructing = null; this.operations = null; this.pushModifiers(modifiers); this.pushElement(element, null); this.didOpenElement(element); }; _proto4.__flushElement = function __flushElement(parent, constructing) { this.dom.insertBefore(parent, constructing, this.nextSibling); }; _proto4.closeElement = function closeElement() { this.willCloseElement(); this.popElement(); return this.popModifiers(); }; _proto4.pushRemoteElement = function pushRemoteElement(element, guid, insertBefore) { return this.__pushRemoteElement(element, guid, insertBefore); }; _proto4.__pushRemoteElement = function __pushRemoteElement(element, _guid, insertBefore) { this.pushElement(element, insertBefore); if (insertBefore === undefined) { while (element.lastChild) { element.removeChild(element.lastChild); } } var block = new RemoteLiveBlock(element); return this.pushLiveBlock(block, true); }; _proto4.popRemoteElement = function popRemoteElement() { this.popBlock(); this.popElement(); }; _proto4.pushElement = function pushElement(element, nextSibling) { if (nextSibling === void 0) { nextSibling = null; } this[CURSOR_STACK].push(new CursorImpl(element, nextSibling)); }; _proto4.pushModifiers = function pushModifiers(modifiers) { this.modifierStack.push(modifiers); }; _proto4.popModifiers = function popModifiers() { return this.modifierStack.pop(); }; _proto4.didAppendBounds = function didAppendBounds(bounds) { this.block().didAppendBounds(bounds); return bounds; }; _proto4.didAppendNode = function didAppendNode(node) { this.block().didAppendNode(node); return node; }; _proto4.didOpenElement = function didOpenElement(element) { this.block().openElement(element); return element; }; _proto4.willCloseElement = function willCloseElement() { this.block().closeElement(); }; _proto4.appendText = function appendText(string) { return this.didAppendNode(this.__appendText(string)); }; _proto4.__appendText = function __appendText(text) { var dom = this.dom, element = this.element, nextSibling = this.nextSibling; var node = dom.createTextNode(text); dom.insertBefore(element, node, nextSibling); return node; }; _proto4.__appendNode = function __appendNode(node) { this.dom.insertBefore(this.element, node, this.nextSibling); return node; }; _proto4.__appendFragment = function __appendFragment(fragment) { var first = fragment.firstChild; if (first) { var ret = new ConcreteBounds(this.element, first, fragment.lastChild); this.dom.insertBefore(this.element, fragment, this.nextSibling); return ret; } else { return new SingleNodeBounds(this.element, this.__appendComment('')); } }; _proto4.__appendHTML = function __appendHTML(html) { return this.dom.insertHTMLBefore(this.element, this.nextSibling, html); }; _proto4.appendDynamicHTML = function appendDynamicHTML(value) { var bounds = this.trustedContent(value); this.didAppendBounds(bounds); }; _proto4.appendDynamicText = function appendDynamicText(value) { var node = this.untrustedContent(value); this.didAppendNode(node); return node; }; _proto4.appendDynamicFragment = function appendDynamicFragment(value) { var bounds = this.__appendFragment(value); this.didAppendBounds(bounds); }; _proto4.appendDynamicNode = function appendDynamicNode(value) { var node = this.__appendNode(value); var bounds = new SingleNodeBounds(this.element, node); this.didAppendBounds(bounds); }; _proto4.trustedContent = function trustedContent(value) { return this.__appendHTML(value); }; _proto4.untrustedContent = function untrustedContent(value) { return this.__appendText(value); }; _proto4.appendComment = function appendComment(string) { return this.didAppendNode(this.__appendComment(string)); }; _proto4.__appendComment = function __appendComment(string) { var dom = this.dom, element = this.element, nextSibling = this.nextSibling; var node = dom.createComment(string); dom.insertBefore(element, node, nextSibling); return node; }; _proto4.__setAttribute = function __setAttribute(name, value, namespace) { this.dom.setAttribute(this.constructing, name, value, namespace); }; _proto4.__setProperty = function __setProperty(name, value) { this.constructing[name] = value; }; _proto4.setStaticAttribute = function setStaticAttribute(name, value, namespace) { this.__setAttribute(name, value, namespace); }; _proto4.setDynamicAttribute = function setDynamicAttribute(name, value, trusting, namespace) { var element = this.constructing; var attribute = dynamicAttribute(element, name, namespace, trusting); attribute.set(this, value, this.env); return attribute; }; _createClass(NewElementBuilder, [{ key: "element", get: function get() { return this[CURSOR_STACK].current.element; } }, { key: "nextSibling", get: function get() { return this[CURSOR_STACK].current.nextSibling; } }, { key: "hasBlocks", get: function get() { return this.blockStack.size > 0; } }]); return NewElementBuilder; }(); _a = CURSOR_STACK; export var SimpleLiveBlock = /*#__PURE__*/function () { function SimpleLiveBlock(parent) { this.parent = parent; this.first = null; this.last = null; this.nesting = 0; } var _proto5 = SimpleLiveBlock.prototype; _proto5.parentElement = function parentElement() { return this.parent; }; _proto5.firstNode = function firstNode() { var first = this.first; return first.firstNode(); }; _proto5.lastNode = function lastNode() { var last = this.last; return last.lastNode(); }; _proto5.openElement = function openElement(element) { this.didAppendNode(element); this.nesting++; }; _proto5.closeElement = function closeElement() { this.nesting--; }; _proto5.didAppendNode = function didAppendNode(node) { if (this.nesting !== 0) return; if (!this.first) { this.first = new First(node); } this.last = new Last(node); }; _proto5.didAppendBounds = function didAppendBounds(bounds) { if (this.nesting !== 0) return; if (!this.first) { this.first = bounds; } this.last = bounds; }; _proto5.finalize = function finalize(stack) { if (this.first === null) { stack.appendComment(''); } }; return SimpleLiveBlock; }(); export var RemoteLiveBlock = /*#__PURE__*/function (_SimpleLiveBlock) { _inheritsLoose(RemoteLiveBlock, _SimpleLiveBlock); function RemoteLiveBlock(parent) { var _this; _this = _SimpleLiveBlock.call(this, parent) || this; registerDestructor(_assertThisInitialized(_this), function () { // In general, you only need to clear the root of a hierarchy, and should never // need to clear any child nodes. This is an important constraint that gives us // a strong guarantee that clearing a subtree is a single DOM operation. // // Because remote blocks are not normally physically nested inside of the tree // that they are logically nested inside, we manually clear remote blocks when // a logical parent is cleared. // // HOWEVER, it is currently possible for a remote block to be physically nested // inside of the block it is logically contained inside of. This happens when // the remote block is appended to the end of the application's entire element. // // The problem with that scenario is that Glimmer believes that it owns more of // the DOM than it actually does. The code is attempting to write past the end // of the Glimmer-managed root, but Glimmer isn't aware of that. // // The correct solution to that problem is for Glimmer to be aware of the end // of the bounds that it owns, and once we make that change, this check could // be removed. // // For now, a more targeted fix is to check whether the node was already removed // and avoid clearing the node if it was. In most cases this shouldn't happen, // so this might hide bugs where the code clears nested nodes unnecessarily, // so we should eventually try to do the correct fix. if (_this.parentElement() === _this.firstNode().parentNode) { clear(_assertThisInitialized(_this)); } }); return _this; } return RemoteLiveBlock; }(SimpleLiveBlock); export var UpdatableBlockImpl = /*#__PURE__*/function (_SimpleLiveBlock2) { _inheritsLoose(UpdatableBlockImpl, _SimpleLiveBlock2); function UpdatableBlockImpl() { return _SimpleLiveBlock2.apply(this, arguments) || this; } var _proto6 = UpdatableBlockImpl.prototype; _proto6.reset = function reset() { destroy(this); var nextSibling = clear(this); this.first = null; this.last = null; this.nesting = 0; return nextSibling; }; return UpdatableBlockImpl; }(SimpleLiveBlock); // FIXME: All the noops in here indicate a modelling problem export var LiveBlockList = /*#__PURE__*/function () { function LiveBlockList(parent, boundList) { this.parent = parent; this.boundList = boundList; this.parent = parent; this.boundList = boundList; } var _proto7 = LiveBlockList.prototype; _proto7.parentElement = function parentElement() { return this.parent; }; _proto7.firstNode = function firstNode() { var head = this.boundList[0]; return head.firstNode(); }; _proto7.lastNode = function lastNode() { var boundList = this.boundList; var tail = boundList[boundList.length - 1]; return tail.lastNode(); }; _proto7.openElement = function openElement(_element) { false && assert(false, 'Cannot openElement directly inside a block list'); }; _proto7.closeElement = function closeElement() { false && assert(false, 'Cannot closeElement directly inside a block list'); }; _proto7.didAppendNode = function didAppendNode(_node) { false && assert(false, 'Cannot create a new node directly inside a block list'); }; _proto7.didAppendBounds = function didAppendBounds(_bounds) {}; _proto7.finalize = function finalize(_stack) { false && assert(this.boundList.length > 0, 'boundsList cannot be empty'); }; return LiveBlockList; }(); export function clientBuilder(env, cursor) { return NewElementBuilder.forInitialRender(env, cursor); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2VsZW1lbnQtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBZUEsU0FBQSxNQUFBLEVBQUEsS0FBQSxFQUFBLE1BQUEsUUFBQSxlQUFBO0FBU0EsU0FBQSxLQUFBLEVBQUEsY0FBQSxFQUFBLFVBQUEsRUFBQSxnQkFBQSxRQUFBLFdBQUE7QUFDQSxTQUFBLE9BQUEsRUFBQSxrQkFBQSxRQUFBLHNCQUFBO0FBQ0EsU0FBQSxnQkFBQSxRQUFBLHNCQUFBOztJQVVBLEs7QUFDRSxpQkFBQSxJQUFBLEVBQW9DO0FBQWhCLFNBQUEsSUFBQSxHQUFBLElBQUE7QUFBb0I7Ozs7U0FFeEMsUyxHQUFBLHFCQUFTO0FBQ1AsV0FBTyxLQUFQLElBQUE7QUFDRCxHOzs7OztJQUdILEk7QUFDRSxnQkFBQSxJQUFBLEVBQW9DO0FBQWhCLFNBQUEsSUFBQSxHQUFBLElBQUE7QUFBb0I7Ozs7VUFFeEMsUSxHQUFBLG9CQUFRO0FBQ04sV0FBTyxLQUFQLElBQUE7QUFDRCxHOzs7OztBQUdILFdBQU0sUUFBTjtBQUdFLG9CQUFBLE1BQUEsRUFBMEI7QUFDeEIsU0FBQSxNQUFBLEdBQUEsTUFBQTtBQUNEOztBQUxIOztBQUFBLFVBT0UsYUFQRixHQU9FLHlCQUFhO0FBQ1gsV0FBTyxLQUFBLE1BQUEsQ0FBUCxhQUFPLEVBQVA7QUFDRCxHQVRIOztBQUFBLFVBV0UsU0FYRixHQVdFLHFCQUFTO0FBQ1AsV0FBTyxLQUFBLE1BQUEsQ0FBUCxTQUFPLEVBQVA7QUFDRCxHQWJIOztBQUFBLFVBZUUsUUFmRixHQWVFLG9CQUFRO0FBQ04sV0FBTyxLQUFBLE1BQUEsQ0FBUCxRQUFPLEVBQVA7QUFDRCxHQWpCSDs7QUFBQTtBQUFBO0FBb0JBLE9BQU8sSUFBTSxZQUFZLEdBQXNCLE1BQU0sQ0FBOUMsY0FBOEMsQ0FBOUM7QUFFUCxXQUFNLGlCQUFOO0FBeUJFLDZCQUFB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Y2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCb3VuZHMsXG4gIEN1cnNvcixcbiAgQ3Vyc29yU3RhY2tTeW1ib2wsXG4gIEVsZW1lbnRCdWlsZGVyLFxuICBFbGVtZW50T3BlcmF0aW9ucyxcbiAgRW52aXJvbm1lbnQsXG4gIEdsaW1tZXJUcmVlQ2hhbmdlcyxcbiAgR2xpbW1lclRyZWVDb25zdHJ1Y3Rpb24sXG4gIExpdmVCbG9jayxcbiAgTWF5YmUsXG4gIE9wdGlvbixcbiAgVXBkYXRhYmxlQmxvY2ssXG4gIE1vZGlmaWVySW5zdGFuY2UsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0LCBleHBlY3QsIFN0YWNrLCBzeW1ib2wgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7XG4gIEF0dHJOYW1lc3BhY2UsXG4gIFNpbXBsZUNvbW1lbnQsXG4gIFNpbXBsZURvY3VtZW50RnJhZ21lbnQsXG4gIFNpbXBsZUVsZW1lbnQsXG4gIFNpbXBsZU5vZGUsXG4gIFNpbXBsZVRleHQsXG59IGZyb20gJ0BzaW1wbGUtZG9tL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBjbGVhciwgQ29uY3JldGVCb3VuZHMsIEN1cnNvckltcGwsIFNpbmdsZU5vZGVCb3VuZHMgfSBmcm9tICcuLi9ib3VuZHMnO1xuaW1wb3J0IHsgZGVzdHJveSwgcmVnaXN0ZXJEZXN0cnVjdG9yIH0gZnJvbSAnQGdsaW1tZXIvZGVzdHJveWFibGUnO1xuaW1wb3J0IHsgRHluYW1pY0F0dHJpYnV0ZSwgZHluYW1pY0F0dHJpYnV0ZSB9IGZyb20gJy4vYXR0cmlidXRlcy9keW5hbWljJztcblxuZXhwb3J0IGludGVyZmFjZSBGaXJzdE5vZGUge1xuICBmaXJzdE5vZGUoKTogU2ltcGxlTm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXN0Tm9kZSB7XG4gIGxhc3ROb2RlKCk6IFNpbXBsZU5vZGU7XG59XG5cbmNsYXNzIEZpcnN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBub2RlOiBTaW1wbGVOb2RlKSB7fVxuXG4gIGZpcnN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlO1xuICB9XG59XG5cbmNsYXNzIExhc3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vZGU6IFNpbXBsZU5vZGUpIHt9XG5cbiAgbGFzdE5vZGUoKTogU2ltcGxlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnJhZ21lbnQgaW1wbGVtZW50cyBCb3VuZHMge1xuICBwcml2YXRlIGJvdW5kczogQm91bmRzO1xuXG4gIGNvbnN0cnVjdG9yKGJvdW5kczogQm91bmRzKSB7XG4gICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gIH1cblxuICBwYXJlbnRFbGVtZW50KCk6IFNpbXBsZUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gIH1cblxuICBmaXJzdE5vZGUoKTogU2ltcGxlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRzLmZpcnN0Tm9kZSgpO1xuICB9XG5cbiAgbGFzdE5vZGUoKTogU2ltcGxlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRzLmxhc3ROb2RlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IENVUlNPUl9TVEFDSzogQ3Vyc29yU3RhY2tTeW1ib2wgPSBzeW1ib2woJ0NVUlNPUl9TVEFDSycpO1xuXG5leHBvcnQgY2xhc3MgTmV3RWxlbWVudEJ1aWxkZXIgaW1wbGVtZW50cyBFbGVtZW50QnVpbGRlciB7XG4gIHB1YmxpYyBkb206IEdsaW1tZXJUcmVlQ29uc3RydWN0aW9uO1xuICBwdWJsaWMgdXBkYXRlT3BlcmF0aW9uczogR2xpbW1lclRyZWVDaGFuZ2VzO1xuICBwdWJsaWMgY29uc3RydWN0aW5nOiBPcHRpb248U2ltcGxlRWxlbWVudD4gPSBudWxsO1xuICBwdWJsaWMgb3BlcmF0aW9uczogT3B0aW9uPEVsZW1lbnRPcGVyYXRpb25zPiA9IG51bGw7XG4gIHByaXZhdGUgZW52OiBFbnZpcm9ubWVudDtcblxuICBbQ1VSU09SX1NUQUNLXSA9IG5ldyBTdGFjazxDdXJzb3I+KCk7XG4gIHByaXZhdGUgbW9kaWZpZXJTdGFjayA9IG5ldyBTdGFjazxPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPj4oKTtcbiAgcHJpdmF0ZSBibG9ja1N0YWNrID0gbmV3IFN0YWNrPExpdmVCbG9jaz4oKTtcblxuICBzdGF0aWMgZm9ySW5pdGlhbFJlbmRlcihlbnY6IEVudmlyb25tZW50LCBjdXJzb3I6IEN1cnNvckltcGwpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoZW52LCBjdXJzb3IuZWxlbWVudCwgY3Vyc29yLm5leHRTaWJsaW5nKS5pbml0aWFsaXplKCk7XG4gIH1cblxuICBzdGF0aWMgcmVzdW1lKGVudjogRW52aXJvbm1lbnQsIGJsb2NrOiBVcGRhdGFibGVCbG9jayk6IE5ld0VsZW1lbnRCdWlsZGVyIHtcbiAgICBsZXQgcGFyZW50Tm9kZSA9IGJsb2NrLnBhcmVudEVsZW1lbnQoKTtcbiAgICBsZXQgbmV4dFNpYmxpbmcgPSBibG9jay5yZXNldChlbnYpO1xuXG4gICAgbGV0IHN0YWNrID0gbmV3IHRoaXMoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykuaW5pdGlhbGl6ZSgpO1xuICAgIHN0YWNrLnB1c2hMaXZlQmxvY2soYmxvY2spO1xuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZW52OiBFbnZpcm9ubWVudCwgcGFyZW50Tm9kZTogU2ltcGxlRWxlbWVudCwgbmV4dFNpYmxpbmc6IE9wdGlvbjxTaW1wbGVOb2RlPikge1xuICAgIHRoaXMucHVzaEVsZW1lbnQocGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcpO1xuXG4gICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgdGhpcy5kb20gPSBlbnYuZ2V0QXBwZW5kT3BlcmF0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlT3BlcmF0aW9ucyA9IGVudi5nZXRET00oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXplKCk6IHRoaXMge1xuICAgIHRoaXMucHVzaFNpbXBsZUJsb2NrKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkZWJ1Z0Jsb2NrcygpOiBMaXZlQmxvY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tTdGFjay50b0FycmF5KCk7XG4gIH1cblxuICBnZXQgZWxlbWVudCgpOiBTaW1wbGVFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpc1tDVVJTT1JfU1RBQ0tdLmN1cnJlbnQhLmVsZW1lbnQ7XG4gIH1cblxuICBnZXQgbmV4dFNpYmxpbmcoKTogT3B0aW9uPFNpbXBsZU5vZGU+IHtcbiAgICByZXR1cm4gdGhpc1tDVVJTT1JfU1RBQ0tdLmN1cnJlbnQhLm5leHRTaWJsaW5nO1xuICB9XG5cbiAgZ2V0IGhhc0Jsb2NrcygpIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja1N0YWNrLnNpemUgPiAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJsb2NrKCk6IExpdmVCbG9jayB7XG4gICAgcmV0dXJuIGV4cGVjdCh0aGlzLmJsb2NrU3RhY2suY3VycmVudCwgJ0V4cGVjdGVkIGEgY3VycmVudCBsaXZlIGJsb2NrJyk7XG4gIH1cblxuICBwb3BFbGVtZW50KCkge1xuICAgIHRoaXNbQ1VSU09SX1NUQUNLXS5wb3AoKTtcbiAgICBleHBlY3QodGhpc1tDVVJTT1JfU1RBQ0tdLmN1cnJlbnQsIFwiY2FuJ3QgcG9wIHBhc3QgdGhlIGxhc3QgZWxlbWVudFwiKTtcbiAgfVxuXG4gIHB1c2hTaW1wbGVCbG9jaygpOiBMaXZlQmxvY2sge1xuICAgIHJldHVybiB0aGlzLnB1c2hMaXZlQmxvY2sobmV3IFNpbXBsZUxpdmVCbG9jayh0aGlzLmVsZW1lbnQpKTtcbiAgfVxuXG4gIHB1c2hVcGRhdGFibGVCbG9jaygpOiBVcGRhdGFibGVCbG9ja0ltcGwge1xuICAgIHJldHVybiB0aGlzLnB1c2hMaXZlQmxvY2sobmV3IFVwZGF0YWJsZUJsb2NrSW1wbCh0aGlzLmVsZW1lbnQpKTtcbiAgfVxuXG4gIHB1c2hCbG9ja0xpc3QobGlzdDogTGl2ZUJsb2NrW10pOiBMaXZlQmxvY2tMaXN0IHtcbiAgICByZXR1cm4gdGhpcy5wdXNoTGl2ZUJsb2NrKG5ldyBMaXZlQmxvY2tMaXN0KHRoaXMuZWxlbWVudCwgbGlzdCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1c2hMaXZlQmxvY2s8VCBleHRlbmRzIExpdmVCbG9jaz4oYmxvY2s6IFQsIGlzUmVtb3RlID0gZmFsc2UpOiBUIHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuYmxvY2tTdGFjay5jdXJyZW50O1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGlmICghaXNSZW1vdGUpIHtcbiAgICAgICAgY3VycmVudC5kaWRBcHBlbmRCb3VuZHMoYmxvY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX19vcGVuQmxvY2soKTtcbiAgICB0aGlzLmJsb2NrU3RhY2sucHVzaChibG9jayk7XG4gICAgcmV0dXJuIGJsb2NrO1xuICB9XG5cbiAgcG9wQmxvY2soKTogTGl2ZUJsb2NrIHtcbiAgICB0aGlzLmJsb2NrKCkuZmluYWxpemUodGhpcyk7XG4gICAgdGhpcy5fX2Nsb3NlQmxvY2soKTtcbiAgICByZXR1cm4gZXhwZWN0KHRoaXMuYmxvY2tTdGFjay5wb3AoKSwgJ0V4cGVjdGVkIHBvcEJsb2NrIHRvIHJldHVybiBhIGJsb2NrJyk7XG4gIH1cblxuICBfX29wZW5CbG9jaygpOiB2b2lkIHt9XG4gIF9fY2xvc2VCbG9jaygpOiB2b2lkIHt9XG5cbiAgLy8gdG9kbyByZXR1cm4gc2VlbXMgdW51c2VkXG4gIG9wZW5FbGVtZW50KHRhZzogc3RyaW5nKTogU2ltcGxlRWxlbWVudCB7XG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLl9fb3BlbkVsZW1lbnQodGFnKTtcbiAgICB0aGlzLmNvbnN0cnVjdGluZyA9IGVsZW1lbnQ7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIF9fb3BlbkVsZW1lbnQodGFnOiBzdHJpbmcpOiBTaW1wbGVFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5kb20uY3JlYXRlRWxlbWVudCh0YWcsIHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBmbHVzaEVsZW1lbnQobW9kaWZpZXJzOiBPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPikge1xuICAgIGxldCBwYXJlbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgbGV0IGVsZW1lbnQgPSBleHBlY3QoXG4gICAgICB0aGlzLmNvbnN0cnVjdGluZyxcbiAgICAgIGBmbHVzaEVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gY29uc3RydWN0aW5nIGFuIGVsZW1lbnRgXG4gICAgKTtcblxuICAgIHRoaXMuX19mbHVzaEVsZW1lbnQocGFyZW50LCBlbGVtZW50KTtcblxuICAgIHRoaXMuY29uc3RydWN0aW5nID0gbnVsbDtcbiAgICB0aGlzLm9wZXJhdGlvbnMgPSBudWxsO1xuXG4gICAgdGhpcy5wdXNoTW9kaWZpZXJzKG1vZGlmaWVycyk7XG4gICAgdGhpcy5wdXNoRWxlbWVudChlbGVtZW50LCBudWxsKTtcbiAgICB0aGlzLmRpZE9wZW5FbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgX19mbHVzaEVsZW1lbnQocGFyZW50OiBTaW1wbGVFbGVtZW50LCBjb25zdHJ1Y3Rpbmc6IFNpbXBsZUVsZW1lbnQpIHtcbiAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUocGFyZW50LCBjb25zdHJ1Y3RpbmcsIHRoaXMubmV4dFNpYmxpbmcpO1xuICB9XG5cbiAgY2xvc2VFbGVtZW50KCk6IE9wdGlvbjxNb2RpZmllckluc3RhbmNlW10+IHtcbiAgICB0aGlzLndpbGxDbG9zZUVsZW1lbnQoKTtcbiAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5wb3BNb2RpZmllcnMoKTtcbiAgfVxuXG4gIHB1c2hSZW1vdGVFbGVtZW50KFxuICAgIGVsZW1lbnQ6IFNpbXBsZUVsZW1lbnQsXG4gICAgZ3VpZDogc3RyaW5nLFxuICAgIGluc2VydEJlZm9yZTogTWF5YmU8U2ltcGxlTm9kZT5cbiAgKTogT3B0aW9uPFJlbW90ZUxpdmVCbG9jaz4ge1xuICAgIHJldHVybiB0aGlzLl9fcHVzaFJlbW90ZUVsZW1lbnQoZWxlbWVudCwgZ3VpZCwgaW5zZXJ0QmVmb3JlKTtcbiAgfVxuXG4gIF9fcHVzaFJlbW90ZUVsZW1lbnQoXG4gICAgZWxlbWVudDogU2ltcGxlRWxlbWVudCxcbiAgICBfZ3VpZDogc3RyaW5nLFxuICAgIGluc2VydEJlZm9yZTogTWF5YmU8U2ltcGxlTm9kZT5cbiAgKTogT3B0aW9uPFJlbW90ZUxpdmVCbG9jaz4ge1xuICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgaW5zZXJ0QmVmb3JlKTtcblxuICAgIGlmIChpbnNlcnRCZWZvcmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgd2hpbGUgKGVsZW1lbnQubGFzdENoaWxkKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5sYXN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBibG9jayA9IG5ldyBSZW1vdGVMaXZlQmxvY2soZWxlbWVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoTGl2ZUJsb2NrKGJsb2NrLCB0cnVlKTtcbiAgfVxuXG4gIHBvcFJlbW90ZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5wb3BCbG9jaygpO1xuICAgIHRoaXMucG9wRWxlbWVudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1c2hFbGVtZW50KGVsZW1lbnQ6IFNpbXBsZUVsZW1lbnQsIG5leHRTaWJsaW5nOiBNYXliZTxTaW1wbGVOb2RlPiA9IG51bGwpIHtcbiAgICB0aGlzW0NVUlNPUl9TVEFDS10ucHVzaChuZXcgQ3Vyc29ySW1wbChlbGVtZW50LCBuZXh0U2libGluZykpO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXNoTW9kaWZpZXJzKG1vZGlmaWVyczogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4pOiB2b2lkIHtcbiAgICB0aGlzLm1vZGlmaWVyU3RhY2sucHVzaChtb2RpZmllcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3BNb2RpZmllcnMoKTogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLm1vZGlmaWVyU3RhY2sucG9wKCk7XG4gIH1cblxuICBkaWRBcHBlbmRCb3VuZHMoYm91bmRzOiBCb3VuZHMpOiBCb3VuZHMge1xuICAgIHRoaXMuYmxvY2soKS5kaWRBcHBlbmRCb3VuZHMoYm91bmRzKTtcbiAgICByZXR1cm4gYm91bmRzO1xuICB9XG5cbiAgZGlkQXBwZW5kTm9kZTxUIGV4dGVuZHMgU2ltcGxlTm9kZT4obm9kZTogVCk6IFQge1xuICAgIHRoaXMuYmxvY2soKS5kaWRBcHBlbmROb2RlKG5vZGUpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZGlkT3BlbkVsZW1lbnQoZWxlbWVudDogU2ltcGxlRWxlbWVudCk6IFNpbXBsZUVsZW1lbnQge1xuICAgIHRoaXMuYmxvY2soKS5vcGVuRWxlbWVudChlbGVtZW50KTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHdpbGxDbG9zZUVsZW1lbnQoKSB7XG4gICAgdGhpcy5ibG9jaygpLmNsb3NlRWxlbWVudCgpO1xuICB9XG5cbiAgYXBwZW5kVGV4dChzdHJpbmc6IHN0cmluZyk6IFNpbXBsZVRleHQge1xuICAgIHJldHVybiB0aGlzLmRpZEFwcGVuZE5vZGUodGhpcy5fX2FwcGVuZFRleHQoc3RyaW5nKSk7XG4gIH1cblxuICBfX2FwcGVuZFRleHQodGV4dDogc3RyaW5nKTogU2ltcGxlVGV4dCB7XG4gICAgbGV0IHsgZG9tLCBlbGVtZW50LCBuZXh0U2libGluZyB9ID0gdGhpcztcbiAgICBsZXQgbm9kZSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbiAgICBkb20uaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5vZGUsIG5leHRTaWJsaW5nKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIF9fYXBwZW5kTm9kZShub2RlOiBTaW1wbGVOb2RlKTogU2ltcGxlTm9kZSB7XG4gICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgbm9kZSwgdGhpcy5uZXh0U2libGluZyk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBfX2FwcGVuZEZyYWdtZW50KGZyYWdtZW50OiBTaW1wbGVEb2N1bWVudEZyYWdtZW50KTogQm91bmRzIHtcbiAgICBsZXQgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0KSB7XG4gICAgICBsZXQgcmV0ID0gbmV3IENvbmNyZXRlQm91bmRzKHRoaXMuZWxlbWVudCwgZmlyc3QsIGZyYWdtZW50Lmxhc3RDaGlsZCEpO1xuICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgZnJhZ21lbnQsIHRoaXMubmV4dFNpYmxpbmcpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBTaW5nbGVOb2RlQm91bmRzKHRoaXMuZWxlbWVudCwgdGhpcy5fX2FwcGVuZENvbW1lbnQoJycpKTtcbiAgICB9XG4gIH1cblxuICBfX2FwcGVuZEhUTUwoaHRtbDogc3RyaW5nKTogQm91bmRzIHtcbiAgICByZXR1cm4gdGhpcy5kb20uaW5zZXJ0SFRNTEJlZm9yZSh0aGlzLmVsZW1lbnQsIHRoaXMubmV4dFNpYmxpbmcsIGh0bWwpO1xuICB9XG5cbiAgYXBwZW5kRHluYW1pY0hUTUwodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBib3VuZHMgPSB0aGlzLnRydXN0ZWRDb250ZW50KHZhbHVlKTtcbiAgICB0aGlzLmRpZEFwcGVuZEJvdW5kcyhib3VuZHMpO1xuICB9XG5cbiAgYXBwZW5kRHluYW1pY1RleHQodmFsdWU6IHN0cmluZyk6IFNpbXBsZVRleHQge1xuICAgIGxldCBub2RlID0gdGhpcy51bnRydXN0ZWRDb250ZW50KHZhbHVlKTtcbiAgICB0aGlzLmRpZEFwcGVuZE5vZGUobm9kZSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBhcHBlbmREeW5hbWljRnJhZ21lbnQodmFsdWU6IFNpbXBsZURvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBsZXQgYm91bmRzID0gdGhpcy5fX2FwcGVuZEZyYWdtZW50KHZhbHVlKTtcbiAgICB0aGlzLmRpZEFwcGVuZEJvdW5kcyhib3VuZHMpO1xuICB9XG5cbiAgYXBwZW5kRHluYW1pY05vZGUodmFsdWU6IFNpbXBsZU5vZGUpOiB2b2lkIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuX19hcHBlbmROb2RlKHZhbHVlKTtcbiAgICBsZXQgYm91bmRzID0gbmV3IFNpbmdsZU5vZGVCb3VuZHModGhpcy5lbGVtZW50LCBub2RlKTtcbiAgICB0aGlzLmRpZEFwcGVuZEJvdW5kcyhib3VuZHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnVzdGVkQ29udGVudCh2YWx1ZTogc3RyaW5nKTogQm91bmRzIHtcbiAgICByZXR1cm4gdGhpcy5fX2FwcGVuZEhUTUwodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnRydXN0ZWRDb250ZW50KHZhbHVlOiBzdHJpbmcpOiBTaW1wbGVUZXh0IHtcbiAgICByZXR1cm4gdGhpcy5fX2FwcGVuZFRleHQodmFsdWUpO1xuICB9XG5cbiAgYXBwZW5kQ29tbWVudChzdHJpbmc6IHN0cmluZyk6IFNpbXBsZUNvbW1lbnQge1xuICAgIHJldHVybiB0aGlzLmRpZEFwcGVuZE5vZGUodGhpcy5fX2FwcGVuZENvbW1lbnQoc3RyaW5nKSk7XG4gIH1cblxuICBfX2FwcGVuZENvbW1lbnQoc3RyaW5nOiBzdHJpbmcpOiBTaW1wbGVDb21tZW50IHtcbiAgICBsZXQgeyBkb20sIGVsZW1lbnQsIG5leHRTaWJsaW5nIH0gPSB0aGlzO1xuICAgIGxldCBub2RlID0gZG9tLmNyZWF0ZUNvbW1lbnQoc3RyaW5nKTtcbiAgICBkb20uaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5vZGUsIG5leHRTaWJsaW5nKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIF9fc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbmFtZXNwYWNlOiBPcHRpb248QXR0ck5hbWVzcGFjZT4pOiB2b2lkIHtcbiAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUodGhpcy5jb25zdHJ1Y3RpbmchLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIF9fc2V0UHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgICh0aGlzLmNvbnN0cnVjdGluZyEgYXMgYW55KVtuYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgc2V0U3RhdGljQXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbmFtZXNwYWNlOiBPcHRpb248QXR0ck5hbWVzcGFjZT4pOiB2b2lkIHtcbiAgICB0aGlzLl9fc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgc2V0RHluYW1pY0F0dHJpYnV0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdHJ1c3Rpbmc6IGJvb2xlYW4sXG4gICAgbmFtZXNwYWNlOiBPcHRpb248QXR0ck5hbWVzcGFjZT5cbiAgKTogRHluYW1pY0F0dHJpYnV0ZSB7XG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLmNvbnN0cnVjdGluZyE7XG4gICAgbGV0IGF0dHJpYnV0ZSA9IGR5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgbmFtZXNwYWNlLCB0cnVzdGluZyk7XG4gICAgYXR0cmlidXRlLnNldCh0aGlzLCB2YWx1ZSwgdGhpcy5lbnYpO1xuICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNpbXBsZUxpdmVCbG9jayBpbXBsZW1lbnRzIExpdmVCbG9jayB7XG4gIHByb3RlY3RlZCBmaXJzdDogT3B0aW9uPEZpcnN0Tm9kZT4gPSBudWxsO1xuICBwcm90ZWN0ZWQgbGFzdDogT3B0aW9uPExhc3ROb2RlPiA9IG51bGw7XG4gIHByb3RlY3RlZCBuZXN0aW5nID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudDogU2ltcGxlRWxlbWVudCkge31cblxuICBwYXJlbnRFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgfVxuXG4gIGZpcnN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICBsZXQgZmlyc3QgPSBleHBlY3QoXG4gICAgICB0aGlzLmZpcnN0LFxuICAgICAgJ2Nhbm5vdCBjYWxsIGBmaXJzdE5vZGUoKWAgd2hpbGUgYFNpbXBsZUxpdmVCbG9ja2AgaXMgc3RpbGwgaW5pdGlhbGl6aW5nJ1xuICAgICk7XG5cbiAgICByZXR1cm4gZmlyc3QuZmlyc3ROb2RlKCk7XG4gIH1cblxuICBsYXN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICBsZXQgbGFzdCA9IGV4cGVjdChcbiAgICAgIHRoaXMubGFzdCxcbiAgICAgICdjYW5ub3QgY2FsbCBgbGFzdE5vZGUoKWAgd2hpbGUgYFNpbXBsZUxpdmVCbG9ja2AgaXMgc3RpbGwgaW5pdGlhbGl6aW5nJ1xuICAgICk7XG5cbiAgICByZXR1cm4gbGFzdC5sYXN0Tm9kZSgpO1xuICB9XG5cbiAgb3BlbkVsZW1lbnQoZWxlbWVudDogU2ltcGxlRWxlbWVudCkge1xuICAgIHRoaXMuZGlkQXBwZW5kTm9kZShlbGVtZW50KTtcbiAgICB0aGlzLm5lc3RpbmcrKztcbiAgfVxuXG4gIGNsb3NlRWxlbWVudCgpIHtcbiAgICB0aGlzLm5lc3RpbmctLTtcbiAgfVxuXG4gIGRpZEFwcGVuZE5vZGUobm9kZTogU2ltcGxlTm9kZSkge1xuICAgIGlmICh0aGlzLm5lc3RpbmcgIT09IDApIHJldHVybjtcblxuICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgdGhpcy5maXJzdCA9IG5ldyBGaXJzdChub2RlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3QgPSBuZXcgTGFzdChub2RlKTtcbiAgfVxuXG4gIGRpZEFwcGVuZEJvdW5kcyhib3VuZHM6IEJvdW5kcykge1xuICAgIGlmICh0aGlzLm5lc3RpbmcgIT09IDApIHJldHVybjtcblxuICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgdGhpcy5maXJzdCA9IGJvdW5kcztcbiAgICB9XG5cbiAgICB0aGlzLmxhc3QgPSBib3VuZHM7XG4gIH1cblxuICBmaW5hbGl6ZShzdGFjazogRWxlbWVudEJ1aWxkZXIpIHtcbiAgICBpZiAodGhpcy5maXJzdCA9PT0gbnVsbCkge1xuICAgICAgc3RhY2suYXBwZW5kQ29tbWVudCgnJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZW1vdGVMaXZlQmxvY2sgZXh0ZW5kcyBTaW1wbGVMaXZlQmxvY2sge1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFNpbXBsZUVsZW1lbnQpIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuXG4gICAgcmVnaXN0ZXJEZXN0cnVjdG9yKHRoaXMsICgpID0+IHtcbiAgICAgIC8vIEluIGdlbmVyYWwsIHlvdSBvbmx5IG5lZWQgdG8gY2xlYXIgdGhlIHJvb3Qgb2YgYSBoaWVyYXJjaHksIGFuZCBzaG91bGQgbmV2ZXJcbiAgICAgIC8vIG5lZWQgdG8gY2xlYXIgYW55IGNoaWxkIG5vZGVzLiBUaGlzIGlzIGFuIGltcG9ydGFudCBjb25zdHJhaW50IHRoYXQgZ2l2ZXMgdXNcbiAgICAgIC8vIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGNsZWFyaW5nIGEgc3VidHJlZSBpcyBhIHNpbmdsZSBET00gb3BlcmF0aW9uLlxuICAgICAgLy9cbiAgICAgIC8vIEJlY2F1c2UgcmVtb3RlIGJsb2NrcyBhcmUgbm90IG5vcm1hbGx5IHBoeXNpY2FsbHkgbmVzdGVkIGluc2lkZSBvZiB0aGUgdHJlZVxuICAgICAgLy8gdGhhdCB0aGV5IGFyZSBsb2dpY2FsbHkgbmVzdGVkIGluc2lkZSwgd2UgbWFudWFsbHkgY2xlYXIgcmVtb3RlIGJsb2NrcyB3aGVuXG4gICAgICAvLyBhIGxvZ2ljYWwgcGFyZW50IGlzIGNsZWFyZWQuXG4gICAgICAvL1xuICAgICAgLy8gSE9XRVZFUiwgaXQgaXMgY3VycmVudGx5IHBvc3NpYmxlIGZvciBhIHJlbW90ZSBibG9jayB0byBiZSBwaHlzaWNhbGx5IG5lc3RlZFxuICAgICAgLy8gaW5zaWRlIG9mIHRoZSBibG9jayBpdCBpcyBsb2dpY2FsbHkgY29udGFpbmVkIGluc2lkZSBvZi4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHRoZSByZW1vdGUgYmxvY2sgaXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgYXBwbGljYXRpb24ncyBlbnRpcmUgZWxlbWVudC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcHJvYmxlbSB3aXRoIHRoYXQgc2NlbmFyaW8gaXMgdGhhdCBHbGltbWVyIGJlbGlldmVzIHRoYXQgaXQgb3ducyBtb3JlIG9mXG4gICAgICAvLyB0aGUgRE9NIHRoYW4gaXQgYWN0dWFsbHkgZG9lcy4gVGhlIGNvZGUgaXMgYXR0ZW1wdGluZyB0byB3cml0ZSBwYXN0IHRoZSBlbmRcbiAgICAgIC8vIG9mIHRoZSBHbGltbWVyLW1hbmFnZWQgcm9vdCwgYnV0IEdsaW1tZXIgaXNuJ3QgYXdhcmUgb2YgdGhhdC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgY29ycmVjdCBzb2x1dGlvbiB0byB0aGF0IHByb2JsZW0gaXMgZm9yIEdsaW1tZXIgdG8gYmUgYXdhcmUgb2YgdGhlIGVuZFxuICAgICAgLy8gb2YgdGhlIGJvdW5kcyB0aGF0IGl0IG93bnMsIGFuZCBvbmNlIHdlIG1ha2UgdGhhdCBjaGFuZ2UsIHRoaXMgY2hlY2sgY291bGRcbiAgICAgIC8vIGJlIHJlbW92ZWQuXG4gICAgICAvL1xuICAgICAgLy8gRm9yIG5vdywgYSBtb3JlIHRhcmdldGVkIGZpeCBpcyB0byBjaGVjayB3aGV0aGVyIHRoZSBub2RlIHdhcyBhbHJlYWR5IHJlbW92ZWRcbiAgICAgIC8vIGFuZCBhdm9pZCBjbGVhcmluZyB0aGUgbm9kZSBpZiBpdCB3YXMuIEluIG1vc3QgY2FzZXMgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLFxuICAgICAgLy8gc28gdGhpcyBtaWdodCBoaWRlIGJ1Z3Mgd2hlcmUgdGhlIGNvZGUgY2xlYXJzIG5lc3RlZCBub2RlcyB1bm5lY2Vzc2FyaWx5LFxuICAgICAgLy8gc28gd2Ugc2hvdWxkIGV2ZW50dWFsbHkgdHJ5IHRvIGRvIHRoZSBjb3JyZWN0IGZpeC5cbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQoKSA9PT0gdGhpcy5maXJzdE5vZGUoKS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNsZWFyKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGFibGVCbG9ja0ltcGwgZXh0ZW5kcyBTaW1wbGVMaXZlQmxvY2sgaW1wbGVtZW50cyBVcGRhdGFibGVCbG9jayB7XG4gIHJlc2V0KCk6IE9wdGlvbjxTaW1wbGVOb2RlPiB7XG4gICAgZGVzdHJveSh0aGlzKTtcbiAgICBsZXQgbmV4dFNpYmxpbmcgPSBjbGVhcih0aGlzKTtcblxuICAgIHRoaXMuZmlyc3QgPSBudWxsO1xuICAgIHRoaXMubGFzdCA9IG51bGw7XG4gICAgdGhpcy5uZXN0aW5nID0gMDtcblxuICAgIHJldHVybiBuZXh0U2libGluZztcbiAgfVxufVxuXG4vLyBGSVhNRTogQWxsIHRoZSBub29wcyBpbiBoZXJlIGluZGljYXRlIGEgbW9kZWxsaW5nIHByb2JsZW1cbmV4cG9ydCBjbGFzcyBMaXZlQmxvY2tMaXN0IGltcGxlbWVudHMgTGl2ZUJsb2NrIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsIHB1YmxpYyBib3VuZExpc3Q6IExpdmVCbG9ja1tdKSB7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5ib3VuZExpc3QgPSBib3VuZExpc3Q7XG4gIH1cblxuICBwYXJlbnRFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgfVxuXG4gIGZpcnN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICBsZXQgaGVhZCA9IGV4cGVjdChcbiAgICAgIHRoaXMuYm91bmRMaXN0WzBdLFxuICAgICAgJ2Nhbm5vdCBjYWxsIGBmaXJzdE5vZGUoKWAgd2hpbGUgYExpdmVCbG9ja0xpc3RgIGlzIHN0aWxsIGluaXRpYWxpemluZydcbiAgICApO1xuXG4gICAgcmV0dXJuIGhlYWQuZmlyc3ROb2RlKCk7XG4gIH1cblxuICBsYXN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICBsZXQgYm91bmRMaXN0ID0gdGhpcy5ib3VuZExpc3Q7XG5cbiAgICBsZXQgdGFpbCA9IGV4cGVjdChcbiAgICAgIGJvdW5kTGlzdFtib3VuZExpc3QubGVuZ3RoIC0gMV0sXG4gICAgICAnY2Fubm90IGNhbGwgYGxhc3ROb2RlKClgIHdoaWxlIGBMaXZlQmxvY2tMaXN0YCBpcyBzdGlsbCBpbml0aWFsaXppbmcnXG4gICAgKTtcblxuICAgIHJldHVybiB0YWlsLmxhc3ROb2RlKCk7XG4gIH1cblxuICBvcGVuRWxlbWVudChfZWxlbWVudDogU2ltcGxlRWxlbWVudCkge1xuICAgIGFzc2VydChmYWxzZSwgJ0Nhbm5vdCBvcGVuRWxlbWVudCBkaXJlY3RseSBpbnNpZGUgYSBibG9jayBsaXN0Jyk7XG4gIH1cblxuICBjbG9zZUVsZW1lbnQoKSB7XG4gICAgYXNzZXJ0KGZhbHNlLCAnQ2Fubm90IGNsb3NlRWxlbWVudCBkaXJlY3RseSBpbnNpZGUgYSBibG9jayBsaXN0Jyk7XG4gIH1cblxuICBkaWRBcHBlbmROb2RlKF9ub2RlOiBTaW1wbGVOb2RlKSB7XG4gICAgYXNzZXJ0KGZhbHNlLCAnQ2Fubm90IGNyZWF0ZSBhIG5ldyBub2RlIGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgfVxuXG4gIGRpZEFwcGVuZEJvdW5kcyhfYm91bmRzOiBCb3VuZHMpIHt9XG5cbiAgZmluYWxpemUoX3N0YWNrOiBFbGVtZW50QnVpbGRlcikge1xuICAgIGFzc2VydCh0aGlzLmJvdW5kTGlzdC5sZW5ndGggPiAwLCAnYm91bmRzTGlzdCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xpZW50QnVpbGRlcihlbnY6IEVudmlyb25tZW50LCBjdXJzb3I6IEN1cnNvckltcGwpOiBFbGVtZW50QnVpbGRlciB7XG4gIHJldHVybiBOZXdFbGVtZW50QnVpbGRlci5mb3JJbml0aWFsUmVuZGVyKGVudiwgY3Vyc29yKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=