UNPKG

shift-spidermonkey-converter

Version:
943 lines (903 loc) 102 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /** * Copyright 2014 Shape Security, Inc. * * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // convert Shift AST format to SpiderMonkey AST format var _cookTemplateString = require("./cook-template-string"); var _cookTemplateString2 = _interopRequireDefault(_cookTemplateString); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure undefined"); } var SpiderMonkeyConverter = { convert: function convert(ast) { if (ast == null) { return null; } return this["convert" + ast.type](ast); }, // bindings convertBindingWithDefault: function convertBindingWithDefault(node) { return { type: "AssignmentPattern", left: this.convert(node.binding), right: this.convert(node.init) }; }, convertBindingIdentifier: function convertBindingIdentifier(node) { return this.createIdentifier(node.name); }, convertArrayBinding: function convertArrayBinding(node) { var _this = this; var elts = node.elements.map(function (v) { if (v == null) return v; if (v.type === "BindingWithDefault") { return { type: "AssignmentPattern", left: _this.convert(v.binding), right: _this.convert(v.init) }; } return _this.convert(v); }); if (node.restElement) elts.push({ type: "RestElement", argument: this.convert(node.restElement) }); return { type: "ArrayPattern", elements: elts }; }, convertObjectBinding: function convertObjectBinding(node) { return { type: "ObjectPattern", properties: node.properties.map(this.convert.bind(this)) }; }, convertBindingPropertyIdentifier: function convertBindingPropertyIdentifier(node) { var key = this.convert(node.binding); var value = !node.init ? key : { type: "AssignmentPattern", left: key, right: this.convert(node.init) }; return { type: "Property", kind: "init", method: false, computed: false, shorthand: true, key: key, value: value }; }, convertBindingPropertyProperty: function convertBindingPropertyProperty(node) { return { type: "Property", kind: "init", computed: false, method: false, shorthand: false, key: this.convert(node.name), value: this.convert(node.binding) }; }, // classes convertClassExpression: function convertClassExpression(node) { var expression = this.convertClassDeclaration(node); expression.type = "ClassExpression"; return expression; }, convertClassDeclaration: function convertClassDeclaration(node) { return { type: "ClassDeclaration", id: this.convert(node.name), superClass: this.convert(node.super), body: { type: "ClassBody", body: node.elements.map(this.convert.bind(this)) } }; }, convertClassElement: function convertClassElement(node) { var m = node.method; var key = this.convertPropertyName(m.name); var computed = m.name.type === "ComputedPropertyName"; switch (m.type) { case "Method": { var _convertFormalParamet = this.convertFormalParameters(m), _convertFormalParamet2 = _slicedToArray(_convertFormalParamet, 2), params = _convertFormalParamet2[0], defaults = _convertFormalParamet2[1]; return { type: "MethodDefinition", key: key, computed: computed, kind: m.name.value === "constructor" ? "constructor" : "method", static: node.isStatic, value: { type: "FunctionExpression", id: null, params: params, defaults: defaults, generator: m.isGenerator, expression: false, body: this.convert(m.body) } }; } case "Getter": return { type: "MethodDefinition", key: key, computed: computed, kind: "get", static: node.isStatic, value: { type: "FunctionExpression", id: null, params: [], defaults: [], generator: false, expression: false, body: this.convert(m.body) } }; case "Setter": { var _convertFormalParamet3 = this.convertFormalParameters({ params: { items: [m.param] } }), _convertFormalParamet4 = _slicedToArray(_convertFormalParamet3, 2), _params = _convertFormalParamet4[0], _defaults = _convertFormalParamet4[1]; // mocking a FormalParameters object return { type: "MethodDefinition", key: key, computed: computed, kind: "set", static: node.isStatic, value: { type: "FunctionExpression", id: null, params: _params, defaults: _defaults, generator: false, expression: false, body: this.convert(m.body) } }; } } }, // modules convertModule: function convertModule(node) { return { type: "Program", body: node.items.map(this.convert.bind(this)), sourceType: "module" }; }, convertImport: function convertImport(node) { var specifiers = node.namedImports.map(this.convert.bind(this)); if (node.defaultBinding) specifiers.unshift({ type: "ImportDefaultSpecifier", local: this.convert(node.defaultBinding) }); return { type: "ImportDeclaration", source: { type: "Literal", value: node.moduleSpecifier }, specifiers: specifiers }; }, convertImportNamespace: function convertImportNamespace(node) { var specifiers = [{ type: "ImportNamespaceSpecifier", local: this.convert(node.namespaceBinding) }]; if (node.defaultBinding != null) { specifiers.unshift({ type: "ImportDefaultSpecifier", local: this.convert(node.defaultBinding) }); } return { type: "ImportDeclaration", source: { type: "Literal", value: node.moduleSpecifier }, specifiers: specifiers }; }, convertImportSpecifier: function convertImportSpecifier(node) { return { type: "ImportSpecifier", local: this.convert(node.binding), imported: this.createIdentifier(node.name) }; }, convertExportAllFrom: function convertExportAllFrom(node) { return { type: "ExportAllDeclaration", source: { type: "Literal", value: node.moduleSpecifier } }; }, convertExportFrom: function convertExportFrom(node) { return { type: "ExportNamedDeclaration", declaration: null, source: node.moduleSpecifier == null ? null : { type: "Literal", value: node.moduleSpecifier }, specifiers: node.namedExports.map(this.convert.bind(this)) }; }, convertExport: function convertExport(node) { return { type: "ExportNamedDeclaration", declaration: this.convert(node.declaration), specifiers: [], source: null }; }, convertExportDefault: function convertExportDefault(node) { return { type: "ExportDefaultDeclaration", declaration: this.convert(node.body) }; }, convertExportSpecifier: function convertExportSpecifier(node) { return { type: "ExportSpecifier", exported: this.createIdentifier(node.exportedName), local: this.createIdentifier(node.name != null ? node.name : node.exportedName) }; }, // property definition convertMethod: function convertMethod(node) { var _convertFormalParamet5 = this.convertFormalParameters(node), _convertFormalParamet6 = _slicedToArray(_convertFormalParamet5, 2), params = _convertFormalParamet6[0], defaults = _convertFormalParamet6[1]; return { type: "Property", key: this.convert(node.name), computed: node.name.type === "ComputedPropertyName", kind: "init", method: true, shorthand: false, value: { type: "FunctionExpression", id: null, params: params, defaults: defaults, generator: node.isGenerator, expression: false, body: this.convertFunctionBody(node.body) } }; }, convertGetter: function convertGetter(node) { return { type: "Property", key: this.convert(node.name), computed: node.name.type === "ComputedPropertyName", value: { type: "FunctionExpression", id: null, params: [], defaults: [], body: this.convertFunctionBody(node.body), generator: false, expression: false }, method: false, shorthand: false, kind: "get" }; }, convertSetter: function convertSetter(node) { var _convertFormalParamet7 = this.convertFormalParameters({ params: { items: [node.param] } }), _convertFormalParamet8 = _slicedToArray(_convertFormalParamet7, 2), params = _convertFormalParamet8[0], defaults = _convertFormalParamet8[1]; // mocking a FormalParameters object return { type: "Property", key: this.convert(node.name), computed: node.name.type === "ComputedPropertyName", value: { type: "FunctionExpression", id: null, params: params, defaults: defaults, body: this.convertFunctionBody(node.body), generator: false, expression: false }, method: false, shorthand: false, kind: "set" }; }, convertDataProperty: function convertDataProperty(node) { return { type: "Property", key: this.convert(node.name), value: this.convert(node.expression), kind: "init", computed: node.name.type === "ComputedPropertyName", method: false, shorthand: false }; }, convertShorthandProperty: function convertShorthandProperty(node) { return { type: "Property", shorthand: true, kind: "init", method: false, computed: false, key: this.createIdentifier(node.name), value: this.createIdentifier(node.name) }; }, convertComputedPropertyName: function convertComputedPropertyName(node) { return this.convert(node.expression); }, convertStaticPropertyName: function convertStaticPropertyName(node) { return { type: "Literal", value: node.value }; }, // literals convertLiteralBooleanExpression: function convertLiteralBooleanExpression(node) { return { type: "Literal", value: node.value }; }, convertLiteralInfinityExpression: function convertLiteralInfinityExpression() { return { type: "Literal", value: 1 / 0 }; }, convertLiteralNullExpression: function convertLiteralNullExpression() { return { type: "Literal", value: null }; }, convertLiteralNumericExpression: function convertLiteralNumericExpression(node) { return { type: "Literal", value: parseFloat(node.value) }; }, convertLiteralRegExpExpression: function convertLiteralRegExpExpression(node) { var value = void 0; try { value = RegExp(node.pattern, node.flags); } catch (_ref) { _objectDestructuringEmpty(_ref); value = null; } return { type: "Literal", value: value, regex: { pattern: node.pattern, flags: node.flags } }; }, convertLiteralStringExpression: function convertLiteralStringExpression(node) { return { type: "Literal", value: node.value }; }, // other expressions convertArrayExpression: function convertArrayExpression(node) { return { type: "ArrayExpression", elements: node.elements.map(this.convert.bind(this)) }; }, convertArrowExpression: function convertArrowExpression(node) { var _convertFormalParamet9 = this.convertFormalParameters(node), _convertFormalParamet10 = _slicedToArray(_convertFormalParamet9, 2), params = _convertFormalParamet10[0], defaults = _convertFormalParamet10[1], body = this.convert(node.body); return { type: "ArrowFunctionExpression", id: null, generator: false, expression: body.type !== "BlockStatement", params: params, defaults: defaults, body: this.convert(node.body) }; }, convertAssignmentExpression: function convertAssignmentExpression(node) { return { type: "AssignmentExpression", operator: "=", left: this.convert(node.binding), right: this.convert(node.expression) }; }, convertBinaryExpression: function convertBinaryExpression(node) { if (node.operator === ",") { return { type: "SequenceExpression", expressions: this.convertSequenceExpressionToArray(node) }; } return { type: node.operator === "||" || node.operator === "&&" ? "LogicalExpression" : "BinaryExpression", operator: node.operator, left: this.convert(node.left), right: this.convert(node.right) }; }, convertCallExpression: function convertCallExpression(node) { return { type: "CallExpression", callee: this.convert(node.callee), arguments: node.arguments.map(this.convert.bind(this)) }; }, convertCompoundAssignmentExpression: function convertCompoundAssignmentExpression(node) { return { type: "AssignmentExpression", operator: node.operator, left: this.convert(node.binding), right: this.convert(node.expression) }; }, convertComputedMemberExpression: function convertComputedMemberExpression(node) { return { type: "MemberExpression", object: this.convert(node.object), property: this.convert(node.expression), computed: true }; }, convertConditionalExpression: function convertConditionalExpression(node) { return { type: "ConditionalExpression", test: this.convert(node.test), alternate: this.convert(node.alternate), consequent: this.convert(node.consequent) }; }, convertFunctionExpression: function convertFunctionExpression(node) { var _convertFormalParamet11 = this.convertFormalParameters(node), _convertFormalParamet12 = _slicedToArray(_convertFormalParamet11, 2), params = _convertFormalParamet12[0], defaults = _convertFormalParamet12[1]; return { type: "FunctionExpression", id: this.convert(node.name), params: params, defaults: defaults, body: this.convert(node.body), generator: node.isGenerator, expression: false }; }, convertIdentifierExpression: function convertIdentifierExpression(node) { return this.createIdentifier(node.name); }, convertNewExpression: function convertNewExpression(node) { return { type: "NewExpression", callee: this.convert(node.callee), arguments: node.arguments.map(this.convert.bind(this)) }; }, convertNewTargetExpression: function convertNewTargetExpression() { return { type: "MetaProperty", meta: "new", property: "target" }; }, convertObjectExpression: function convertObjectExpression(node) { return { type: "ObjectExpression", properties: node.properties.map(this.convert.bind(this)) }; }, convertUnaryExpression: function convertUnaryExpression(node) { return { type: "UnaryExpression", operator: node.operator, argument: this.convert(node.operand), prefix: true }; }, convertStaticMemberExpression: function convertStaticMemberExpression(node) { return { type: "MemberExpression", object: this.convert(node.object), property: this.createIdentifier(node.property), computed: false }; }, convertTemplateExpression: function convertTemplateExpression(node) { var _this2 = this; var quasis = [], expressions = []; node.elements.forEach(function (v, i) { if (i % 2 === 0) quasis.push(_this2.convert(v));else expressions.push(_this2.convert(v)); }); quasis[quasis.length - 1].tail = true; if (node.tag != null) { return { type: "TaggedTemplateExpression", tag: this.convert(node.tag), quasi: { type: "TemplateLiteral", quasis: quasis, expressions: expressions } }; } return { type: "TemplateLiteral", quasis: quasis, expressions: expressions }; }, convertThisExpression: function convertThisExpression() { return { type: "ThisExpression" }; }, convertUpdateExpression: function convertUpdateExpression(node) { return { type: "UpdateExpression", prefix: node.isPrefix, operator: node.operator, argument: this.convert(node.operand) }; }, convertYieldExpression: function convertYieldExpression(node) { return { type: "YieldExpression", argument: this.convert(node.expression), delegate: false }; }, convertYieldGeneratorExpression: function convertYieldGeneratorExpression(node) { var expr = this.convertYieldExpression(node); expr.delegate = true; return expr; }, // other statements convertBlockStatement: function convertBlockStatement(node) { return this.convertBlock(node.block); }, convertBreakStatement: function convertBreakStatement(node) { return { type: "BreakStatement", label: node.label ? this.createIdentifier(node.label) : null }; }, convertContinueStatement: function convertContinueStatement(node) { return { type: "ContinueStatement", label: node.label ? this.createIdentifier(node.label) : null }; }, convertDebuggerStatement: function convertDebuggerStatement() { return { type: "DebuggerStatement" }; }, convertDoWhileStatement: function convertDoWhileStatement(node) { return { type: "DoWhileStatement", test: this.convert(node.test), body: this.convert(node.body) }; }, convertEmptyStatement: function convertEmptyStatement() { return { type: "EmptyStatement" }; }, convertExpressionStatement: function convertExpressionStatement(node) { return { type: "ExpressionStatement", expression: this.convert(node.expression) }; }, convertForInStatement: function convertForInStatement(node) { return { type: "ForInStatement", left: this.convert(node.left), right: this.convert(node.right), body: this.convert(node.body) }; }, convertForOfStatement: function convertForOfStatement(node) { return { type: "ForOfStatement", left: this.convert(node.left), right: this.convert(node.right), body: this.convert(node.body) }; }, convertForStatement: function convertForStatement(node) { return { type: "ForStatement", init: this.convert(node.init), test: this.convert(node.test), update: this.convert(node.update), body: this.convert(node.body) }; }, convertIfStatement: function convertIfStatement(node) { return { type: "IfStatement", test: this.convert(node.test), consequent: this.convert(node.consequent), alternate: this.convert(node.alternate) }; }, convertLabeledStatement: function convertLabeledStatement(node) { return { type: "LabeledStatement", label: this.createIdentifier(node.label), body: this.convert(node.body) }; }, convertReturnStatement: function convertReturnStatement(node) { return { type: "ReturnStatement", argument: this.convert(node.expression) }; }, convertSwitchStatement: function convertSwitchStatement(node) { return { type: "SwitchStatement", discriminant: this.convert(node.discriminant), cases: node.cases.map(this.convert.bind(this)) }; }, convertSwitchStatementWithDefault: function convertSwitchStatementWithDefault(node) { return { type: "SwitchStatement", discriminant: this.convert(node.discriminant), cases: node.preDefaultCases.map(this.convert.bind(this)).concat(this.convert(node.defaultCase)).concat(node.postDefaultCases.map(this.convert.bind(this))) }; }, convertThrowStatement: function convertThrowStatement(node) { return { type: "ThrowStatement", argument: this.convert(node.expression) }; }, convertTryCatchStatement: function convertTryCatchStatement(node) { var catchClause = this.convert(node.catchClause); return { type: "TryStatement", block: this.convertBlock(node.body), handler: catchClause, finalizer: null }; }, convertTryFinallyStatement: function convertTryFinallyStatement(node) { var catchClause = this.convert(node.catchClause); return { type: "TryStatement", block: this.convertBlock(node.body), handler: catchClause, finalizer: this.convert(node.finalizer) }; }, convertVariableDeclarationStatement: function convertVariableDeclarationStatement(node) { return this.convert(node.declaration); }, convertWhileStatement: function convertWhileStatement(node) { return { type: "WhileStatement", test: this.convert(node.test), body: this.convert(node.body) }; }, convertWithStatement: function convertWithStatement(node) { return { type: "WithStatement", object: this.convert(node.object), body: this.convert(node.body) }; }, // other nodes convertBlock: function convertBlock(node) { return { type: "BlockStatement", body: node.statements.map(this.convert.bind(this)) }; }, convertCatchClause: function convertCatchClause(node) { return { type: "CatchClause", param: this.convert(node.binding), body: this.convert(node.body) }; }, convertDirective: function convertDirective(node) { return { type: "ExpressionStatement", expression: { type: "Literal", value: node.rawValue }, directive: node.rawValue }; }, convertFormalParameters: function convertFormalParameters(node) { var _this3 = this; var ps = node.params; var params = [], defaults = []; if (ps.items.length > 0) { var hasDefaultBindings = false; ps.items.forEach(function (v) { if (v.type === "BindingWithDefault") { hasDefaultBindings = true; params.push(_this3.convert(v.binding)); defaults.push(_this3.convert(v.init)); } else { params.push(_this3.convert(v)); defaults.push(null); } }); if (ps.rest != null) { params.push({ type: "RestElement", argument: this.convert(ps.rest) }); defaults.push(null); } if (!hasDefaultBindings) { defaults = []; } } return [params, defaults]; }, convertFunctionBody: function convertFunctionBody(node) { var directives = node.directives ? node.directives.map(this.convert.bind(this)) : [], statements = node.statements ? node.statements.map(this.convert.bind(this)) : []; return { type: "BlockStatement", body: directives.concat(statements) }; }, convertFunctionDeclaration: function convertFunctionDeclaration(node) { var _convertFormalParamet13 = this.convertFormalParameters(node), _convertFormalParamet14 = _slicedToArray(_convertFormalParamet13, 2), params = _convertFormalParamet14[0], defaults = _convertFormalParamet14[1]; return { type: "FunctionDeclaration", id: this.convert(node.name), params: params, defaults: defaults, body: this.convert(node.body), generator: node.isGenerator, expression: false }; }, convertScript: function convertScript(node) { var directives = node.directives.map(this.convert.bind(this)), statements = node.statements.map(this.convert.bind(this)); return { type: "Program", body: directives.concat(statements), sourceType: "script" }; }, convertSpreadElement: function convertSpreadElement(node) { return { type: "SpreadElement", argument: this.convert(node.expression) }; }, convertSuper: function convertSuper() { return { type: "Super" }; }, convertSwitchCase: function convertSwitchCase(node) { return { type: "SwitchCase", test: this.convert(node.test), consequent: node.consequent.map(this.convert.bind(this)) }; }, convertSwitchDefault: function convertSwitchDefault(node) { return { type: "SwitchCase", test: null, consequent: node.consequent.map(this.convert.bind(this)) }; }, convertTemplateElement: function convertTemplateElement(node) { return { type: "TemplateElement", value: { raw: node.rawValue, cooked: (0, _cookTemplateString2.default)(node.rawValue) }, tail: false }; }, convertVariableDeclaration: function convertVariableDeclaration(node) { return { type: "VariableDeclaration", declarations: node.declarators.map(this.convert.bind(this)), kind: node.kind }; }, convertVariableDeclarator: function convertVariableDeclarator(node) { return { type: "VariableDeclarator", id: this.convert(node.binding), init: this.convert(node.init) }; }, // auxiliary methods convertPropertyName: function convertPropertyName(node) { switch (node.type) { case "StaticPropertyName": return this.convertStaticPropertyName(node); case "ComputedPropertyName": return this.convertComputedPropertyName(node); case "ShorthandProperty": return this.convertShorthandProperty(node); } }, convertSequenceExpressionToArray: function convertSequenceExpressionToArray(node) { var array = []; if (node.left.type === "BinaryExpression" && node.left.operator === ",") { array = this.convertSequenceExpressionToArray(node.left); } else { array = [this.convert(node.left)]; } array.push(this.convert(node.right)); return array; }, createIdentifier: function createIdentifier(name) { return { type: "Identifier", name: name }; }, convertIdentifier: function convertIdentifier(node) { return this.createIdentifier(node.name); } }; exports.default = SpiderMonkeyConverter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90by1zcGlkZXJtb25rZXkuanMiXSwibmFtZXMiOlsiU3BpZGVyTW9ua2V5Q29udmVydGVyIiwiY29udmVydCIsImFzdCIsInR5cGUiLCJjb252ZXJ0QmluZGluZ1dpdGhEZWZhdWx0Iiwibm9kZSIsImxlZnQiLCJiaW5kaW5nIiwicmlnaHQiLCJpbml0IiwiY29udmVydEJpbmRpbmdJZGVudGlmaWVyIiwiY3JlYXRlSWRlbnRpZmllciIsIm5hbWUiLCJjb252ZXJ0QXJyYXlCaW5kaW5nIiwiZWx0cyIsImVsZW1lbnRzIiwibWFwIiwidiIsInJlc3RFbGVtZW50IiwicHVzaCIsImFyZ3VtZW50IiwiY29udmVydE9iamVjdEJpbmRpbmciLCJwcm9wZXJ0aWVzIiwiYmluZCIsImNvbnZlcnRCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyIiwia2V5IiwidmFsdWUiLCJraW5kIiwibWV0aG9kIiwiY29tcHV0ZWQiLCJzaG9ydGhhbmQiLCJjb252ZXJ0QmluZGluZ1Byb3BlcnR5UHJvcGVydHkiLCJjb252ZXJ0Q2xhc3NFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImNvbnZlcnRDbGFzc0RlY2xhcmF0aW9uIiwiaWQiLCJzdXBlckNsYXNzIiwic3VwZXIiLCJib2R5IiwiY29udmVydENsYXNzRWxlbWVudCIsIm0iLCJjb252ZXJ0UHJvcGVydHlOYW1lIiwiY29udmVydEZvcm1hbFBhcmFtZXRlcnMiLCJwYXJhbXMiLCJkZWZhdWx0cyIsInN0YXRpYyIsImlzU3RhdGljIiwiZ2VuZXJhdG9yIiwiaXNHZW5lcmF0b3IiLCJpdGVtcyIsInBhcmFtIiwiY29udmVydE1vZHVsZSIsInNvdXJjZVR5cGUiLCJjb252ZXJ0SW1wb3J0Iiwic3BlY2lmaWVycyIsIm5hbWVkSW1wb3J0cyIsImRlZmF1bHRCaW5kaW5nIiwidW5zaGlmdCIsImxvY2FsIiwic291cmNlIiwibW9kdWxlU3BlY2lmaWVyIiwiY29udmVydEltcG9ydE5hbWVzcGFjZSIsIm5hbWVzcGFjZUJpbmRpbmciLCJjb252ZXJ0SW1wb3J0U3BlY2lmaWVyIiwiaW1wb3J0ZWQiLCJjb252ZXJ0RXhwb3J0QWxsRnJvbSIsImNvbnZlcnRFeHBvcnRGcm9tIiwiZGVjbGFyYXRpb24iLCJuYW1lZEV4cG9ydHMiLCJjb252ZXJ0RXhwb3J0IiwiY29udmVydEV4cG9ydERlZmF1bHQiLCJjb252ZXJ0RXhwb3J0U3BlY2lmaWVyIiwiZXhwb3J0ZWQiLCJleHBvcnRlZE5hbWUiLCJjb252ZXJ0TWV0aG9kIiwiY29udmVydEZ1bmN0aW9uQm9keSIsImNvbnZlcnRHZXR0ZXIiLCJjb252ZXJ0U2V0dGVyIiwiY29udmVydERhdGFQcm9wZXJ0eSIsImNvbnZlcnRTaG9ydGhhbmRQcm9wZXJ0eSIsImNvbnZlcnRDb21wdXRlZFByb3BlcnR5TmFtZSIsImNvbnZlcnRTdGF0aWNQcm9wZXJ0eU5hbWUiLCJjb252ZXJ0TGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uIiwiY29udmVydExpdGVyYWxJbmZpbml0eUV4cHJlc3Npb24iLCJjb252ZXJ0TGl0ZXJhbE51bGxFeHByZXNzaW9uIiwiY29udmVydExpdGVyYWxOdW1lcmljRXhwcmVzc2lvbiIsInBhcnNlRmxvYXQiLCJjb252ZXJ0TGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb24iLCJSZWdFeHAiLCJwYXR0ZXJuIiwiZmxhZ3MiLCJyZWdleCIsImNvbnZlcnRMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbiIsImNvbnZlcnRBcnJheUV4cHJlc3Npb24iLCJjb252ZXJ0QXJyb3dFeHByZXNzaW9uIiwiY29udmVydEFzc2lnbm1lbnRFeHByZXNzaW9uIiwib3BlcmF0b3IiLCJjb252ZXJ0QmluYXJ5RXhwcmVzc2lvbiIsImV4cHJlc3Npb25zIiwiY29udmVydFNlcXVlbmNlRXhwcmVzc2lvblRvQXJyYXkiLCJjb252ZXJ0Q2FsbEV4cHJlc3Npb24iLCJjYWxsZWUiLCJhcmd1bWVudHMiLCJjb252ZXJ0Q29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvbiIsImNvbnZlcnRDb21wdXRlZE1lbWJlckV4cHJlc3Npb24iLCJvYmplY3QiLCJwcm9wZXJ0eSIsImNvbnZlcnRDb25kaXRpb25hbEV4cHJlc3Npb24iLCJ0ZXN0IiwiYWx0ZXJuYXRlIiwiY29uc2VxdWVudCIsImNvbnZlcnRGdW5jdGlvbkV4cHJlc3Npb24iLCJjb252ZXJ0SWRlbnRpZmllckV4cHJlc3Npb24iLCJjb252ZXJ0TmV3RXhwcmVzc2lvbiIsImNvbnZlcnROZXdUYXJnZXRFeHByZXNzaW9uIiwibWV0YSIsImNvbnZlcnRPYmplY3RFeHByZXNzaW9uIiwiY29udmVydFVuYXJ5RXhwcmVzc2lvbiIsIm9wZXJhbmQiLCJwcmVmaXgiLCJjb252ZXJ0U3RhdGljTWVtYmVyRXhwcmVzc2lvbiIsImNvbnZlcnRUZW1wbGF0ZUV4cHJlc3Npb24iLCJxdWFzaXMiLCJmb3JFYWNoIiwiaSIsImxlbmd0aCIsInRhaWwiLCJ0YWciLCJxdWFzaSIsImNvbnZlcnRUaGlzRXhwcmVzc2lvbiIsImNvbnZlcnRVcGRhdGVFeHByZXNzaW9uIiwiaXNQcmVmaXgiLCJjb252ZXJ0WWllbGRFeHByZXNzaW9uIiwiZGVsZWdhdGUiLCJjb252ZXJ0WWllbGRHZW5lcmF0b3JFeHByZXNzaW9uIiwiZXhwciIsImNvbnZlcnRCbG9ja1N0YXRlbWVudCIsImNvbnZlcnRCbG9jayIsImJsb2NrIiwiY29udmVydEJyZWFrU3RhdGVtZW50IiwibGFiZWwiLCJjb252ZXJ0Q29udGludWVTdGF0ZW1lbnQiLCJjb252ZXJ0RGVidWdnZXJTdGF0ZW1lbnQiLCJjb252ZXJ0RG9XaGlsZVN0YXRlbWVudCIsImNvbnZlcnRFbXB0eVN0YXRlbWVudCIsImNvbnZlcnRFeHByZXNzaW9uU3RhdGVtZW50IiwiY29udmVydEZvckluU3RhdGVtZW50IiwiY29udmVydEZvck9mU3RhdGVtZW50IiwiY29udmVydEZvclN0YXRlbWVudCIsInVwZGF0ZSIsImNvbnZlcnRJZlN0YXRlbWVudCIsImNvbnZlcnRMYWJlbGVkU3RhdGVtZW50IiwiY29udmVydFJldHVyblN0YXRlbWVudCIsImNvbnZlcnRTd2l0Y2hTdGF0ZW1lbnQiLCJkaXNjcmltaW5hbnQiLCJjYXNlcyIsImNvbnZlcnRTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCIsInByZURlZmF1bHRDYXNlcyIsImNvbmNhdCIsImRlZmF1bHRDYXNlIiwicG9zdERlZmF1bHRDYXNlcyIsImNvbnZlcnRUaHJvd1N0YXRlbWVudCIsImNvbnZlcnRUcnlDYXRjaFN0YXRlbWVudCIsImNhdGNoQ2xhdXNlIiwiaGFuZGxlciIsImZpbmFsaXplciIsImNvbnZlcnRUcnlGaW5hbGx5U3RhdGVtZW50IiwiY29udmVydFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCJjb252ZXJ0V2hpbGVTdGF0ZW1lbnQiLCJjb252ZXJ0V2l0aFN0YXRlbWVudCIsInN0YXRlbWVudHMiLCJjb252ZXJ0Q2F0Y2hDbGF1c2UiLCJjb252ZXJ0RGlyZWN0aXZlIiwicmF3VmFsdWUiLCJkaXJlY3RpdmUiLCJwcyIsImhhc0RlZmF1bHRCaW5kaW5ncyIsInJlc3QiLCJkaXJlY3RpdmVzIiwiY29udmVydEZ1bmN0aW9uRGVjbGFyYXRpb24iLCJjb252ZXJ0U2NyaXB0IiwiY29udmVydFNwcmVhZEVsZW1lbnQiLCJjb252ZXJ0U3VwZXIiLCJjb252ZXJ0U3dpdGNoQ2FzZSIsImNvbnZlcnRTd2l0Y2hEZWZhdWx0IiwiY29udmVydFRlbXBsYXRlRWxlbWVudCIsInJhdyIsImNvb2tlZCIsImNvbnZlcnRWYXJpYWJsZURlY2xhcmF0aW9uIiwiZGVjbGFyYXRpb25zIiwiZGVjbGFyYXRvcnMiLCJjb252ZXJ0VmFyaWFibGVEZWNsYXJhdG9yIiwiYXJyYXkiLCJjb252ZXJ0SWRlbnRpZmllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3lwQkFBQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFFQTs7Ozs7Ozs7QUFFQSxJQUFNQSx3QkFBd0I7QUFDNUJDLFNBRDRCLG1CQUNwQkMsR0FEb0IsRUFDZjtBQUNYLFFBQUlBLE9BQU8sSUFBWCxFQUFpQjtBQUNmLGFBQU8sSUFBUDtBQUNE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