@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
535 lines (421 loc) • 49.4 kB
JavaScript
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=