UNPKG

@glimmer/compiler

Version:
352 lines (322 loc) 45.5 kB
import { generateSyntaxError } from '@glimmer/syntax'; import { Err, Ok, Result } from '../../../shared/result'; import * as mir from '../../2-encoding/mir'; import { VISIT_EXPRS } from '../visitors/expressions'; import { VISIT_STMTS } from '../visitors/statements'; import { keywords } from './impl'; import { assertCurryKeyword } from './utils/curry'; export var BLOCK_KEYWORDS = keywords('Block').kw('in-element', { assert: function assert(node) { var args = node.args; var guid = args.get('guid'); if (guid) { return Err(generateSyntaxError("Cannot pass `guid` to `{{#in-element}}`", guid.loc)); } var insertBefore = args.get('insertBefore'); var destination = args.nth(0); if (destination === null) { return Err(generateSyntaxError("{{#in-element}} requires a target element as its first positional parameter", args.loc)); } // TODO Better syntax checks return 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 = VISIT_STMTS.NamedBlock(named, state); var destinationResult = VISIT_EXPRS.visit(destination, state); return Result.all(body, destinationResult).andThen(function (_ref3) { var body = _ref3[0], destination = _ref3[1]; if (insertBefore) { return VISIT_EXPRS.visit(insertBefore, state).mapOk(function (insertBefore) { return { body: body, destination: destination, insertBefore: insertBefore }; }); } else { return 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 Err(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 Err(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 Err(generateSyntaxError("{{#if}} requires a condition as its first positional parameter, did not receive any parameters", node.loc)); } return 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 = VISIT_EXPRS.visit(condition, state); var blockResult = VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return 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 Err(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 Err(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 Err(generateSyntaxError("{{#unless}} requires a condition as its first positional parameter, did not receive any parameters", node.loc)); } return 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 = VISIT_EXPRS.visit(condition, state); var blockResult = VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return 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 Err(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 Err(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 Err(generateSyntaxError("{{#each}} requires an iterable value to be passed as its first positional parameter, did not receive any parameters", args.loc)); } return 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 = VISIT_EXPRS.visit(value, state); var keyResult = key ? VISIT_EXPRS.visit(key, state) : Ok(null); var blockResult = VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return 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 Err(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 Err(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 Err(generateSyntaxError("{{#with}} requires a value as its first positional parameter, did not receive any parameters", args.loc)); } return 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 = VISIT_EXPRS.visit(value, state); var blockResult = VISIT_STMTS.NamedBlock(block, state); var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return 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 Err(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 Err(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 Err(generateSyntaxError("{{#let}} cannot receive an {{else}} block", args.positional.loc)); } return 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 = VISIT_EXPRS.Positional(positional, state); var blockResult = VISIT_STMTS.NamedBlock(block, state); return 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 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 = VISIT_EXPRS.NamedArguments(named, state); var blockResult = VISIT_STMTS.NamedBlock(block, state); return 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: assertCurryKeyword(0 /* Component */ ), translate: function translate(_ref23, _ref24) { var node = _ref23.node, state = _ref23.state; var definition = _ref24.definition, args = _ref24.args; var definitionResult = VISIT_EXPRS.visit(definition, state); var argsResult = VISIT_EXPRS.Args(args, state); var blocksResult = VISIT_STMTS.NamedBlocks(node.blocks, state); return 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 }); }); } }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2tleXdvcmRzL2Jsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQUEsbUJBQUEsUUFBQSxpQkFBQTtBQUVBLFNBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxNQUFBLFFBQUEsd0JBQUE7QUFDQSxPQUFPLEtBQVAsR0FBQSxNQUFBLHNCQUFBO0FBRUEsU0FBQSxXQUFBLFFBQUEseUJBQUE7QUFDQSxTQUFBLFdBQUEsUUFBQSx3QkFBQTtBQUNBLFNBQUEsUUFBQSxRQUFBLFFBQUE7QUFDQSxTQUFBLGtCQUFBLFFBQUEsZUFBQTtBQUVBLE9BQU8sSUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFSLE9BQVEsQ0FBUixDQUFBLEVBQUEsQ0FBQSxZQUFBLEVBQ1Y7QUFDaEIsRUFBQSxNQURnQixrQkFDVixJQURVLEVBRVM7QUFBQSxRQUtqQixJQUxpQixHQUt2QixJQUx1QixDQUtqQixJQUxpQjtBQU92QixRQUFJLElBQUksR0FBRyxJQUFJLENBQUosR0FBQSxDQUFYLE1BQVcsQ0FBWDs7QUFFQSxRQUFBLElBQUEsRUFBVTtBQUNSLGFBQU8sR0FBRyxDQUFDLG1CQUFtQiw0Q0FBZ0QsSUFBSSxDQUFsRixHQUE4QixDQUFwQixDQUFWO0FBQ0Q7O0FBRUQsUUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFKLEdBQUEsQ0FBbkIsY0FBbUIsQ0FBbkI7QUFDQSxRQUFJLFdBQVcsR0FBRyxJQUFJLENBQUosR0FBQSxDQUFsQixDQUFrQixDQUFsQjs7QUFFQSxRQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLGFBQU8sR0FBRyxDQUNSLG1CQUFtQixnRkFFakIsSUFBSSxDQUhSLEdBQ3FCLENBRFgsQ0FBVjtBQWpCcUIsS0FBQSxDQXlCdkI7OztBQUVBLFdBQU8sRUFBRSxDQUFDO0FBQUUsTUFBQSxZQUFGLEVBQUUsWUFBRjtB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LFVBQTlELElBQThEO0FBRTVFLFFBQUksZ0JBQWdCLEdBQUcsV0FBVyxDQUFYLEtBQUEsQ0FBQSxVQUFBLEVBQXZCLEtBQXVCLENBQXZCO0FBQ0EsUUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFYLElBQUEsQ0FBQSxJQUFBLEVBQWpCLEtBQWlCLENBQWpCO0FBQ0EsUUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFYLFdBQUEsQ0FBd0IsSUFBSSxDQUE1QixNQUFBLEVBQW5CLEtBQW1CLENBQW5CO0FBRUEsV0FBTyxNQUFNLENBQU4sR0FBQSxDQUFBLGdCQUFBLEVBQUEsVUFBQSxFQUFBLFlBQUEsRUFBQSxLQUFBLENBQ0w7QUFBQSxVQUFDLFVBQUQ7QUFBQSxVQUFDLElBQUQ7QUFBQSxVQUFBLE1BQUE7QUFBQSxhQUNFLElBQUksR0FBRyxDQUFQLGVBQUEsQ0FBd0I7QUFDdEIsUUFBQSxHQUFHLEVBQUUsSUFBSSxDQURhLEdBQUE7QUFFdEIsUUFBQSxVQUZzQixFQUV0QixVQUZzQjtBQUd0QixRQUFBLElBSHNCLEVBR3RCLElBSHNCO0FBSXRCLFFBQUEsTUFBQSxFQUFBO0FBSnNCLE9BQXhCLENBREY7QUFBQSxLQURLLENBQVA7QUFTRDtBQXBCYyxDQTFhVyxDQUF2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJpZWRUeXBlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBU1R2MiwgZ2VuZXJhdGVTeW50YXhFcnJvciB9IGZyb20gJ0BnbGltbWVyL3N5bnRheCc7XG5cbmltcG9ydCB7IEVyciwgT2ssIFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9yZXN1bHQnO1xuaW1wb3J0ICogYXMgbWlyIGZyb20gJy4uLy4uLzItZW5jb2RpbmcvbWlyJztcbmltcG9ydCB7IE5vcm1hbGl6YXRpb25TdGF0ZSB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHsgVklTSVRfRVhQUlMgfSBmcm9tICcuLi92aXNpdG9ycy9leHByZXNzaW9ucyc7XG5pbXBvcnQgeyBWSVNJVF9TVE1UUyB9IGZyb20gJy4uL3Zpc2l0b3JzL3N0YXRlbWVudHMnO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tICcuL2ltcGwnO1xuaW1wb3J0IHsgYXNzZXJ0Q3VycnlLZXl3b3JkIH0gZnJvbSAnLi91dGlscy9jdXJyeSc7XG5cbmV4cG9ydCBjb25zdCBCTE9DS19LRVlXT1JEUyA9IGtleXdvcmRzKCdCbG9jaycpXG4gIC5rdygnaW4tZWxlbWVudCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICBpbnNlcnRCZWZvcmU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDtcbiAgICAgIGRlc3RpbmF0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBsZXQgZ3VpZCA9IGFyZ3MuZ2V0KCdndWlkJyk7XG5cbiAgICAgIGlmIChndWlkKSB7XG4gICAgICAgIHJldHVybiBFcnIoZ2VuZXJhdGVTeW50YXhFcnJvcihgQ2Fubm90IHBhc3MgXFxgZ3VpZFxcYCB0byBcXGB7eyNpbi1lbGVtZW50fX1cXGBgLCBndWlkLmxvYykpO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW5zZXJ0QmVmb3JlID0gYXJncy5nZXQoJ2luc2VydEJlZm9yZScpO1xuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gYXJncy5udGgoMCk7XG5cbiAgICAgIGlmIChkZXN0aW5hdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjaW4tZWxlbWVudH19IHJlcXVpcmVzIGEgdGFyZ2V0IGVsZW1lbnQgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyYCxcbiAgICAgICAgICAgIGFyZ3MubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPIEJldHRlciBzeW50YXggY2hlY2tzXG5cbiAgICAgIHJldHVybiBPayh7IGluc2VydEJlZm9yZSwgZGVzdGluYXRpb24gfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAge1xuICAgICAgICBpbnNlcnRCZWZvcmUsXG4gICAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgfTogeyBpbnNlcnRCZWZvcmU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDsgZGVzdGluYXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLkluRWxlbWVudD4ge1xuICAgICAgbGV0IG5hbWVkID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgYm9keSA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2sobmFtZWQsIHN0YXRlKTtcbiAgICAgIGxldCBkZXN0aW5hdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGRlc3RpbmF0aW9uLCBzdGF0ZSk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGJvZHksIGRlc3RpbmF0aW9uUmVzdWx0KVxuICAgICAgICAuYW5kVGhlbihcbiAgICAgICAgICAoW2JvZHksIGRlc3RpbmF0aW9uXSk6IFJlc3VsdDx7XG4gICAgICAgICAgICBib2R5OiBtaXIuTmFtZWRCbG9jaztcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBtaXIuRXhwcmVzc2lvbk5vZGU7XG4gICAgICAgICAgICBpbnNlcnRCZWZvcmU6IG1pci5FeHByZXNzaW9uTm9kZTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBWSVNJVF9FWFBSUy52aXNpdChpbnNlcnRCZWZvcmUsIHN0YXRlKS5tYXBPaygoaW5zZXJ0QmVmb3JlKSA9PiAoe1xuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlLFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gT2soe1xuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlOiBuZXcgbWlyLk1pc3Npbmcoe1xuICAgICAgICAgICAgICAgICAgbG9jOiBub2RlLmNhbGxlZS5sb2MuY29sbGFwc2UoJ2VuZCcpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgLm1hcE9rKFxuICAgICAgICAgICh7IGJvZHksIGRlc3RpbmF0aW9uLCBpbnNlcnRCZWZvcmUgfSkgPT5cbiAgICAgICAgICAgIG5ldyBtaXIuSW5FbGVtZW50KHtcbiAgICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgICAgYmxvY2s6IGJvZHksXG4gICAgICAgICAgICAgIGluc2VydEJlZm9yZSxcbiAgICAgICAgICAgICAgZ3VpZDogc3RhdGUuZ2VuZXJhdGVVbmlxdWVDdXJzb3IoKSxcbiAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnaWYnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgY29uZGl0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IGNhbiBvbmx5IHJlY2VpdmUgb25lIHBvc2l0aW9uYWwgcGFyYW1ldGVyIGluIGJsb2NrIGZvcm0sIHRoZSBjb25kaXRpb25hbCB2YWx1ZS4gUmVjZWl2ZWQgJHthcmdzLnBvc2l0aW9uYWwuc2l6ZX0gcGFyYW1ldGVyc2AsXG4gICAgICAgICAgICBub2RlLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbmRpdGlvbiA9IGFyZ3MubnRoKDApO1xuXG4gICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IHJlcXVpcmVzIGEgY29uZGl0aW9uIGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgZGlkIG5vdCByZWNlaXZlIGFueSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyBjb25kaXRpb24gfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBjb25kaXRpb24gfTogeyBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLklmPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcbiAgICAgIGxldCBpbnZlcnNlID0gbm9kZS5ibG9ja3MuZ2V0KCdlbHNlJyk7XG5cbiAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChjb25kaXRpb24sIHN0YXRlKTtcbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcbiAgICAgIGxldCBpbnZlcnNlUmVzdWx0ID0gaW52ZXJzZSA/IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soaW52ZXJzZSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGNvbmRpdGlvblJlc3VsdCwgYmxvY2tSZXN1bHQsIGludmVyc2VSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW2NvbmRpdGlvbiwgYmxvY2ssIGludmVyc2VdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuSWYoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgaW52ZXJzZSxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KVxuICAua3coJ3VubGVzcycsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmICghYXJncy5uYW1lZC5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I3VubGVzc319IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyN1bmxlc3N9fSBjYW4gb25seSByZWNlaXZlIG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciBpbiBibG9jayBmb3JtLCB0aGUgY29uZGl0aW9uYWwgdmFsdWUuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgbm9kZS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb25kaXRpb24gPSBhcmdzLm50aCgwKTtcblxuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjdW5sZXNzfX0gcmVxdWlyZXMgYSBjb25kaXRpb24gYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgbm9kZS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IGNvbmRpdGlvbiB9KTtcbiAgICB9LFxuXG4gICAgdHJhbnNsYXRlKFxuICAgICAgeyBub2RlLCBzdGF0ZSB9OiB7IG5vZGU6IEFTVHYyLkludm9rZUJsb2NrOyBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlIH0sXG4gICAgICB7IGNvbmRpdGlvbiB9OiB7IGNvbmRpdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfVxuICAgICk6IFJlc3VsdDxtaXIuSWY+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuICAgICAgbGV0IGludmVyc2UgPSBub2RlLmJsb2Nrcy5nZXQoJ2Vsc2UnKTtcblxuICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGNvbmRpdGlvbiwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwoY29uZGl0aW9uUmVzdWx0LCBibG9ja1Jlc3VsdCwgaW52ZXJzZVJlc3VsdCkubWFwT2soXG4gICAgICAgIChbY29uZGl0aW9uLCBibG9jaywgaW52ZXJzZV0pID0+XG4gICAgICAgICAgbmV3IG1pci5JZih7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgY29uZGl0aW9uOiBuZXcgbWlyLk5vdCh7IHZhbHVlOiBjb25kaXRpb24sIGxvYzogbm9kZS5sb2MgfSksXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdlYWNoJywge1xuICAgIGFzc2VydChcbiAgICAgIG5vZGU6IEFTVHYyLkludm9rZUJsb2NrXG4gICAgKTogUmVzdWx0PHtcbiAgICAgIHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICAgIGtleTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfCBudWxsO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmICghYXJncy5uYW1lZC5lbnRyaWVzLmV2ZXJ5KChlKSA9PiBlLm5hbWUuY2hhcnMgPT09ICdrZXknKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjZWFjaH19IGNhbiBvbmx5IHJlY2VpdmUgdGhlICdrZXknIG5hbWVkIHBhcmFtZXRlciwgcmVjZWl2ZWQgJHthcmdzLm5hbWVkLmVudHJpZXNcbiAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5uYW1lLmNoYXJzICE9PSAna2V5JylcbiAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5uYW1lLmNoYXJzKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgYXJncy5uYW1lZC5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLnBvc2l0aW9uYWwuc2l6ZSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2VhY2h9fSBjYW4gb25seSByZWNlaXZlIG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciwgdGhlIGNvbGxlY3Rpb24gYmVpbmcgaXRlcmF0ZWQuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0gYXJncy5udGgoMCk7XG4gICAgICBsZXQga2V5ID0gYXJncy5nZXQoJ2tleScpO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2VhY2h9fSByZXF1aXJlcyBhbiBpdGVyYWJsZSB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IHZhbHVlLCBrZXkgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyB2YWx1ZSwga2V5IH06IHsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyBrZXk6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbCB9XG4gICAgKTogUmVzdWx0PG1pci5FYWNoPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcbiAgICAgIGxldCBpbnZlcnNlID0gbm9kZS5ibG9ja3MuZ2V0KCdlbHNlJyk7XG5cbiAgICAgIGxldCB2YWx1ZVJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KHZhbHVlLCBzdGF0ZSk7XG4gICAgICBsZXQga2V5UmVzdWx0ID0ga2V5ID8gVklTSVRfRVhQUlMudmlzaXQoa2V5LCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwodmFsdWVSZXN1bHQsIGtleVJlc3VsdCwgYmxvY2tSZXN1bHQsIGludmVyc2VSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW3ZhbHVlLCBrZXksIGJsb2NrLCBpbnZlcnNlXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLkVhY2goe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICBpbnZlcnNlLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnd2l0aCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgfT4ge1xuICAgICAgbGV0IHsgYXJncyB9ID0gbm9kZTtcblxuICAgICAgaWYgKCFhcmdzLm5hbWVkLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjd2l0aH19IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIGFyZ3MubmFtZWQubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyN3aXRofX0gY2FuIG9ubHkgcmVjZWl2ZSBvbmUgcG9zaXRpb25hbCBwYXJhbWV0ZXIuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0gYXJncy5udGgoMCk7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjd2l0aH19IHJlcXVpcmVzIGEgdmFsdWUgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IHZhbHVlIH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgdmFsdWUgfTogeyB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfVxuICAgICk6IFJlc3VsdDxtaXIuV2l0aD4ge1xuICAgICAgbGV0IGJsb2NrID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgaW52ZXJzZSA9IG5vZGUuYmxvY2tzLmdldCgnZWxzZScpO1xuXG4gICAgICBsZXQgdmFsdWVSZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdCh2YWx1ZSwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwodmFsdWVSZXN1bHQsIGJsb2NrUmVzdWx0LCBpbnZlcnNlUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFt2YWx1ZSwgYmxvY2ssIGludmVyc2VdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuV2l0aCh7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdsZXQnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNsZXR9fSBjYW5ub3QgcmVjZWl2ZSBuYW1lZCBwYXJhbWV0ZXJzLCByZWNlaXZlZCAke2FyZ3MubmFtZWQuZW50cmllc1xuICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLm5hbWUuY2hhcnMpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBhcmdzLm5hbWVkLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3MucG9zaXRpb25hbC5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNsZXR9fSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWUgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuYmxvY2tzLmdldCgnZWxzZScpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihge3sjbGV0fX0gY2Fubm90IHJlY2VpdmUgYW4ge3tlbHNlfX0gYmxvY2tgLCBhcmdzLnBvc2l0aW9uYWwubG9jKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyBwb3NpdGlvbmFsOiBhcmdzLnBvc2l0aW9uYWwgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBwb3NpdGlvbmFsIH06IHsgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyB9XG4gICAgKTogUmVzdWx0PG1pci5MZXQ+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuXG4gICAgICBsZXQgcG9zaXRpb25hbFJlc3VsdCA9IFZJU0lUX0VYUFJTLlBvc2l0aW9uYWwocG9zaXRpb25hbCwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChwb3NpdGlvbmFsUmVzdWx0LCBibG9ja1Jlc3VsdCkubWFwT2soXG4gICAgICAgIChbcG9zaXRpb25hbCwgYmxvY2tdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuTGV0KHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBwb3NpdGlvbmFsLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCctd2l0aC1keW5hbWljLXZhcnMnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgbmFtZWQ6IEFTVHYyLk5hbWVkQXJndW1lbnRzO1xuICAgIH0+IHtcbiAgICAgIHJldHVybiBPayh7IG5hbWVkOiBub2RlLmFyZ3MubmFtZWQgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBuYW1lZCB9OiB7IG5hbWVkOiBBU1R2Mi5OYW1lZEFyZ3VtZW50cyB9XG4gICAgKTogUmVzdWx0PG1pci5XaXRoRHluYW1pY1ZhcnM+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuXG4gICAgICBsZXQgbmFtZWRSZXN1bHQgPSBWSVNJVF9FWFBSUy5OYW1lZEFyZ3VtZW50cyhuYW1lZCwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChuYW1lZFJlc3VsdCwgYmxvY2tSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW25hbWVkLCBibG9ja10pID0+XG4gICAgICAgICAgbmV3IG1pci5XaXRoRHluYW1pY1ZhcnMoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIG5hbWVkLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdjb21wb25lbnQnLCB7XG4gICAgYXNzZXJ0OiBhc3NlcnRDdXJyeUtleXdvcmQoQ3VycmllZFR5cGUuQ29tcG9uZW50KSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBkZWZpbml0aW9uLCBhcmdzIH06IHsgZGVmaW5pdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGU7IGFyZ3M6IEFTVHYyLkFyZ3MgfVxuICAgICk6IFJlc3VsdDxtaXIuSW52b2tlQ29tcG9uZW50PiB7XG4gICAgICBsZXQgZGVmaW5pdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGRlZmluaXRpb24sIHN0YXRlKTtcbiAgICAgIGxldCBhcmdzUmVzdWx0ID0gVklTSVRfRVhQUlMuQXJncyhhcmdzLCBzdGF0ZSk7XG4gICAgICBsZXQgYmxvY2tzUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9ja3Mobm9kZS5ibG9ja3MsIHN0YXRlKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwoZGVmaW5pdGlvblJlc3VsdCwgYXJnc1Jlc3VsdCwgYmxvY2tzUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFtkZWZpbml0aW9uLCBhcmdzLCBibG9ja3NdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuSW52b2tlQ29tcG9uZW50KHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=