UNPKG

ember-legacy-class-transform

Version:
513 lines (436 loc) 59.6 kB
var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import TemplateVisitor from "./template-visitor"; import JavaScriptCompiler from "./javascript-compiler"; import { Stack, getAttrNamespace } from "@glimmer/util"; import { assert } from "@glimmer/util"; import { isLiteral, SyntaxError } from '@glimmer/syntax'; function isTrustedValue(value) { return value.escaped !== undefined && !value.escaped; } var TemplateCompiler = function () { function TemplateCompiler(options) { _classCallCheck(this, TemplateCompiler); this.templateId = 0; this.templateIds = []; this.symbolStack = new Stack(); this.opcodes = []; this.includeMeta = false; this.options = options || {}; } TemplateCompiler.compile = function compile(options, ast) { var templateVisitor = new TemplateVisitor(); templateVisitor.visit(ast); var compiler = new TemplateCompiler(options); var opcodes = compiler.process(templateVisitor.actions); return JavaScriptCompiler.process(opcodes, ast['symbols'], options.meta); }; TemplateCompiler.prototype.process = function process(actions) { var _this = this; actions.forEach(function (_ref) { var name = _ref[0], args = _ref.slice(1); if (!_this[name]) { throw new Error("Unimplemented " + name + " on TemplateCompiler"); } _this[name].apply(_this, args); }); return this.opcodes; }; TemplateCompiler.prototype.startProgram = function startProgram(program) { this.symbolStack.push(program[0]['symbols']); this.opcode('startProgram', program, program); }; TemplateCompiler.prototype.endProgram = function endProgram() { this.symbolStack.pop(); this.opcode('endProgram', null); }; TemplateCompiler.prototype.startBlock = function startBlock(program) { this.symbolStack.push(program[0]['symbols']); this.templateId++; this.opcode('startBlock', program, program); }; TemplateCompiler.prototype.endBlock = function endBlock() { this.symbolStack.pop(); this.templateIds.push(this.templateId - 1); this.opcode('endBlock', null); }; TemplateCompiler.prototype.text = function text(_ref2) { var action = _ref2[0]; this.opcode('text', action, action.chars); }; TemplateCompiler.prototype.comment = function comment(_ref3) { var action = _ref3[0]; this.opcode('comment', action, action.value); }; TemplateCompiler.prototype.openElement = function openElement(_ref4) { var action = _ref4[0]; this.opcode('openElement', action, action); for (var i = 0; i < action.attributes.length; i++) { this.attribute([action.attributes[i]]); } for (var _i = 0; _i < action.modifiers.length; _i++) { this.modifier([action.modifiers[_i]]); } this.opcode('flushElement', null); this.symbolStack.push(action['symbols']); }; TemplateCompiler.prototype.closeElement = function closeElement(_ref5) { var action = _ref5[0]; this.symbolStack.pop(); this.opcode('closeElement', null, action); }; TemplateCompiler.prototype.attribute = function attribute(_ref6) { var action = _ref6[0]; var name = action.name, value = action.value; var namespace = getAttrNamespace(name); var isStatic = this.prepareAttributeValue(value); if (name.charAt(0) === '@') { // Arguments if (isStatic) { this.opcode('staticArg', action, name); } else if (action.value.type === 'MustacheStatement') { this.opcode('dynamicArg', action, name); } else { this.opcode('dynamicArg', action, name); } } else { var isTrusting = isTrustedValue(value); if (isStatic) { this.opcode('staticAttr', action, name, namespace); } else if (isTrusting) { this.opcode('trustingAttr', action, name, namespace); } else if (action.value.type === 'MustacheStatement') { this.opcode('dynamicAttr', action, name); } else { this.opcode('dynamicAttr', action, name, namespace); } } }; TemplateCompiler.prototype.modifier = function modifier(_ref7) { var action = _ref7[0]; assertIsSimplePath(action.path, action.loc, 'modifier'); var parts = action.path.parts; this.prepareHelper(action); this.opcode('modifier', action, parts[0]); }; TemplateCompiler.prototype.mustache = function mustache(_ref8) { var action = _ref8[0]; var path = action.path; if (isLiteral(path)) { this.mustacheExpression(action); this.opcode('append', action, !action.escaped); } else if (isYield(path)) { var to = assertValidYield(action); this.yield(to, action); } else if (isPartial(path)) { var params = assertValidPartial(action); this.partial(params, action); } else if (isDebugger(path)) { assertValidDebuggerUsage(action); this.debugger('debugger', action); } else { this.mustacheExpression(action); this.opcode('append', action, !action.escaped); } }; TemplateCompiler.prototype.block = function block(_ref9) { var action /*, index, count*/ = _ref9[0]; this.prepareHelper(action); var templateId = this.templateIds.pop(); var inverseId = action.inverse === null ? null : this.templateIds.pop(); this.opcode('block', action, action.path.parts[0], templateId, inverseId); }; /// Internal actions, not found in the original processed actions TemplateCompiler.prototype.arg = function arg(_ref10) { var path = _ref10[0]; var _path$parts = path.parts, head = _path$parts[0], rest = _path$parts.slice(1); var symbol = this.symbols.allocateNamed(head); this.opcode('get', path, symbol, rest); }; TemplateCompiler.prototype.mustacheExpression = function mustacheExpression(expr) { var path = expr.path; if (isLiteral(path)) { this.opcode('literal', expr, path.value); } else if (isBuiltInHelper(path)) { this.builtInHelper(expr); } else if (isArg(path)) { this.arg([path]); } else if (isHelperInvocation(expr)) { this.prepareHelper(expr); this.opcode('helper', expr, path.parts[0]); } else if (path.this) { this.opcode('get', expr, 0, path.parts); } else if (isLocal(path, this.symbols)) { var _path$parts2 = path.parts, head = _path$parts2[0], parts = _path$parts2.slice(1); this.opcode('get', expr, this.symbols.get(head), parts); } else if (isSimplePath(path)) { this.opcode('unknown', expr, path.parts[0]); } else { this.opcode('maybeLocal', expr, path.parts); } }; /// Internal Syntax TemplateCompiler.prototype.yield = function _yield(to, action) { this.prepareParams(action.params); this.opcode('yield', action, this.symbols.allocateBlock(to)); }; TemplateCompiler.prototype.debugger = function _debugger(_name, action) { this.opcode('debugger', action, this.symbols.getEvalInfo()); }; TemplateCompiler.prototype.hasBlock = function hasBlock(name, action) { this.opcode('hasBlock', action, this.symbols.allocateBlock(name)); }; TemplateCompiler.prototype.hasBlockParams = function hasBlockParams(name, action) { this.opcode('hasBlockParams', action, this.symbols.allocateBlock(name)); }; TemplateCompiler.prototype.partial = function partial(_params, action) { this.prepareParams(action.params); this.opcode('partial', action, this.symbols.getEvalInfo()); }; TemplateCompiler.prototype.builtInHelper = function builtInHelper(expr) { var path = expr.path; if (isHasBlock(path)) { var name = assertValidHasBlockUsage(expr.path.original, expr); this.hasBlock(name, expr); } else if (isHasBlockParams(path)) { var _name2 = assertValidHasBlockUsage(expr.path.original, expr); this.hasBlockParams(_name2, expr); } }; /// Expressions, invoked recursively from prepareParams and prepareHash TemplateCompiler.prototype.SubExpression = function SubExpression(expr) { if (isBuiltInHelper(expr.path)) { this.builtInHelper(expr); } else { this.prepareHelper(expr); this.opcode('helper', expr, expr.path.parts[0]); } }; TemplateCompiler.prototype.PathExpression = function PathExpression(expr) { if (expr.data) { this.arg([expr]); } else { var symbols = this.symbols; var _expr$parts = expr.parts, head = _expr$parts[0]; if (expr.this) { this.opcode('get', expr, 0, expr.parts); } else if (symbols.has(head)) { this.opcode('get', expr, symbols.get(head), expr.parts.slice(1)); } else { this.opcode('get', expr, 0, expr.parts); } } }; TemplateCompiler.prototype.StringLiteral = function StringLiteral(action) { this.opcode('literal', null, action.value); }; TemplateCompiler.prototype.BooleanLiteral = function BooleanLiteral(action) { this.opcode('literal', null, action.value); }; TemplateCompiler.prototype.NumberLiteral = function NumberLiteral(action) { this.opcode('literal', null, action.value); }; TemplateCompiler.prototype.NullLiteral = function NullLiteral(action) { this.opcode('literal', null, action.value); }; TemplateCompiler.prototype.UndefinedLiteral = function UndefinedLiteral(action) { this.opcode('literal', null, action.value); }; /// Utilities TemplateCompiler.prototype.opcode = function opcode(name, action) { for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } var opcode = [name].concat(args); if (this.includeMeta && action) { opcode.push(this.meta(action)); } this.opcodes.push(opcode); }; TemplateCompiler.prototype.prepareHelper = function prepareHelper(expr) { assertIsSimplePath(expr.path, expr.loc, 'helper'); var params = expr.params, hash = expr.hash; this.prepareHash(hash); this.prepareParams(params); }; TemplateCompiler.prototype.prepareParams = function prepareParams(params) { if (!params.length) { this.opcode('literal', null, null); return; } for (var i = params.length - 1; i >= 0; i--) { var param = params[i]; assert(this[param.type], "Unimplemented " + param.type + " on TemplateCompiler"); this[param.type](param); } this.opcode('prepareArray', null, params.length); }; TemplateCompiler.prototype.prepareHash = function prepareHash(hash) { var pairs = hash.pairs; if (!pairs.length) { this.opcode('literal', null, null); return; } for (var i = pairs.length - 1; i >= 0; i--) { var _pairs$i = pairs[i], key = _pairs$i.key, value = _pairs$i.value; assert(this[value.type], "Unimplemented " + value.type + " on TemplateCompiler"); this[value.type](value); this.opcode('literal', null, key); } this.opcode('prepareObject', null, pairs.length); }; TemplateCompiler.prototype.prepareAttributeValue = function prepareAttributeValue(value) { // returns the static value if the value is static switch (value.type) { case 'TextNode': this.opcode('literal', value, value.chars); return true; case 'MustacheStatement': this.attributeMustache([value]); return false; case 'ConcatStatement': this.prepareConcatParts(value.parts); this.opcode('concat', value); return false; } }; TemplateCompiler.prototype.prepareConcatParts = function prepareConcatParts(parts) { for (var i = parts.length - 1; i >= 0; i--) { var part = parts[i]; if (part.type === 'MustacheStatement') { this.attributeMustache([part]); } else if (part.type === 'TextNode') { this.opcode('literal', null, part.chars); } } this.opcode('prepareArray', null, parts.length); }; TemplateCompiler.prototype.attributeMustache = function attributeMustache(_ref11) { var action = _ref11[0]; this.mustacheExpression(action); }; TemplateCompiler.prototype.meta = function meta(node) { var loc = node.loc; if (!loc) { return []; } var source = loc.source, start = loc.start, end = loc.end; return ['loc', [source || null, [start.line, start.column], [end.line, end.column]]]; }; _createClass(TemplateCompiler, [{ key: "symbols", get: function () { return this.symbolStack.current; } }]); return TemplateCompiler; }(); export default TemplateCompiler; function isHelperInvocation(mustache) { return mustache.params && mustache.params.length > 0 || mustache.hash && mustache.hash.pairs.length > 0; } function isSimplePath(_ref12) { var parts = _ref12.parts; return parts.length === 1; } function isLocal(_ref13, symbols) { var parts = _ref13.parts; return symbols && symbols.has(parts[0]); } function isYield(path) { return path.original === 'yield'; } function isPartial(path) { return path.original === 'partial'; } function isDebugger(path) { return path.original === 'debugger'; } function isHasBlock(path) { return path.original === 'has-block'; } function isHasBlockParams(path) { return path.original === 'has-block-params'; } function isBuiltInHelper(path) { return isHasBlock(path) || isHasBlockParams(path); } function isArg(path) { return !!path['data']; } function assertIsSimplePath(path, loc, context) { if (!isSimplePath(path)) { throw new SyntaxError("`" + path.original + "` is not a valid name for a " + context + " on line " + loc.start.line + ".", path.loc); } } function assertValidYield(statement) { var pairs = statement.hash.pairs; if (pairs.length === 1 && pairs[0].key !== 'to' || pairs.length > 1) { throw new SyntaxError("yield only takes a single named argument: 'to'", statement.loc); } else if (pairs.length === 1 && pairs[0].value.type !== 'StringLiteral') { throw new SyntaxError("you can only yield to a literal value", statement.loc); } else if (pairs.length === 0) { return 'default'; } else { return pairs[0].value.value; } } function assertValidPartial(statement) { var params = statement.params, hash = statement.hash, escaped = statement.escaped, loc = statement.loc; if (params && params.length !== 1) { throw new SyntaxError("Partial found with no arguments. You must specify a template name. (on line " + loc.start.line + ")", statement.loc); } else if (hash && hash.pairs.length > 0) { throw new SyntaxError("partial does not take any named arguments (on line " + loc.start.line + ")", statement.loc); } else if (!escaped) { throw new SyntaxError("{{{partial ...}}} is not supported, please use {{partial ...}} instead (on line " + loc.start.line + ")", statement.loc); } return params; } function assertValidHasBlockUsage(type, call) { var params = call.params, hash = call.hash, loc = call.loc; if (hash && hash.pairs.length > 0) { throw new SyntaxError(type + " does not take any named arguments", call.loc); } if (params.length === 0) { return 'default'; } else if (params.length === 1) { var param = params[0]; if (param.type === 'StringLiteral') { return param.value; } else { throw new SyntaxError("you can only yield to a literal value (on line " + loc.start.line + ")", call.loc); } } else { throw new SyntaxError(type + " only takes a single positional argument (on line " + loc.start.line + ")", call.loc); } } function assertValidDebuggerUsage(statement) { var params = statement.params, hash = statement.hash; if (hash && hash.pairs.length > 0) { throw new SyntaxError("debugger does not take any named arguments", statement.loc); } if (params.length === 0) { return 'default'; } else { throw new SyntaxError("debugger does not take any positional arguments", statement.loc); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90ZW1wbGF0ZS1jb21waWxlci5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVZpc2l0b3IiLCJKYXZhU2NyaXB0Q29tcGlsZXIiLCJTdGFjayIsImdldEF0dHJOYW1lc3BhY2UiLCJhc3NlcnQiLCJpc0xpdGVyYWwiLCJTeW50YXhFcnJvciIsImlzVHJ1c3RlZFZhbHVlIiwidmFsdWUiLCJlc2NhcGVkIiwidW5kZWZpbmVkIiwiVGVtcGxhdGVDb21waWxlciIsIm9wdGlvbnMiLCJ0ZW1wbGF0ZUlkIiwidGVtcGxhdGVJZHMiLCJzeW1ib2xTdGFjayIsIm9wY29kZXMiLCJpbmNsdWRlTWV0YSIsImNvbXBpbGUiLCJhc3QiLCJ0ZW1wbGF0ZVZpc2l0b3IiLCJ2aXNpdCIsImNvbXBpbGVyIiwicHJvY2VzcyIsImFjdGlvbnMiLCJtZXRhIiwiZm9yRWFjaCIsIm5hbWUiLCJhcmdzIiwiRXJyb3IiLCJzdGFydFByb2dyYW0iLCJwcm9ncmFtIiwicHVzaCIsIm9wY29kZSIsImVuZFByb2dyYW0iLCJwb3AiLCJzdGFydEJsb2NrIiwiZW5kQmxvY2siLCJ0ZXh0IiwiYWN0aW9uIiwiY2hhcnMiLCJjb21tZW50Iiwib3BlbkVsZW1lbnQiLCJpIiwiYXR0cmlidXRlcyIsImxlbmd0aCIsImF0dHJpYnV0ZSIsIm1vZGlmaWVycyIsIm1vZGlmaWVyIiwiY2xvc2VFbGVtZW50IiwibmFtZXNwYWNlIiwiaXNTdGF0aWMiLCJwcmVwYXJlQXR0cmlidXRlVmFsdWUiLCJjaGFyQXQiLCJ0eXBlIiwiaXNUcnVzdGluZyIsImFzc2VydElzU2ltcGxlUGF0aCIsInBhdGgiLCJsb2MiLCJwYXJ0cyIsInByZXBhcmVIZWxwZXIiLCJtdXN0YWNoZSIsIm11c3RhY2hlRXhwcmVzc2lvbiIsImlzWWllbGQiLCJ0byIsImFzc2VydFZhbGlkWWllbGQiLCJ5aWVsZCIsImlzUGFydGlhbCIsInBhcmFtcyIsImFzc2VydFZhbGlkUGFydGlhbCIsInBhcnRpYWwiLCJpc0RlYnVnZ2VyIiwiYXNzZXJ0VmFsaWREZWJ1Z2dlclVzYWdlIiwiZGVidWdnZXIiLCJibG9jayIsImludmVyc2VJZCIsImludmVyc2UiLCJhcmciLCJoZWFkIiwicmVzdCIsInN5bWJvbCIsInN5bWJvbHMiLCJhbGxvY2F0ZU5hbWVkIiwiZXhwciIsImlzQnVpbHRJbkhlbHBlciIsImJ1aWx0SW5IZWxwZXIiLCJpc0FyZyIsImlzSGVscGVySW52b2NhdGlvbiIsInRoaXMiLCJpc0xvY2FsIiwiZ2V0IiwiaXNTaW1wbGVQYXRoIiwicHJlcGFyZVBhcmFtcyIsImFsbG9jYXRlQmxvY2siLCJfbmFtZSIsImdldEV2YWxJbmZvIiwiaGFzQmxvY2siLCJoYXNCbG9ja1BhcmFtcyIsIl9wYXJhbXMiLCJpc0hhc0Jsb2NrIiwiYXNzZXJ0VmFsaWRIYXNCbG9ja1VzYWdlIiwib3JpZ2luYWwiLCJpc0hhc0Jsb2NrUGFyYW1zIiwiU3ViRXhwcmVzc2lvbiIsIlBhdGhFeHByZXNzaW9uIiwiZGF0YSIsImhhcyIsInNsaWNlIiwiU3RyaW5nTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtYmVyTGl0ZXJhbCIsIk51bGxMaXRlcmFsIiwiVW5kZWZpbmVkTGl0ZXJhbCIsImhhc2giLCJwcmVwYXJlSGFzaCIsInBhcmFtIiwicGFpcnMiLCJrZXkiLCJhdHRyaWJ1dGVNdXN0YWNoZSIsInByZXBhcmVDb25jYXRQYXJ0cyIsInBhcnQiLCJub2RlIiwic291cmNlIiwic3RhcnQiLCJlbmQiLCJsaW5lIiwiY29sdW1uIiwiY3VycmVudCIsImNvbnRleHQiLCJzdGF0ZW1lbnQiLCJjYWxsIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBT0EsZUFBUCxNQUE0QixvQkFBNUI7QUFDQSxPQUFPQyxrQkFBUCxNQUErQix1QkFBL0I7QUFDQSxTQUFTQyxLQUFULEVBQWdCQyxnQkFBaEIsUUFBd0MsZUFBeEM7QUFDQSxTQUFTQyxNQUFULFFBQStCLGVBQS9CO0FBQ0EsU0FBU0MsU0FBVCxFQUFvQkMsV0FBcEIsUUFBdUMsaUJBQXZDO0FBQ0EsU0FBU0Ms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U0FBUDtBQUNILEtBRkQsTUFFTztBQUNILGNBQU0sSUFBSXZDLFdBQUosb0RBQW1FMkgsVUFBVXZFLEdBQTdFLENBQU47QUFDSDtBQUNKIiwiZmlsZSI6ImxpYi90ZW1wbGF0ZS1jb21waWxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVZpc2l0b3IgZnJvbSBcIi4vdGVtcGxhdGUtdmlzaXRvclwiO1xuaW1wb3J0IEphdmFTY3JpcHRDb21waWxlciBmcm9tIFwiLi9qYXZhc2NyaXB0LWNvbXBpbGVyXCI7XG5pbXBvcnQgeyBTdGFjaywgZ2V0QXR0ck5hbWVzcGFjZSB9IGZyb20gXCJAZ2xpbW1lci91dGlsXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGV4cGVjdCB9IGZyb20gXCJAZ2xpbW1lci91dGlsXCI7XG5pbXBvcnQgeyBpc0xpdGVyYWwsIFN5bnRheEVycm9yIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmZ1bmN0aW9uIGlzVHJ1c3RlZFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmVzY2FwZWQgIT09IHVuZGVmaW5lZCAmJiAhdmFsdWUuZXNjYXBlZDtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbXBsYXRlQ29tcGlsZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUlkID0gMDtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUlkcyA9IFtdO1xuICAgICAgICB0aGlzLnN5bWJvbFN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmluY2x1ZGVNZXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgfVxuICAgIHN0YXRpYyBjb21waWxlKG9wdGlvbnMsIGFzdCkge1xuICAgICAgICBsZXQgdGVtcGxhdGVWaXNpdG9yID0gbmV3IFRlbXBsYXRlVmlzaXRvcigpO1xuICAgICAgICB0ZW1wbGF0ZVZpc2l0b3IudmlzaXQoYXN0KTtcbiAgICAgICAgbGV0IGNvbXBpbGVyID0gbmV3IFRlbXBsYXRlQ29tcGlsZXIob3B0aW9ucyk7XG4gICAgICAgIGxldCBvcGNvZGVzID0gY29tcGlsZXIucHJvY2Vzcyh0ZW1wbGF0ZVZpc2l0b3IuYWN0aW9ucyk7XG4gICAgICAgIHJldHVybiBKYXZhU2NyaXB0Q29tcGlsZXIucHJvY2VzcyhvcGNvZGVzLCBhc3RbJ3N5bWJvbHMnXSwgb3B0aW9ucy5tZXRhKTtcbiAgICB9XG4gICAgZ2V0IHN5bWJvbHMoKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5zeW1ib2xTdGFjay5jdXJyZW50LCAnRXhwZWN0ZWQgYSBzeW1ib2wgdGFibGUgb24gdGhlIHN0YWNrJyk7XG4gICAgfVxuICAgIHByb2Nlc3MoYWN0aW9ucykge1xuICAgICAgICBhY3Rpb25zLmZvckVhY2goKFtuYW1lLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkICR7bmFtZX0gb24gVGVtcGxhdGVDb21waWxlcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1tuYW1lXSguLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9wY29kZXM7XG4gICAgfVxuICAgIHN0YXJ0UHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sU3RhY2sucHVzaChwcm9ncmFtWzBdWydzeW1ib2xzJ10pO1xuICAgICAgICB0aGlzLm9wY29kZSgnc3RhcnRQcm9ncmFtJywgcHJvZ3JhbSwgcHJvZ3JhbSk7XG4gICAgfVxuICAgIGVuZFByb2dyYW0oKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdlbmRQcm9ncmFtJywgbnVsbCk7XG4gICAgfVxuICAgIHN0YXJ0QmxvY2socHJvZ3JhbSkge1xuICAgICAgICB0aGlzLnN5bWJvbFN0YWNrLnB1c2gocHJvZ3JhbVswXVsnc3ltYm9scyddKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUlkKys7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdzdGFydEJsb2NrJywgcHJvZ3JhbSwgcHJvZ3JhbSk7XG4gICAgfVxuICAgIGVuZEJsb2NrKCkge1xuICAgICAgICB0aGlzLnN5bWJvbFN0YWNrLnBvcCgpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlSWRzLnB1c2godGhpcy50ZW1wbGF0ZUlkIC0gMSk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdlbmRCbG9jaycsIG51bGwpO1xuICAgIH1cbiAgICB0ZXh0KFthY3Rpb25dKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCd0ZXh0JywgYWN0aW9uLCBhY3Rpb24uY2hhcnMpO1xuICAgIH1cbiAgICBjb21tZW50KFthY3Rpb25dKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdjb21tZW50JywgYWN0aW9uLCBhY3Rpb24udmFsdWUpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudChbYWN0aW9uXSkge1xuICAgICAgICB0aGlzLm9wY29kZSgnb3BlbkVsZW1lbnQnLCBhY3Rpb24sIGFjdGlvbik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9uLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlKFthY3Rpb24uYXR0cmlidXRlc1tpXV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9uLm1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5tb2RpZmllcihbYWN0aW9uLm1vZGlmaWVyc1tpXV0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Bjb2RlKCdmbHVzaEVsZW1lbnQnLCBudWxsKTtcbiAgICAgICAgdGhpcy5zeW1ib2xTdGFjay5wdXNoKGFjdGlvblsnc3ltYm9scyddKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KFthY3Rpb25dKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdjbG9zZUVsZW1lbnQnLCBudWxsLCBhY3Rpb24pO1xuICAgIH1cbiAgICBhdHRyaWJ1dGUoW2FjdGlvbl0pIHtcbiAgICAgICAgbGV0IHsgbmFtZSwgdmFsdWUgfSA9IGFjdGlvbjtcbiAgICAgICAgbGV0IG5hbWVzcGFjZSA9IGdldEF0dHJOYW1lc3BhY2UobmFtZSk7XG4gICAgICAgIGxldCBpc1N0YXRpYyA9IHRoaXMucHJlcGFyZUF0dHJpYnV0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSAnQCcpIHtcbiAgICAgICAgICAgIC8vIEFyZ3VtZW50c1xuICAgICAgICAgICAgaWYgKGlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ3N0YXRpY0FyZycsIGFjdGlvbiwgbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi52YWx1ZS50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ2R5bmFtaWNBcmcnLCBhY3Rpb24sIG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wY29kZSgnZHluYW1pY0FyZycsIGFjdGlvbiwgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaXNUcnVzdGluZyA9IGlzVHJ1c3RlZFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc1N0YXRpYykge1xuICAgICAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdzdGF0aWNBdHRyJywgYWN0aW9uLCBuYW1lLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1RydXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ3RydXN0aW5nQXR0cicsIGFjdGlvbiwgbmFtZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnZhbHVlLnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wY29kZSgnZHluYW1pY0F0dHInLCBhY3Rpb24sIG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wY29kZSgnZHluYW1pY0F0dHInLCBhY3Rpb24sIG5hbWUsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW9kaWZpZXIoW2FjdGlvbl0pIHtcbiAgICAgICAgYXNzZXJ0SXNTaW1wbGVQYXRoKGFjdGlvbi5wYXRoLCBhY3Rpb24ubG9jLCAnbW9kaWZpZXInKTtcbiAgICAgICAgbGV0IHsgcGF0aDogeyBwYXJ0cyB9IH0gPSBhY3Rpb247XG4gICAgICAgIHRoaXMucHJlcGFyZUhlbHBlcihhY3Rpb24pO1xuICAgICAgICB0aGlzLm9wY29kZSgnbW9kaWZpZXInLCBhY3Rpb24sIHBhcnRzWzBdKTtcbiAgICB9XG4gICAgbXVzdGFjaGUoW2FjdGlvbl0pIHtcbiAgICAgICAgbGV0IHsgcGF0aCB9ID0gYWN0aW9uO1xuICAgICAgICBpZiAoaXNMaXRlcmFsKHBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLm11c3RhY2hlRXhwcmVzc2lvbihhY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcsIGFjdGlvbiwgIWFjdGlvbi5lc2NhcGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1lpZWxkKHBhdGgpKSB7XG4gICAgICAgICAgICBsZXQgdG8gPSBhc3NlcnRWYWxpZFlpZWxkKGFjdGlvbik7XG4gICAgICAgICAgICB0aGlzLnlpZWxkKHRvLCBhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUGFydGlhbChwYXRoKSkge1xuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IGFzc2VydFZhbGlkUGFydGlhbChhY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsKHBhcmFtcywgYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RlYnVnZ2VyKHBhdGgpKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZERlYnVnZ2VyVXNhZ2UoYWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuZGVidWdnZXIoJ2RlYnVnZ2VyJywgYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubXVzdGFjaGVFeHByZXNzaW9uKGFjdGlvbik7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJywgYWN0aW9uLCAhYWN0aW9uLmVzY2FwZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJsb2NrKFthY3Rpb24gLyosIGluZGV4LCBjb3VudCovXSkge1xuICAgICAgICB0aGlzLnByZXBhcmVIZWxwZXIoYWN0aW9uKTtcbiAgICAgICAgbGV0IHRlbXBsYXRlSWQgPSB0aGlzLnRlbXBsYXRlSWRzLnBvcCgpO1xuICAgICAgICBsZXQgaW52ZXJzZUlkID0gYWN0aW9uLmludmVyc2UgPT09IG51bGwgPyBudWxsIDogdGhpcy50ZW1wbGF0ZUlkcy5wb3AoKTtcbiAgICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrJywgYWN0aW9uLCBhY3Rpb24ucGF0aC5wYXJ0c1swXSwgdGVtcGxhdGVJZCwgaW52ZXJzZUlkKTtcbiAgICB9XG4gICAgLy8vIEludGVybmFsIGFjdGlvbnMsIG5vdCBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgcHJvY2Vzc2VkIGFjdGlvbnNcbiAgICBhcmcoW3BhdGhdKSB7XG4gICAgICAgIGxldCB7IHBhcnRzOiBbaGVhZCwgLi4ucmVzdF0gfSA9IHBhdGg7XG4gICAgICAgIGxldCBzeW1ib2wgPSB0aGlzLnN5bWJvbHMuYWxsb2NhdGVOYW1lZChoZWFkKTtcbiAgICAgICAgdGhpcy5vcGNvZGUoJ2dldCcsIHBhdGgsIHN5bWJvbCwgcmVzdCk7XG4gICAgfVxuICAgIG11c3RhY2hlRXhwcmVzc2lvbihleHByKSB7XG4gICAgICAgIGxldCB7IHBhdGggfSA9IGV4cHI7XG4gICAgICAgIGlmIChpc0xpdGVyYWwocGF0aCkpIHtcbiAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdsaXRlcmFsJywgZXhwciwgcGF0aC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNCdWlsdEluSGVscGVyKHBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0SW5IZWxwZXIoZXhwcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcmcocGF0aCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXJnKFtwYXRoXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIZWxwZXJJbnZvY2F0aW9uKGV4cHIpKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVIZWxwZXIoZXhwcik7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnaGVscGVyJywgZXhwciwgcGF0aC5wYXJ0c1swXSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0aC50aGlzKSB7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnZ2V0JywgZXhwciwgMCwgcGF0aC5wYXJ0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNMb2NhbChwYXRoLCB0aGlzLnN5bWJvbHMpKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWQsIC4uLnBhcnRzXSA9IHBhdGgucGFydHM7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnZ2V0JywgZXhwciwgdGhpcy5zeW1ib2xzLmdldChoZWFkKSwgcGFydHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzU2ltcGxlUGF0aChwYXRoKSkge1xuICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ3Vua25vd24nLCBleHByLCBwYXRoLnBhcnRzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdtYXliZUxvY2FsJywgZXhwciwgcGF0aC5wYXJ0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8vIEludGVybmFsIFN5bnRheFxuICAgIHlpZWxkKHRvLCBhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlUGFyYW1zKGFjdGlvbi5wYXJhbXMpO1xuICAgICAgICB0aGlzLm9wY29kZSgneWllbGQnLCBhY3Rpb24sIHRoaXMuc3ltYm9scy5hbGxvY2F0ZUJsb2NrKHRvKSk7XG4gICAgfVxuICAgIGRlYnVnZ2VyKF9uYW1lLCBhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5vcGNvZGUoJ2RlYnVnZ2VyJywgYWN0aW9uLCB0aGlzLnN5bWJvbHMuZ2V0RXZhbEluZm8oKSk7XG4gICAgfVxuICAgIGhhc0Jsb2NrKG5hbWUsIGFjdGlvbikge1xuICAgICAgICB0aGlzLm9wY29kZSgnaGFzQmxvY2snLCBhY3Rpb24sIHRoaXMuc3ltYm9scy5hbGxvY2F0ZUJsb2NrKG5hbWUpKTtcbiAgICB9XG4gICAgaGFzQmxvY2tQYXJhbXMobmFtZSwgYWN0aW9uKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdoYXNCbG9ja1BhcmFtcycsIGFjdGlvbiwgdGhpcy5zeW1ib2xzLmFsbG9jYXRlQmxvY2sobmFtZSkpO1xuICAgIH1cbiAgICBwYXJ0aWFsKF9wYXJhbXMsIGFjdGlvbikge1xuICAgICAgICB0aGlzLnByZXBhcmVQYXJhbXMoYWN0aW9uLnBhcmFtcyk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdwYXJ0aWFsJywgYWN0aW9uLCB0aGlzLnN5bWJvbHMuZ2V0RXZhbEluZm8oKSk7XG4gICAgfVxuICAgIGJ1aWx0SW5IZWxwZXIoZXhwcikge1xuICAgICAgICBsZXQgeyBwYXRoIH0gPSBleHByO1xuICAgICAgICBpZiAoaXNIYXNCbG9jayhwYXRoKSkge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBhc3NlcnRWYWxpZEhhc0Jsb2NrVXNhZ2UoZXhwci5wYXRoLm9yaWdpbmFsLCBleHByKTtcbiAgICAgICAgICAgIHRoaXMuaGFzQmxvY2sobmFtZSwgZXhwcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNCbG9ja1BhcmFtcyhwYXRoKSkge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBhc3NlcnRWYWxpZEhhc0Jsb2NrVXNhZ2UoZXhwci5wYXRoLm9yaWdpbmFsLCBleHByKTtcbiAgICAgICAgICAgIHRoaXMuaGFzQmxvY2tQYXJhbXMobmFtZSwgZXhwcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8vIEV4cHJlc3Npb25zLCBpbnZva2VkIHJlY3Vyc2l2ZWx5IGZyb20gcHJlcGFyZVBhcmFtcyBhbmQgcHJlcGFyZUhhc2hcbiAgICBTdWJFeHByZXNzaW9uKGV4cHIpIHtcbiAgICAgICAgaWYgKGlzQnVpbHRJbkhlbHBlcihleHByLnBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0SW5IZWxwZXIoZXhwcik7XG4gICAgICAgIH0gZWxzZSB7XG4gIC