UNPKG

@glimmer/compiler

Version:
397 lines (330 loc) 48.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BLOCK_KEYWORDS = void 0; var _syntax = require("@glimmer/syntax"); var _result = require("../../../shared/result"); var mir = _interopRequireWildcard(require("../../2-encoding/mir")); var _expressions = require("../visitors/expressions"); var _statements = require("../visitors/statements"); var _impl = require("./impl"); var _curry = require("./utils/curry"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var BLOCK_KEYWORDS = (0, _impl.keywords)('Block').kw('in-element', { assert: function assert(node) { var args = node.args; var guid = args.get('guid'); if (guid) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("Cannot pass `guid` to `{{#in-element}}`", guid.loc)); } var insertBefore = args.get('insertBefore'); var destination = args.nth(0); if (destination === null) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#in-element}} requires a target element as its first positional parameter", args.loc)); } // TODO Better syntax checks return (0, _result.Ok)({ insertBefore: insertBefore, destination: destination }); }, translate: function translate(_ref, _ref2) { var node = _ref.node, state = _ref.state; var insertBefore = _ref2.insertBefore, destination = _ref2.destination; var named = node.blocks.get('default'); var body = _statements.VISIT_STMTS.NamedBlock(named, state); var destinationResult = _expressions.VISIT_EXPRS.visit(destination, state); return _result.Result.all(body, destinationResult).andThen(function (_ref3) { var body = _ref3[0], destination = _ref3[1]; if (insertBefore) { return _expressions.VISIT_EXPRS.visit(insertBefore, state).mapOk(function (insertBefore) { return { body: body, destination: destination, insertBefore: insertBefore }; }); } else { return (0, _result.Ok)({ body: body, destination: destination, insertBefore: new mir.Missing({ loc: node.callee.loc.collapse('end') }) }); } }).mapOk(function (_ref4) { var body = _ref4.body, destination = _ref4.destination, insertBefore = _ref4.insertBefore; return new mir.InElement({ loc: node.loc, block: body, insertBefore: insertBefore, guid: state.generateUniqueCursor(), destination: destination }); }); } }).kw('if', { assert: function assert(node) { var args = node.args; if (!args.named.isEmpty()) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#if}} cannot receive named parameters, received " + args.named.entries.map(function (e) { return e.name.chars; }).join(', '), node.loc)); } if (args.positional.size > 1) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#if}} can only receive one positional parameter in block form, the conditional value. Received " + args.positional.size + " parameters", node.loc)); } var condition = args.nth(0); if (condition === null) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#if}} requires a condition as its first positional parameter, did not receive any parameters", node.loc)); } return (0, _result.Ok)({ condition: condition }); }, translate: function translate(_ref5, _ref6) { var node = _ref5.node, state = _ref5.state; var condition = _ref6.condition; var block = node.blocks.get('default'); var inverse = node.blocks.get('else'); var conditionResult = _expressions.VISIT_EXPRS.visit(condition, state); var blockResult = _statements.VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? _statements.VISIT_STMTS.NamedBlock(inverse, state) : (0, _result.Ok)(null); return _result.Result.all(conditionResult, blockResult, inverseResult).mapOk(function (_ref7) { var condition = _ref7[0], block = _ref7[1], inverse = _ref7[2]; return new mir.If({ loc: node.loc, condition: condition, block: block, inverse: inverse }); }); } }).kw('unless', { assert: function assert(node) { var args = node.args; if (!args.named.isEmpty()) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#unless}} cannot receive named parameters, received " + args.named.entries.map(function (e) { return e.name.chars; }).join(', '), node.loc)); } if (args.positional.size > 1) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#unless}} can only receive one positional parameter in block form, the conditional value. Received " + args.positional.size + " parameters", node.loc)); } var condition = args.nth(0); if (condition === null) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#unless}} requires a condition as its first positional parameter, did not receive any parameters", node.loc)); } return (0, _result.Ok)({ condition: condition }); }, translate: function translate(_ref8, _ref9) { var node = _ref8.node, state = _ref8.state; var condition = _ref9.condition; var block = node.blocks.get('default'); var inverse = node.blocks.get('else'); var conditionResult = _expressions.VISIT_EXPRS.visit(condition, state); var blockResult = _statements.VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? _statements.VISIT_STMTS.NamedBlock(inverse, state) : (0, _result.Ok)(null); return _result.Result.all(conditionResult, blockResult, inverseResult).mapOk(function (_ref10) { var condition = _ref10[0], block = _ref10[1], inverse = _ref10[2]; return new mir.If({ loc: node.loc, condition: new mir.Not({ value: condition, loc: node.loc }), block: block, inverse: inverse }); }); } }).kw('each', { assert: function assert(node) { var args = node.args; if (!args.named.entries.every(function (e) { return e.name.chars === 'key'; })) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#each}} can only receive the 'key' named parameter, received " + args.named.entries.filter(function (e) { return e.name.chars !== 'key'; }).map(function (e) { return e.name.chars; }).join(', '), args.named.loc)); } if (args.positional.size > 1) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#each}} can only receive one positional parameter, the collection being iterated. Received " + args.positional.size + " parameters", args.positional.loc)); } var value = args.nth(0); var key = args.get('key'); if (value === null) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#each}} requires an iterable value to be passed as its first positional parameter, did not receive any parameters", args.loc)); } return (0, _result.Ok)({ value: value, key: key }); }, translate: function translate(_ref11, _ref12) { var node = _ref11.node, state = _ref11.state; var value = _ref12.value, key = _ref12.key; var block = node.blocks.get('default'); var inverse = node.blocks.get('else'); var valueResult = _expressions.VISIT_EXPRS.visit(value, state); var keyResult = key ? _expressions.VISIT_EXPRS.visit(key, state) : (0, _result.Ok)(null); var blockResult = _statements.VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? _statements.VISIT_STMTS.NamedBlock(inverse, state) : (0, _result.Ok)(null); return _result.Result.all(valueResult, keyResult, blockResult, inverseResult).mapOk(function (_ref13) { var value = _ref13[0], key = _ref13[1], block = _ref13[2], inverse = _ref13[3]; return new mir.Each({ loc: node.loc, value: value, key: key, block: block, inverse: inverse }); }); } }).kw('with', { assert: function assert(node) { var args = node.args; if (!args.named.isEmpty()) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#with}} cannot receive named parameters, received " + args.named.entries.map(function (e) { return e.name.chars; }).join(', '), args.named.loc)); } if (args.positional.size > 1) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#with}} can only receive one positional parameter. Received " + args.positional.size + " parameters", args.positional.loc)); } var value = args.nth(0); if (value === null) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#with}} requires a value as its first positional parameter, did not receive any parameters", args.loc)); } return (0, _result.Ok)({ value: value }); }, translate: function translate(_ref14, _ref15) { var node = _ref14.node, state = _ref14.state; var value = _ref15.value; var block = node.blocks.get('default'); var inverse = node.blocks.get('else'); var valueResult = _expressions.VISIT_EXPRS.visit(value, state); var blockResult = _statements.VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? _statements.VISIT_STMTS.NamedBlock(inverse, state) : (0, _result.Ok)(null); return _result.Result.all(valueResult, blockResult, inverseResult).mapOk(function (_ref16) { var value = _ref16[0], block = _ref16[1], inverse = _ref16[2]; return new mir.With({ loc: node.loc, value: value, block: block, inverse: inverse }); }); } }).kw('let', { assert: function assert(node) { var args = node.args; if (!args.named.isEmpty()) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#let}} cannot receive named parameters, received " + args.named.entries.map(function (e) { return e.name.chars; }).join(', '), args.named.loc)); } if (args.positional.size === 0) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#let}} requires at least one value as its first positional parameter, did not receive any parameters", args.positional.loc)); } if (node.blocks.get('else')) { return (0, _result.Err)((0, _syntax.generateSyntaxError)("{{#let}} cannot receive an {{else}} block", args.positional.loc)); } return (0, _result.Ok)({ positional: args.positional }); }, translate: function translate(_ref17, _ref18) { var node = _ref17.node, state = _ref17.state; var positional = _ref18.positional; var block = node.blocks.get('default'); var positionalResult = _expressions.VISIT_EXPRS.Positional(positional, state); var blockResult = _statements.VISIT_STMTS.NamedBlock(block, state); return _result.Result.all(positionalResult, blockResult).mapOk(function (_ref19) { var positional = _ref19[0], block = _ref19[1]; return new mir.Let({ loc: node.loc, positional: positional, block: block }); }); } }).kw('-with-dynamic-vars', { assert: function assert(node) { return (0, _result.Ok)({ named: node.args.named }); }, translate: function translate(_ref20, _ref21) { var node = _ref20.node, state = _ref20.state; var named = _ref21.named; var block = node.blocks.get('default'); var namedResult = _expressions.VISIT_EXPRS.NamedArguments(named, state); var blockResult = _statements.VISIT_STMTS.NamedBlock(block, state); return _result.Result.all(namedResult, blockResult).mapOk(function (_ref22) { var named = _ref22[0], block = _ref22[1]; return new mir.WithDynamicVars({ loc: node.loc, named: named, block: block }); }); } }).kw('component', { assert: (0, _curry.assertCurryKeyword)(0 /* Component */ ), translate: function translate(_ref23, _ref24) { var node = _ref23.node, state = _ref23.state; var definition = _ref24.definition, args = _ref24.args; var definitionResult = _expressions.VISIT_EXPRS.visit(definition, state); var argsResult = _expressions.VISIT_EXPRS.Args(args, state); var blocksResult = _statements.VISIT_STMTS.NamedBlocks(node.blocks, state); return _result.Result.all(definitionResult, argsResult, blocksResult).mapOk(function (_ref25) { var definition = _ref25[0], args = _ref25[1], blocks = _ref25[2]; return new mir.InvokeComponent({ loc: node.loc, definition: definition, args: args, blocks: blocks }); }); } }); exports.BLOCK_KEYWORDS = BLOCK_KEYWORDS; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2tleXdvcmRzL2Jsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFFQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRU8sSUFBTSxjQUFjLEdBQUcsb0JBQUEsT0FBQSxFQUFBLEVBQUEsQ0FBQSxZQUFBLEVBQ1Y7QUFDaEIsRUFBQSxNQURnQixFQUFBLFNBQUEsTUFBQSxDQUFBLElBQUEsRUFFUztBQUFBLFFBS2pCLElBTGlCLEdBS3ZCLElBTHVCLENBQUEsSUFBQTtBQU92QixRQUFJLElBQUksR0FBRyxJQUFJLENBQUosR0FBQSxDQUFYLE1BQVcsQ0FBWDs7QUFFQSxRQUFBLElBQUEsRUFBVTtBQUNSLGFBQU8saUJBQUksaUNBQW1CLHlDQUFuQixFQUFtRSxJQUFJLENBQWxGLEdBQVcsQ0FBSixDQUFQO0FBQ0Q7O0FBRUQsUUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFKLEdBQUEsQ0FBbkIsY0FBbUIsQ0FBbkI7QUFDQSxRQUFJLFdBQVcsR0FBRyxJQUFJLENBQUosR0FBQSxDQUFsQixDQUFrQixDQUFsQjs7QUFFQSxRQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLGFBQU8saUJBQ0wsaUNBQW1CLDZFQUFuQixFQUVFLElBQUksQ0FIUixHQUNFLENBREssQ0FBUDtBQWpCcUIsS0FBQSxDQXlCdkI7OztBQUVBLFdBQU8sZ0JBQUc7QUFBRSxNQUFBLFlBQUYsRUFBQSxZQUFBO0FBQWdCLE1BQUEsV0FBQSxFQUFBO0FBQWhCLEtBQUgsQ0FBUDtBQTdCYyxHQUFBO0FBZ0NoQixFQUFBLFNBaENnQixFQUFBLFNBQUEsU0FBQSxDQUFBLElBQUEsRUFBQSxLQUFBLEVBcUNxRTtBQUFBLFFBSm5GLElBSW1GLEdBQUEsSUFBQSxDQUpuRixJQUltRjtBQUFBLFFBSjNFLEtB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QSxNQUFBLENBQTVFLFVBQTRFO0FBQUEsUUFBOUQsSUFBOEQsR0FBQSxNQUFBLENBQTlELElBQThEOztBQUU1RSxRQUFJLGdCQUFnQixHQUFHLHlCQUFBLEtBQUEsQ0FBQSxVQUFBLEVBQXZCLEtBQXVCLENBQXZCOztBQUNBLFFBQUksVUFBVSxHQUFHLHlCQUFBLElBQUEsQ0FBQSxJQUFBLEVBQWpCLEtBQWlCLENBQWpCOztBQUNBLFFBQUksWUFBWSxHQUFHLHdCQUFBLFdBQUEsQ0FBd0IsSUFBSSxDQUE1QixNQUFBLEVBQW5CLEtBQW1CLENBQW5COztBQUVBLFdBQU8sZUFBQSxHQUFBLENBQUEsZ0JBQUEsRUFBQSxVQUFBLEVBQUEsWUFBQSxFQUFBLEtBQUEsQ0FDTCxVQUFBLE1BQUEsRUFBQTtBQUFBLFVBQUMsVUFBRCxHQUFBLE1BQUEsQ0FBQSxDQUFBLENBQUE7QUFBQSxVQUFDLElBQUQsR0FBQSxNQUFBLENBQUEsQ0FBQSxDQUFBO0FBQUEsVUFBQSxNQUFBLEdBQUEsTUFBQSxDQUFBLENBQUEsQ0FBQTtBQUFBLGFBQ0UsSUFBSSxHQUFHLENBQVAsZUFBQSxDQUF3QjtBQUN0QixRQUFBLEdBQUcsRUFBRSxJQUFJLENBRGEsR0FBQTtBQUV0QixRQUFBLFVBRnNCLEVBQUEsVUFBQTtBQUd0QixRQUFBLElBSHNCLEVBQUEsSUFBQTtBQUl0QixRQUFBLE1BQUEsRUFBQTtBQUpzQixPQUF4QixDQURGO0FBREYsS0FBTyxDQUFQO0FBU0Q7QUFwQmMsQ0ExYVcsQ0FBdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyaWVkVHlwZSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQVNUdjIsIGdlbmVyYXRlU3ludGF4RXJyb3IgfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuXG5pbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcmVzdWx0JztcbmltcG9ydCAqIGFzIG1pciBmcm9tICcuLi8uLi8yLWVuY29kaW5nL21pcic7XG5pbXBvcnQgeyBOb3JtYWxpemF0aW9uU3RhdGUgfSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB7IFZJU0lUX0VYUFJTIH0gZnJvbSAnLi4vdmlzaXRvcnMvZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgVklTSVRfU1RNVFMgfSBmcm9tICcuLi92aXNpdG9ycy9zdGF0ZW1lbnRzJztcbmltcG9ydCB7IGtleXdvcmRzIH0gZnJvbSAnLi9pbXBsJztcbmltcG9ydCB7IGFzc2VydEN1cnJ5S2V5d29yZCB9IGZyb20gJy4vdXRpbHMvY3VycnknO1xuXG5leHBvcnQgY29uc3QgQkxPQ0tfS0VZV09SRFMgPSBrZXl3b3JkcygnQmxvY2snKVxuICAua3coJ2luLWVsZW1lbnQnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgaW5zZXJ0QmVmb3JlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB8IG51bGw7XG4gICAgICBkZXN0aW5hdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgfT4ge1xuICAgICAgbGV0IHsgYXJncyB9ID0gbm9kZTtcblxuICAgICAgbGV0IGd1aWQgPSBhcmdzLmdldCgnZ3VpZCcpO1xuXG4gICAgICBpZiAoZ3VpZCkge1xuICAgICAgICByZXR1cm4gRXJyKGdlbmVyYXRlU3ludGF4RXJyb3IoYENhbm5vdCBwYXNzIFxcYGd1aWRcXGAgdG8gXFxge3sjaW4tZWxlbWVudH19XFxgYCwgZ3VpZC5sb2MpKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGluc2VydEJlZm9yZSA9IGFyZ3MuZ2V0KCdpbnNlcnRCZWZvcmUnKTtcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IGFyZ3MubnRoKDApO1xuXG4gICAgICBpZiAoZGVzdGluYXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2luLWVsZW1lbnR9fSByZXF1aXJlcyBhIHRhcmdldCBlbGVtZW50IGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlcmAsXG4gICAgICAgICAgICBhcmdzLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyBCZXR0ZXIgc3ludGF4IGNoZWNrc1xuXG4gICAgICByZXR1cm4gT2soeyBpbnNlcnRCZWZvcmUsIGRlc3RpbmF0aW9uIH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHtcbiAgICAgICAgaW5zZXJ0QmVmb3JlLFxuICAgICAgICBkZXN0aW5hdGlvbixcbiAgICAgIH06IHsgaW5zZXJ0QmVmb3JlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB8IG51bGw7IGRlc3RpbmF0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB9XG4gICAgKTogUmVzdWx0PG1pci5JbkVsZW1lbnQ+IHtcbiAgICAgIGxldCBuYW1lZCA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuICAgICAgbGV0IGJvZHkgPSBWSVNJVF9TVE1UUy5OYW1lZEJsb2NrKG5hbWVkLCBzdGF0ZSk7XG4gICAgICBsZXQgZGVzdGluYXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChkZXN0aW5hdGlvbiwgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChib2R5LCBkZXN0aW5hdGlvblJlc3VsdClcbiAgICAgICAgLmFuZFRoZW4oXG4gICAgICAgICAgKFtib2R5LCBkZXN0aW5hdGlvbl0pOiBSZXN1bHQ8e1xuICAgICAgICAgICAgYm9keTogbWlyLk5hbWVkQmxvY2s7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogbWlyLkV4cHJlc3Npb25Ob2RlO1xuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlOiBtaXIuRXhwcmVzc2lvbk5vZGU7XG4gICAgICAgICAgfT4gPT4ge1xuICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSkge1xuICAgICAgICAgICAgICByZXR1cm4gVklTSVRfRVhQUlMudmlzaXQoaW5zZXJ0QmVmb3JlLCBzdGF0ZSkubWFwT2soKGluc2VydEJlZm9yZSkgPT4gKHtcbiAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZSxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE9rKHtcbiAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZTogbmV3IG1pci5NaXNzaW5nKHtcbiAgICAgICAgICAgICAgICAgIGxvYzogbm9kZS5jYWxsZWUubG9jLmNvbGxhcHNlKCdlbmQnKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC5tYXBPayhcbiAgICAgICAgICAoeyBib2R5LCBkZXN0aW5hdGlvbiwgaW5zZXJ0QmVmb3JlIH0pID0+XG4gICAgICAgICAgICBuZXcgbWlyLkluRWxlbWVudCh7XG4gICAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICAgIGJsb2NrOiBib2R5LFxuICAgICAgICAgICAgICBpbnNlcnRCZWZvcmUsXG4gICAgICAgICAgICAgIGd1aWQ6IHN0YXRlLmdlbmVyYXRlVW5pcXVlQ3Vyc29yKCksXG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LFxuICB9KVxuICAua3coJ2lmJywge1xuICAgIGFzc2VydChcbiAgICAgIG5vZGU6IEFTVHYyLkludm9rZUJsb2NrXG4gICAgKTogUmVzdWx0PHtcbiAgICAgIGNvbmRpdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgfT4ge1xuICAgICAgbGV0IHsgYXJncyB9ID0gbm9kZTtcblxuICAgICAgaWYgKCFhcmdzLm5hbWVkLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjaWZ9fSBjYW5ub3QgcmVjZWl2ZSBuYW1lZCBwYXJhbWV0ZXJzLCByZWNlaXZlZCAke2FyZ3MubmFtZWQuZW50cmllc1xuICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLm5hbWUuY2hhcnMpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBub2RlLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3MucG9zaXRpb25hbC5zaXplID4gMSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjaWZ9fSBjYW4gb25seSByZWNlaXZlIG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciBpbiBibG9jayBmb3JtLCB0aGUgY29uZGl0aW9uYWwgdmFsdWUuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgbm9kZS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb25kaXRpb24gPSBhcmdzLm50aCgwKTtcblxuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjaWZ9fSByZXF1aXJlcyBhIGNvbmRpdGlvbiBhcyBpdHMgZmlyc3QgcG9zaXRpb25hbCBwYXJhbWV0ZXIsIGRpZCBub3QgcmVjZWl2ZSBhbnkgcGFyYW1ldGVyc2AsXG4gICAgICAgICAgICBub2RlLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9rKHsgY29uZGl0aW9uIH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgY29uZGl0aW9uIH06IHsgY29uZGl0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB9XG4gICAgKTogUmVzdWx0PG1pci5JZj4ge1xuICAgICAgbGV0IGJsb2NrID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgaW52ZXJzZSA9IG5vZGUuYmxvY2tzLmdldCgnZWxzZScpO1xuXG4gICAgICBsZXQgY29uZGl0aW9uUmVzdWx0ID0gVklTSVRfRVhQUlMudmlzaXQoY29uZGl0aW9uLCBzdGF0ZSk7XG4gICAgICBsZXQgYmxvY2tSZXN1bHQgPSBWSVNJVF9TVE1UUy5OYW1lZEJsb2NrKGJsb2NrLCBzdGF0ZSk7XG4gICAgICBsZXQgaW52ZXJzZVJlc3VsdCA9IGludmVyc2UgPyBWSVNJVF9TVE1UUy5OYW1lZEJsb2NrKGludmVyc2UsIHN0YXRlKSA6IE9rKG51bGwpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChjb25kaXRpb25SZXN1bHQsIGJsb2NrUmVzdWx0LCBpbnZlcnNlUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFtjb25kaXRpb24sIGJsb2NrLCBpbnZlcnNlXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLklmKHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCd1bmxlc3MnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgY29uZGl0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyN1bmxlc3N9fSBjYW5ub3QgcmVjZWl2ZSBuYW1lZCBwYXJhbWV0ZXJzLCByZWNlaXZlZCAke2FyZ3MubmFtZWQuZW50cmllc1xuICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLm5hbWUuY2hhcnMpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBub2RlLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3MucG9zaXRpb25hbC5zaXplID4gMSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjdW5sZXNzfX0gY2FuIG9ubHkgcmVjZWl2ZSBvbmUgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaW4gYmxvY2sgZm9ybSwgdGhlIGNvbmRpdGlvbmFsIHZhbHVlLiBSZWNlaXZlZCAke2FyZ3MucG9zaXRpb25hbC5zaXplfSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29uZGl0aW9uID0gYXJncy5udGgoMCk7XG5cbiAgICAgIGlmIChjb25kaXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I3VubGVzc319IHJlcXVpcmVzIGEgY29uZGl0aW9uIGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgZGlkIG5vdCByZWNlaXZlIGFueSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyBjb25kaXRpb24gfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBjb25kaXRpb24gfTogeyBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLklmPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcbiAgICAgIGxldCBpbnZlcnNlID0gbm9kZS5ibG9ja3MuZ2V0KCdlbHNlJyk7XG5cbiAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChjb25kaXRpb24sIHN0YXRlKTtcbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcbiAgICAgIGxldCBpbnZlcnNlUmVzdWx0ID0gaW52ZXJzZSA/IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soaW52ZXJzZSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGNvbmRpdGlvblJlc3VsdCwgYmxvY2tSZXN1bHQsIGludmVyc2VSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW2NvbmRpdGlvbiwgYmxvY2ssIGludmVyc2VdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuSWYoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbmV3IG1pci5Ob3QoeyB2YWx1ZTogY29uZGl0aW9uLCBsb2M6IG5vZGUubG9jIH0pLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICBpbnZlcnNlLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnZWFjaCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgICBrZXk6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuZW50cmllcy5ldmVyeSgoZSkgPT4gZS5uYW1lLmNoYXJzID09PSAna2V5JykpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2VhY2h9fSBjYW4gb25seSByZWNlaXZlIHRoZSAna2V5JyBuYW1lZCBwYXJhbWV0ZXIsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUubmFtZS5jaGFycyAhPT0gJ2tleScpXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIGFyZ3MubmFtZWQubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNlYWNofX0gY2FuIG9ubHkgcmVjZWl2ZSBvbmUgcG9zaXRpb25hbCBwYXJhbWV0ZXIsIHRoZSBjb2xsZWN0aW9uIGJlaW5nIGl0ZXJhdGVkLiBSZWNlaXZlZCAke2FyZ3MucG9zaXRpb25hbC5zaXplfSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIGFyZ3MucG9zaXRpb25hbC5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWx1ZSA9IGFyZ3MubnRoKDApO1xuICAgICAgbGV0IGtleSA9IGFyZ3MuZ2V0KCdrZXknKTtcblxuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNlYWNofX0gcmVxdWlyZXMgYW4gaXRlcmFibGUgdmFsdWUgdG8gYmUgcGFzc2VkIGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgZGlkIG5vdCByZWNlaXZlIGFueSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIGFyZ3MubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyB2YWx1ZSwga2V5IH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgdmFsdWUsIGtleSB9OiB7IHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTsga2V5OiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB8IG51bGwgfVxuICAgICk6IFJlc3VsdDxtaXIuRWFjaD4ge1xuICAgICAgbGV0IGJsb2NrID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgaW52ZXJzZSA9IG5vZGUuYmxvY2tzLmdldCgnZWxzZScpO1xuXG4gICAgICBsZXQgdmFsdWVSZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdCh2YWx1ZSwgc3RhdGUpO1xuICAgICAgbGV0IGtleVJlc3VsdCA9IGtleSA/IFZJU0lUX0VYUFJTLnZpc2l0KGtleSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcbiAgICAgIGxldCBpbnZlcnNlUmVzdWx0ID0gaW52ZXJzZSA/IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soaW52ZXJzZSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKHZhbHVlUmVzdWx0LCBrZXlSZXN1bHQsIGJsb2NrUmVzdWx0LCBpbnZlcnNlUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFt2YWx1ZSwga2V5LCBibG9jaywgaW52ZXJzZV0pID0+XG4gICAgICAgICAgbmV3IG1pci5FYWNoKHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgaW52ZXJzZSxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KVxuICAua3coJ3dpdGgnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmICghYXJncy5uYW1lZC5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I3dpdGh9fSBjYW5ub3QgcmVjZWl2ZSBuYW1lZCBwYXJhbWV0ZXJzLCByZWNlaXZlZCAke2FyZ3MubmFtZWQuZW50cmllc1xuICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLm5hbWUuY2hhcnMpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBhcmdzLm5hbWVkLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3MucG9zaXRpb25hbC5zaXplID4gMSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjd2l0aH19IGNhbiBvbmx5IHJlY2VpdmUgb25lIHBvc2l0aW9uYWwgcGFyYW1ldGVyLiBSZWNlaXZlZCAke2FyZ3MucG9zaXRpb25hbC5zaXplfSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIGFyZ3MucG9zaXRpb25hbC5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWx1ZSA9IGFyZ3MubnRoKDApO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I3dpdGh9fSByZXF1aXJlcyBhIHZhbHVlIGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgZGlkIG5vdCByZWNlaXZlIGFueSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIGFyZ3MubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyB2YWx1ZSB9KTtcbiAgICB9LFxuXG4gICAgdHJhbnNsYXRlKFxuICAgICAgeyBub2RlLCBzdGF0ZSB9OiB7IG5vZGU6IEFTVHYyLkludm9rZUJsb2NrOyBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlIH0sXG4gICAgICB7IHZhbHVlIH06IHsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLldpdGg+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuICAgICAgbGV0IGludmVyc2UgPSBub2RlLmJsb2Nrcy5nZXQoJ2Vsc2UnKTtcblxuICAgICAgbGV0IHZhbHVlUmVzdWx0ID0gVklTSVRfRVhQUlMudmlzaXQodmFsdWUsIHN0YXRlKTtcbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcbiAgICAgIGxldCBpbnZlcnNlUmVzdWx0ID0gaW52ZXJzZSA/IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soaW52ZXJzZSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKHZhbHVlUmVzdWx0LCBibG9ja1Jlc3VsdCwgaW52ZXJzZVJlc3VsdCkubWFwT2soXG4gICAgICAgIChbdmFsdWUsIGJsb2NrLCBpbnZlcnNlXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLldpdGgoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICBpbnZlcnNlLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnbGV0Jywge1xuICAgIGFzc2VydChcbiAgICAgIG5vZGU6IEFTVHYyLkludm9rZUJsb2NrXG4gICAgKTogUmVzdWx0PHtcbiAgICAgIHBvc2l0aW9uYWw6IEFTVHYyLlBvc2l0aW9uYWxBcmd1bWVudHM7XG4gICAgfT4ge1xuICAgICAgbGV0IHsgYXJncyB9ID0gbm9kZTtcblxuICAgICAgaWYgKCFhcmdzLm5hbWVkLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjbGV0fX0gY2Fubm90IHJlY2VpdmUgbmFtZWQgcGFyYW1ldGVycywgcmVjZWl2ZWQgJHthcmdzLm5hbWVkLmVudHJpZXNcbiAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5uYW1lLmNoYXJzKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgYXJncy5uYW1lZC5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLnBvc2l0aW9uYWwuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjbGV0fX0gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlIGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgZGlkIG5vdCByZWNlaXZlIGFueSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIGFyZ3MucG9zaXRpb25hbC5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmJsb2Nrcy5nZXQoJ2Vsc2UnKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoYHt7I2xldH19IGNhbm5vdCByZWNlaXZlIGFuIHt7ZWxzZX19IGJsb2NrYCwgYXJncy5wb3NpdGlvbmFsLmxvYylcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9rKHsgcG9zaXRpb25hbDogYXJncy5wb3NpdGlvbmFsIH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgcG9zaXRpb25hbCB9OiB7IHBvc2l0aW9uYWw6IEFTVHYyLlBvc2l0aW9uYWxBcmd1bWVudHMgfVxuICAgICk6IFJlc3VsdDxtaXIuTGV0PiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcblxuICAgICAgbGV0IHBvc2l0aW9uYWxSZXN1bHQgPSBWSVNJVF9FWFBSUy5Qb3NpdGlvbmFsKHBvc2l0aW9uYWwsIHN0YXRlKTtcbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwocG9zaXRpb25hbFJlc3VsdCwgYmxvY2tSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW3Bvc2l0aW9uYWwsIGJsb2NrXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLkxldCh7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgcG9zaXRpb25hbCxcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnLXdpdGgtZHluYW1pYy12YXJzJywge1xuICAgIGFzc2VydChcbiAgICAgIG5vZGU6IEFTVHYyLkludm9rZUJsb2NrXG4gICAgKTogUmVzdWx0PHtcbiAgICAgIG5hbWVkOiBBU1R2Mi5OYW1lZEFyZ3VtZW50cztcbiAgICB9PiB7XG4gICAgICByZXR1cm4gT2soeyBuYW1lZDogbm9kZS5hcmdzLm5hbWVkIH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgbmFtZWQgfTogeyBuYW1lZDogQVNUdjIuTmFtZWRBcmd1bWVudHMgfVxuICAgICk6IFJlc3VsdDxtaXIuV2l0aER5bmFtaWNWYXJzPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcblxuICAgICAgbGV0IG5hbWVkUmVzdWx0ID0gVklTSVRfRVhQUlMuTmFtZWRBcmd1bWVudHMobmFtZWQsIHN0YXRlKTtcbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwobmFtZWRSZXN1bHQsIGJsb2NrUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFtuYW1lZCwgYmxvY2tdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuV2l0aER5bmFtaWNWYXJzKHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBuYW1lZCxcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnY29tcG9uZW50Jywge1xuICAgIGFzc2VydDogYXNzZXJ0Q3VycnlLZXl3b3JkKEN1cnJpZWRUeXBlLkNvbXBvbmVudCksXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgZGVmaW5pdGlvbiwgYXJncyB9OiB7IGRlZmluaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyBhcmdzOiBBU1R2Mi5BcmdzIH1cbiAgICApOiBSZXN1bHQ8bWlyLkludm9rZUNvbXBvbmVudD4ge1xuICAgICAgbGV0IGRlZmluaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChkZWZpbml0aW9uLCBzdGF0ZSk7XG4gICAgICBsZXQgYXJnc1Jlc3VsdCA9IFZJU0lUX0VYUFJTLkFyZ3MoYXJncywgc3RhdGUpO1xuICAgICAgbGV0IGJsb2Nrc1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2tzKG5vZGUuYmxvY2tzLCBzdGF0ZSk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGRlZmluaXRpb25SZXN1bHQsIGFyZ3NSZXN1bHQsIGJsb2Nrc1Jlc3VsdCkubWFwT2soXG4gICAgICAgIChbZGVmaW5pdGlvbiwgYXJncywgYmxvY2tzXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLkludm9rZUNvbXBvbmVudCh7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBibG9ja3MsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG4iXSwic291cmNlUm9vdCI6IiJ9