UNPKG

ember-legacy-class-transform

Version:
541 lines (454 loc) 57.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _templateVisitor = require("./template-visitor"); var _templateVisitor2 = _interopRequireDefault(_templateVisitor); var _javascriptCompiler = require("./javascript-compiler"); var _javascriptCompiler2 = _interopRequireDefault(_javascriptCompiler); var _util = require("@glimmer/util"); var _syntax = require("@glimmer/syntax"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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"); } } 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 _util.Stack(); this.opcodes = []; this.includeMeta = false; this.options = options || {}; } TemplateCompiler.compile = function compile(options, ast) { var templateVisitor = new _templateVisitor2.default(); templateVisitor.visit(ast); var compiler = new TemplateCompiler(options); var opcodes = compiler.process(templateVisitor.actions); return _javascriptCompiler2.default.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 = (0, _util.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 ((0, _syntax.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 ((0, _syntax.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]; (0, _util.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; (0, _util.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; }(); exports.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 _syntax.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 _syntax.SyntaxError("yield only takes a single named argument: 'to'", statement.loc); } else if (pairs.length === 1 && pairs[0].value.type !== 'StringLiteral') { throw new _syntax.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 _syntax.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 _syntax.SyntaxError("partial does not take any named arguments (on line " + loc.start.line + ")", statement.loc); } else if (!escaped) { throw new _syntax.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 _syntax.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 _syntax.SyntaxError("you can only yield to a literal value (on line " + loc.start.line + ")", call.loc); } } else { throw new _syntax.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 _syntax.SyntaxError("debugger does not take any named arguments", statement.loc); } if (params.length === 0) { return 'default'; } else { throw new _syntax.SyntaxError("debugger does not take any positional arguments", statement.loc); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90ZW1wbGF0ZS1jb21waWxlci5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVZpc2l0b3IiLCJKYXZhU2NyaXB0Q29tcGlsZXIiLCJTdGFjayIsImdldEF0dHJOYW1lc3BhY2UiLCJhc3NlcnQiLCJpc0xpdGVyYWwiLCJTeW50YXhFcnJvciIsImlzVHJ1c3RlZFZhbHVlIiwidmFsdWUiLCJlc2NhcGVkIiwidW5kZWZpbmVkIiwiVGVtcGxhdGVDb21waWxlciIsIm9wdGlvbnMiLCJ0ZW1wbGF0ZUlkIiwidGVtcGxhdGVJZHMiLCJzeW1ib2xTdGFjayIsIm9wY29kZXMiLCJpbmNsdWRlTWV0YSIsImNvbXBpbGUiLCJhc3QiLCJ0ZW1wbGF0ZVZpc2l0b3IiLCJ2aXNpdCIsImNvbXBpbGVyIiwicHJvY2VzcyIsImFjdGlvbnMiLCJtZXRhIiwiZm9yRWFjaCIsIm5hbWUiLCJhcmdzIiwiRXJyb3IiLCJzdGFydFByb2dyYW0iLCJwcm9ncmFtIiwicHVzaCIsIm9wY29kZSIsImVuZFByb2dyYW0iLCJwb3AiLCJzdGFydEJsb2NrIiwiZW5kQmxvY2siLCJ0ZXh0IiwiYWN0aW9uIiwiY2hhcnMiLCJjb21tZW50Iiwib3BlbkVsZW1lbnQiLCJpIiwiYXR0cmlidXRlcyIsImxlbmd0aCIsImF0dHJpYnV0ZSIsIm1vZGlmaWVycyIsIm1vZGlmaWVyIiwiY2xvc2VFbGVtZW50IiwibmFtZXNwYWNlIiwiaXNTdGF0aWMiLCJwcmVwYXJlQXR0cmlidXRlVmFsdWUiLCJjaGFyQXQiLCJ0eXBlIiwiaXNUcnVzdGluZyIsImFzc2VydElzU2ltcGxlUGF0aCIsInBhdGgiLCJsb2MiLCJwYXJ0cyIsInByZXBhcmVIZWxwZXIiLCJtdXN0YWNoZSIsIm11c3RhY2hlRXhwcmVzc2lvbiIsImlzWWllbGQiLCJ0byIsImFzc2VydFZhbGlkWWllbGQiLCJ5aWVsZCIsImlzUGFydGlhbCIsInBhcmFtcyIsImFzc2VydFZhbGlkUGFydGlhbCIsInBhcnRpYWwiLCJpc0RlYnVnZ2VyIiwiYXNzZXJ0VmFsaWREZWJ1Z2dlclVzYWdlIiwiZGVidWdnZXIiLCJibG9jayIsImludmVyc2VJZCIsImludmVyc2UiLCJhcmciLCJoZWFkIiwicmVzdCIsInN5bWJvbCIsInN5bWJvbHMiLCJhbGxvY2F0ZU5hbWVkIiwiZXhwciIsImlzQnVpbHRJbkhlbHBlciIsImJ1aWx0SW5IZWxwZXIiLCJpc0FyZyIsImlzSGVscGVySW52b2NhdGlvbiIsInRoaXMiLCJpc0xvY2FsIiwiZ2V0IiwiaXNTaW1wbGVQYXRoIiwicHJlcGFyZVBhcmFtcyIsImFsbG9jYXRlQmxvY2siLCJfbmFtZSIsImdldEV2YWxJbmZvIiwiaGFzQmxvY2siLCJoYXNCbG9ja1BhcmFtcyIsIl9wYXJhbXMiLCJpc0hhc0Jsb2NrIiwiYXNzZXJ0VmFsaWRIYXNCbG9ja1VzYWdlIiwib3JpZ2luYWwiLCJpc0hhc0Jsb2NrUGFyYW1zIiwiU3ViRXhwcmVzc2lvbiIsIlBhdGhFeHByZXNzaW9uIiwiZGF0YSIsImhhcyIsInNsaWNlIiwiU3RyaW5nTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtYmVyTGl0ZXJhbCIsIk51bGxMaXRlcmFsIiwiVW5kZWZpbmVkTGl0ZXJhbCIsImhhc2giLCJwcmVwYXJlSGFzaCIsInBhcmFtIiwicGFpcnMiLCJrZXkiLCJhdHRyaWJ1dGVNdXN0YWNoZSIsInByZXBhcmVDb25jYXRQYXJ0cyIsInBhcnQiLCJub2RlIiwic291cmNlIiwic3RhcnQiLCJlbmQiLCJsaW5lIiwiY29sdW1uIiwiY3VycmVudCIsImNvbnRleHQiLCJzdGF0ZW1lbnQiLCJjYWxsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxBQUFPLEFBQXFCOzs7O0FBQzVCLEFBQU8sQUFBd0I7Ozs7QUFDL0IsQUFBUyxBQUFPLEFBQXdCLEFBQ3hDLEFBQVMsQUFBc0I7O0FBQy9CLEFBQVMsQUFBVyxBQUFtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDdkMsU0FBQSxBQUFTLGVBQVQsQUFBd0IsT0FBTyxBQUMzQjtXQUFPLE1BQUEsQUFBTSxZQUFOLEFB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LFNBRG1DLEFBQ2xCLFVBRGtCLEFBQ25DO1FBRG1DLEFBQzNCLE9BRDJCLEFBQ2xCLFVBRGtCLEFBQzNCLEFBQ2Q7O1FBQUksUUFBUSxLQUFBLEFBQUssTUFBTCxBQUFXLFNBQXZCLEFBQWdDLEdBQUcsQUFDL0I7Y0FBTSxBQUFJLHNFQUEwRCxVQUFwRSxBQUFNLEFBQXdFLEFBQ2pGO0FBQ0Q7UUFBSSxPQUFBLEFBQU8sV0FBWCxBQUFzQixHQUFHLEFBQ3JCO2VBQUEsQUFBTyxBQUNWO0FBRkQsV0FFTyxBQUNIO2NBQU0sQUFBSSwyRUFBK0QsVUFBekUsQUFBTSxBQUE2RSxBQUN0RjtBQUNKIiwiZmlsZSI6ImxpYi90ZW1wbGF0ZS1jb21waWxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVZpc2l0b3IgZnJvbSBcIi4vdGVtcGxhdGUtdmlzaXRvclwiO1xuaW1wb3J0IEphdmFTY3JpcHRDb21waWxlciBmcm9tIFwiLi9qYXZhc2NyaXB0LWNvbXBpbGVyXCI7XG5pbXBvcnQgeyBTdGFjaywgZ2V0QXR0ck5hbWVzcGFjZSB9IGZyb20gXCJAZ2xpbW1lci91dGlsXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGV4cGVjdCB9IGZyb20gXCJAZ2xpbW1lci91dGlsXCI7XG5pbXBvcnQgeyBpc0xpdGVyYWwsIFN5bnRheEVycm9yIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmZ1bmN0aW9uIGlzVHJ1c3RlZFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmVzY2FwZWQgIT09IHVuZGVmaW5lZCAmJiAhdmFsdWUuZXNjYXBlZDtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbXBsYXRlQ29tcGlsZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUlkID0gMDtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUlkcyA9IFtdO1xuICAgICAgICB0aGlzLnN5bWJvbFN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmluY2x1ZGVNZXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgfVxuICAgIHN0YXRpYyBjb21waWxlKG9wdGlvbnMsIGFzdCkge1xuICAgICAgICBsZXQgdGVtcGxhdGVWaXNpdG9yID0gbmV3IFRlbXBsYXRlVmlzaXRvcigpO1xuICAgICAgICB0ZW1wbGF0ZVZpc2l0b3IudmlzaXQoYXN0KTtcbiAgICAgICAgbGV0IGNvbXBpbGVyID0gbmV3IFRlbXBsYXRlQ29tcGlsZXIob3B0aW9ucyk7XG4gICAgICAgIGxldCBvcGNvZGVzID0gY29tcGlsZXIucHJvY2Vzcyh0ZW1wbGF0ZVZpc2l0b3IuYWN0aW9ucyk7XG4gICAgICAgIHJldHVybiBKYXZhU2NyaXB0Q29tcGlsZXIucHJvY2VzcyhvcGNvZGVzLCBhc3RbJ3N5bWJvbHMnXSwgb3B0aW9ucy5tZXRhKTtcbiAgICB9XG4gICAgZ2V0IHN5bWJvbHMoKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5zeW1ib2xTdGFjay5jdXJyZW50LCAnRXhwZWN0ZWQgYSBzeW1ib2wgdGFibGUgb24gdGhlIHN0YWNrJyk7XG4gICAgfVxuICAgIHByb2Nlc3MoYWN0aW9ucykge1xuICAgICAgICBhY3Rpb25zLmZvckVhY2goKFtuYW1lLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkICR7bmFtZX0gb24gVGVtcGxhdGVDb21waWxlcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1tuYW1lXSguLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9wY29kZXM7XG4gICAgfVxuICAgIHN0YXJ0UHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sU3RhY2sucHVzaChwcm9ncmFtWzBdWydzeW1ib2xzJ10pO1xuICAgICAgICB0aGlzLm9wY29kZSgnc3RhcnRQcm9ncmFtJywgcHJvZ3JhbSwgcHJvZ3JhbSk7XG4gICAgfVxuICAgIGVuZFByb2dyYW0oKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdlbmRQcm9ncmFtJywgbnVsbCk7XG4gICAgfVxuICAgIHN0YXJ0QmxvY2socHJvZ3JhbSkge1xuICAgICAgICB0aGlzLnN5bWJvbFN0YWNrLnB1c2gocHJvZ3JhbVswXVsnc3ltYm9scyddKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUlkKys7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdzdGFydEJsb2NrJywgcHJvZ3JhbSwgcHJvZ3JhbSk7XG4gICAgfVxuICAgIGVuZEJsb2NrKCkge1xuICAgICAgICB0aGlzLnN5bWJvbFN0YWNrLnBvcCgpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlSWRzLnB1c2godGhpcy50ZW1wbGF0ZUlkIC0gMSk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdlbmRCbG9jaycsIG51bGwpO1xuICAgIH1cbiAgICB0ZXh0KFthY3Rpb25dKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCd0ZXh0JywgYWN0aW9uLCBhY3Rpb24uY2hhcnMpO1xuICAgIH1cbiAgICBjb21tZW50KFthY3Rpb25dKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdjb21tZW50JywgYWN0aW9uLCBhY3Rpb24udmFsdWUpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudChbYWN0aW9uXSkge1xuICAgICAgICB0aGlzLm9wY29kZSgnb3BlbkVsZW1lbnQnLCBhY3Rpb24sIGFjdGlvbik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9uLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlKFthY3Rpb24uYXR0cmlidXRlc1tpXV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9uLm1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5tb2RpZmllcihbYWN0aW9uLm1vZGlmaWVyc1tpXV0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Bjb2RlKCdmbHVzaEVsZW1lbnQnLCBudWxsKTtcbiAgICAgICAgdGhpcy5zeW1ib2xTdGFjay5wdXNoKGFjdGlvblsnc3ltYm9scyddKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KFthY3Rpb25dKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdjbG9zZUVsZW1lbnQnLCBudWxsLCBhY3Rpb24pO1xuICAgIH1cbiAgICBhdHRyaWJ1dGUoW2FjdGlvbl0pIHtcbiAgICAgICAgbGV0IHsgbmFtZSwgdmFsdWUgfSA9IGFjdGlvbjtcbiAgICAgICAgbGV0IG5hbWVzcGFjZSA9IGdldEF0dHJOYW1lc3BhY2UobmFtZSk7XG4gICAgICAgIGxldCBpc1N0YXRpYyA9IHRoaXMucHJlcGFyZUF0dHJpYnV0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSAnQCcpIHtcbiAgICAgICAgICAgIC8vIEFyZ3VtZW50c1xuICAgICAgICAgICAgaWYgKGlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ3N0YXRpY0FyZycsIGFjdGlvbiwgbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi52YWx1ZS50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ2R5bmFtaWNBcmcnLCBhY3Rpb24sIG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wY29kZSgnZHluYW1pY0FyZycsIGFjdGlvbiwgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaXNUcnVzdGluZyA9IGlzVHJ1c3RlZFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc1N0YXRpYykge1xuICAgICAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdzdGF0aWNBdHRyJywgYWN0aW9uLCBuYW1lLCBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1RydXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ3RydXN0aW5nQXR0cicsIGFjdGlvbiwgbmFtZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnZhbHVlLnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wY29kZSgnZHluYW1pY0F0dHInLCBhY3Rpb24sIG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wY29kZSgnZHluYW1pY0F0dHInLCBhY3Rpb24sIG5hbWUsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW9kaWZpZXIoW2FjdGlvbl0pIHtcbiAgICAgICAgYXNzZXJ0SXNTaW1wbGVQYXRoKGFjdGlvbi5wYXRoLCBhY3Rpb24ubG9jLCAnbW9kaWZpZXInKTtcbiAgICAgICAgbGV0IHsgcGF0aDogeyBwYXJ0cyB9IH0gPSBhY3Rpb247XG4gICAgICAgIHRoaXMucHJlcGFyZUhlbHBlcihhY3Rpb24pO1xuICAgICAgICB0aGlzLm9wY29kZSgnbW9kaWZpZXInLCBhY3Rpb24sIHBhcnRzWzBdKTtcbiAgICB9XG4gICAgbXVzdGFjaGUoW2FjdGlvbl0pIHtcbiAgICAgICAgbGV0IHsgcGF0aCB9ID0gYWN0aW9uO1xuICAgICAgICBpZiAoaXNMaXRlcmFsKHBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLm11c3RhY2hlRXhwcmVzc2lvbihhY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcsIGFjdGlvbiwgIWFjdGlvbi5lc2NhcGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1lpZWxkKHBhdGgpKSB7XG4gICAgICAgICAgICBsZXQgdG8gPSBhc3NlcnRWYWxpZFlpZWxkKGFjdGlvbik7XG4gICAgICAgICAgICB0aGlzLnlpZWxkKHRvLCBhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUGFydGlhbChwYXRoKSkge1xuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IGFzc2VydFZhbGlkUGFydGlhbChhY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsKHBhcmFtcywgYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RlYnVnZ2VyKHBhdGgpKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZERlYnVnZ2VyVXNhZ2UoYWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuZGVidWdnZXIoJ2RlYnVnZ2VyJywgYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubXVzdGFjaGVFeHByZXNzaW9uKGFjdGlvbik7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnYXBwZW5kJywgYWN0aW9uLCAhYWN0aW9uLmVzY2FwZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJsb2NrKFthY3Rpb24gLyosIGluZGV4LCBjb3VudCovXSkge1xuICAgICAgICB0aGlzLnByZXBhcmVIZWxwZXIoYWN0aW9uKTtcbiAgICAgICAgbGV0IHRlbXBsYXRlSWQgPSB0aGlzLnRlbXBsYXRlSWRzLnBvcCgpO1xuICAgICAgICBsZXQgaW52ZXJzZUlkID0gYWN0aW9uLmludmVyc2UgPT09IG51bGwgPyBudWxsIDogdGhpcy50ZW1wbGF0ZUlkcy5wb3AoKTtcbiAgICAgICAgdGhpcy5vcGNvZGUoJ2Jsb2NrJywgYWN0aW9uLCBhY3Rpb24ucGF0aC5wYXJ0c1swXSwgdGVtcGxhdGVJZCwgaW52ZXJzZUlkKTtcbiAgICB9XG4gICAgLy8vIEludGVybmFsIGFjdGlvbnMsIG5vdCBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgcHJvY2Vzc2VkIGFjdGlvbnNcbiAgICBhcmcoW3BhdGhdKSB7XG4gICAgICAgIGxldCB7IHBhcnRzOiBbaGVhZCwgLi4ucmVzdF0gfSA9IHBhdGg7XG4gICAgICAgIGxldCBzeW1ib2wgPSB0aGlzLnN5bWJvbHMuYWxsb2NhdGVOYW1lZChoZWFkKTtcbiAgICAgICAgdGhpcy5vcGNvZGUoJ2dldCcsIHBhdGgsIHN5bWJvbCwgcmVzdCk7XG4gICAgfVxuICAgIG11c3RhY2hlRXhwcmVzc2lvbihleHByKSB7XG4gICAgICAgIGxldCB7IHBhdGggfSA9IGV4cHI7XG4gICAgICAgIGlmIChpc0xpdGVyYWwocGF0aCkpIHtcbiAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdsaXRlcmFsJywgZXhwciwgcGF0aC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNCdWlsdEluSGVscGVyKHBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0SW5IZWxwZXIoZXhwcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcmcocGF0aCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXJnKFtwYXRoXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIZWxwZXJJbnZvY2F0aW9uKGV4cHIpKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVIZWxwZXIoZXhwcik7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnaGVscGVyJywgZXhwciwgcGF0aC5wYXJ0c1swXSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0aC50aGlzKSB7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnZ2V0JywgZXhwciwgMCwgcGF0aC5wYXJ0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNMb2NhbChwYXRoLCB0aGlzLnN5bWJvbHMpKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWQsIC4uLnBhcnRzXSA9IHBhdGgucGFydHM7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnZ2V0JywgZXhwciwgdGhpcy5zeW1ib2xzLmdldChoZWFkKSwgcGFydHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzU2ltcGxlUGF0aChwYXRoKSkge1xuICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ3Vua25vd24nLCBleHByLCBwYXRoLnBhcnRzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdtYXliZUxvY2FsJywgZXhwciwgcGF0aC5wYXJ0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8vIEludGVybmFsIFN5bnRheFxuICAgIHlpZWxkKHRvLCBhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlUGFyYW1zKGFjdGlvbi5wYXJhbXMpO1xuICAgICAgICB0aGlzLm9wY29kZSgneWllbGQnLCBhY3Rpb24sIHRoaXMuc3ltYm9scy5hbGxvY2F0ZUJsb2NrKHRvKSk7XG4gICAgfVxuICAgIGRlYnVnZ2VyKF9uYW1lLCBhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5vcGNvZGUoJ2RlYnVnZ2VyJywgYWN0aW9uLCB0aGlzLnN5bWJvbHMuZ2V0RXZhbEluZm8oKSk7XG4gICAgfVxuICAgIGhhc0Jsb2NrKG5hbWUsIGFjdGlvbikge1xuICAgICAgICB0aGlzLm9wY29kZSgnaGFzQmxvY2snLCBhY3Rpb24sIHRoaXMuc3ltYm9scy5hbGxvY2F0ZUJsb2NrKG5hbWUpKTtcbiAgICB9XG4gICAgaGFzQmxvY2tQYXJhbXMobmFtZSwgYWN0aW9uKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdoYXNCbG9ja1BhcmFtcycsIGFjdGlvbiwgdGhpcy5zeW1ib2xzLmFsbG9jYXRlQmxvY2sobmFtZSkpO1xuICAgIH1cbiAgICBwYXJ0aWFsKF9wYXJhbXMsIGFjdGlvbikge1xuICAgICAgICB0aGlzLnByZXBhcmVQYXJhbXMoYWN0aW9uLnBhcmFtcyk7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdwYXJ0aWFsJywgYWN0aW9uLCB0aGlzLnN5bWJvbHMuZ2V0RXZhbEluZm8oKSk7XG4gICAgfVxuICAgIGJ1aWx0SW5IZWxwZXIoZXhwcikge1xuICAgICAgICBsZXQgeyBwYXRoIH0gPSBleHByO1xuICAgICAgICBpZiAoaXNIYXNCbG9jayhwYXRoKSkge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBhc3NlcnRWYWxpZEhhc0Jsb2NrVXNhZ2UoZXhwci5wYXRoLm9yaWdpbmFsLCBleHByKTtcbiAgICAgICAgICAgIHRoaXMuaGFzQmxvY2sobmFtZSwgZXhwcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNCbG9ja1BhcmFtcyhwYXRoKSkge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBhc3NlcnRWYWxpZEhhc0Jsb2NrVXNhZ2UoZXhwci5wYXRoLm9yaWdpbmFsLCBleHByKTtcbiAgICAgICAgICAgIHRoaXMuaGFzQmxvY2tQYXJhbXMobmFtZSwgZXhwcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8vIEV4cHJlc3Npb25zLCBpbnZva2VkIHJlY3Vyc2l2ZWx5IGZyb20gcHJlcGFyZVBhcmFtcyBhbmQgcHJlcGFyZUhhc2hcbiAgICBTdWJFeHByZXNzaW9uKGV4cHIpIHtcbiAgICAgICAgaWYgKGlzQnVpbHRJbkhlbHBlcihleHByLnBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0SW5IZWxwZXIoZXhwcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVIZWxwZXIoZXhwcik7XG4gICAgICAgICAgICB0aGlzLm9wY29kZSgnaGVscGVyJywgZXhwciwgZXhwci5wYXRoLnBhcnRzWzBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBQYXRoRXhwcmVzc2lvbihleHByKSB7XG4gICAgICAgIGlmIChleHByLmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYXJnKFtleHByXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgeyBzeW1ib2xzIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IFtoZWFkXSA9IGV4cHIucGFydHM7XG4gICAgICAgICAgICBpZiAoZXhwci50aGlzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGNvZGUoJ2dldCcsIGV4cHIsIDAsIGV4cHIucGFydHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzeW1ib2xzLmhhcyhoZWFkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdnZXQnLCBleHByLCBzeW1ib2xzLmdldChoZWFkKSwgZXhwci5wYXJ0cy5zbGljZSgxKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3Bjb2RlKCdnZXQnLCBleHByLCAwLCBleHByLnBhcnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBTdHJpbmdMaXRlcmFsKGFjdGlvbikge1xuICAgICAgICB0aGlzLm9wY29kZSgnbGl0ZXJhbCcsIG51bGwsIGFjdGlvbi52YWx1ZSk7XG4gICAgfVxuICAgIEJvb2xlYW5MaXRlcmFsKGFjdGlvbikge1xuICAgICAgICB0aGlzLm9wY29kZSgnbGl0ZXJhbCcsIG51bGwsIGFjdGlvbi52YWx1ZSk7XG4gICAgfVxuICAgIE51bWJlckxpdGVyYWwoYWN0aW9uKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdsaXRlcmFsJywgbnVsbCwgYWN0aW9uLnZhbHVlKTtcbiAgICB9XG4gICAgTnVsbExpdGVyYWwoYWN0aW9uKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlKCdsaXRlcmFsJywgbnVsbCwgYWN0aW9uLnZhbHVlKTtcbiAgICB9XG4gICAgVW5kZWZpbmVkTGl0ZXJhbChhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5vcGNvZGUoJ2xpdGVyYWwnLCBudWxsLCBhY3Rpb24udmFsdWUpO1xuICAgIH1cbiAgICAvLy8gVXRpbGl0aWVzXG4gICAgb3Bjb2RlKG5hbWUsIGFjdGlvbiwgLi4uYXJncykge1xuICAgICAgICBsZXQgb3Bjb2RlID0gW25hbWUsIC4uLmFyZ3NdO1xuICAgICAgICBpZiAodGhpcy5pbmNsdWRlTWV0YSAmJiBhY3Rpb24pIHtcbiAgICAgICAgICAgIG9wY29kZS5wdXNoKHR