diff --git a/browser/scripts/sweet.js b/browser/scripts/sweet.js index 0749a998..5d82377e 100644 --- a/browser/scripts/sweet.js +++ b/browser/scripts/sweet.js @@ -57,85 +57,87 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack Object.defineProperty(exports, "__esModule", { value: true }); - exports.compile = exports.parse = exports.expand = undefined; + exports.expand = expand; + exports.parse = parse; + exports.compile = compile; - var _shiftReader = __webpack_require__(3); + var _immutable = __webpack_require__(3); - var _shiftReader2 = _interopRequireDefault(_shiftReader); - - var _immutable = __webpack_require__(11); - - var _syntax = __webpack_require__(12); - - var _syntax2 = _interopRequireDefault(_syntax); - - var _env = __webpack_require__(31); - - var _env2 = _interopRequireDefault(_env); - - var _shiftReducer = __webpack_require__(33); + var _shiftReducer = __webpack_require__(4); var _shiftReducer2 = _interopRequireDefault(_shiftReducer); - var _parseReducer = __webpack_require__(37); + var _parseReducer = __webpack_require__(8); var _parseReducer2 = _interopRequireDefault(_parseReducer); - var _shiftCodegen = __webpack_require__(38); + var _shiftCodegen = __webpack_require__(12); var _shiftCodegen2 = _interopRequireDefault(_shiftCodegen); - var _scope = __webpack_require__(44); - - var _bindingMap = __webpack_require__(14); + var _bindingMap = __webpack_require__(22); var _bindingMap2 = _interopRequireDefault(_bindingMap); - var _terms = __webpack_require__(28); + var _terms = __webpack_require__(9); var _terms2 = _interopRequireDefault(_terms); - var _modules = __webpack_require__(46); + var _modules = __webpack_require__(36); - var _babelCore = __webpack_require__(75); + var _babelCore = __webpack_require__(73); - var _nodeModuleResolver = __webpack_require__(76); + var _nodeModuleResolver = __webpack_require__(74); var _nodeModuleResolver2 = _interopRequireDefault(_nodeModuleResolver); - var _nodeModuleLoader = __webpack_require__(77); + var _nodeModuleLoader = __webpack_require__(75); var _nodeModuleLoader2 = _interopRequireDefault(_nodeModuleLoader); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function expand_797(source_800) { - let options_801 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + function expand(source) { + let options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - let bindings_802 = new _bindingMap2.default(); - let modules_803 = new _modules.Modules({ bindings: bindings_802, cwd: options_801.cwd || process.cwd(), filename: options_801.filename, transform: options_801.transform || _babelCore.transform || function (c_806) { - return { code: c_806 }; - }, moduleResolver: options_801.moduleResolver || _nodeModuleResolver2.default, moduleLoader: options_801.moduleLoader || _nodeModuleLoader2.default }); - let compiledMod_804 = modules_803.compileEntrypoint(source_800, options_801.filename, options_801.enforcePragma); - let nativeImports_805 = compiledMod_804.importEntries.filter(imp_807 => !modules_803.has(imp_807.moduleSpecifier.val())); - return new _terms2.default("Module", { directives: (0, _immutable.List)(), items: nativeImports_805.concat(compiledMod_804.body).concat(compiledMod_804.exportEntries.interpose(new _terms2.default("EmptyStatement", {}))) }); + let bindings = new _bindingMap2.default(); + let modules = new _modules.Modules({ + bindings: bindings, + cwd: options.cwd || process.cwd(), + filename: options.filename, + transform: options.transform || _babelCore.transform || function (c) { + return { code: c }; + }, + moduleResolver: options.moduleResolver || _nodeModuleResolver2.default, + moduleLoader: options.moduleLoader || _nodeModuleLoader2.default + }); + let compiledMod = modules.compileEntrypoint(source, options.filename, options.enforcePragma); + let nativeImports = compiledMod.importEntries.filter(imp => !modules.has(imp.moduleSpecifier.val())); + return new _terms2.default("Module", { + directives: (0, _immutable.List)(), + items: nativeImports.concat(compiledMod.body).concat(compiledMod.exportEntries.interpose(new _terms2.default('EmptyStatement', {}))) + }); } - function parse_798(source_808, options_809) { - let includeImports_810 = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; - return (0, _shiftReducer2.default)(new _parseReducer2.default({ phase: 0 }), expand_797(source_808, options_809).gen({ includeImports: includeImports_810 })); + // not available in browser + + function parse(source, options) { + let includeImports = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; + + return (0, _shiftReducer2.default)(new _parseReducer2.default({ phase: 0 }), expand(source, options).gen(includeImports)); } - function compile_799(source_811) { - let options_812 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - let ast_813 = parse_798(source_811, options_812, options_812.includeImports); - let gen_814 = (0, _shiftCodegen2.default)(ast_813, new _shiftCodegen.FormattedCodeGen()); - return options_812.transform && !options_812.noBabel ? options_812.transform(gen_814, { babelrc: true, filename: options_812.filename }) : { code: gen_814 }; + function compile(source) { + let options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + let ast = parse(source, options, options.includeImports); + let gen = (0, _shiftCodegen2.default)(ast, new _shiftCodegen.FormattedCodeGen()); + return options.transform && !options.noBabel ? options.transform(gen, { + babelrc: true, + filename: options.filename + }) : { code: gen }; } - exports.expand = expand_797; - exports.parse = parse_798; - exports.compile = compile_799; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3N3ZWV0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBQ0EsU0FBUyxVQUFULENBQW9CLFVBQXBCLEVBQWtEO0FBQUEsTUFBbEIsV0FBa0IseURBQUosRUFBSTs7QUFDaEQsTUFBSSxlQUFlLDBCQUFuQjtBQUNBLE1BQUksY0FBYyxxQkFBWSxFQUFDLFVBQVUsWUFBWCxFQUF5QixLQUFLLFlBQVksR0FBWixJQUFtQixRQUFRLEdBQVIsRUFBakQsRUFBZ0UsVUFBVSxZQUFZLFFBQXRGLEVBQWdHLFdBQVcsWUFBWSxTQUFaLDRCQUEyQyxVQUFVLEtBQVYsRUFBaUI7QUFDbk0sYUFBTyxFQUFDLE1BQU0sS0FBUCxFQUFQO0FBQ0QsS0FGNkIsRUFFM0IsZ0JBQWdCLFlBQVksY0FBWixnQ0FGVyxFQUVpQyxjQUFjLFlBQVksWUFBWiw4QkFGL0MsRUFBWixDQUFsQjtBQUdBLE1BQUksa0JBQWtCLFlBQVksaUJBQVosQ0FBOEIsVUFBOUIsRUFBMEMsWUFBWSxRQUF0RCxFQUFnRSxZQUFZLGFBQTVFLENBQXRCO0FBQ0EsTUFBSSxvQkFBb0IsZ0JBQWdCLGFBQWhCLENBQThCLE1BQTlCLENBQXFDLFdBQVcsQ0FBQyxZQUFZLEdBQVosQ0FBZ0IsUUFBUSxlQUFSLENBQXdCLEdBQXhCLEVBQWhCLENBQWpELENBQXhCO0FBQ0EsU0FBTyxvQkFBUyxRQUFULEVBQW1CLEVBQUMsWUFBWSxzQkFBYixFQUFxQixPQUFPLGtCQUFrQixNQUFsQixDQUF5QixnQkFBZ0IsSUFBekMsRUFBK0MsTUFBL0MsQ0FBc0QsZ0JBQWdCLGFBQWhCLENBQThCLFNBQTlCLENBQXdDLG9CQUFTLGdCQUFULEVBQTJCLEVBQTNCLENBQXhDLENBQXRELENBQTVCLEVBQW5CLENBQVA7QUFDRDtBQUNELFNBQVMsU0FBVCxDQUFtQixVQUFuQixFQUErQixXQUEvQixFQUF1RTtBQUFBLE1BQTNCLGtCQUEyQix5REFBTixJQUFNOztBQUNyRSxTQUFPLDRCQUFPLDJCQUFpQixFQUFDLE9BQU8sQ0FBUixFQUFqQixDQUFQLEVBQXFDLFdBQVcsVUFBWCxFQUF1QixXQUF2QixFQUFvQyxHQUFwQyxDQUF3QyxFQUFDLGdCQUFnQixrQkFBakIsRUFBeEMsQ0FBckMsQ0FBUDtBQUNEO0FBQ0QsU0FBUyxXQUFULENBQXFCLFVBQXJCLEVBQW1EO0FBQUEsTUFBbEIsV0FBa0IseURBQUosRUFBSTs7QUFDakQsTUFBSSxVQUFVLFVBQVUsVUFBVixFQUFzQixXQUF0QixFQUFtQyxZQUFZLGNBQS9DLENBQWQ7QUFDQSxNQUFJLFVBQVUsNEJBQVEsT0FBUixFQUFpQixvQ0FBakIsQ0FBZDtBQUNBLFNBQU8sWUFBWSxTQUFaLElBQXlCLENBQUMsWUFBWSxPQUF0QyxHQUFnRCxZQUFZLFNBQVosQ0FBc0IsT0FBdEIsRUFBK0IsRUFBQyxTQUFTLElBQVYsRUFBZ0IsVUFBVSxZQUFZLFFBQXRDLEVBQS9CLENBQWhELEdBQWtJLEVBQUMsTUFBTSxPQUFQLEVBQXpJO0FBQ0Q7UUFDcUIsTSxHQUFkLFU7UUFDYSxLLEdBQWIsUztRQUNlLE8sR0FBZixXIiwiZmlsZSI6InN3ZWV0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWRlciBmcm9tIFwiLi9zaGlmdC1yZWFkZXJcIjtcbmltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IFN5bnRheCBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBFbnYgZnJvbSBcIi4vZW52XCI7XG5pbXBvcnQgcmVkdWNlIGZyb20gXCJzaGlmdC1yZWR1Y2VyXCI7XG5pbXBvcnQgUGFyc2VSZWR1Y2VyIGZyb20gXCIuL3BhcnNlLXJlZHVjZXJcIjtcbmltcG9ydCBjb2RlZ2VuLCB7Rm9ybWF0dGVkQ29kZUdlbn0gZnJvbSBcInNoaWZ0LWNvZGVnZW5cIjtcbmltcG9ydCB7U2NvcGUsIGZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgQmluZGluZ01hcCBmcm9tIFwiLi9iaW5kaW5nLW1hcC5qc1wiO1xuaW1wb3J0IFRlcm0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7TW9kdWxlc30gZnJvbSBcIi4vbW9kdWxlc1wiO1xuaW1wb3J0IHt0cmFuc2Zvcm0gYXMgYmFiZWxUcmFuc2Zvcm19IGZyb20gXCJiYWJlbC1jb3JlXCI7XG5pbXBvcnQgbm9kZVJlc29sdmVyIGZyb20gXCIuL25vZGUtbW9kdWxlLXJlc29sdmVyXCI7XG5pbXBvcnQgbm9kZUxvYWRlciBmcm9tIFwiLi9ub2RlLW1vZHVsZS1sb2FkZXJcIjtcbmZ1bmN0aW9uIGV4cGFuZF83OTcoc291cmNlXzgwMCwgb3B0aW9uc184MDEgPSB7fSkge1xuICBsZXQgYmluZGluZ3NfODAyID0gbmV3IEJpbmRpbmdNYXA7XG4gIGxldCBtb2R1bGVzXzgwMyA9IG5ldyBNb2R1bGVzKHtiaW5kaW5nczogYmluZGluZ3NfODAyLCBjd2Q6IG9wdGlvbnNfODAxLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZTogb3B0aW9uc184MDEuZmlsZW5hbWUsIHRyYW5zZm9ybTogb3B0aW9uc184MDEudHJhbnNmb3JtIHx8IGJhYmVsVHJhbnNmb3JtIHx8IGZ1bmN0aW9uIChjXzgwNikge1xuICAgIHJldHVybiB7Y29kZTogY184MDZ9O1xuICB9LCBtb2R1bGVSZXNvbHZlcjogb3B0aW9uc184MDEubW9kdWxlUmVzb2x2ZXIgfHwgbm9kZVJlc29sdmVyLCBtb2R1bGVMb2FkZXI6IG9wdGlvbnNfODAxLm1vZHVsZUxvYWRlciB8fCBub2RlTG9hZGVyfSk7XG4gIGxldCBjb21waWxlZE1vZF84MDQgPSBtb2R1bGVzXzgwMy5jb21waWxlRW50cnlwb2ludChzb3VyY2VfODAwLCBvcHRpb25zXzgwMS5maWxlbmFtZSwgb3B0aW9uc184MDEuZW5mb3JjZVByYWdtYSk7XG4gIGxldCBuYXRpdmVJbXBvcnRzXzgwNSA9IGNvbXBpbGVkTW9kXzgwNC5pbXBvcnRFbnRyaWVzLmZpbHRlcihpbXBfODA3ID0+ICFtb2R1bGVzXzgwMy5oYXMoaW1wXzgwNy5tb2R1bGVTcGVjaWZpZXIudmFsKCkpKTtcbiAgcmV0dXJuIG5ldyBUZXJtKFwiTW9kdWxlXCIsIHtkaXJlY3RpdmVzOiBMaXN0KCksIGl0ZW1zOiBuYXRpdmVJbXBvcnRzXzgwNS5jb25jYXQoY29tcGlsZWRNb2RfODA0LmJvZHkpLmNvbmNhdChjb21waWxlZE1vZF84MDQuZXhwb3J0RW50cmllcy5pbnRlcnBvc2UobmV3IFRlcm0oXCJFbXB0eVN0YXRlbWVudFwiLCB7fSkpKX0pO1xufVxuZnVuY3Rpb24gcGFyc2VfNzk4KHNvdXJjZV84MDgsIG9wdGlvbnNfODA5LCBpbmNsdWRlSW1wb3J0c184MTAgPSB0cnVlKSB7XG4gIHJldHVybiByZWR1Y2UobmV3IFBhcnNlUmVkdWNlcih7cGhhc2U6IDB9KSwgZXhwYW5kXzc5Nyhzb3VyY2VfODA4LCBvcHRpb25zXzgwOSkuZ2VuKHtpbmNsdWRlSW1wb3J0czogaW5jbHVkZUltcG9ydHNfODEwfSkpO1xufVxuZnVuY3Rpb24gY29tcGlsZV83OTkoc291cmNlXzgxMSwgb3B0aW9uc184MTIgPSB7fSkge1xuICBsZXQgYXN0XzgxMyA9IHBhcnNlXzc5OChzb3VyY2VfODExLCBvcHRpb25zXzgxMiwgb3B0aW9uc184MTIuaW5jbHVkZUltcG9ydHMpO1xuICBsZXQgZ2VuXzgxNCA9IGNvZGVnZW4oYXN0XzgxMywgbmV3IEZvcm1hdHRlZENvZGVHZW4pO1xuICByZXR1cm4gb3B0aW9uc184MTIudHJhbnNmb3JtICYmICFvcHRpb25zXzgxMi5ub0JhYmVsID8gb3B0aW9uc184MTIudHJhbnNmb3JtKGdlbl84MTQsIHtiYWJlbHJjOiB0cnVlLCBmaWxlbmFtZTogb3B0aW9uc184MTIuZmlsZW5hbWV9KSA6IHtjb2RlOiBnZW5fODE0fTtcbn1cbmV4cG9ydCB7ZXhwYW5kXzc5NyBhcyBleHBhbmR9O1xuZXhwb3J0IHtwYXJzZV83OTggYXMgcGFyc2V9O1xuZXhwb3J0IHtjb21waWxlXzc5OSBhcyBjb21waWxlfSJdfQ== + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zd2VldC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQTZCZ0IsTSxHQUFBLE07UUFvQkEsSyxHQUFBLEs7UUFJQSxPLEdBQUEsTzs7QUFwRGhCOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBRUE7Ozs7QUFDQTs7QUFJQTs7QUFDQTs7OztBQUNBOzs7Ozs7QUFjTyxTQUFTLE1BQVQsQ0FBZ0IsTUFBaEIsRUFBaUU7QUFBQSxNQUFqQyxPQUFpQyx5REFBVCxFQUFTOztBQUN0RSxNQUFJLFdBQVcsMEJBQWY7QUFDQSxNQUFJLFVBQVUscUJBQVk7QUFDeEIsc0JBRHdCO0FBRXhCLFNBQUssUUFBUSxHQUFSLElBQWUsUUFBUSxHQUFSLEVBRkk7QUFHeEIsY0FBVSxRQUFRLFFBSE07QUFJeEIsZUFBVyxRQUFRLFNBQVIsNEJBQXVDLFVBQVMsQ0FBVCxFQUFZO0FBQzVELGFBQU8sRUFBQyxNQUFNLENBQVAsRUFBUDtBQUNELEtBTnVCO0FBT3hCLG9CQUFnQixRQUFRLGNBQVIsZ0NBUFE7QUFReEIsa0JBQWMsUUFBUSxZQUFSO0FBUlUsR0FBWixDQUFkO0FBVUEsTUFBSSxjQUFjLFFBQVEsaUJBQVIsQ0FBMEIsTUFBMUIsRUFBa0MsUUFBUSxRQUExQyxFQUFvRCxRQUFRLGFBQTVELENBQWxCO0FBQ0EsTUFBSSxnQkFBZ0IsWUFBWSxhQUFaLENBQTBCLE1BQTFCLENBQWlDLE9BQU8sQ0FBQyxRQUFRLEdBQVIsQ0FBWSxJQUFJLGVBQUosQ0FBb0IsR0FBcEIsRUFBWixDQUF6QyxDQUFwQjtBQUNBLFNBQU8sb0JBQVMsUUFBVCxFQUFtQjtBQUN4QixnQkFBWSxzQkFEWTtBQUV4QixXQUFPLGNBQWMsTUFBZCxDQUFxQixZQUFZLElBQWpDLEVBQXVDLE1BQXZDLENBQThDLFlBQVksYUFBWixDQUEwQixTQUExQixDQUFvQyxvQkFBUyxnQkFBVCxFQUEyQixFQUEzQixDQUFwQyxDQUE5QztBQUZpQixHQUFuQixDQUFQO0FBSUQ7O0FBcENEOztBQXNDTyxTQUFTLEtBQVQsQ0FBZSxNQUFmLEVBQStCLE9BQS9CLEVBQTJGO0FBQUEsTUFBckMsY0FBcUMseURBQVgsSUFBVzs7QUFDaEcsU0FBTyw0QkFBTywyQkFBaUIsRUFBQyxPQUFPLENBQVIsRUFBakIsQ0FBUCxFQUFxQyxPQUFPLE1BQVAsRUFBZSxPQUFmLEVBQXdCLEdBQXhCLENBQTRCLGNBQTVCLENBQXJDLENBQVA7QUFDRDs7QUFFTSxTQUFTLE9BQVQsQ0FBaUIsTUFBakIsRUFBeUU7QUFBQSxNQUF4QyxPQUF3Qyx5REFBaEIsRUFBZ0I7O0FBQzlFLE1BQUksTUFBTSxNQUFNLE1BQU4sRUFBYyxPQUFkLEVBQXVCLFFBQVEsY0FBL0IsQ0FBVjtBQUNBLE1BQUksTUFBTSw0QkFBUSxHQUFSLEVBQWEsb0NBQWIsQ0FBVjtBQUNBLFNBQU8sUUFBUSxTQUFSLElBQXNCLENBQUMsUUFBUSxPQUEvQixHQUEwQyxRQUFRLFNBQVIsQ0FBa0IsR0FBbEIsRUFBdUI7QUFDdEUsYUFBUyxJQUQ2RDtBQUV0RSxjQUFVLFFBQVE7QUFGb0QsR0FBdkIsQ0FBMUMsR0FHRixFQUFFLE1BQU0sR0FBUixFQUhMO0FBSUQiLCJmaWxlIjoic3dlZXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCByZWR1Y2UgZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmltcG9ydCBQYXJzZVJlZHVjZXIgZnJvbSBcIi4vcGFyc2UtcmVkdWNlclwiO1xuaW1wb3J0IGNvZGVnZW4sIHsgRm9ybWF0dGVkQ29kZUdlbiB9IGZyb20gXCJzaGlmdC1jb2RlZ2VuXCI7XG5cbmltcG9ydCBCaW5kaW5nTWFwIGZyb20gXCIuL2JpbmRpbmctbWFwLmpzXCI7XG5cbmltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQgeyBNb2R1bGVzIH0gZnJvbSAnLi9tb2R1bGVzJztcblxuLy8gbm90IGF2YWlsYWJsZSBpbiBicm93c2VyXG5cbmltcG9ydCB7IHRyYW5zZm9ybSBhcyBiYWJlbFRyYW5zZm9ybSB9IGZyb20gXCJiYWJlbC1jb3JlXCI7XG5pbXBvcnQgbm9kZVJlc29sdmVyIGZyb20gXCIuL25vZGUtbW9kdWxlLXJlc29sdmVyXCI7XG5pbXBvcnQgbm9kZUxvYWRlciBmcm9tIFwiLi9ub2RlLW1vZHVsZS1sb2FkZXJcIjtcblxudHlwZSBDb2RlT3V0cHV0ID0ge1xuICBjb2RlOiBzdHJpbmdcbn1cblxudHlwZSBTd2VldE9wdGlvbnMgPSB7XG4gIGluY2x1ZGVJbXBvcnRzPzogYm9vbGVhbjtcbiAgY3dkPzogc3RyaW5nO1xuICBlbmZvcmNlUHJhZ21hPzogYm9vbGVhbjtcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHRyYW5zZm9ybT86IChzOiBzdHJpbmcpID0+IHsgY29kZTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmQoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFN3ZWV0T3B0aW9ucyA9IHt9KTogYW55IHtcbiAgbGV0IGJpbmRpbmdzID0gbmV3IEJpbmRpbmdNYXAoKTtcbiAgbGV0IG1vZHVsZXMgPSBuZXcgTW9kdWxlcyh7XG4gICAgYmluZGluZ3MsXG4gICAgY3dkOiBvcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgIGZpbGVuYW1lOiBvcHRpb25zLmZpbGVuYW1lLFxuICAgIHRyYW5zZm9ybTogb3B0aW9ucy50cmFuc2Zvcm0gfHwgYmFiZWxUcmFuc2Zvcm0gfHwgZnVuY3Rpb24oYykge1xuICAgICAgcmV0dXJuIHtjb2RlOiBjfTtcbiAgICB9LFxuICAgIG1vZHVsZVJlc29sdmVyOiBvcHRpb25zLm1vZHVsZVJlc29sdmVyIHx8IG5vZGVSZXNvbHZlcixcbiAgICBtb2R1bGVMb2FkZXI6IG9wdGlvbnMubW9kdWxlTG9hZGVyIHx8IG5vZGVMb2FkZXJcbiAgfSk7XG4gIGxldCBjb21waWxlZE1vZCA9IG1vZHVsZXMuY29tcGlsZUVudHJ5cG9pbnQoc291cmNlLCBvcHRpb25zLmZpbGVuYW1lLCBvcHRpb25zLmVuZm9yY2VQcmFnbWEpO1xuICBsZXQgbmF0aXZlSW1wb3J0cyA9IGNvbXBpbGVkTW9kLmltcG9ydEVudHJpZXMuZmlsdGVyKGltcCA9PiAhbW9kdWxlcy5oYXMoaW1wLm1vZHVsZVNwZWNpZmllci52YWwoKSkpO1xuICByZXR1cm4gbmV3IFRlcm0oXCJNb2R1bGVcIiwge1xuICAgIGRpcmVjdGl2ZXM6IExpc3QoKSxcbiAgICBpdGVtczogbmF0aXZlSW1wb3J0cy5jb25jYXQoY29tcGlsZWRNb2QuYm9keSkuY29uY2F0KGNvbXBpbGVkTW9kLmV4cG9ydEVudHJpZXMuaW50ZXJwb3NlKG5ldyBUZXJtKCdFbXB0eVN0YXRlbWVudCcsIHt9KSkpXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Uoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFN3ZWV0T3B0aW9ucywgaW5jbHVkZUltcG9ydHM6IGJvb2xlYW4gPSB0cnVlKTogYW55IHtcbiAgcmV0dXJuIHJlZHVjZShuZXcgUGFyc2VSZWR1Y2VyKHtwaGFzZTogMH0pLCBleHBhbmQoc291cmNlLCBvcHRpb25zKS5nZW4oaW5jbHVkZUltcG9ydHMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGUoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFN3ZWV0T3B0aW9ucyA9IHt9KTogQ29kZU91dHB1dCB7XG4gIGxldCBhc3QgPSBwYXJzZShzb3VyY2UsIG9wdGlvbnMsIG9wdGlvbnMuaW5jbHVkZUltcG9ydHMpO1xuICBsZXQgZ2VuID0gY29kZWdlbihhc3QsIG5ldyBGb3JtYXR0ZWRDb2RlR2VuKCkpO1xuICByZXR1cm4gb3B0aW9ucy50cmFuc2Zvcm0gJiYgKCFvcHRpb25zLm5vQmFiZWwpID8gb3B0aW9ucy50cmFuc2Zvcm0oZ2VuLCB7XG4gICAgYmFiZWxyYzogdHJ1ZSxcbiAgICBmaWxlbmFtZTogb3B0aW9ucy5maWxlbmFtZVxuICB9KSA6IHsgY29kZTogZ2VuIH07XG59XG4iXX0= /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) /***/ }, @@ -267,7416 +269,6316 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /* 3 */ /***/ function(module, exports, __webpack_require__) { - "use strict"; + /** + * Copyright (c) 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ - Object.defineProperty(exports, "__esModule", { - value: true - }); + (function (global, factory) { + true ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.Immutable = factory()); + }(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice; - var _tokenizer = __webpack_require__(4); + function createClass(ctor, superClass) { + if (superClass) { + ctor.prototype = Object.create(superClass.prototype); + } + ctor.prototype.constructor = ctor; + } - var _tokenizer2 = _interopRequireDefault(_tokenizer); + function Iterable(value) { + return isIterable(value) ? value : Seq(value); + } - var _immutable = __webpack_require__(11); - var _syntax = __webpack_require__(12); + createClass(KeyedIterable, Iterable); + function KeyedIterable(value) { + return isKeyed(value) ? value : KeyedSeq(value); + } - var _syntax2 = _interopRequireDefault(_syntax); - var _ramdaFantasy = __webpack_require__(15); + createClass(IndexedIterable, Iterable); + function IndexedIterable(value) { + return isIndexed(value) ? value : IndexedSeq(value); + } - var _errors = __webpack_require__(13); - var _terms = __webpack_require__(28); + createClass(SetIterable, Iterable); + function SetIterable(value) { + return isIterable(value) && !isAssociative(value) ? value : SetSeq(value); + } - var _terms2 = _interopRequireDefault(_terms); - var _ramda = __webpack_require__(27); - var R = _interopRequireWildcard(_ramda); + function isIterable(maybeIterable) { + return !!(maybeIterable && maybeIterable[IS_ITERABLE_SENTINEL]); + } - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + function isKeyed(maybeKeyed) { + return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]); + } - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + function isIndexed(maybeIndexed) { + return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]); + } - const Just_662 = _ramdaFantasy.Maybe.Just; - const Nothing_663 = _ramdaFantasy.Maybe.Nothing; - const LSYNTAX_664 = { name: "left-syntax" }; - const RSYNTAX_665 = { name: "right-syntax" }; - const AT_666 = { klass: _tokenizer.TokenClass.Punctuator, name: "@" }; - const literalKeywords_667 = ["this", "null", "true", "false"]; - const isLeftBracket_668 = R.whereEq({ type: _tokenizer.TokenType.LBRACK }); - const isLeftBrace_669 = R.whereEq({ type: _tokenizer.TokenType.LBRACE }); - const isLeftParen_670 = R.whereEq({ type: _tokenizer.TokenType.LPAREN }); - const isRightBracket_671 = R.whereEq({ type: _tokenizer.TokenType.RBRACK }); - const isRightBrace_672 = R.whereEq({ type: _tokenizer.TokenType.RBRACE }); - const isRightParen_673 = R.whereEq({ type: _tokenizer.TokenType.RPAREN }); - const isEOS_674 = R.whereEq({ type: _tokenizer.TokenType.EOS }); - const isHash_675 = R.whereEq({ type: _tokenizer.TokenType.IDENTIFIER, value: "#" }); - const isLeftSyntax_676 = R.whereEq({ type: LSYNTAX_664 }); - const isRightSyntax_677 = R.whereEq({ type: RSYNTAX_665 }); - const isLeftDelimiter_678 = R.anyPass([isLeftBracket_668, isLeftBrace_669, isLeftParen_670, isLeftSyntax_676]); - const isRightDelimiter_679 = R.anyPass([isRightBracket_671, isRightBrace_672, isRightParen_673, isRightSyntax_677]); - const isMatchingDelimiters_680 = R.cond([[isLeftBracket_668, (__721, b_722) => isRightBracket_671(b_722)], [isLeftBrace_669, (__723, b_724) => isRightBrace_672(b_724)], [isLeftParen_670, (__725, b_726) => isRightParen_673(b_726)], [isLeftSyntax_676, (__727, b_728) => isRightSyntax_677(b_728)], [R.T, R.F]]); - const assignOps_681 = ["=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "|=", "^=", ","]; - const binaryOps_682 = ["+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", "|", "^", "&&", "||", "?", ":", "===", "==", ">=", "<=", "<", ">", "!=", "!==", "instanceof"]; - const unaryOps_683 = ["++", "--", "~", "!", "delete", "void", "typeof", "yield", "throw", "new"]; - const isEmpty_684 = R.whereEq({ size: 0 }); - const isPunctuator_685 = s_729 => s_729.match("punctuator"); - const isKeyword_686 = s_730 => s_730.match("keyword"); - const isDelimiter_687 = s_731 => s_731.match("delimiter"); - const isParens_688 = s_732 => s_732.match("parens"); - const isBraces_689 = s_733 => s_733.match("braces"); - const isBrackets_690 = s_734 => s_734.match("brackets"); - const isIdentifier_691 = s_735 => s_735.match("identifier"); - const val_692 = s_736 => s_736.val(); - const isVal_693 = R.curry((v_737, s_738) => s_738.val() === v_737); - const isDot_694 = R.allPass([isPunctuator_685, isVal_693(".")]); - const isColon_695 = R.allPass([isPunctuator_685, isVal_693(":")]); - const isFunctionKeyword_696 = R.allPass([isKeyword_686, isVal_693("function")]); - const isOperator_697 = s_739 => (s_739.match("punctuator") || s_739.match("keyword")) && R.any(R.equals(s_739.val()), assignOps_681.concat(binaryOps_682).concat(unaryOps_683)); - const isNonLiteralKeyword_698 = R.allPass([isKeyword_686, s_740 => R.none(R.equals(s_740.val()), literalKeywords_667)]); - const isKeywordExprPrefix_699 = R.allPass([isKeyword_686, s_741 => R.any(R.equals(s_741.val()), ["instanceof", "typeof", "delete", "void", "yield", "throw", "new", "case"])]); - let last_700 = p_742 => p_742.last(); - let safeLast_701 = R.pipe(R.cond([[isEmpty_684, R.always(Nothing_663())], [R.T, R.compose(_ramdaFantasy.Maybe.of, last_700)]])); - let stuffTrue_702 = R.curry((p_743, b_744) => b_744 ? Just_662(p_743) : Nothing_663()); - let stuffFalse_703 = R.curry((p_745, b_746) => !b_746 ? Just_662(p_745) : Nothing_663()); - let isTopColon_704 = R.pipe(safeLast_701, R.map(isColon_695), _ramdaFantasy.Maybe.maybe(false, R.identity)); - let isTopPunctuator_705 = R.pipe(safeLast_701, R.map(isPunctuator_685), _ramdaFantasy.Maybe.maybe(false, R.identity)); - let isExprReturn_706 = R.curry((l_747, p_748) => { - let retKwd_749 = safeLast_701(p_748); - let maybeDot_750 = pop_717(p_748).chain(safeLast_701); - if (maybeDot_750.map(isDot_694).getOrElse(false)) { - return true; + function isAssociative(maybeAssociative) { + return isKeyed(maybeAssociative) || isIndexed(maybeAssociative); } - return retKwd_749.map(s_751 => { - return s_751.match("keyword") && s_751.val() === "return" && s_751.lineNumber() === l_747; - }).getOrElse(false); - }); - const isTopOperator_707 = R.pipe(safeLast_701, R.map(isOperator_697), _ramdaFantasy.Maybe.maybe(false, R.identity)); - const isTopKeywordExprPrefix_708 = R.pipe(safeLast_701, R.map(isKeywordExprPrefix_699), _ramdaFantasy.Maybe.maybe(false, R.identity)); - let isExprPrefix_709 = R.curry((l_752, b_753) => R.cond([[isEmpty_684, R.always(b_753)], [isTopColon_704, R.always(b_753)], [isTopKeywordExprPrefix_708, R.T], [isTopOperator_707, R.T], [isTopPunctuator_705, R.always(b_753)], [isExprReturn_706(l_752), R.T], [R.T, R.F]])); - let curly_710 = p_754 => safeLast_701(p_754).map(isBraces_689).chain(stuffTrue_702(p_754)); - let paren_711 = p_755 => safeLast_701(p_755).map(isParens_688).chain(stuffTrue_702(p_755)); - let func_712 = p_756 => safeLast_701(p_756).map(isFunctionKeyword_696).chain(stuffTrue_702(p_756)); - let ident_713 = p_757 => safeLast_701(p_757).map(isIdentifier_691).chain(stuffTrue_702(p_757)); - let nonLiteralKeyword_714 = p_758 => safeLast_701(p_758).map(isNonLiteralKeyword_698).chain(stuffTrue_702(p_758)); - let opt_715 = R.curry((a_759, b_760, p_761) => { - let result_762 = R.pipeK(a_759, b_760)(_ramdaFantasy.Maybe.of(p_761)); - return _ramdaFantasy.Maybe.isJust(result_762) ? result_762 : _ramdaFantasy.Maybe.of(p_761); - }); - let notDot_716 = R.ifElse(R.whereEq({ size: 0 }), Just_662, p_763 => safeLast_701(p_763).map(s_764 => !(s_764.match("punctuator") && s_764.val() === ".")).chain(stuffTrue_702(p_763))); - let pop_717 = R.compose(Just_662, p_765 => p_765.pop()); - const functionPrefix_718 = R.pipeK(curly_710, pop_717, paren_711, pop_717, opt_715(ident_713, pop_717), func_712); - const isRegexPrefix_719 = b_766 => R.anyPass([isEmpty_684, isTopPunctuator_705, R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(nonLiteralKeyword_714, pop_717, notDot_716), _ramdaFantasy.Maybe.isJust), R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(paren_711, pop_717, nonLiteralKeyword_714, pop_717, notDot_716), _ramdaFantasy.Maybe.isJust), R.pipe(_ramdaFantasy.Maybe.of, functionPrefix_718, R.chain(p_767 => { - return safeLast_701(p_767).map(s_768 => s_768.lineNumber()).chain(fnLine_769 => { - return pop_717(p_767).map(isExprPrefix_709(fnLine_769, b_766)); - }).chain(stuffFalse_703(p_767)); - }), _ramdaFantasy.Maybe.isJust), p_770 => { - let isCurly_771 = _ramdaFantasy.Maybe.isJust(safeLast_701(p_770).map(isBraces_689)); - let alreadyCheckedFunction_772 = R.pipe(_ramdaFantasy.Maybe.of, functionPrefix_718, _ramdaFantasy.Maybe.isJust)(p_770); - if (alreadyCheckedFunction_772) { - return false; + + function isOrdered(maybeOrdered) { + return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]); } - return R.pipe(_ramdaFantasy.Maybe.of, R.chain(curly_710), R.chain(p_773 => { - return safeLast_701(p_773).map(s_774 => s_774.lineNumber()).chain(curlyLine_775 => { - return pop_717(p_773).map(isExprPrefix_709(curlyLine_775, b_766)); - }).chain(stuffFalse_703(p_773)); - }), _ramdaFantasy.Maybe.isJust)(p_770); - }]); - function lastEl_720(l_776) { - return l_776[l_776.length - 1]; - } - class Reader extends _tokenizer2.default { - constructor(strings_777, context_778, replacements_779) { - super(Array.isArray(strings_777) ? strings_777.join("") : strings_777); - this.delimStack = new Map(); - this.insideSyntaxTemplate = [false]; - this.context = context_778; - if (Array.isArray(strings_777)) { - let totalIndex = 0; - this.replacementIndex = R.reduce((acc_780, strRep_781) => { - acc_780.push({ index: totalIndex + strRep_781[0].length, replacement: strRep_781[1] }); - totalIndex += strRep_781[0].length; - return acc_780; - }, [], R.zip(strings_777, replacements_779)); - } + + Iterable.isIterable = isIterable; + Iterable.isKeyed = isKeyed; + Iterable.isIndexed = isIndexed; + Iterable.isAssociative = isAssociative; + Iterable.isOrdered = isOrdered; + + Iterable.Keyed = KeyedIterable; + Iterable.Indexed = IndexedIterable; + Iterable.Set = SetIterable; + + + var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; + var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; + var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@'; + var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; + + // Used for setting prototype methods that IE8 chokes on. + var DELETE = 'delete'; + + // Constants describing the size of trie nodes. + var SHIFT = 5; // Resulted in best performance after ______? + var SIZE = 1 << SHIFT; + var MASK = SIZE - 1; + + // A consistent shared value representing "not set" which equals nothing other + // than itself, and nothing that could be provided externally. + var NOT_SET = {}; + + // Boolean references, Rough equivalent of `bool &`. + var CHANGE_LENGTH = { value: false }; + var DID_ALTER = { value: false }; + + function MakeRef(ref) { + ref.value = false; + return ref; } - read() { - let stack_782 = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; - let b_783 = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; - let singleDelimiter_784 = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; - let prefix_785 = (0, _immutable.List)(); - while (true) { - let tok = this.advance(prefix_785, b_783); - if (tok.scopesets || tok instanceof _terms2.default) { - stack_782.push(tok); - continue; - } - if (Array.isArray(tok)) { - Array.prototype.push.apply(stack_782, tok); - continue; - } - if (_immutable.List.isList(tok)) { - Array.prototype.push.apply(stack_782, tok.toArray()); - continue; - } - if (isEOS_674(tok)) { - if (stack_782[0] && isLeftDelimiter_678(stack_782[0].token)) { - throw this.createUnexpected(tok); - } - break; - } - if (isLeftDelimiter_678(tok)) { - if (isLeftSyntax_676(tok)) { - this.insideSyntaxTemplate.push(true); - } - let line = tok.slice.startLocation.line; - let innerB = isLeftBrace_669(tok) ? isExprPrefix_709(line, b_783)(prefix_785) : true; - let inner = this.read([new _syntax2.default(tok, this.context)], innerB, false); - let stx = new _syntax2.default(inner, this.context); - prefix_785 = prefix_785.concat(stx); - stack_782.push(stx); - if (singleDelimiter_784) { - break; - } - } else if (isRightDelimiter_679(tok)) { - if (stack_782[0] && !isMatchingDelimiters_680(stack_782[0].token, tok)) { - throw this.createUnexpected(tok); - } - let stx = new _syntax2.default(tok, this.context); - stack_782.push(stx); - if (lastEl_720(this.insideSyntaxTemplate) && isRightSyntax_677(tok)) { - this.insideSyntaxTemplate.pop(); - } - break; - } else { - let stx = new _syntax2.default(tok, this.context); - prefix_785 = prefix_785.concat(stx); - stack_782.push(stx); - } - } - return (0, _immutable.List)(stack_782); + function SetRef(ref) { + ref && (ref.value = true); } - advance(prefix_786, b_787) { - let startLocation_788 = this.getLocation(); - this.lastIndex = this.index; - this.lastLine = this.line; - this.lastLineStart = this.lineStart; - this.skipComment(); - this.startIndex = this.index; - this.startLine = this.line; - this.startLineStart = this.lineStart; - if (this.replacementIndex && this.replacementIndex[0] && this.index >= this.replacementIndex[0].index) { - let rep = this.replacementIndex[0].replacement; - this.replacementIndex.shift(); - return rep; - } - let charCode_789 = this.source.charCodeAt(this.index); - if (charCode_789 === 96) { - let element, - items = []; - let startLocation_788 = this.getLocation(); - let start = this.index; - this.index++; - if (lastEl_720(this.insideSyntaxTemplate)) { - let slice = this.getSlice(start, startLocation_788); - return { type: RSYNTAX_665, value: "`", slice: slice }; - } - do { - element = this.scanTemplateElement(); - items.push(element); - if (element.interp) { - element = this.read([], false, true); - (0, _errors.assert)(element.size === 1, "should only have read a single delimiter inside a template"); - items.push(element.get(0)); - } - } while (!element.tail); - return { type: _tokenizer.TokenType.TEMPLATE, items: (0, _immutable.List)(items), slice: this.getSlice(start, startLocation_788) }; - } else if (charCode_789 === 35) { - let startLocation_788 = this.getLocation(); - let start = this.index; - let slice = this.getSlice(start, startLocation_788); - this.index++; - if (this.source.charCodeAt(this.index) === 96) { - this.index++; - return { type: LSYNTAX_664, value: "#`", slice: slice }; - } - return { type: _tokenizer.TokenType.IDENTIFIER, value: "#", slice: slice }; - } else if (charCode_789 === 64) { - let startLocation_788 = this.getLocation(); - let start = this.index; - let slice = this.getSlice(start, startLocation_788); - this.index++; - return { type: AT_666, value: "@", slice: slice }; + + // A function which returns a value representing an "owner" for transient writes + // to tries. The return value will only ever equal itself, and will not equal + // the return of any subsequent call of this function. + function OwnerID() {} + + // http://jsperf.com/copy-array-inline + function arrCopy(arr, offset) { + offset = offset || 0; + var len = Math.max(0, arr.length - offset); + var newArr = new Array(len); + for (var ii = 0; ii < len; ii++) { + newArr[ii] = arr[ii + offset]; } - let lookahead_790 = super.advance(); - if (lookahead_790.type === _tokenizer.TokenType.DIV && isRegexPrefix_719(b_787)(prefix_786)) { - return super.scanRegExp("/"); + return newArr; + } + + function ensureSize(iter) { + if (iter.size === undefined) { + iter.size = iter.__iterate(returnTrue); } - return lookahead_790; + return iter.size; } - scanTemplateElement() { - let startLocation_791 = this.getLocation(); - let start_792 = this.index; - while (this.index < this.source.length) { - let ch = this.source.charCodeAt(this.index); - switch (ch) { - case 96: - let slice = this.getSlice(start_792, startLocation_791); - this.index++; - return { type: _tokenizer.TokenType.TEMPLATE, tail: true, interp: false, slice: slice }; - case 36: - if (this.source.charCodeAt(this.index + 1) === 123) { - let slice = this.getSlice(start_792, startLocation_791); - this.index += 1; - return { type: _tokenizer.TokenType.TEMPLATE, tail: false, interp: true, slice: slice }; - } - this.index++; - break; - case 92: - { - let octal = this.scanStringEscape("", null)[1]; - if (octal != null) { - throw this.createILLEGAL(); - } - break; - } - default: - this.index++; + + function wrapIndex(iter, index) { + // This implements "is array index" which the ECMAString spec defines as: + // + // A String property name P is an array index if and only if + // ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal + // to 2^32−1. + // + // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects + if (typeof index !== 'number') { + var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32 + if ('' + uint32Index !== index || uint32Index === 4294967295) { + return NaN; } + index = uint32Index; } - throw this.createILLEGAL(); + return index < 0 ? ensureSize(iter) + index : index; } - } - exports.default = Reader; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3NoaWZ0LXJlYWRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUVBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7SUFBYSxDOzs7Ozs7QUFDYixNQUFNLFdBQVcsb0JBQU0sSUFBdkI7QUFDQSxNQUFNLGNBQWMsb0JBQU0sT0FBMUI7QUFDQSxNQUFNLGNBQWMsRUFBQyxNQUFNLGFBQVAsRUFBcEI7QUFDQSxNQUFNLGNBQWMsRUFBQyxNQUFNLGNBQVAsRUFBcEI7QUFDQSxNQUFNLFNBQVMsRUFBQyxPQUFPLHNCQUFXLFVBQW5CLEVBQStCLE1BQU0sR0FBckMsRUFBZjtBQUNBLE1BQU0sc0JBQXNCLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsTUFBakIsRUFBeUIsT0FBekIsQ0FBNUI7QUFDQSxNQUFNLG9CQUFvQixFQUFFLE9BQUYsQ0FBVSxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBVixDQUExQjtBQUNBLE1BQU0sa0JBQWtCLEVBQUUsT0FBRixDQUFVLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUFWLENBQXhCO0FBQ0EsTUFBTSxrQkFBa0IsRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLE1BQWpCLEVBQVYsQ0FBeEI7QUFDQSxNQUFNLHFCQUFxQixFQUFFLE9BQUYsQ0FBVSxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBVixDQUEzQjtBQUNBLE1BQU0sbUJBQW1CLEVBQUUsT0FBRixDQUFVLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUFWLENBQXpCO0FBQ0EsTUFBTSxtQkFBbUIsRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLE1BQWpCLEVBQVYsQ0FBekI7QUFDQSxNQUFNLFlBQVksRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLEdBQWpCLEVBQVYsQ0FBbEI7QUFDQSxNQUFNLGFBQWEsRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLFVBQWpCLEVB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aEQsRUFBc0QsT0FBTyxLQUE3RCxFQUFQO0FBQ0Q7QUFDRCxlQUFLLEtBQUw7QUFDQTtBQUNGLGFBQUssRUFBTDtBQUNFO0FBQ0UsZ0JBQUksUUFBUSxLQUFLLGdCQUFMLENBQXNCLEVBQXRCLEVBQTBCLElBQTFCLEVBQWdDLENBQWhDLENBQVo7QUFDQSxnQkFBSSxTQUFTLElBQWIsRUFBbUI7QUFDakIsb0JBQU0sS0FBSyxhQUFMLEVBQU47QUFDRDtBQUNEO0FBQ0Q7QUFDSDtBQUNFLGVBQUssS0FBTDtBQXRCSjtBQXdCRDtBQUNELFVBQU0sS0FBSyxhQUFMLEVBQU47QUFDRDtBQTVKMkM7a0JBQXpCLE0iLCJmaWxlIjoic2hpZnQtcmVhZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRva2VuaXplciBmcm9tIFwic2hpZnQtcGFyc2VyL2Rpc3QvdG9rZW5pemVyXCI7XG5pbXBvcnQge1Rva2VuQ2xhc3MsIFRva2VuVHlwZX0gZnJvbSBcInNoaWZ0LXBhcnNlci9kaXN0L3Rva2VuaXplclwiO1xuaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHtNYXliZX0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQgICogYXMgUiBmcm9tIFwicmFtZGFcIjtcbmNvbnN0IEp1c3RfNjYyID0gTWF5YmUuSnVzdDtcbmNvbnN0IE5vdGhpbmdfNjYzID0gTWF5YmUuTm90aGluZztcbmNvbnN0IExTWU5UQVhfNjY0ID0ge25hbWU6IFwibGVmdC1zeW50YXhcIn07XG5jb25zdCBSU1lOVEFYXzY2NSA9IHtuYW1lOiBcInJpZ2h0LXN5bnRheFwifTtcbmNvbnN0IEFUXzY2NiA9IHtrbGFzczogVG9rZW5DbGFzcy5QdW5jdHVhdG9yLCBuYW1lOiBcIkBcIn07XG5jb25zdCBsaXRlcmFsS2V5d29yZHNfNjY3ID0gW1widGhpc1wiLCBcIm51bGxcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIl07XG5jb25zdCBpc0xlZnRCcmFja2V0XzY2OCA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLkxCUkFDS30pO1xuY29uc3QgaXNMZWZ0QnJhY2VfNjY5ID0gUi53aGVyZUVxKHt0eXBlOiBUb2tlblR5cGUuTEJSQUNFfSk7XG5jb25zdCBpc0xlZnRQYXJlbl82NzAgPSBSLndoZXJlRXEoe3R5cGU6IFRva2VuVHlwZS5MUEFSRU59KTtcbmNvbnN0IGlzUmlnaHRCcmFja2V0XzY3MSA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLlJCUkFDS30pO1xuY29uc3QgaXNSaWdodEJyYWNlXzY3MiA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLlJCUkFDRX0pO1xuY29uc3QgaXNSaWdodFBhcmVuXzY3MyA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLlJQQVJFTn0pO1xuY29uc3QgaXNFT1NfNjc0ID0gUi53aGVyZUVxKHt0eXBlOiBUb2tlblR5cGUuRU9TfSk7XG5jb25zdCBpc0hhc2hfNjc1ID0gUi53aGVyZUVxKHt0eXBlOiBUb2tlblR5cGUuSURFTlRJRklFUiwgdmFsdWU6IFwiI1wifSk7XG5jb25zdCBpc0xlZnRTeW50YXhfNjc2ID0gUi53aGVyZUVxKHt0eXBlOiBMU1lOVEFYXzY2NH0pO1xuY29uc3QgaXNSaWdodFN5bnRheF82NzcgPSBSLndoZXJlRXEoe3R5cGU6IFJTWU5UQVhfNjY1fSk7XG5jb25zdCBpc0xlZnREZWxpbWl0ZXJfNjc4ID0gUi5hbnlQYXNzKFtpc0xlZnRCcmFja2V0XzY2OCwgaXNMZWZ0QnJhY2VfNjY5LCBpc0xlZnRQYXJlbl82NzAsIGlzTGVmdFN5bnRheF82NzZdKTtcbmNvbnN0IGlzUmlnaHREZWxpbWl0ZXJfNjc5ID0gUi5hbnlQYXNzKFtpc1JpZ2h0QnJhY2tldF82NzEsIGlzUmlnaHRCcmFjZV82NzIsIGlzUmlnaHRQYXJlbl82NzMsIGlzUmlnaHRTeW50YXhfNjc3XSk7XG5jb25zdCBpc01hdGNoaW5nRGVsaW1pdGVyc182ODAgPSBSLmNvbmQoW1tpc0xlZnRCcmFja2V0XzY2OCwgKF9fNzIxLCBiXzcyMikgPT4gaXNSaWdodEJyYWNrZXRfNjcxKGJfNzIyKV0sIFtpc0xlZnRCcmFjZV82NjksIChfXzcyMywgYl83MjQpID0+IGlzUmlnaHRCcmFjZV82NzIoYl83MjQpXSwgW2lzTGVmdFBhcmVuXzY3MCwgKF9fNzI1LCBiXzcyNikgPT4gaXNSaWdodFBhcmVuXzY3MyhiXzcyNildLCBbaXNMZWZ0U3ludGF4XzY3NiwgKF9fNzI3LCBiXzcyOCkgPT4gaXNSaWdodFN5bnRheF82NzcoYl83MjgpXSwgW1IuVCwgUi5GXV0pO1xuY29uc3QgYXNzaWduT3BzXzY4MSA9IFtcIj1cIiwgXCIrPVwiLCBcIi09XCIsIFwiKj1cIiwgXCIvPVwiLCBcIiU9XCIsIFwiPDw9XCIsIFwiPj49XCIsIFwiPj4+PVwiLCBcIiY9XCIsIFwifD1cIiwgXCJePVwiLCBcIixcIl07XG5jb25zdCBiaW5hcnlPcHNfNjgyID0gW1wiK1wiLCBcIi1cIiwgXCIqXCIsIFwiL1wiLCBcIiVcIiwgXCI8PFwiLCBcIj4+XCIsIFwiPj4+XCIsIFwiJlwiLCBcInxcIiwgXCJeXCIsIFwiJiZcIiwgXCJ8fFwiLCBcIj9cIiwgXCI6XCIsIFwiPT09XCIsIFwiPT1cIiwgXCI+PVwiLCBcIjw9XCIsIFwiPFwiLCBcIj5cIiwgXCIhPVwiLCBcIiE9PVwiLCBcImluc3RhbmNlb2ZcIl07XG5jb25zdCB1bmFyeU9wc182ODMgPSBbXCIrK1wiLCBcIi0tXCIsIFwiflwiLCBcIiFcIiwgXCJkZWxldGVcIiwgXCJ2b2lkXCIsIFwidHlwZW9mXCIsIFwieWllbGRcIiwgXCJ0aHJvd1wiLCBcIm5ld1wiXTtcbmNvbnN0IGlzRW1wdHlfNjg0ID0gUi53aGVyZUVxKHtzaXplOiAwfSk7XG5jb25zdCBpc1B1bmN0dWF0b3JfNjg1ID0gc183MjkgPT4gc183MjkubWF0Y2goXCJwdW5jdHVhdG9yXCIpO1xuY29uc3QgaXNLZXl3b3JkXzY4NiA9IHNfNzMwID0+IHNfNzMwLm1hdGNoKFwia2V5d29yZFwiKTtcbmNvbnN0IGlzRGVsaW1pdGVyXzY4NyA9IHNfNzMxID0+IHNfNzMxLm1hdGNoKFwiZGVsaW1pdGVyXCIpO1xuY29uc3QgaXNQYXJlbnNfNjg4ID0gc183MzIgPT4gc183MzIubWF0Y2goXCJwYXJlbnNcIik7XG5jb25zdCBpc0JyYWNlc182ODkgPSBzXzczMyA9PiBzXzczMy5tYXRjaChcImJyYWNlc1wiKTtcbmNvbnN0IGlzQnJhY2tldHNfNjkwID0gc183MzQgPT4gc183MzQubWF0Y2goXCJicmFja2V0c1wiKTtcbmNvbnN0IGlzSWRlbnRpZmllcl82OTEgPSBzXzczNSA9PiBzXzczNS5tYXRjaChcImlkZW50aWZpZXJcIik7XG5jb25zdCB2YWxfNjkyID0gc183MzYgPT4gc183MzYudmFsKCk7XG5jb25zdCBpc1ZhbF82OTMgPSBSLmN1cnJ5KCh2XzczNywgc183MzgpID0+IHNfNzM4LnZhbCgpID09PSB2XzczNyk7XG5jb25zdCBpc0RvdF82OTQgPSBSLmFsbFBhc3MoW2lzUHVuY3R1YXRvcl82ODUsIGlzVmFsXzY5MyhcIi5cIildKTtcbmNvbnN0IGlzQ29sb25fNjk1ID0gUi5hbGxQYXNzKFtpc1B1bmN0dWF0b3JfNjg1LCBpc1ZhbF82OTMoXCI6XCIpXSk7XG5jb25zdCBpc0Z1bmN0aW9uS2V5d29yZF82OTYgPSBSLmFsbFBhc3MoW2lzS2V5d29yZF82ODYsIGlzVmFsXzY5MyhcImZ1bmN0aW9uXCIpXSk7XG5jb25zdCBpc09wZXJhdG9yXzY5NyA9IHNfNzM5ID0+IChzXzczOS5tYXRjaChcInB1bmN0dWF0b3JcIikgfHwgc183MzkubWF0Y2goXCJrZXl3b3JkXCIpKSAmJiBSLmFueShSLmVxdWFscyhzXzczOS52YWwoKSksIGFzc2lnbk9wc182ODEuY29uY2F0KGJpbmFyeU9wc182ODIpLmNvbmNhdCh1bmFyeU9wc182ODMpKTtcbmNvbnN0IGlzTm9uTGl0ZXJhbEtleXdvcmRfNjk4ID0gUi5hbGxQYXNzKFtpc0tleXdvcmRfNjg2LCBzXzc0MCA9PiBSLm5vbmUoUi5lcXVhbHMoc183NDAudmFsKCkpLCBsaXRlcmFsS2V5d29yZHNfNjY3KV0pO1xuY29uc3QgaXNLZXl3b3JkRXhwclByZWZpeF82OTkgPSBSLmFsbFBhc3MoW2lzS2V5d29yZF82ODYsIHNfNzQxID0+IFIuYW55KFIuZXF1YWxzKHNfNzQxLnZhbCgpKSwgW1wiaW5zdGFuY2VvZlwiLCBcInR5cGVvZlwiLCBcImRlbGV0ZVwiLCBcInZvaWRcIiwgXCJ5aWVsZFwiLCBcInRocm93XCIsIFwibmV3XCIsIFwiY2FzZVwiXSldKTtcbmxldCBsYXN0XzcwMCA9IHBfNzQyID0+IHBfNzQyLmxhc3QoKTtcbmxldCBzYWZlTGFzdF83MDEgPSBSLnBpcGUoUi5jb25kKFtbaXNFbXB0eV82ODQsIFIuYWx3YXlzKE5vdGhpbmdfNjYzKCkpXSwgW1IuVCwgUi5jb21wb3NlKE1heWJlLm9mLCBsYXN0XzcwMCldXSkpO1xubGV0IHN0dWZmVHJ1ZV83MDIgPSBSLmN1cnJ5KChwXzc0MywgYl83NDQpID0+IGJfNzQ0ID8gSnVzdF82NjIocF83NDMpIDogTm90aGluZ182NjMoKSk7XG5sZXQgc3R1ZmZGYWxzZV83MDMgPSBSLmN1cnJ5KChwXzc0NSwgYl83NDYpID0+ICFiXzc0NiA/IEp1c3RfNjYyKHBfNzQ1KSA6IE5vdGhpbmdfNjYzKCkpO1xubGV0IGlzVG9wQ29sb25fNzA0ID0gUi5waXBlKHNhZmVMYXN0XzcwMSwgUi5tYXAoaXNDb2xvbl82OTUpLCBNYXliZS5tYXliZShmYWxzZSwgUi5pZGVudGl0eSkpO1xubGV0IGlzVG9wUHVuY3R1YXRvcl83MDUgPSBSLnBpcGUoc2FmZUxhc3RfNzAxLCBSLm1hcChpc1B1bmN0dWF0b3JfNjg1KSwgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpKTtcbmxldCBpc0V4cHJSZXR1cm5fNzA2ID0gUi5jdXJyeSgobF83NDcsIHBfNzQ4KSA9PiB7XG4gIGxldCByZXRLd2RfNzQ5ID0gc2FmZUxhc3RfNzAxKHBfNzQ4KTtcbiAgbGV0IG1heWJlRG90Xzc1MCA9IHBvcF83MTcocF83NDgpLmNoYWluKHNhZmVMYXN0XzcwMSk7XG4gIGlmIChtYXliZURvdF83NTAubWFwKGlzRG90XzY5NCkuZ2V0T3JFbHNlKGZhbHNlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZXRLd2RfNzQ5Lm1hcChzXzc1MSA9PiB7XG4gICAgcmV0dXJuIHNfNzUxLm1hdGNoKFwia2V5d29yZFwiKSAmJiBzXzc1MS52YWwoKSA9PT0gXCJyZXR1cm5cIiAmJiBzXzc1MS5saW5lTnVtYmVyKCkgPT09IGxfNzQ3O1xuICB9KS5nZXRPckVsc2UoZmFsc2UpO1xufSk7XG5jb25zdCBpc1RvcE9wZXJhdG9yXzcwNyA9IFIucGlwZShzYWZlTGFzdF83MDEsIFIubWFwKGlzT3BlcmF0b3JfNjk3KSwgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpKTtcbmNvbnN0IGlzVG9wS2V5d29yZEV4cHJQcmVmaXhfNzA4ID0gUi5waXBlKHNhZmVMYXN0XzcwMSwgUi5tYXAoaXNLZXl3b3JkRXhwclByZWZpeF82OTkpLCBNYXliZS5tYXliZShmYWxzZSwgUi5pZGVudGl0eSkpO1xubGV0IGlzRXhwclByZWZpeF83MDkgPSBSLmN1cnJ5KChsXzc1MiwgYl83NTMpID0+IFIuY29uZChbW2lzRW1wdHlfNjg0LCBSLmFsd2F5cyhiXzc1MyldLCBbaXNUb3BDb2xvbl83MDQsIFIuYWx3YXlzKGJfNzUzKV0sIFtpc1RvcEtleXdvcmRFeHByUHJlZml4XzcwOCwgUi5UXSwgW2lzVG9wT3BlcmF0b3JfNzA3LCBSLlRdLCBbaXNUb3BQdW5jdHVhdG9yXzcwNSwgUi5hbHdheXMoYl83NTMpXSwgW2lzRXhwclJldHVybl83MDYobF83NTIpLCBSLlRdLCBbUi5ULCBSLkZdXSkpO1xubGV0IGN1cmx5XzcxMCA9IHBfNzU0ID0+IHNhZmVMYXN0XzcwMShwXzc1NCkubWFwKGlzQnJhY2VzXzY4OSkuY2hhaW4oc3R1ZmZUcnVlXzcwMihwXzc1NCkpO1xubGV0IHBhcmVuXzcxMSA9IHBfNzU1ID0+IHNhZmVMYXN0XzcwMShwXzc1NSkubWFwKGlzUGFyZW5zXzY4OCkuY2hhaW4oc3R1ZmZUcnVlXzcwMihwXzc1NSkpO1xubGV0IGZ1bmNfNzEyID0gcF83NTYgPT4gc2FmZUxhc3RfNzAxKHBfNzU2KS5tYXAoaXNGdW5jdGlvbktleXdvcmRfNjk2KS5jaGFpbihzdHVmZlRydWVfNzAyKHBfNzU2KSk7XG5sZXQgaWRlbnRfNzEzID0gcF83NTcgPT4gc2FmZUxhc3RfNzAxKHBfNzU3KS5tYXAoaXNJZGVudGlmaWVyXzY5MSkuY2hhaW4oc3R1ZmZUcnVlXzcwMihwXzc1NykpO1xubGV0IG5vbkxpdGVyYWxLZXl3b3JkXzcxNCA9IHBfNzU4ID0+IHNhZmVMYXN0XzcwMShwXzc1OCkubWFwKGlzTm9uTGl0ZXJhbEtleXdvcmRfNjk4KS5jaGFpbihzdHVmZlRydWVfNzAyKHBfNzU4KSk7XG5sZXQgb3B0XzcxNSA9IFIuY3VycnkoKGFfNzU5LCBiXzc2MCwgcF83NjEpID0+IHtcbiAgbGV0IHJlc3VsdF83NjIgPSBSLnBpcGVLKGFfNzU5LCBiXzc2MCkoTWF5YmUub2YocF83NjEpKTtcbiAgcmV0dXJuIE1heWJlLmlzSnVzdChyZXN1bHRfNzYyKSA/IHJlc3VsdF83NjIgOiBNYXliZS5vZihwXzc2MSk7XG59KTtcbmxldCBub3REb3RfNzE2ID0gUi5pZkVsc2UoUi53aGVyZUVxKHtzaXplOiAwfSksIEp1c3RfNjYyLCBwXzc2MyA9PiBzYWZlTGFzdF83MDEocF83NjMpLm1hcChzXzc2NCA9PiAhKHNfNzY0Lm1hdGNoKFwicHVuY3R1YXRvclwiKSAmJiBzXzc2NC52YWwoKSA9PT0gXCIuXCIpKS5jaGFpbihzdHVmZlRydWVfNzAyKHBfNzYzKSkpO1xubGV0IHBvcF83MTcgPSBSLmNvbXBvc2UoSnVzdF82NjIsIHBfNzY1ID0+IHBfNzY1LnBvcCgpKTtcbmNvbnN0IGZ1bmN0aW9uUHJlZml4XzcxOCA9IFIucGlwZUsoY3VybHlfNzEwLCBwb3BfNzE3LCBwYXJlbl83MTEsIHBvcF83MTcsIG9wdF83MTUoaWRlbnRfNzEzLCBwb3BfNzE3KSwgZnVuY183MTIpO1xuY29uc3QgaXNSZWdleFByZWZpeF83MTkgPSBiXzc2NiA9PiBSLmFueVBhc3MoW2lzRW1wdHlfNjg0LCBpc1RvcFB1bmN0dWF0b3JfNzA1LCBSLnBpcGUoTWF5YmUub2YsIFIucGlwZUsobm9uTGl0ZXJhbEtleXdvcmRfNzE0LCBwb3BfNzE3LCBub3REb3RfNzE2KSwgTWF5YmUuaXNKdXN0KSwgUi5waXBlKE1heWJlLm9mLCBSLnBpcGVLKHBhcmVuXzcxMSwgcG9wXzcxNywgbm9uTGl0ZXJhbEtleXdvcmRfNzE0LCBwb3BfNzE3LCBub3REb3RfNzE2KSwgTWF5YmUuaXNKdXN0KSwgUi5waXBlKE1heWJlLm9mLCBmdW5jdGlvblByZWZpeF83MTgsIFIuY2hhaW4ocF83NjcgPT4ge1xuICByZXR1cm4gc2FmZUxhc3RfNzAxKHBfNzY3KS5tYXAoc183NjggPT4gc183NjgubGluZU51bWJlcigpKS5jaGFpbihmbkxpbmVfNzY5ID0+IHtcbiAgICByZXR1cm4gcG9wXzcxNyhwXzc2NykubWFwKGlzRXhwclByZWZpeF83MDkoZm5MaW5lXzc2OSwgYl83NjYpKTtcbiAgfSkuY2hhaW4oc3R1ZmZGYWxzZV83MDMocF83NjcpKTtcbn0pLCBNYXliZS5pc0p1c3QpLCBwXzc3MCA9PiB7XG4gIGxldCBpc0N1cmx5Xzc3MSA9IE1heWJlLmlzSnVzdChzYWZlTGFzdF83MDEocF83NzApLm1hcChpc0JyYWNlc182ODkpKTtcbiAgbGV0IGFscmVhZHlDaGVja2VkRnVuY3Rpb25fNzcyID0gUi5waXBlKE1heWJlLm9mLCBmdW5jdGlvblByZWZpeF83MTgsIE1heWJlLmlzSnVzdCkocF83NzApO1xuICBpZiAoYWxyZWFkeUNoZWNrZWRGdW5jdGlvbl83NzIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIFIucGlwZShNYXliZS5vZiwgUi5jaGFpbihjdXJseV83MTApLCBSLmNoYWluKHBfNzczID0+IHtcbiAgICByZXR1cm4gc2FmZUxhc3RfNzAxKHBfNzczKS5tYXAoc183NzQgPT4gc183NzQubGluZU51bWJlcigpKS5jaGFpbihjdXJseUxpbmVfNzc1ID0+IHtcbiAgICAgIHJldHVybiBwb3BfNzE3KHBfNzczKS5tYXAoaXNFeHByUHJlZml4XzcwOShjdXJseUxpbmVfNzc1LCBiXzc2NikpO1xuICAgIH0pLmNoYWluKHN0dWZmRmFsc2VfNzAzKHBfNzczKSk7XG4gIH0pLCBNYXliZS5pc0p1c3QpKHBfNzcwKTtcbn1dKTtcbmZ1bmN0aW9uIGxhc3RFbF83MjAobF83NzYpIHtcbiAgcmV0dXJuIGxfNzc2W2xfNzc2Lmxlbmd0aCAtIDFdO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhZGVyIGV4dGVuZHMgVG9rZW5pemVyIHtcbiAgY29uc3RydWN0b3Ioc3RyaW5nc183NzcsIGNvbnRleHRfNzc4LCByZXBsYWNlbWVudHNfNzc5KSB7XG4gICAgc3VwZXIoQXJyYXkuaXNBcnJheShzdHJpbmdzXzc3NykgPyBzdHJpbmdzXzc3Ny5qb2luKFwiXCIpIDogc3RyaW5nc183NzcpO1xuICAgIHRoaXMuZGVsaW1TdGFjayA9IG5ldyBNYXA7XG4gICAgdGhpcy5pbnNpZGVTeW50YXhUZW1wbGF0ZSA9IFtmYWxzZV07XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF83Nzg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RyaW5nc183NzcpKSB7XG4gICAgICBsZXQgdG90YWxJbmRleCA9IDA7XG4gICAgICB0aGlzLnJlcGxhY2VtZW50SW5kZXggPSBSLnJlZHVjZSgoYWNjXzc4MCwgc3RyUmVwXzc4MSkgPT4ge1xuICAgICAgICBhY2NfNzgwLnB1c2goe2luZGV4OiB0b3RhbEluZGV4ICsgc3RyUmVwXzc4MVswXS5sZW5ndGgsIHJlcGxhY2VtZW50OiBzdHJSZXBfNzgxWzFdfSk7XG4gICAgICAgIHRvdGFsSW5kZXggKz0gc3RyUmVwXzc4MVswXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBhY2NfNzgwO1xuICAgICAgfSwgW10sIFIuemlwKHN0cmluZ3NfNzc3LCByZXBsYWNlbWVudHNfNzc5KSk7XG4gICAgfVxuICB9XG4gIHJlYWQoc3RhY2tfNzgyID0gW10sIGJfNzgzID0gZmFsc2UsIHNpbmdsZURlbGltaXRlcl83ODQgPSBmYWxzZSkge1xuICAgIGxldCBwcmVmaXhfNzg1ID0gTGlzdCgpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgdG9rID0gdGhpcy5hZHZhbmNlKHByZWZpeF83ODUsIGJfNzgzKTtcbiAgICAgIGlmICh0b2suc2NvcGVzZXRzIHx8IHRvayBpbnN0YW5jZW9mIFRlcm0pIHtcbiAgICAgICAgc3RhY2tfNzgyLnB1c2godG9rKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b2spKSB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHN0YWNrXzc4MiwgdG9rKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoTGlzdC5pc0xpc3QodG9rKSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzdGFja183ODIsIHRvay50b0FycmF5KCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VPU182NzQodG9rKSkge1xuICAgICAgICBpZiAoc3RhY2tfNzgyWzBdICYmIGlzTGVmdERlbGltaXRlcl82Nzgoc3RhY2tfNzgyWzBdLnRva2VuKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5leHBlY3RlZCh0b2spO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGlzTGVmdERlbGltaXRlcl82NzgodG9rKSkge1xuICAgICAgICBpZiAoaXNMZWZ0U3ludGF4XzY3Nih0b2spKSB7XG4gICAgICAgICAgdGhpcy5pbnNpZGVTeW50YXhUZW1wbGF0ZS5wdXNoKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gdG9rLnNsaWNlLnN0YXJ0TG9jYXRpb24ubGluZTtcbiAgICAgICAgbGV0IGlubmVyQiA9IGlzTGVmdEJyYWNlXzY2OSh0b2spID8gaXNFeHByUHJlZml4XzcwOShsaW5lLCBiXzc4MykocHJlZml4Xzc4NSkgOiB0cnVlO1xuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLnJlYWQoW25ldyBTeW50YXgodG9rLCB0aGlzLmNvbnRleHQpXSwgaW5uZXJCLCBmYWxzZSk7XG4gICAgICAgIGxldCBzdHggPSBuZXcgU3ludGF4KGlubmVyLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICBwcmVmaXhfNzg1ID0gcHJlZml4Xzc4NS5jb25jYXQoc3R4KTtcbiAgICAgICAgc3RhY2tfNzgyLnB1c2goc3R4KTtcbiAgICAgICAgaWYgKHNpbmdsZURlbGltaXRlcl83ODQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1JpZ2h0RGVsaW1pdGVyXzY3OSh0b2spKSB7XG4gICAgICAgIGlmIChzdGFja183ODJbMF0gJiYgIWlzTWF0Y2hpbmdEZWxpbWl0ZXJzXzY4MChzdGFja183ODJbMF0udG9rZW4sIHRvaykpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZVVuZXhwZWN0ZWQodG9rKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3R4ID0gbmV3IFN5bnRheCh0b2ssIHRoaXMuY29udGV4dCk7XG4gICAgICAgIHN0YWNrXzc4Mi5wdXNoKHN0eCk7XG4gICAgICAgIGlmIChsYXN0RWxfNzIwKHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUpICYmIGlzUmlnaHRTeW50YXhfNjc3KHRvaykpIHtcbiAgICAgICAgICB0aGlzLmluc2lkZVN5bnRheFRlbXBsYXRlLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHN0eCA9IG5ldyBTeW50YXgodG9rLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICBwcmVmaXhfNzg1ID0gcHJlZml4Xzc4NS5jb25jYXQoc3R4KTtcbiAgICAgICAgc3RhY2tfNzgyLnB1c2goc3R4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIExpc3Qoc3RhY2tfNzgyKTtcbiAgfVxuICBhZHZhbmNlKHByZWZpeF83ODYsIGJfNzg3KSB7XG4gICAgbGV0IHN0YXJ0TG9jYXRpb25fNzg4ID0gdGhpcy5nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMubGFzdEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmxhc3RMaW5lID0gdGhpcy5saW5lO1xuICAgIHRoaXMubGFzdExpbmVTdGFydCA9IHRoaXMubGluZVN0YXJ0O1xuICAgIHRoaXMuc2tpcENvbW1lbnQoKTtcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuc3RhcnRMaW5lID0gdGhpcy5saW5lO1xuICAgIHRoaXMuc3RhcnRMaW5lU3RhcnQgPSB0aGlzLmxpbmVTdGFydDtcbiAgICBpZiAodGhpcy5yZXBsYWNlbWVudEluZGV4ICYmIHRoaXMucmVwbGFjZW1lbnRJbmRleFswXSAmJiB0aGlzLmluZGV4ID49IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5pbmRleCkge1xuICAgICAgbGV0IHJlcCA9IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5yZXBsYWNlbWVudDtcbiAgICAgIHRoaXMucmVwbGFjZW1lbnRJbmRleC5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHJlcDtcbiAgICB9XG4gICAgbGV0IGNoYXJDb2RlXzc4OSA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG4gICAgaWYgKGNoYXJDb2RlXzc4OSA9PT0gOTYpIHtcbiAgICAgIGxldCBlbGVtZW50LCBpdGVtcyA9IFtdO1xuICAgICAgbGV0IHN0YXJ0TG9jYXRpb25fNzg4ID0gdGhpcy5nZXRMb2NhdGlvbigpO1xuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIGlmIChsYXN0RWxfNzIwKHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUpKSB7XG4gICAgICAgIGxldCBzbGljZSA9IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb25fNzg4KTtcbiAgICAgICAgcmV0dXJuIHt0eXBlOiBSU1lOVEFYXzY2NSwgdmFsdWU6IFwiYFwiLCBzbGljZTogc2xpY2V9O1xuICAgICAgfVxuICAgICAgZG8ge1xuICAgICAgICBlbGVtZW50ID0gdGhpcy5zY2FuVGVtcGxhdGVFbGVtZW50KCk7XG4gICAgICAgIGl0ZW1zLnB1c2goZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LmludGVycCkge1xuICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLnJlYWQoW10sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICBhc3NlcnQoZWxlbWVudC5zaXplID09PSAxLCBcInNob3VsZCBvbmx5IGhhdmUgcmVhZCBhIHNpbmdsZSBkZWxpbWl0ZXIgaW5zaWRlIGEgdGVtcGxhdGVcIik7XG4gICAgICAgICAgaXRlbXMucHVzaChlbGVtZW50LmdldCgwKSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKCFlbGVtZW50LnRhaWwpO1xuICAgICAgcmV0dXJuIHt0eXBlOiBUb2tlblR5cGUuVEVNUExBVEUsIGl0ZW1zOiBMaXN0KGl0ZW1zKSwgc2xpY2U6IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb25fNzg4KX07XG4gICAgfSBlbHNlIGlmIChjaGFyQ29kZV83ODkgPT09IDM1KSB7XG4gICAgICBsZXQgc3RhcnRMb2NhdGlvbl83ODggPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgICBsZXQgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbl83ODgpO1xuICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgaWYgKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgPT09IDk2KSB7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIHt0eXBlOiBMU1lOVEFYXzY2NCwgdmFsdWU6IFwiI2BcIiwgc2xpY2U6IHNsaWNlfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7dHlwZTogVG9rZW5UeXBlLklERU5USUZJRVIsIHZhbHVlOiBcIiNcIiwgc2xpY2U6IHNsaWNlfTtcbiAgICB9IGVsc2UgaWYgKGNoYXJDb2RlXzc4OSA9PT0gNjQpIHtcbiAgICAgIGxldCBzdGFydExvY2F0aW9uXzc4OCA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICBsZXQgc2xpY2UgPSB0aGlzLmdldFNsaWNlKHN0YXJ0LCBzdGFydExvY2F0aW9uXzc4OCk7XG4gICAgICB0aGlzLmluZGV4Kys7XG4gICAgICByZXR1cm4ge3R5cGU6IEFUXzY2NiwgdmFsdWU6IFwiQFwiLCBzbGljZTogc2xpY2V9O1xuICAgIH1cbiAgICBsZXQgbG9va2FoZWFkXzc5MCA9IHN1cGVyLmFkdmFuY2UoKTtcbiAgICBpZiAobG9va2FoZWFkXzc5MC50eXBlID09PSBUb2tlblR5cGUuRElWICYmIGlzUmVnZXhQcmVmaXhfNzE5KGJfNzg3KShwcmVmaXhfNzg2KSkge1xuICAgICAgcmV0dXJuIHN1cGVyLnNjYW5SZWdFeHAoXCIvXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbG9va2FoZWFkXzc5MDtcbiAgfVxuICBzY2FuVGVtcGxhdGVFbGVtZW50KCkge1xuICAgIGxldCBzdGFydExvY2F0aW9uXzc5MSA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcbiAgICBsZXQgc3RhcnRfNzkyID0gdGhpcy5pbmRleDtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCkge1xuICAgICAgbGV0IGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcbiAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgY2FzZSA5NjpcbiAgICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLmdldFNsaWNlKHN0YXJ0Xzc5Miwgc3RhcnRMb2NhdGlvbl83OTEpO1xuICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgICByZXR1cm4ge3R5cGU6IFRva2VuVHlwZS5URU1QTEFURSwgdGFpbDogdHJ1ZSwgaW50ZXJwOiBmYWxzZSwgc2xpY2U6IHNsaWNlfTtcbiAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMSkgPT09IDEyMykge1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydF83OTIsIHN0YXJ0TG9jYXRpb25fNzkxKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgICAgICAgIHJldHVybiB7dHlwZTogVG9rZW5UeXBlLlRFTVBMQVRFLCB0YWlsOiBmYWxzZSwgaW50ZXJwOiB0cnVlLCBzbGljZTogc2xpY2V9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgbGV0IG9jdGFsID0gdGhpcy5zY2FuU3RyaW5nRXNjYXBlKFwiXCIsIG51bGwpWzFdO1xuICAgICAgICAgICAgaWYgKG9jdGFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVJTExFR0FMKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUlMTEVHQUwoKTtcbiAgfVxufVxuIl19 - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - "use strict"; + function returnTrue() { + return true; + } - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.JsError = exports.TokenType = exports.TokenClass = undefined; + function wholeSlice(begin, end, size) { + return (begin === 0 || (size !== undefined && begin <= -size)) && + (end === undefined || (size !== undefined && end >= size)); + } - 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"); } }; }(); + function resolveBegin(begin, size) { + return resolveIndex(begin, size, 0); + } - 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 resolveEnd(end, size) { + return resolveIndex(end, size, size); + } - var _utils = __webpack_require__(5); + function resolveIndex(index, size, defaultIndex) { + return index === undefined ? + defaultIndex : + index < 0 ? + Math.max(0, size + index) : + size === undefined ? + index : + Math.min(size, index); + } - var _errors = __webpack_require__(10); + /* global Symbol */ - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + var ITERATE_KEYS = 0; + var ITERATE_VALUES = 1; + var ITERATE_ENTRIES = 2; - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + var REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** - * 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. - */ + var ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL; - var TokenClass = exports.TokenClass = { - Eof: { name: "" }, - Ident: { name: "Identifier", isIdentifierName: true }, - Keyword: { name: "Keyword", isIdentifierName: true }, - NumericLiteral: { name: "Numeric" }, - TemplateElement: { name: "Template" }, - Punctuator: { name: "Punctuator" }, - StringLiteral: { name: "String" }, - RegularExpression: { name: "RegularExpression" }, - Illegal: { name: "Illegal" } - }; - var TokenType = exports.TokenType = { - EOS: { klass: TokenClass.Eof, name: "EOS" }, - LPAREN: { klass: TokenClass.Punctuator, name: "(" }, - RPAREN: { klass: TokenClass.Punctuator, name: ")" }, - LBRACK: { klass: TokenClass.Punctuator, name: "[" }, - RBRACK: { klass: TokenClass.Punctuator, name: "]" }, - LBRACE: { klass: TokenClass.Punctuator, name: "{" }, - RBRACE: { klass: TokenClass.Punctuator, name: "}" }, - COLON: { klass: TokenClass.Punctuator, name: ":" }, - SEMICOLON: { klass: TokenClass.Punctuator, name: ";" }, - PERIOD: { klass: TokenClass.Punctuator, name: "." }, - ELLIPSIS: { klass: TokenClass.Punctuator, name: "..." }, - ARROW: { klass: TokenClass.Punctuator, name: "=>" }, - CONDITIONAL: { klass: TokenClass.Punctuator, name: "?" }, - INC: { klass: TokenClass.Punctuator, name: "++" }, - DEC: { klass: TokenClass.Punctuator, name: "--" }, - ASSIGN: { klass: TokenClass.Punctuator, name: "=" }, - ASSIGN_BIT_OR: { klass: TokenClass.Punctuator, name: "|=" }, - ASSIGN_BIT_XOR: { klass: TokenClass.Punctuator, name: "^=" }, - ASSIGN_BIT_AND: { klass: TokenClass.Punctuator, name: "&=" }, - ASSIGN_SHL: { klass: TokenClass.Punctuator, name: "<<=" }, - ASSIGN_SHR: { klass: TokenClass.Punctuator, name: ">>=" }, - ASSIGN_SHR_UNSIGNED: { klass: TokenClass.Punctuator, name: ">>>=" }, - ASSIGN_ADD: { klass: TokenClass.Punctuator, name: "+=" }, - ASSIGN_SUB: { klass: TokenClass.Punctuator, name: "-=" }, - ASSIGN_MUL: { klass: TokenClass.Punctuator, name: "*=" }, - ASSIGN_DIV: { klass: TokenClass.Punctuator, name: "/=" }, - ASSIGN_MOD: { klass: TokenClass.Punctuator, name: "%=" }, - COMMA: { klass: TokenClass.Punctuator, name: "," }, - OR: { klass: TokenClass.Punctuator, name: "||" }, - AND: { klass: TokenClass.Punctuator, name: "&&" }, - BIT_OR: { klass: TokenClass.Punctuator, name: "|" }, - BIT_XOR: { klass: TokenClass.Punctuator, name: "^" }, - BIT_AND: { klass: TokenClass.Punctuator, name: "&" }, - SHL: { klass: TokenClass.Punctuator, name: "<<" }, - SHR: { klass: TokenClass.Punctuator, name: ">>" }, - SHR_UNSIGNED: { klass: TokenClass.Punctuator, name: ">>>" }, - ADD: { klass: TokenClass.Punctuator, name: "+" }, - SUB: { klass: TokenClass.Punctuator, name: "-" }, - MUL: { klass: TokenClass.Punctuator, name: "*" }, - DIV: { klass: TokenClass.Punctuator, name: "/" }, - MOD: { klass: TokenClass.Punctuator, name: "%" }, - EQ: { klass: TokenClass.Punctuator, name: "==" }, - NE: { klass: TokenClass.Punctuator, name: "!=" }, - EQ_STRICT: { klass: TokenClass.Punctuator, name: "===" }, - NE_STRICT: { klass: TokenClass.Punctuator, name: "!==" }, - LT: { klass: TokenClass.Punctuator, name: "<" }, - GT: { klass: TokenClass.Punctuator, name: ">" }, - LTE: { klass: TokenClass.Punctuator, name: "<=" }, - GTE: { klass: TokenClass.Punctuator, name: ">=" }, - INSTANCEOF: { klass: TokenClass.Keyword, name: "instanceof" }, - IN: { klass: TokenClass.Keyword, name: "in" }, - NOT: { klass: TokenClass.Punctuator, name: "!" }, - BIT_NOT: { klass: TokenClass.Punctuator, name: "~" }, - AWAIT: { klass: TokenClass.Keyword, name: "await" }, - DELETE: { klass: TokenClass.Keyword, name: "delete" }, - TYPEOF: { klass: TokenClass.Keyword, name: "typeof" }, - VOID: { klass: TokenClass.Keyword, name: "void" }, - BREAK: { klass: TokenClass.Keyword, name: "break" }, - CASE: { klass: TokenClass.Keyword, name: "case" }, - CATCH: { klass: TokenClass.Keyword, name: "catch" }, - CLASS: { klass: TokenClass.Keyword, name: "class" }, - CONTINUE: { klass: TokenClass.Keyword, name: "continue" }, - DEBUGGER: { klass: TokenClass.Keyword, name: "debugger" }, - DEFAULT: { klass: TokenClass.Keyword, name: "default" }, - DO: { klass: TokenClass.Keyword, name: "do" }, - ELSE: { klass: TokenClass.Keyword, name: "else" }, - EXPORT: { klass: TokenClass.Keyword, name: "export" }, - EXTENDS: { klass: TokenClass.Keyword, name: "extends" }, - FINALLY: { klass: TokenClass.Keyword, name: "finally" }, - FOR: { klass: TokenClass.Keyword, name: "for" }, - FUNCTION: { klass: TokenClass.Keyword, name: "function" }, - IF: { klass: TokenClass.Keyword, name: "if" }, - IMPORT: { klass: TokenClass.Keyword, name: "import" }, - LET: { klass: TokenClass.Keyword, name: "let" }, - NEW: { klass: TokenClass.Keyword, name: "new" }, - RETURN: { klass: TokenClass.Keyword, name: "return" }, - SUPER: { klass: TokenClass.Keyword, name: "super" }, - SWITCH: { klass: TokenClass.Keyword, name: "switch" }, - THIS: { klass: TokenClass.Keyword, name: "this" }, - THROW: { klass: TokenClass.Keyword, name: "throw" }, - TRY: { klass: TokenClass.Keyword, name: "try" }, - VAR: { klass: TokenClass.Keyword, name: "var" }, - WHILE: { klass: TokenClass.Keyword, name: "while" }, - WITH: { klass: TokenClass.Keyword, name: "with" }, - NULL: { klass: TokenClass.Keyword, name: "null" }, - TRUE: { klass: TokenClass.Keyword, name: "true" }, - FALSE: { klass: TokenClass.Keyword, name: "false" }, - YIELD: { klass: TokenClass.Keyword, name: "yield" }, - NUMBER: { klass: TokenClass.NumericLiteral, name: "" }, - STRING: { klass: TokenClass.StringLiteral, name: "" }, - REGEXP: { klass: TokenClass.RegularExpression, name: "" }, - IDENTIFIER: { klass: TokenClass.Ident, name: "" }, - CONST: { klass: TokenClass.Keyword, name: "const" }, - TEMPLATE: { klass: TokenClass.TemplateElement, name: "" }, - ILLEGAL: { klass: TokenClass.Illegal, name: "" } - }; + function Iterator(next) { + this.next = next; + } - var TT = TokenType; - var I = TT.ILLEGAL; - var F = false; - var T = true; + Iterator.prototype.toString = function() { + return '[Iterator]'; + }; - var ONE_CHAR_PUNCTUATOR = [I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, TT.NOT, I, I, I, TT.MOD, TT.BIT_AND, I, TT.LPAREN, TT.RPAREN, TT.MUL, TT.ADD, TT.COMMA, TT.SUB, TT.PERIOD, TT.DIV, I, I, I, I, I, I, I, I, I, I, TT.COLON, TT.SEMICOLON, TT.LT, TT.ASSIGN, TT.GT, TT.CONDITIONAL, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, TT.LBRACK, I, TT.RBRACK, TT.BIT_XOR, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, TT.LBRACE, TT.BIT_OR, TT.RBRACE, TT.BIT_NOT]; - var PUNCTUATOR_START = [F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, T, T, F, T, T, T, T, T, T, F, T, F, F, F, F, F, F, F, F, F, F, T, T, T, T, T, T, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, F, T, T, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, T, T, T, F]; + Iterator.KEYS = ITERATE_KEYS; + Iterator.VALUES = ITERATE_VALUES; + Iterator.ENTRIES = ITERATE_ENTRIES; - var JsError = exports.JsError = function (_Error) { - _inherits(JsError, _Error); + Iterator.prototype.inspect = + Iterator.prototype.toSource = function () { return this.toString(); } + Iterator.prototype[ITERATOR_SYMBOL] = function () { + return this; + }; - function JsError(index, line, column, msg) { - _classCallCheck(this, JsError); - var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(JsError).call(this, msg)); + function iteratorValue(type, k, v, iteratorResult) { + var value = type === 0 ? k : type === 1 ? v : [k, v]; + iteratorResult ? (iteratorResult.value = value) : (iteratorResult = { + value: value, done: false + }); + return iteratorResult; + } - _this.index = index; - _this.line = line; - _this.column = column; - _this.description = msg; - _this.message = "[" + line + ":" + column + "]: " + msg; - return _this; + function iteratorDone() { + return { value: undefined, done: true }; } - return JsError; - }(Error); + function hasIterator(maybeIterable) { + return !!getIteratorFn(maybeIterable); + } - function fromCodePoint(cp) { - if (cp <= 0xFFFF) return String.fromCharCode(cp); - var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); - var cu2 = String.fromCharCode((cp - 0x10000) % 0x400 + 0xDC00); - return cu1 + cu2; - } + function isIterator(maybeIterator) { + return maybeIterator && typeof maybeIterator.next === 'function'; + } - function decodeUtf16(lead, trail) { - return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; - } + function getIterator(iterable) { + var iteratorFn = getIteratorFn(iterable); + return iteratorFn && iteratorFn.call(iterable); + } - var Tokenizer = function () { - function Tokenizer(source) { - _classCallCheck(this, Tokenizer); + function getIteratorFn(iterable) { + var iteratorFn = iterable && ( + (REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) || + iterable[FAUX_ITERATOR_SYMBOL] + ); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } - this.source = source; - this.index = 0; - this.line = 0; - this.lineStart = 0; - this.startIndex = 0; - this.startLine = 0; - this.startLineStart = 0; - this.lastIndex = 0; - this.lastLine = 0; - this.lastLineStart = 0; - this.hasLineTerminatorBeforeNext = false; - this.tokenIndex = 0; + function isArrayLike(value) { + return value && typeof value.length === 'number'; } - _createClass(Tokenizer, [{ - key: "saveLexerState", - value: function saveLexerState() { - return { - source: this.source, - index: this.index, - line: this.line, - lineStart: this.lineStart, - startIndex: this.startIndex, - startLine: this.startLine, - startLineStart: this.startLineStart, - lastIndex: this.lastIndex, - lastLine: this.lastLine, - lastLineStart: this.lastLineStart, - lookahead: this.lookahead, - hasLineTerminatorBeforeNext: this.hasLineTerminatorBeforeNext, - tokenIndex: this.tokenIndex - }; + createClass(Seq, Iterable); + function Seq(value) { + return value === null || value === undefined ? emptySequence() : + isIterable(value) ? value.toSeq() : seqFromValue(value); } - }, { - key: "restoreLexerState", - value: function restoreLexerState(state) { - this.source = state.source; - this.index = state.index; - this.line = state.line; - this.lineStart = state.lineStart; - this.startIndex = state.startIndex; - this.startLine = state.startLine; - this.startLineStart = state.startLineStart; - this.lastIndex = state.lastIndex; - this.lastLine = state.lastLine; - this.lastLineStart = state.lastLineStart; - this.lookahead = state.lookahead; - this.hasLineTerminatorBeforeNext = state.hasLineTerminatorBeforeNext; - this.tokenIndex = state.tokenIndex; + + Seq.of = function(/*...values*/) { + return Seq(arguments); + }; + + Seq.prototype.toSeq = function() { + return this; + }; + + Seq.prototype.toString = function() { + return this.__toString('Seq {', '}'); + }; + + Seq.prototype.cacheResult = function() { + if (!this._cache && this.__iterateUncached) { + this._cache = this.entrySeq().toArray(); + this.size = this._cache.length; + } + return this; + }; + + // abstract __iterateUncached(fn, reverse) + + Seq.prototype.__iterate = function(fn, reverse) { + return seqIterate(this, fn, reverse, true); + }; + + // abstract __iteratorUncached(type, reverse) + + Seq.prototype.__iterator = function(type, reverse) { + return seqIterator(this, type, reverse, true); + }; + + + + createClass(KeyedSeq, Seq); + function KeyedSeq(value) { + return value === null || value === undefined ? + emptySequence().toKeyedSeq() : + isIterable(value) ? + (isKeyed(value) ? value.toSeq() : value.fromEntrySeq()) : + keyedSeqFromValue(value); } - }, { - key: "createILLEGAL", - value: function createILLEGAL() { - this.startIndex = this.index; - this.startLine = this.line; - this.startLineStart = this.lineStart; - return this.index < this.source.length ? this.createError(_errors.ErrorMessages.UNEXPECTED_ILLEGAL_TOKEN, this.source.charAt(this.index)) : this.createError(_errors.ErrorMessages.UNEXPECTED_EOS); + + KeyedSeq.prototype.toKeyedSeq = function() { + return this; + }; + + + + createClass(IndexedSeq, Seq); + function IndexedSeq(value) { + return value === null || value === undefined ? emptySequence() : + !isIterable(value) ? indexedSeqFromValue(value) : + isKeyed(value) ? value.entrySeq() : value.toIndexedSeq(); } - }, { - key: "createUnexpected", - value: function createUnexpected(token) { - switch (token.type.klass) { - case TokenClass.Eof: - return this.createError(_errors.ErrorMessages.UNEXPECTED_EOS); - case TokenClass.Ident: - return this.createError(_errors.ErrorMessages.UNEXPECTED_IDENTIFIER); - case TokenClass.Keyword: - return this.createError(_errors.ErrorMessages.UNEXPECTED_TOKEN, token.slice.text); - case TokenClass.NumericLiteral: - return this.createError(_errors.ErrorMessages.UNEXPECTED_NUMBER); - case TokenClass.TemplateElement: - return this.createError(_errors.ErrorMessages.UNEXPECTED_TEMPLATE); - case TokenClass.Punctuator: - return this.createError(_errors.ErrorMessages.UNEXPECTED_TOKEN, token.type.name); - case TokenClass.StringLiteral: - return this.createError(_errors.ErrorMessages.UNEXPECTED_STRING); - // the other token classes are RegularExpression and Illegal, but they cannot reach here - } + + IndexedSeq.of = function(/*...values*/) { + return IndexedSeq(arguments); + }; + + IndexedSeq.prototype.toIndexedSeq = function() { + return this; + }; + + IndexedSeq.prototype.toString = function() { + return this.__toString('Seq [', ']'); + }; + + IndexedSeq.prototype.__iterate = function(fn, reverse) { + return seqIterate(this, fn, reverse, false); + }; + + IndexedSeq.prototype.__iterator = function(type, reverse) { + return seqIterator(this, type, reverse, false); + }; + + + + createClass(SetSeq, Seq); + function SetSeq(value) { + return ( + value === null || value === undefined ? emptySequence() : + !isIterable(value) ? indexedSeqFromValue(value) : + isKeyed(value) ? value.entrySeq() : value + ).toSetSeq(); } - }, { - key: "createError", - value: function createError(message) { - var _arguments = arguments; - /* istanbul ignore next */ - var msg = message.replace(/\{(\d+)\}/g, function (_, n) { - return JSON.stringify(_arguments[+n + 1]); - }); - return new JsError(this.startIndex, this.startLine + 1, this.startIndex - this.startLineStart + 1, msg); + SetSeq.of = function(/*...values*/) { + return SetSeq(arguments); + }; + + SetSeq.prototype.toSetSeq = function() { + return this; + }; + + + + Seq.isSeq = isSeq; + Seq.Keyed = KeyedSeq; + Seq.Set = SetSeq; + Seq.Indexed = IndexedSeq; + + var IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@'; + + Seq.prototype[IS_SEQ_SENTINEL] = true; + + + + createClass(ArraySeq, IndexedSeq); + function ArraySeq(array) { + this._array = array; + this.size = array.length; } - }, { - key: "createErrorWithLocation", - value: function createErrorWithLocation(location, message) { - var _arguments2 = arguments; - /* istanbul ignore next */ - var msg = message.replace(/\{(\d+)\}/g, function (_, n) { - return JSON.stringify(_arguments2[+n + 2]); - }); - if (location.slice && location.slice.startLocation) { - location = location.slice.startLocation; + ArraySeq.prototype.get = function(index, notSetValue) { + return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue; + }; + + ArraySeq.prototype.__iterate = function(fn, reverse) { + var array = this._array; + var maxIndex = array.length - 1; + for (var ii = 0; ii <= maxIndex; ii++) { + if (fn(array[reverse ? maxIndex - ii : ii], ii, this) === false) { + return ii + 1; + } } - return new JsError(location.offset, location.line, location.column + 1, msg); + return ii; + }; + + ArraySeq.prototype.__iterator = function(type, reverse) { + var array = this._array; + var maxIndex = array.length - 1; + var ii = 0; + return new Iterator(function() + {return ii > maxIndex ? + iteratorDone() : + iteratorValue(type, ii, array[reverse ? maxIndex - ii++ : ii++])} + ); + }; + + + + createClass(ObjectSeq, KeyedSeq); + function ObjectSeq(object) { + var keys = Object.keys(object); + this._object = object; + this._keys = keys; + this.size = keys.length; } - }, { - key: "getKeyword", - value: function getKeyword(id) { - if (id.length === 1 || id.length > 10) { - return TokenType.IDENTIFIER; + + ObjectSeq.prototype.get = function(key, notSetValue) { + if (notSetValue !== undefined && !this.has(key)) { + return notSetValue; } + return this._object[key]; + }; - /* istanbul ignore next */ - switch (id.length) { - case 2: - switch (id.charAt(0)) { - case "i": - switch (id.charAt(1)) { - case "f": - return TokenType.IF; - case "n": - return TokenType.IN; - default: - break; - } - break; - case "d": - if (id.charAt(1) === "o") { - return TokenType.DO; - } - break; - } - break; - case 3: - switch (id.charAt(0)) { - case "v": - if (Tokenizer.cse2(id, "a", "r")) { - return TokenType.VAR; - } - break; - case "f": - if (Tokenizer.cse2(id, "o", "r")) { - return TokenType.FOR; - } - break; - case "n": - if (Tokenizer.cse2(id, "e", "w")) { - return TokenType.NEW; - } - break; - case "t": - if (Tokenizer.cse2(id, "r", "y")) { - return TokenType.TRY; - } - break; - case "l": - if (Tokenizer.cse2(id, "e", "t")) { - return TokenType.LET; - } - break; - } - break; - case 4: - switch (id.charAt(0)) { - case "t": - if (Tokenizer.cse3(id, "h", "i", "s")) { - return TokenType.THIS; - } else if (Tokenizer.cse3(id, "r", "u", "e")) { - return TokenType.TRUE; - } - break; - case "n": - if (Tokenizer.cse3(id, "u", "l", "l")) { - return TokenType.NULL; - } - break; - case "e": - if (Tokenizer.cse3(id, "l", "s", "e")) { - return TokenType.ELSE; - } - break; - case "c": - if (Tokenizer.cse3(id, "a", "s", "e")) { - return TokenType.CASE; - } - break; - case "v": - if (Tokenizer.cse3(id, "o", "i", "d")) { - return TokenType.VOID; - } - break; - case "w": - if (Tokenizer.cse3(id, "i", "t", "h")) { - return TokenType.WITH; - } - break; - } - break; - case 5: - switch (id.charAt(0)) { - case "a": - if (this.moduleIsTheGoalSymbol && Tokenizer.cse4(id, "w", "a", "i", "t")) { - return TokenType.AWAIT; - } - break; - case "w": - if (Tokenizer.cse4(id, "h", "i", "l", "e")) { - return TokenType.WHILE; - } - break; - case "b": - if (Tokenizer.cse4(id, "r", "e", "a", "k")) { - return TokenType.BREAK; - } - break; - case "f": - if (Tokenizer.cse4(id, "a", "l", "s", "e")) { - return TokenType.FALSE; - } - break; - case "c": - if (Tokenizer.cse4(id, "a", "t", "c", "h")) { - return TokenType.CATCH; - } else if (Tokenizer.cse4(id, "o", "n", "s", "t")) { - return TokenType.CONST; - } else if (Tokenizer.cse4(id, "l", "a", "s", "s")) { - return TokenType.CLASS; - } - break; - case "t": - if (Tokenizer.cse4(id, "h", "r", "o", "w")) { - return TokenType.THROW; - } - break; - case "y": - if (Tokenizer.cse4(id, "i", "e", "l", "d")) { - return TokenType.YIELD; - } - break; - case "s": - if (Tokenizer.cse4(id, "u", "p", "e", "r")) { - return TokenType.SUPER; - } - break; - } - break; - case 6: - switch (id.charAt(0)) { - case "r": - if (Tokenizer.cse5(id, "e", "t", "u", "r", "n")) { - return TokenType.RETURN; - } - break; - case "t": - if (Tokenizer.cse5(id, "y", "p", "e", "o", "f")) { - return TokenType.TYPEOF; - } - break; - case "d": - if (Tokenizer.cse5(id, "e", "l", "e", "t", "e")) { - return TokenType.DELETE; - } - break; - case "s": - if (Tokenizer.cse5(id, "w", "i", "t", "c", "h")) { - return TokenType.SWITCH; - } - break; - case "e": - if (Tokenizer.cse5(id, "x", "p", "o", "r", "t")) { - return TokenType.EXPORT; - } - break; - case "i": - if (Tokenizer.cse5(id, "m", "p", "o", "r", "t")) { - return TokenType.IMPORT; - } - break; - } - break; - case 7: - switch (id.charAt(0)) { - case "d": - if (Tokenizer.cse6(id, "e", "f", "a", "u", "l", "t")) { - return TokenType.DEFAULT; - } - break; - case "f": - if (Tokenizer.cse6(id, "i", "n", "a", "l", "l", "y")) { - return TokenType.FINALLY; - } - break; - case "e": - if (Tokenizer.cse6(id, "x", "t", "e", "n", "d", "s")) { - return TokenType.EXTENDS; - } - break; - } - break; - case 8: - switch (id.charAt(0)) { - case "f": - if (Tokenizer.cse7(id, "u", "n", "c", "t", "i", "o", "n")) { - return TokenType.FUNCTION; - } - break; - case "c": - if (Tokenizer.cse7(id, "o", "n", "t", "i", "n", "u", "e")) { - return TokenType.CONTINUE; - } - break; - case "d": - if (Tokenizer.cse7(id, "e", "b", "u", "g", "g", "e", "r")) { - return TokenType.DEBUGGER; - } - break; - } - break; - case 10: - if (id === "instanceof") { - return TokenType.INSTANCEOF; - } - break; + ObjectSeq.prototype.has = function(key) { + return this._object.hasOwnProperty(key); + }; + + ObjectSeq.prototype.__iterate = function(fn, reverse) { + var object = this._object; + var keys = this._keys; + var maxIndex = keys.length - 1; + for (var ii = 0; ii <= maxIndex; ii++) { + var key = keys[reverse ? maxIndex - ii : ii]; + if (fn(object[key], key, this) === false) { + return ii + 1; + } } - return TokenType.IDENTIFIER; + return ii; + }; + + ObjectSeq.prototype.__iterator = function(type, reverse) { + var object = this._object; + var keys = this._keys; + var maxIndex = keys.length - 1; + var ii = 0; + return new Iterator(function() { + var key = keys[reverse ? maxIndex - ii : ii]; + return ii++ > maxIndex ? + iteratorDone() : + iteratorValue(type, key, object[key]); + }); + }; + + ObjectSeq.prototype[IS_ORDERED_SENTINEL] = true; + + + createClass(IterableSeq, IndexedSeq); + function IterableSeq(iterable) { + this._iterable = iterable; + this.size = iterable.length || iterable.size; } - }, { - key: "skipSingleLineComment", - value: function skipSingleLineComment(offset) { - this.index += offset; - while (this.index < this.source.length) { - /** - * @type {Number} - */ - var chCode = this.source.charCodeAt(this.index); - this.index++; - if ((0, _utils.isLineTerminator)(chCode)) { - this.hasLineTerminatorBeforeNext = true; - if (chCode === 0xD /* "\r" */ && this.source.charCodeAt(this.index) === 0xA /*"\n" */) { - this.index++; - } - this.lineStart = this.index; - this.line++; - return; + + IterableSeq.prototype.__iterateUncached = function(fn, reverse) { + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var iterable = this._iterable; + var iterator = getIterator(iterable); + var iterations = 0; + if (isIterator(iterator)) { + var step; + while (!(step = iterator.next()).done) { + if (fn(step.value, iterations++, this) === false) { + break; + } } } - } - }, { - key: "skipMultiLineComment", - value: function skipMultiLineComment() { - this.index += 2; - var length = this.source.length; - var isLineStart = false; - while (this.index < length) { - var chCode = this.source.charCodeAt(this.index); - if (chCode < 0x80) { - switch (chCode) { - case 42: - // "*" - // Block comment ends with "*/". - if (this.source.charAt(this.index + 1) === "/") { - this.index = this.index + 2; - return isLineStart; - } - this.index++; - break; - case 10: - // "\n" - isLineStart = true; - this.hasLineTerminatorBeforeNext = true; - this.index++; - this.lineStart = this.index; - this.line++; - break; - case 13: - // "\r": - isLineStart = true; - this.hasLineTerminatorBeforeNext = true; - if (this.source.charAt(this.index + 1) === "\n") { - this.index++; - } - this.index++; - this.lineStart = this.index; - this.line++; - break; - default: - this.index++; - } - } else if (chCode === 0x2028 || chCode === 0x2029) { - isLineStart = true; - this.hasLineTerminatorBeforeNext = true; - this.index++; - this.lineStart = this.index; - this.line++; - } else { - this.index++; - } + return iterations; + }; + + IterableSeq.prototype.__iteratorUncached = function(type, reverse) { + if (reverse) { + return this.cacheResult().__iterator(type, reverse); } - throw this.createILLEGAL(); - } - }, { - key: "skipComment", - value: function skipComment() { - this.hasLineTerminatorBeforeNext = false; + var iterable = this._iterable; + var iterator = getIterator(iterable); + if (!isIterator(iterator)) { + return new Iterator(iteratorDone); + } + var iterations = 0; + return new Iterator(function() { + var step = iterator.next(); + return step.done ? step : iteratorValue(type, iterations++, step.value); + }); + }; - var isLineStart = this.index === 0; - var length = this.source.length; - while (this.index < length) { - var chCode = this.source.charCodeAt(this.index); - if ((0, _utils.isWhiteSpace)(chCode)) { - this.index++; - } else if ((0, _utils.isLineTerminator)(chCode)) { - this.hasLineTerminatorBeforeNext = true; - this.index++; - if (chCode === 13 /* "\r" */ && this.source.charAt(this.index) === "\n") { - this.index++; - } - this.lineStart = this.index; - this.line++; - isLineStart = true; - } else if (chCode === 47 /* "/" */) { - if (this.index + 1 >= length) { - break; - } - chCode = this.source.charCodeAt(this.index + 1); - if (chCode === 47 /* "/" */) { - this.skipSingleLineComment(2); - isLineStart = true; - } else if (chCode === 42 /* "*" */) { - isLineStart = this.skipMultiLineComment() || isLineStart; - } else { - break; - } - } else if (!this.moduleIsTheGoalSymbol && isLineStart && chCode === 45 /* "-" */) { - if (this.index + 2 >= length) { - break; - } - // U+003E is ">" - if (this.source.charAt(this.index + 1) === "-" && this.source.charAt(this.index + 2) === ">") { - // "-->" is a single-line comment - this.skipSingleLineComment(3); - } else { - break; - } - } else if (!this.moduleIsTheGoalSymbol && chCode === 60 /* "<" */) { - if (this.source.slice(this.index + 1, this.index + 4) === "!--") { - this.skipSingleLineComment(4); - } else { - break; - } - } else { - break; - } - } + + createClass(IteratorSeq, IndexedSeq); + function IteratorSeq(iterator) { + this._iterator = iterator; + this._iteratorCache = []; } - }, { - key: "scanHexEscape2", - value: function scanHexEscape2() { - if (this.index + 2 > this.source.length) { - return -1; - } - var r1 = (0, _utils.getHexValue)(this.source.charAt(this.index)); - if (r1 === -1) { - return -1; - } - var r2 = (0, _utils.getHexValue)(this.source.charAt(this.index + 1)); - if (r2 === -1) { - return -1; + + IteratorSeq.prototype.__iterateUncached = function(fn, reverse) { + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); } - this.index += 2; - return r1 << 4 | r2; - } - }, { - key: "scanUnicode", - value: function scanUnicode() { - if (this.source.charAt(this.index) === "{") { - //\u{HexDigits} - var i = this.index + 1; - var hexDigits = 0, - ch = void 0; - while (i < this.source.length) { - ch = this.source.charAt(i); - var hex = (0, _utils.getHexValue)(ch); - if (hex === -1) { - break; - } - hexDigits = hexDigits << 4 | hex; - if (hexDigits > 0x10FFFF) { - throw this.createILLEGAL(); - } - i++; - } - if (ch !== "}") { - throw this.createILLEGAL(); - } - if (i === this.index + 1) { - ++this.index; // This is so that the error is 'Unexpected "}"' instead of 'Unexpected "{"'. - throw this.createILLEGAL(); - } - this.index = i + 1; - return hexDigits; - } else { - //\uHex4Digits - if (this.index + 4 > this.source.length) { - return -1; - } - var r1 = (0, _utils.getHexValue)(this.source.charAt(this.index)); - if (r1 === -1) { - return -1; - } - var r2 = (0, _utils.getHexValue)(this.source.charAt(this.index + 1)); - if (r2 === -1) { - return -1; - } - var r3 = (0, _utils.getHexValue)(this.source.charAt(this.index + 2)); - if (r3 === -1) { - return -1; + var iterator = this._iterator; + var cache = this._iteratorCache; + var iterations = 0; + while (iterations < cache.length) { + if (fn(cache[iterations], iterations++, this) === false) { + return iterations; } - var r4 = (0, _utils.getHexValue)(this.source.charAt(this.index + 3)); - if (r4 === -1) { - return -1; + } + var step; + while (!(step = iterator.next()).done) { + var val = step.value; + cache[iterations] = val; + if (fn(val, iterations++, this) === false) { + break; } - this.index += 4; - return r1 << 12 | r2 << 8 | r3 << 4 | r4; } - } - }, { - key: "getEscapedIdentifier", - value: function getEscapedIdentifier() { - var id = ""; - var check = _utils.isIdentifierStart; + return iterations; + }; - while (this.index < this.source.length) { - var ch = this.source.charAt(this.index); - var code = ch.charCodeAt(0); - var start = this.index; - ++this.index; - if (ch === "\\") { - if (this.index >= this.source.length) { - throw this.createILLEGAL(); - } - if (this.source.charAt(this.index) !== "u") { - throw this.createILLEGAL(); - } - ++this.index; - code = this.scanUnicode(); - if (code < 0) { - throw this.createILLEGAL(); - } - ch = fromCodePoint(code); - } else if (0xD800 <= code && code <= 0xDBFF) { - if (this.index >= this.source.length) { - throw this.createILLEGAL(); - } - var lowSurrogateCode = this.source.charCodeAt(this.index); - ++this.index; - if (!(0xDC00 <= lowSurrogateCode && lowSurrogateCode <= 0xDFFF)) { - throw this.createILLEGAL(); - } - code = decodeUtf16(code, lowSurrogateCode); - ch = fromCodePoint(code); - } - if (!check(code)) { - if (id.length < 1) { - throw this.createILLEGAL(); - } - this.index = start; - return id; - } - check = _utils.isIdentifierPart; - id += ch; + IteratorSeq.prototype.__iteratorUncached = function(type, reverse) { + if (reverse) { + return this.cacheResult().__iterator(type, reverse); } - return id; - } - }, { - key: "getIdentifier", - value: function getIdentifier() { - var start = this.index; - var l = this.source.length; - var i = this.index; - var check = _utils.isIdentifierStart; - while (i < l) { - var ch = this.source.charAt(i); - var code = ch.charCodeAt(0); - if (ch === "\\" || 0xD800 <= code && code <= 0xDBFF) { - // Go back and try the hard one. - this.index = start; - return this.getEscapedIdentifier(); - } - if (!check(code)) { - this.index = i; - return this.source.slice(start, i); + var iterator = this._iterator; + var cache = this._iteratorCache; + var iterations = 0; + return new Iterator(function() { + if (iterations >= cache.length) { + var step = iterator.next(); + if (step.done) { + return step; + } + cache[iterations] = step.value; } - ++i; - check = _utils.isIdentifierPart; - } - this.index = i; - return this.source.slice(start, i); - } - }, { - key: "scanIdentifier", - value: function scanIdentifier() { - var startLocation = this.getLocation(); - var start = this.index; + return iteratorValue(type, iterations, cache[iterations++]); + }); + }; - // Backslash (U+005C) starts an escaped character. - var id = this.source.charAt(this.index) === "\\" ? this.getEscapedIdentifier() : this.getIdentifier(); - // There is no keyword or literal with only one character. - // Thus, it must be an identifier. - var slice = this.getSlice(start, startLocation); - slice.text = id; - return { type: this.getKeyword(id), value: id, slice: slice }; - } - }, { - key: "getLocation", - value: function getLocation() { - return { - line: this.startLine + 1, - column: this.startIndex - this.startLineStart, - offset: this.startIndex - }; - } - }, { - key: "getSlice", - value: function getSlice(start, startLocation) { - return { text: this.source.slice(start, this.index), start: start, startLocation: startLocation, end: this.index }; - } - }, { - key: "scanPunctuatorHelper", - value: function scanPunctuatorHelper() { - var ch1 = this.source.charAt(this.index); - switch (ch1) { - // Check for most common single-character punctuators. - case ".": - var ch2 = this.source.charAt(this.index + 1); - if (ch2 !== ".") return TokenType.PERIOD; - var ch3 = this.source.charAt(this.index + 2); - if (ch3 !== ".") return TokenType.PERIOD; - return TokenType.ELLIPSIS; - case "(": - return TokenType.LPAREN; - case ")": - case ";": - case ",": - return ONE_CHAR_PUNCTUATOR[ch1.charCodeAt(0)]; - case "{": - return TokenType.LBRACE; - case "}": - case "[": - case "]": - case ":": - case "?": - case "~": - return ONE_CHAR_PUNCTUATOR[ch1.charCodeAt(0)]; - default: - // "=" (U+003D) marks an assignment or comparison operator. - if (this.index + 1 < this.source.length && this.source.charAt(this.index + 1) === "=") { - switch (ch1) { - case "=": - if (this.index + 2 < this.source.length && this.source.charAt(this.index + 2) === "=") { - return TokenType.EQ_STRICT; - } - return TokenType.EQ; - case "!": - if (this.index + 2 < this.source.length && this.source.charAt(this.index + 2) === "=") { - return TokenType.NE_STRICT; - } - return TokenType.NE; - case "|": - return TokenType.ASSIGN_BIT_OR; - case "+": - return TokenType.ASSIGN_ADD; - case "-": - return TokenType.ASSIGN_SUB; - case "*": - return TokenType.ASSIGN_MUL; - case "<": - return TokenType.LTE; - case ">": - return TokenType.GTE; - case "/": - return TokenType.ASSIGN_DIV; - case "%": - return TokenType.ASSIGN_MOD; - case "^": - return TokenType.ASSIGN_BIT_XOR; - case "&": - return TokenType.ASSIGN_BIT_AND; - // istanbul ignore next - default: - break; //failed - } - } - } + // # pragma Helper functions - if (this.index + 1 < this.source.length) { - var _ch = this.source.charAt(this.index + 1); - if (ch1 === _ch) { - if (this.index + 2 < this.source.length) { - var _ch2 = this.source.charAt(this.index + 2); - if (ch1 === ">" && _ch2 === ">") { - // 4-character punctuator: >>>= - if (this.index + 3 < this.source.length && this.source.charAt(this.index + 3) === "=") { - return TokenType.ASSIGN_SHR_UNSIGNED; - } - return TokenType.SHR_UNSIGNED; - } + function isSeq(maybeSeq) { + return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]); + } - if (ch1 === "<" && _ch2 === "=") { - return TokenType.ASSIGN_SHL; - } + var EMPTY_SEQ; - if (ch1 === ">" && _ch2 === "=") { - return TokenType.ASSIGN_SHR; - } - } - // Other 2-character punctuators: ++ -- << >> && || - switch (ch1) { - case "+": - return TokenType.INC; - case "-": - return TokenType.DEC; - case "<": - return TokenType.SHL; - case ">": - return TokenType.SHR; - case "&": - return TokenType.AND; - case "|": - return TokenType.OR; - // istanbul ignore next - default: - break; //failed - } - } else if (ch1 === "=" && _ch === ">") { - return TokenType.ARROW; - } - } + function emptySequence() { + return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([])); + } - return ONE_CHAR_PUNCTUATOR[ch1.charCodeAt(0)]; + function keyedSeqFromValue(value) { + var seq = + Array.isArray(value) ? new ArraySeq(value).fromEntrySeq() : + isIterator(value) ? new IteratorSeq(value).fromEntrySeq() : + hasIterator(value) ? new IterableSeq(value).fromEntrySeq() : + typeof value === 'object' ? new ObjectSeq(value) : + undefined; + if (!seq) { + throw new TypeError( + 'Expected Array or iterable object of [k, v] entries, '+ + 'or keyed object: ' + value + ); } + return seq; + } - // 7.7 Punctuators + function indexedSeqFromValue(value) { + var seq = maybeIndexedSeqFromValue(value); + if (!seq) { + throw new TypeError( + 'Expected Array or iterable object of values: ' + value + ); + } + return seq; + } - }, { - key: "scanPunctuator", - value: function scanPunctuator() { - var startLocation = this.getLocation(); - var start = this.index; - var subType = this.scanPunctuatorHelper(); - this.index += subType.name.length; - return { type: subType, value: subType.name, slice: this.getSlice(start, startLocation) }; + function seqFromValue(value) { + var seq = maybeIndexedSeqFromValue(value) || + (typeof value === 'object' && new ObjectSeq(value)); + if (!seq) { + throw new TypeError( + 'Expected Array or iterable object of values, or keyed object: ' + value + ); } - }, { - key: "scanHexLiteral", - value: function scanHexLiteral(start, startLocation) { - var i = this.index; - while (i < this.source.length) { - var ch = this.source.charAt(i); - var hex = (0, _utils.getHexValue)(ch); - if (hex === -1) { - break; - } - i++; - } + return seq; + } - if (this.index === i) { - throw this.createILLEGAL(); - } + function maybeIndexedSeqFromValue(value) { + return ( + isArrayLike(value) ? new ArraySeq(value) : + isIterator(value) ? new IteratorSeq(value) : + hasIterator(value) ? new IterableSeq(value) : + undefined + ); + } - if (i < this.source.length && (0, _utils.isIdentifierStart)(this.source.charCodeAt(i))) { - throw this.createILLEGAL(); + function seqIterate(seq, fn, reverse, useKeys) { + var cache = seq._cache; + if (cache) { + var maxIndex = cache.length - 1; + for (var ii = 0; ii <= maxIndex; ii++) { + var entry = cache[reverse ? maxIndex - ii : ii]; + if (fn(entry[1], useKeys ? entry[0] : ii, seq) === false) { + return ii + 1; + } } - - this.index = i; - - var slice = this.getSlice(start, startLocation); - return { type: TokenType.NUMBER, value: parseInt(slice.text.substr(2), 16), slice: slice }; + return ii; } - }, { - key: "scanBinaryLiteral", - value: function scanBinaryLiteral(start, startLocation) { - var offset = this.index - start; + return seq.__iterateUncached(fn, reverse); + } - while (this.index < this.source.length) { - var ch = this.source.charAt(this.index); - if (ch !== "0" && ch !== "1") { - break; - } - this.index++; - } + function seqIterator(seq, type, reverse, useKeys) { + var cache = seq._cache; + if (cache) { + var maxIndex = cache.length - 1; + var ii = 0; + return new Iterator(function() { + var entry = cache[reverse ? maxIndex - ii : ii]; + return ii++ > maxIndex ? + iteratorDone() : + iteratorValue(type, useKeys ? entry[0] : ii - 1, entry[1]); + }); + } + return seq.__iteratorUncached(type, reverse); + } - if (this.index - start <= offset) { - throw this.createILLEGAL(); - } + function fromJS(json, converter) { + return converter ? + fromJSWith(converter, json, '', {'': json}) : + fromJSDefault(json); + } - if (this.index < this.source.length && ((0, _utils.isIdentifierStart)(this.source.charCodeAt(this.index)) || (0, _utils.isDecimalDigit)(this.source.charCodeAt(this.index)))) { - throw this.createILLEGAL(); - } + function fromJSWith(converter, json, key, parentJSON) { + if (Array.isArray(json)) { + return converter.call(parentJSON, key, IndexedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)})); + } + if (isPlainObj(json)) { + return converter.call(parentJSON, key, KeyedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)})); + } + return json; + } - return { - type: TokenType.NUMBER, - value: parseInt(this.getSlice(start, startLocation).text.substr(offset), 2), - slice: this.getSlice(start, startLocation), - octal: false, - noctal: false - }; + function fromJSDefault(json) { + if (Array.isArray(json)) { + return IndexedSeq(json).map(fromJSDefault).toList(); } - }, { - key: "scanOctalLiteral", - value: function scanOctalLiteral(start, startLocation) { - while (this.index < this.source.length) { - var ch = this.source.charAt(this.index); - if ("0" <= ch && ch <= "7") { - this.index++; - } else if ((0, _utils.isIdentifierPart)(ch.charCodeAt(0))) { - throw this.createILLEGAL(); - } else { - break; - } - } + if (isPlainObj(json)) { + return KeyedSeq(json).map(fromJSDefault).toMap(); + } + return json; + } - if (this.index - start === 2) { - throw this.createILLEGAL(); - } + function isPlainObj(value) { + return value && (value.constructor === Object || value.constructor === undefined); + } - return { - type: TokenType.NUMBER, - value: parseInt(this.getSlice(start, startLocation).text.substr(2), 8), - slice: this.getSlice(start, startLocation), - octal: false, - noctal: false - }; + /** + * An extension of the "same-value" algorithm as [described for use by ES6 Map + * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality) + * + * NaN is considered the same as NaN, however -0 and 0 are considered the same + * value, which is different from the algorithm described by + * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + * + * This is extended further to allow Objects to describe the values they + * represent, by way of `valueOf` or `equals` (and `hashCode`). + * + * Note: because of this extension, the key equality of Immutable.Map and the + * value equality of Immutable.Set will differ from ES6 Map and Set. + * + * ### Defining custom values + * + * The easiest way to describe the value an object represents is by implementing + * `valueOf`. For example, `Date` represents a value by returning a unix + * timestamp for `valueOf`: + * + * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ... + * var date2 = new Date(1234567890000); + * date1.valueOf(); // 1234567890000 + * assert( date1 !== date2 ); + * assert( Immutable.is( date1, date2 ) ); + * + * Note: overriding `valueOf` may have other implications if you use this object + * where JavaScript expects a primitive, such as implicit string coercion. + * + * For more complex types, especially collections, implementing `valueOf` may + * not be performant. An alternative is to implement `equals` and `hashCode`. + * + * `equals` takes another object, presumably of similar type, and returns true + * if the it is equal. Equality is symmetrical, so the same result should be + * returned if this and the argument are flipped. + * + * assert( a.equals(b) === b.equals(a) ); + * + * `hashCode` returns a 32bit integer number representing the object which will + * be used to determine how to store the value object in a Map or Set. You must + * provide both or neither methods, one must not exist without the other. + * + * Also, an important relationship between these methods must be upheld: if two + * values are equal, they *must* return the same hashCode. If the values are not + * equal, they might have the same hashCode; this is called a hash collision, + * and while undesirable for performance reasons, it is acceptable. + * + * if (a.equals(b)) { + * assert( a.hashCode() === b.hashCode() ); + * } + * + * All Immutable collections implement `equals` and `hashCode`. + * + */ + function is(valueA, valueB) { + if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { + return true; } - }, { - key: "scanLegacyOctalLiteral", - value: function scanLegacyOctalLiteral(start, startLocation) { - var isOctal = true; - - while (this.index < this.source.length) { - var ch = this.source.charAt(this.index); - if ("0" <= ch && ch <= "7") { - this.index++; - } else if (ch === "8" || ch === "9") { - isOctal = false; - this.index++; - } else if ((0, _utils.isIdentifierPart)(ch.charCodeAt(0))) { - throw this.createILLEGAL(); - } else { - break; - } + if (!valueA || !valueB) { + return false; + } + if (typeof valueA.valueOf === 'function' && + typeof valueB.valueOf === 'function') { + valueA = valueA.valueOf(); + valueB = valueB.valueOf(); + if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { + return true; } - - var slice = this.getSlice(start, startLocation); - if (!isOctal) { - this.eatDecimalLiteralSuffix(); - return { - type: TokenType.NUMBER, - slice: slice, - value: +slice.text, - octal: true, - noctal: !isOctal - }; + if (!valueA || !valueB) { + return false; } + } + if (typeof valueA.equals === 'function' && + typeof valueB.equals === 'function' && + valueA.equals(valueB)) { + return true; + } + return false; + } - return { - type: TokenType.NUMBER, - slice: slice, - value: parseInt(slice.text.substr(1), 8), - octal: true, - noctal: !isOctal - }; + function deepEqual(a, b) { + if (a === b) { + return true; } - }, { - key: "scanNumericLiteral", - value: function scanNumericLiteral() { - var ch = this.source.charAt(this.index); - // assert(ch === "." || "0" <= ch && ch <= "9") - var startLocation = this.getLocation(); - var start = this.index; - if (ch === "0") { - this.index++; - if (this.index < this.source.length) { - ch = this.source.charAt(this.index); - if (ch === "x" || ch === "X") { - this.index++; - return this.scanHexLiteral(start, startLocation); - } else if (ch === "b" || ch === "B") { - this.index++; - return this.scanBinaryLiteral(start, startLocation); - } else if (ch === "o" || ch === "O") { - this.index++; - return this.scanOctalLiteral(start, startLocation); - } else if ("0" <= ch && ch <= "9") { - return this.scanLegacyOctalLiteral(start, startLocation); - } - } else { - var _slice = this.getSlice(start, startLocation); - return { - type: TokenType.NUMBER, - value: +_slice.text, - slice: _slice, - octal: false, - noctal: false - }; - } - } else if (ch !== ".") { - // Must be "1".."9" - ch = this.source.charAt(this.index); - while ("0" <= ch && ch <= "9") { - this.index++; - if (this.index === this.source.length) { - var _slice2 = this.getSlice(start, startLocation); - return { - type: TokenType.NUMBER, - value: +_slice2.text, - slice: _slice2, - octal: false, - noctal: false - }; - } - ch = this.source.charAt(this.index); - } - } + if ( + !isIterable(b) || + a.size !== undefined && b.size !== undefined && a.size !== b.size || + a.__hash !== undefined && b.__hash !== undefined && a.__hash !== b.__hash || + isKeyed(a) !== isKeyed(b) || + isIndexed(a) !== isIndexed(b) || + isOrdered(a) !== isOrdered(b) + ) { + return false; + } - this.eatDecimalLiteralSuffix(); + if (a.size === 0 && b.size === 0) { + return true; + } - if (this.index !== this.source.length && (0, _utils.isIdentifierStart)(this.source.charCodeAt(this.index))) { - throw this.createILLEGAL(); - } + var notAssociative = !isAssociative(a); - var slice = this.getSlice(start, startLocation); - return { - type: TokenType.NUMBER, - value: +slice.text, - slice: slice, - octal: false, - noctal: false - }; + if (isOrdered(a)) { + var entries = a.entries(); + return b.every(function(v, k) { + var entry = entries.next().value; + return entry && is(entry[1], v) && (notAssociative || is(entry[0], k)); + }) && entries.next().done; } - }, { - key: "eatDecimalLiteralSuffix", - value: function eatDecimalLiteralSuffix() { - var ch = this.source.charAt(this.index); - if (ch === ".") { - this.index++; - if (this.index === this.source.length) { - return; - } - ch = this.source.charAt(this.index); - while ("0" <= ch && ch <= "9") { - this.index++; - if (this.index === this.source.length) { - return; - } - ch = this.source.charAt(this.index); + var flipped = false; + + if (a.size === undefined) { + if (b.size === undefined) { + if (typeof a.cacheResult === 'function') { + a.cacheResult(); } + } else { + flipped = true; + var _ = a; + a = b; + b = _; } + } - // EOF not reached here - if (ch === "e" || ch === "E") { - this.index++; - if (this.index === this.source.length) { - throw this.createILLEGAL(); - } + var allEqual = true; + var bSize = b.__iterate(function(v, k) { + if (notAssociative ? !a.has(v) : + flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)) { + allEqual = false; + return false; + } + }); - ch = this.source.charAt(this.index); - if (ch === "+" || ch === "-") { - this.index++; - if (this.index === this.source.length) { - throw this.createILLEGAL(); - } - ch = this.source.charAt(this.index); - } + return allEqual && a.size === bSize; + } - if ("0" <= ch && ch <= "9") { - while ("0" <= ch && ch <= "9") { - this.index++; - if (this.index === this.source.length) { - break; - } - ch = this.source.charAt(this.index); - } - } else { - throw this.createILLEGAL(); - } - } - } - }, { - key: "scanStringEscape", - value: function scanStringEscape(str, octal) { - this.index++; - if (this.index === this.source.length) { - throw this.createILLEGAL(); + createClass(Repeat, IndexedSeq); + + function Repeat(value, times) { + if (!(this instanceof Repeat)) { + return new Repeat(value, times); } - var ch = this.source.charAt(this.index); - if (!(0, _utils.isLineTerminator)(ch.charCodeAt(0))) { - switch (ch) { - case "n": - str += "\n"; - this.index++; - break; - case "r": - str += "\r"; - this.index++; - break; - case "t": - str += "\t"; - this.index++; - break; - case "u": - case "x": - var unescaped = void 0; - this.index++; - if (this.index >= this.source.length) { - throw this.createILLEGAL(); - } - unescaped = ch === "u" ? this.scanUnicode() : this.scanHexEscape2(); - if (unescaped < 0) { - throw this.createILLEGAL(); - } - str += fromCodePoint(unescaped); - break; - case "b": - str += "\b"; - this.index++; - break; - case "f": - str += "\f"; - this.index++; - break; - case "v": - str += "\u000b"; - this.index++; - break; - default: - if ("0" <= ch && ch <= "7") { - var octalStart = this.index; - var octLen = 1; - // 3 digits are only allowed when string starts - // with 0, 1, 2, 3 - if ("0" <= ch && ch <= "3") { - octLen = 0; - } - var code = 0; - while (octLen < 3 && "0" <= ch && ch <= "7") { - this.index++; - if (octLen > 0 || ch !== "0") { - octal = this.source.slice(octalStart, this.index); - } - code *= 8; - code += ch - "0"; - octLen++; - if (this.index === this.source.length) { - throw this.createILLEGAL(); - } - ch = this.source.charAt(this.index); - } - str += String.fromCharCode(code); - } else if (ch === "8" || ch === "9") { - throw this.createILLEGAL(); - } else { - str += ch; - this.index++; - } - } - } else { - this.index++; - if (ch === "\r" && this.source.charAt(this.index) === "\n") { - this.index++; + this._value = value; + this.size = times === undefined ? Infinity : Math.max(0, times); + if (this.size === 0) { + if (EMPTY_REPEAT) { + return EMPTY_REPEAT; } - this.lineStart = this.index; - this.line++; + EMPTY_REPEAT = this; } - return [str, octal]; } - // 7.8.4 String Literals - }, { - key: "scanStringLiteral", - value: function scanStringLiteral() { - var str = ""; + Repeat.prototype.toString = function() { + if (this.size === 0) { + return 'Repeat []'; + } + return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]'; + }; - var quote = this.source.charAt(this.index); - // assert((quote === "\"" || quote === """), "String literal must starts with a quote") + Repeat.prototype.get = function(index, notSetValue) { + return this.has(index) ? this._value : notSetValue; + }; - var startLocation = this.getLocation(); - var start = this.index; - this.index++; + Repeat.prototype.includes = function(searchValue) { + return is(this._value, searchValue); + }; - var octal = null; - while (this.index < this.source.length) { - var ch = this.source.charAt(this.index); - if (ch === quote) { - this.index++; - return { type: TokenType.STRING, slice: this.getSlice(start, startLocation), str: str, octal: octal }; - } else if (ch === "\\") { - var _scanStringEscape = this.scanStringEscape(str, octal); + Repeat.prototype.slice = function(begin, end) { + var size = this.size; + return wholeSlice(begin, end, size) ? this : + new Repeat(this._value, resolveEnd(end, size) - resolveBegin(begin, size)); + }; - var _scanStringEscape2 = _slicedToArray(_scanStringEscape, 2); + Repeat.prototype.reverse = function() { + return this; + }; - str = _scanStringEscape2[0]; - octal = _scanStringEscape2[1]; - } else if ((0, _utils.isLineTerminator)(ch.charCodeAt(0))) { - throw this.createILLEGAL(); - } else { - str += ch; - this.index++; - } + Repeat.prototype.indexOf = function(searchValue) { + if (is(this._value, searchValue)) { + return 0; } + return -1; + }; - throw this.createILLEGAL(); - } - }, { - key: "scanTemplateElement", - value: function scanTemplateElement() { - var startLocation = this.getLocation(); - var start = this.index; - this.index++; - while (this.index < this.source.length) { - var ch = this.source.charCodeAt(this.index); - switch (ch) { - case 0x60: - // ` - this.index++; - return { type: TokenType.TEMPLATE, tail: true, slice: this.getSlice(start, startLocation) }; - case 0x24: - // $ - if (this.source.charCodeAt(this.index + 1) === 0x7B) { - // { - this.index += 2; - return { type: TokenType.TEMPLATE, tail: false, slice: this.getSlice(start, startLocation) }; - } - this.index++; - break; - case 0x5C: - // \\ - { - var octal = this.scanStringEscape("", null)[1]; - if (octal != null) { - throw this.createILLEGAL(); - } - break; - } - default: - this.index++; - } + Repeat.prototype.lastIndexOf = function(searchValue) { + if (is(this._value, searchValue)) { + return this.size; } + return -1; + }; - throw this.createILLEGAL(); - } - }, { - key: "scanRegExp", - value: function scanRegExp(str) { - var startLocation = this.getLocation(); - var start = this.index; - - var terminated = false; - var classMarker = false; - while (this.index < this.source.length) { - var ch = this.source.charAt(this.index); - if (ch === "\\") { - str += ch; - this.index++; - ch = this.source.charAt(this.index); - // ECMA-262 7.8.5 - if ((0, _utils.isLineTerminator)(ch.charCodeAt(0))) { - throw this.createError(_errors.ErrorMessages.UNTERMINATED_REGEXP); - } - str += ch; - this.index++; - } else if ((0, _utils.isLineTerminator)(ch.charCodeAt(0))) { - throw this.createError(_errors.ErrorMessages.UNTERMINATED_REGEXP); - } else { - if (classMarker) { - if (ch === "]") { - classMarker = false; - } - } else { - if (ch === "/") { - terminated = true; - str += ch; - this.index++; - break; - } else if (ch === "[") { - classMarker = true; - } - } - str += ch; - this.index++; + Repeat.prototype.__iterate = function(fn, reverse) { + for (var ii = 0; ii < this.size; ii++) { + if (fn(this._value, ii, this) === false) { + return ii + 1; } } + return ii; + }; - if (!terminated) { - throw this.createError(_errors.ErrorMessages.UNTERMINATED_REGEXP); - } + Repeat.prototype.__iterator = function(type, reverse) {var this$0 = this; + var ii = 0; + return new Iterator(function() + {return ii < this$0.size ? iteratorValue(type, ii++, this$0._value) : iteratorDone()} + ); + }; - while (this.index < this.source.length) { - var _ch3 = this.source.charAt(this.index); - if (_ch3 === "\\") { - throw this.createError(_errors.ErrorMessages.INVALID_REGEXP_FLAGS); - } - if (!(0, _utils.isIdentifierPart)(_ch3.charCodeAt(0))) { - break; + Repeat.prototype.equals = function(other) { + return other instanceof Repeat ? + is(this._value, other._value) : + deepEqual(other); + }; + + + var EMPTY_REPEAT; + + function invariant(condition, error) { + if (!condition) throw new Error(error); + } + + createClass(Range, IndexedSeq); + + function Range(start, end, step) { + if (!(this instanceof Range)) { + return new Range(start, end, step); + } + invariant(step !== 0, 'Cannot step a Range by 0'); + start = start || 0; + if (end === undefined) { + end = Infinity; + } + step = step === undefined ? 1 : Math.abs(step); + if (end < start) { + step = -step; + } + this._start = start; + this._end = end; + this._step = step; + this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1); + if (this.size === 0) { + if (EMPTY_RANGE) { + return EMPTY_RANGE; } - this.index++; - str += _ch3; + EMPTY_RANGE = this; } - return { type: TokenType.REGEXP, value: str, slice: this.getSlice(start, startLocation) }; } - }, { - key: "advance", - value: function advance() { - var startLocation = this.getLocation(); - this.lastIndex = this.index; - this.lastLine = this.line; - this.lastLineStart = this.lineStart; + Range.prototype.toString = function() { + if (this.size === 0) { + return 'Range []'; + } + return 'Range [ ' + + this._start + '...' + this._end + + (this._step !== 1 ? ' by ' + this._step : '') + + ' ]'; + }; - this.skipComment(); + Range.prototype.get = function(index, notSetValue) { + return this.has(index) ? + this._start + wrapIndex(this, index) * this._step : + notSetValue; + }; - this.startIndex = this.index; - this.startLine = this.line; - this.startLineStart = this.lineStart; + Range.prototype.includes = function(searchValue) { + var possibleIndex = (searchValue - this._start) / this._step; + return possibleIndex >= 0 && + possibleIndex < this.size && + possibleIndex === Math.floor(possibleIndex); + }; - if (this.lastIndex === 0) { - this.lastIndex = this.index; - this.lastLine = this.line; - this.lastLineStart = this.lineStart; + Range.prototype.slice = function(begin, end) { + if (wholeSlice(begin, end, this.size)) { + return this; } - - if (this.index >= this.source.length) { - return { type: TokenType.EOS, slice: this.getSlice(this.index, startLocation) }; + begin = resolveBegin(begin, this.size); + end = resolveEnd(end, this.size); + if (end <= begin) { + return new Range(0, 0); } + return new Range(this.get(begin, this._end), this.get(end, this._end), this._step); + }; - var charCode = this.source.charCodeAt(this.index); - - if (charCode < 0x80) { - if (PUNCTUATOR_START[charCode]) { - return this.scanPunctuator(); + Range.prototype.indexOf = function(searchValue) { + var offsetValue = searchValue - this._start; + if (offsetValue % this._step === 0) { + var index = offsetValue / this._step; + if (index >= 0 && index < this.size) { + return index } + } + return -1; + }; - if ((0, _utils.isIdentifierStart)(charCode) || charCode === 0x5C /* backslash (\) */) { - return this.scanIdentifier(); - } + Range.prototype.lastIndexOf = function(searchValue) { + return this.indexOf(searchValue); + }; - // Dot (.) U+002E can also start a floating-point number, hence the need - // to check the next character. - if (charCode === 0x2E) { - if (this.index + 1 < this.source.length && (0, _utils.isDecimalDigit)(this.source.charCodeAt(this.index + 1))) { - return this.scanNumericLiteral(); - } - return this.scanPunctuator(); + Range.prototype.__iterate = function(fn, reverse) { + var maxIndex = this.size - 1; + var step = this._step; + var value = reverse ? this._start + maxIndex * step : this._start; + for (var ii = 0; ii <= maxIndex; ii++) { + if (fn(value, ii, this) === false) { + return ii + 1; } + value += reverse ? -step : step; + } + return ii; + }; - // String literal starts with single quote (U+0027) or double quote (U+0022). - if (charCode === 0x27 || charCode === 0x22) { - return this.scanStringLiteral(); - } + Range.prototype.__iterator = function(type, reverse) { + var maxIndex = this.size - 1; + var step = this._step; + var value = reverse ? this._start + maxIndex * step : this._start; + var ii = 0; + return new Iterator(function() { + var v = value; + value += reverse ? -step : step; + return ii > maxIndex ? iteratorDone() : iteratorValue(type, ii++, v); + }); + }; - // Template literal starts with back quote (U+0060) - if (charCode === 0x60) { - return this.scanTemplateElement(); - } + Range.prototype.equals = function(other) { + return other instanceof Range ? + this._start === other._start && + this._end === other._end && + this._step === other._step : + deepEqual(this, other); + }; - if (0x30 /* "0" */ <= charCode && charCode <= 0x39 /* "9" */) { - return this.scanNumericLiteral(); - } - // Slash (/) U+002F can also start a regex. - throw this.createILLEGAL(); - } else { - if ((0, _utils.isIdentifierStart)(charCode) || 0xD800 <= charCode && charCode <= 0xDBFF) { - return this.scanIdentifier(); - } + var EMPTY_RANGE; - throw this.createILLEGAL(); - } + createClass(Collection, Iterable); + function Collection() { + throw TypeError('Abstract'); } - }, { - key: "eof", - value: function eof() { - return this.lookahead.type === TokenType.EOS; + + + createClass(KeyedCollection, Collection);function KeyedCollection() {} + + createClass(IndexedCollection, Collection);function IndexedCollection() {} + + createClass(SetCollection, Collection);function SetCollection() {} + + + Collection.Keyed = KeyedCollection; + Collection.Indexed = IndexedCollection; + Collection.Set = SetCollection; + + var imul = + typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ? + Math.imul : + function imul(a, b) { + a = a | 0; // int + b = b | 0; // int + var c = a & 0xffff; + var d = b & 0xffff; + // Shift by 0 fixes the sign on the high part. + return (c * d) + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0) | 0; // int + }; + + // v8 has an optimization for storing 31-bit signed numbers. + // Values which have either 00 or 11 as the high order bits qualify. + // This function drops the highest order bit in a signed number, maintaining + // the sign bit. + function smi(i32) { + return ((i32 >>> 1) & 0x40000000) | (i32 & 0xBFFFFFFF); + } + + function hash(o) { + if (o === false || o === null || o === undefined) { + return 0; } - }, { - key: "lex", - value: function lex() { - var prevToken = this.lookahead; - this.lookahead = this.advance(); - this.tokenIndex++; - return prevToken; + if (typeof o.valueOf === 'function') { + o = o.valueOf(); + if (o === false || o === null || o === undefined) { + return 0; + } } - }], [{ - key: "cse2", - value: function cse2(id, ch1, ch2) { - return id.charAt(1) === ch1 && id.charAt(2) === ch2; + if (o === true) { + return 1; } - }, { - key: "cse3", - value: function cse3(id, ch1, ch2, ch3) { - return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3; + var type = typeof o; + if (type === 'number') { + if (o !== o || o === Infinity) { + return 0; + } + var h = o | 0; + if (h !== o) { + h ^= o * 0xFFFFFFFF; + } + while (o > 0xFFFFFFFF) { + o /= 0xFFFFFFFF; + h ^= o; + } + return smi(h); } - }, { - key: "cse4", - value: function cse4(id, ch1, ch2, ch3, ch4) { - return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4; + if (type === 'string') { + return o.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(o) : hashString(o); } - }, { - key: "cse5", - value: function cse5(id, ch1, ch2, ch3, ch4, ch5) { - return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4 && id.charAt(5) === ch5; + if (typeof o.hashCode === 'function') { + return o.hashCode(); } - }, { - key: "cse6", - value: function cse6(id, ch1, ch2, ch3, ch4, ch5, ch6) { - return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4 && id.charAt(5) === ch5 && id.charAt(6) === ch6; + if (type === 'object') { + return hashJSObj(o); } - }, { - key: "cse7", - value: function cse7(id, ch1, ch2, ch3, ch4, ch5, ch6, ch7) { - return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4 && id.charAt(5) === ch5 && id.charAt(6) === ch6 && id.charAt(7) === ch7; + if (typeof o.toString === 'function') { + return hashString(o.toString()); } - }]); + throw new Error('Value type ' + type + ' cannot be hashed.'); + } - return Tokenizer; - }(); + function cachedHashString(string) { + var hash = stringHashCache[string]; + if (hash === undefined) { + hash = hashString(string); + if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) { + STRING_HASH_CACHE_SIZE = 0; + stringHashCache = {}; + } + STRING_HASH_CACHE_SIZE++; + stringHashCache[string] = hash; + } + return hash; + } - exports.default = Tokenizer; + // http://jsperf.com/hashing-strings + function hashString(string) { + // This is the hash from JVM + // The hash code for a string is computed as + // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1], + // where s[i] is the ith character of the string and n is the length of + // the string. We "mod" the result to make it between 0 (inclusive) and 2^31 + // (exclusive) by dropping high bits. + var hash = 0; + for (var ii = 0; ii < string.length; ii++) { + hash = 31 * hash + string.charCodeAt(ii) | 0; + } + return smi(hash); + } -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { + function hashJSObj(obj) { + var hash; + if (usingWeakMap) { + hash = weakMap.get(obj); + if (hash !== undefined) { + return hash; + } + } - "use strict"; + hash = obj[UID_HASH_KEY]; + if (hash !== undefined) { + return hash; + } - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.isDecimalDigit = exports.isLineTerminator = exports.isWhiteSpace = exports.isIdentifierPart = exports.isIdentifierStart = exports.isRestrictedWord = undefined; - exports.isStrictModeReservedWord = isStrictModeReservedWord; - exports.getHexValue = getHexValue; + if (!canDefineProperty) { + hash = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY]; + if (hash !== undefined) { + return hash; + } - var _esutils = __webpack_require__(6); + hash = getIENodeHash(obj); + if (hash !== undefined) { + return hash; + } + } - var isReservedWordES6 = _esutils.keyword.isReservedWordES6; /** - * 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. - */ + hash = ++objHashUID; + if (objHashUID & 0x40000000) { + objHashUID = 0; + } - var isRestrictedWord = _esutils.keyword.isRestrictedWord; - var isIdentifierStartES6 = _esutils.code.isIdentifierStartES6; - var isIdentifierPartES6 = _esutils.code.isIdentifierPartES6; - var isWhiteSpace = _esutils.code.isWhiteSpace; - var isLineTerminator = _esutils.code.isLineTerminator; - var isDecimalDigit = _esutils.code.isDecimalDigit; - exports.isRestrictedWord = isRestrictedWord; - exports.isIdentifierStart = isIdentifierStartES6; - exports.isIdentifierPart = isIdentifierPartES6; - exports.isWhiteSpace = isWhiteSpace; - exports.isLineTerminator = isLineTerminator; - exports.isDecimalDigit = isDecimalDigit; - function isStrictModeReservedWord(id) { - return isReservedWordES6(id, true); - } + if (usingWeakMap) { + weakMap.set(obj, hash); + } else if (isExtensible !== undefined && isExtensible(obj) === false) { + throw new Error('Non-extensible objects are not allowed as keys.'); + } else if (canDefineProperty) { + Object.defineProperty(obj, UID_HASH_KEY, { + 'enumerable': false, + 'configurable': false, + 'writable': false, + 'value': hash + }); + } else if (obj.propertyIsEnumerable !== undefined && + obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable) { + // Since we can't define a non-enumerable property on the object + // we'll hijack one of the less-used non-enumerable properties to + // save our hash on it. Since this is a function it will not show up in + // `JSON.stringify` which is what we want. + obj.propertyIsEnumerable = function() { + return this.constructor.prototype.propertyIsEnumerable.apply(this, arguments); + }; + obj.propertyIsEnumerable[UID_HASH_KEY] = hash; + } else if (obj.nodeType !== undefined) { + // At this point we couldn't get the IE `uniqueID` to use as a hash + // and we couldn't use a non-enumerable property to exploit the + // dontEnum bug so we simply add the `UID_HASH_KEY` on the node + // itself. + obj[UID_HASH_KEY] = hash; + } else { + throw new Error('Unable to set a non-enumerable property on object.'); + } - function getHexValue(rune) { - if ("0" <= rune && rune <= "9") { - return rune.charCodeAt(0) - 48; - } - if ("a" <= rune && rune <= "f") { - return rune.charCodeAt(0) - 87; - } - if ("A" <= rune && rune <= "F") { - return rune.charCodeAt(0) - 55; + return hash; } - return -1; - } - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - /* - Copyright (C) 2013 Yusuke Suzuki - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: + // Get references to ES5 object methods. + var isExtensible = Object.isExtensible; - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - - (function () { - 'use strict'; + // True if Object.defineProperty works as expected. IE8 fails this test. + var canDefineProperty = (function() { + try { + Object.defineProperty({}, '@', {}); + return true; + } catch (e) { + return false; + } + }()); - exports.ast = __webpack_require__(7); - exports.code = __webpack_require__(8); - exports.keyword = __webpack_require__(9); - }()); - /* vim: set sw=4 ts=4 et tw=80 : */ + // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it + // and avoid memory leaks from the IE cloneNode bug. + function getIENodeHash(node) { + if (node && node.nodeType > 0) { + switch (node.nodeType) { + case 1: // Element + return node.uniqueID; + case 9: // Document + return node.documentElement && node.documentElement.uniqueID; + } + } + } + // If possible, use a WeakMap. + var usingWeakMap = typeof WeakMap === 'function'; + var weakMap; + if (usingWeakMap) { + weakMap = new WeakMap(); + } -/***/ }, -/* 7 */ -/***/ function(module, exports) { + var objHashUID = 0; - /* - Copyright (C) 2013 Yusuke Suzuki + var UID_HASH_KEY = '__immutablehash__'; + if (typeof Symbol === 'function') { + UID_HASH_KEY = Symbol(UID_HASH_KEY); + } - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: + var STRING_HASH_CACHE_MIN_STRLEN = 16; + var STRING_HASH_CACHE_MAX_SIZE = 255; + var STRING_HASH_CACHE_SIZE = 0; + var stringHashCache = {}; - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + function assertNotInfinite(size) { + invariant( + size !== Infinity, + 'Cannot perform this action with an infinite size.' + ); + } - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ + createClass(Map, KeyedCollection); - (function () { - 'use strict'; + // @pragma Construction - function isExpression(node) { - if (node == null) { return false; } - switch (node.type) { - case 'ArrayExpression': - case 'AssignmentExpression': - case 'BinaryExpression': - case 'CallExpression': - case 'ConditionalExpression': - case 'FunctionExpression': - case 'Identifier': - case 'Literal': - case 'LogicalExpression': - case 'MemberExpression': - case 'NewExpression': - case 'ObjectExpression': - case 'SequenceExpression': - case 'ThisExpression': - case 'UnaryExpression': - case 'UpdateExpression': - return true; - } - return false; + function Map(value) { + return value === null || value === undefined ? emptyMap() : + isMap(value) && !isOrdered(value) ? value : + emptyMap().withMutations(function(map ) { + var iter = KeyedIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v, k) {return map.set(k, v)}); + }); } - function isIterationStatement(node) { - if (node == null) { return false; } - switch (node.type) { - case 'DoWhileStatement': - case 'ForInStatement': - case 'ForStatement': - case 'WhileStatement': - return true; + Map.of = function() {var keyValues = SLICE$0.call(arguments, 0); + return emptyMap().withMutations(function(map ) { + for (var i = 0; i < keyValues.length; i += 2) { + if (i + 1 >= keyValues.length) { + throw new Error('Missing value for key: ' + keyValues[i]); + } + map.set(keyValues[i], keyValues[i + 1]); } - return false; - } + }); + }; - function isStatement(node) { - if (node == null) { return false; } - switch (node.type) { - case 'BlockStatement': - case 'BreakStatement': - case 'ContinueStatement': - case 'DebuggerStatement': - case 'DoWhileStatement': - case 'EmptyStatement': - case 'ExpressionStatement': - case 'ForInStatement': - case 'ForStatement': - case 'IfStatement': - case 'LabeledStatement': - case 'ReturnStatement': - case 'SwitchStatement': - case 'ThrowStatement': - case 'TryStatement': - case 'VariableDeclaration': - case 'WhileStatement': - case 'WithStatement': - return true; - } - return false; - } + Map.prototype.toString = function() { + return this.__toString('Map {', '}'); + }; - function isSourceElement(node) { - return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; - } + // @pragma Access - function trailingStatement(node) { - switch (node.type) { - case 'IfStatement': - if (node.alternate != null) { - return node.alternate; - } - return node.consequent; + Map.prototype.get = function(k, notSetValue) { + return this._root ? + this._root.get(0, undefined, k, notSetValue) : + notSetValue; + }; - case 'LabeledStatement': - case 'ForStatement': - case 'ForInStatement': - case 'WhileStatement': - case 'WithStatement': - return node.body; - } - return null; - } + // @pragma Modification - function isProblematicIfStatement(node) { - var current; + Map.prototype.set = function(k, v) { + return updateMap(this, k, v); + }; - if (node.type !== 'IfStatement') { - return false; - } - if (node.alternate == null) { - return false; - } - current = node.consequent; - do { - if (current.type === 'IfStatement') { - if (current.alternate == null) { - return true; - } - } - current = trailingStatement(current); - } while (current); + Map.prototype.setIn = function(keyPath, v) { + return this.updateIn(keyPath, NOT_SET, function() {return v}); + }; - return false; - } + Map.prototype.remove = function(k) { + return updateMap(this, k, NOT_SET); + }; - module.exports = { - isExpression: isExpression, - isStatement: isStatement, - isIterationStatement: isIterationStatement, - isSourceElement: isSourceElement, - isProblematicIfStatement: isProblematicIfStatement, + Map.prototype.deleteIn = function(keyPath) { + return this.updateIn(keyPath, function() {return NOT_SET}); + }; - trailingStatement: trailingStatement + Map.prototype.update = function(k, notSetValue, updater) { + return arguments.length === 1 ? + k(this) : + this.updateIn([k], notSetValue, updater); }; - }()); - /* vim: set sw=4 ts=4 et tw=80 : */ + Map.prototype.updateIn = function(keyPath, notSetValue, updater) { + if (!updater) { + updater = notSetValue; + notSetValue = undefined; + } + var updatedValue = updateInDeepMap( + this, + forceIterator(keyPath), + notSetValue, + updater + ); + return updatedValue === NOT_SET ? undefined : updatedValue; + }; -/***/ }, -/* 8 */ -/***/ function(module, exports) { + Map.prototype.clear = function() { + if (this.size === 0) { + return this; + } + if (this.__ownerID) { + this.size = 0; + this._root = null; + this.__hash = undefined; + this.__altered = true; + return this; + } + return emptyMap(); + }; - /* - Copyright (C) 2013-2014 Yusuke Suzuki - Copyright (C) 2014 Ivan Nikulin + // @pragma Composition - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: + Map.prototype.merge = function(/*...iters*/) { + return mergeIntoMapWith(this, undefined, arguments); + }; - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + Map.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoMapWith(this, merger, iters); + }; - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ + Map.prototype.mergeIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1); + return this.updateIn( + keyPath, + emptyMap(), + function(m ) {return typeof m.merge === 'function' ? + m.merge.apply(m, iters) : + iters[iters.length - 1]} + ); + }; - (function () { - 'use strict'; + Map.prototype.mergeDeep = function(/*...iters*/) { + return mergeIntoMapWith(this, deepMerger, arguments); + }; - var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; + Map.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoMapWith(this, deepMergerWith(merger), iters); + }; - // See `tools/generate-identifier-regex.js`. - ES5Regex = { - // ECMAScript 5.1/Unicode v7.0.0 NonAsciiIdentifierStart: - NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, - // ECMAScript 5.1/Unicode v7.0.0 NonAsciiIdentifierPart: - NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ + Map.prototype.mergeDeepIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1); + return this.updateIn( + keyPath, + emptyMap(), + function(m ) {return typeof m.mergeDeep === 'function' ? + m.mergeDeep.apply(m, iters) : + iters[iters.length - 1]} + ); }; - ES6Regex = { - // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierStart: - NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]/, - // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierPart: - NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDD0-\uDDDA\uDE00-\uDE11\uDE13-\uDE37\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF01-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ + Map.prototype.sort = function(comparator) { + // Late binding + return OrderedMap(sortFactory(this, comparator)); }; - function isDecimalDigit(ch) { - return 0x30 <= ch && ch <= 0x39; // 0..9 - } + Map.prototype.sortBy = function(mapper, comparator) { + // Late binding + return OrderedMap(sortFactory(this, comparator, mapper)); + }; - function isHexDigit(ch) { - return 0x30 <= ch && ch <= 0x39 || // 0..9 - 0x61 <= ch && ch <= 0x66 || // a..f - 0x41 <= ch && ch <= 0x46; // A..F - } + // @pragma Mutability - function isOctalDigit(ch) { - return ch >= 0x30 && ch <= 0x37; // 0..7 - } + Map.prototype.withMutations = function(fn) { + var mutable = this.asMutable(); + fn(mutable); + return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this; + }; - // 7.2 White Space + Map.prototype.asMutable = function() { + return this.__ownerID ? this : this.__ensureOwner(new OwnerID()); + }; - NON_ASCII_WHITESPACES = [ - 0x1680, 0x180E, - 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, - 0x202F, 0x205F, - 0x3000, - 0xFEFF - ]; + Map.prototype.asImmutable = function() { + return this.__ensureOwner(); + }; - function isWhiteSpace(ch) { - return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || - ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; - } + Map.prototype.wasAltered = function() { + return this.__altered; + }; - // 7.3 Line Terminators + Map.prototype.__iterator = function(type, reverse) { + return new MapIterator(this, type, reverse); + }; - function isLineTerminator(ch) { - return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029; - } + Map.prototype.__iterate = function(fn, reverse) {var this$0 = this; + var iterations = 0; + this._root && this._root.iterate(function(entry ) { + iterations++; + return fn(entry[1], entry[0], this$0); + }, reverse); + return iterations; + }; - // 7.6 Identifier Names and Identifiers + Map.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + if (!ownerID) { + this.__ownerID = ownerID; + this.__altered = false; + return this; + } + return makeMap(this.size, this._root, ownerID, this.__hash); + }; - function fromCodePoint(cp) { - if (cp <= 0xFFFF) { return String.fromCharCode(cp); } - var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); - var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00); - return cu1 + cu2; - } - IDENTIFIER_START = new Array(0x80); - for(ch = 0; ch < 0x80; ++ch) { - IDENTIFIER_START[ch] = - ch >= 0x61 && ch <= 0x7A || // a..z - ch >= 0x41 && ch <= 0x5A || // A..Z - ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) - } + function isMap(maybeMap) { + return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]); + } - IDENTIFIER_PART = new Array(0x80); - for(ch = 0; ch < 0x80; ++ch) { - IDENTIFIER_PART[ch] = - ch >= 0x61 && ch <= 0x7A || // a..z - ch >= 0x41 && ch <= 0x5A || // A..Z - ch >= 0x30 && ch <= 0x39 || // 0..9 - ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) - } + Map.isMap = isMap; - function isIdentifierStartES5(ch) { - return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); - } + var IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@'; - function isIdentifierPartES5(ch) { - return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); - } + var MapPrototype = Map.prototype; + MapPrototype[IS_MAP_SENTINEL] = true; + MapPrototype[DELETE] = MapPrototype.remove; + MapPrototype.removeIn = MapPrototype.deleteIn; - function isIdentifierStartES6(ch) { - return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); - } - function isIdentifierPartES6(ch) { - return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); - } + // #pragma Trie Nodes - module.exports = { - isDecimalDigit: isDecimalDigit, - isHexDigit: isHexDigit, - isOctalDigit: isOctalDigit, - isWhiteSpace: isWhiteSpace, - isLineTerminator: isLineTerminator, - isIdentifierStartES5: isIdentifierStartES5, - isIdentifierPartES5: isIdentifierPartES5, - isIdentifierStartES6: isIdentifierStartES6, - isIdentifierPartES6: isIdentifierPartES6 - }; - }()); - /* vim: set sw=4 ts=4 et tw=80 : */ -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { + function ArrayMapNode(ownerID, entries) { + this.ownerID = ownerID; + this.entries = entries; + } - /* - Copyright (C) 2013 Yusuke Suzuki + ArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) { + var entries = this.entries; + for (var ii = 0, len = entries.length; ii < len; ii++) { + if (is(key, entries[ii][0])) { + return entries[ii][1]; + } + } + return notSetValue; + }; - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: + ArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + var removed = value === NOT_SET; - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + var entries = this.entries; + var idx = 0; + for (var len = entries.length; idx < len; idx++) { + if (is(key, entries[idx][0])) { + break; + } + } + var exists = idx < len; - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ + if (exists ? entries[idx][1] === value : removed) { + return this; + } - (function () { - 'use strict'; + SetRef(didAlter); + (removed || !exists) && SetRef(didChangeSize); - var code = __webpack_require__(8); + if (removed && entries.length === 1) { + return; // undefined + } - function isStrictModeReservedWordES6(id) { - switch (id) { - case 'implements': - case 'interface': - case 'package': - case 'private': - case 'protected': - case 'public': - case 'static': - case 'let': - return true; - default: - return false; - } - } + if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) { + return createNodes(ownerID, entries, key, value); + } - function isKeywordES5(id, strict) { - // yield should not be treated as keyword under non-strict mode. - if (!strict && id === 'yield') { - return false; - } - return isKeywordES6(id, strict); - } + var isEditable = ownerID && ownerID === this.ownerID; + var newEntries = isEditable ? entries : arrCopy(entries); - function isKeywordES6(id, strict) { - if (strict && isStrictModeReservedWordES6(id)) { - return true; + if (exists) { + if (removed) { + idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); + } else { + newEntries[idx] = [key, value]; } + } else { + newEntries.push([key, value]); + } - switch (id.length) { - case 2: - return (id === 'if') || (id === 'in') || (id === 'do'); - case 3: - return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try'); - case 4: - return (id === 'this') || (id === 'else') || (id === 'case') || - (id === 'void') || (id === 'with') || (id === 'enum'); - case 5: - return (id === 'while') || (id === 'break') || (id === 'catch') || - (id === 'throw') || (id === 'const') || (id === 'yield') || - (id === 'class') || (id === 'super'); - case 6: - return (id === 'return') || (id === 'typeof') || (id === 'delete') || - (id === 'switch') || (id === 'export') || (id === 'import'); - case 7: - return (id === 'default') || (id === 'finally') || (id === 'extends'); - case 8: - return (id === 'function') || (id === 'continue') || (id === 'debugger'); - case 10: - return (id === 'instanceof'); - default: - return false; - } - } + if (isEditable) { + this.entries = newEntries; + return this; + } - function isReservedWordES5(id, strict) { - return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); - } + return new ArrayMapNode(ownerID, newEntries); + }; - function isReservedWordES6(id, strict) { - return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); - } - function isRestrictedWord(id) { - return id === 'eval' || id === 'arguments'; + + + function BitmapIndexedNode(ownerID, bitmap, nodes) { + this.ownerID = ownerID; + this.bitmap = bitmap; + this.nodes = nodes; } - function isIdentifierNameES5(id) { - var i, iz, ch; + BitmapIndexedNode.prototype.get = function(shift, keyHash, key, notSetValue) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var bit = (1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK)); + var bitmap = this.bitmap; + return (bitmap & bit) === 0 ? notSetValue : + this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue); + }; - if (id.length === 0) { return false; } + BitmapIndexedNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + var bit = 1 << keyHashFrag; + var bitmap = this.bitmap; + var exists = (bitmap & bit) !== 0; - ch = id.charCodeAt(0); - if (!code.isIdentifierStartES5(ch)) { - return false; - } + if (!exists && value === NOT_SET) { + return this; + } - for (i = 1, iz = id.length; i < iz; ++i) { - ch = id.charCodeAt(i); - if (!code.isIdentifierPartES5(ch)) { - return false; - } - } - return true; - } + var idx = popCount(bitmap & (bit - 1)); + var nodes = this.nodes; + var node = exists ? nodes[idx] : undefined; + var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter); - function decodeUtf16(lead, trail) { - return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; - } + if (newNode === node) { + return this; + } - function isIdentifierNameES6(id) { - var i, iz, ch, lowCh, check; + if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) { + return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode); + } - if (id.length === 0) { return false; } + if (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) { + return nodes[idx ^ 1]; + } - check = code.isIdentifierStartES6; - for (i = 0, iz = id.length; i < iz; ++i) { - ch = id.charCodeAt(i); - if (0xD800 <= ch && ch <= 0xDBFF) { - ++i; - if (i >= iz) { return false; } - lowCh = id.charCodeAt(i); - if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) { - return false; - } - ch = decodeUtf16(ch, lowCh); - } - if (!check(ch)) { - return false; - } - check = code.isIdentifierPartES6; - } - return true; - } + if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) { + return newNode; + } - function isIdentifierES5(id, strict) { - return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); - } + var isEditable = ownerID && ownerID === this.ownerID; + var newBitmap = exists ? newNode ? bitmap : bitmap ^ bit : bitmap | bit; + var newNodes = exists ? newNode ? + setIn(nodes, idx, newNode, isEditable) : + spliceOut(nodes, idx, isEditable) : + spliceIn(nodes, idx, newNode, isEditable); - function isIdentifierES6(id, strict) { - return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); + if (isEditable) { + this.bitmap = newBitmap; + this.nodes = newNodes; + return this; + } + + return new BitmapIndexedNode(ownerID, newBitmap, newNodes); + }; + + + + + function HashArrayMapNode(ownerID, count, nodes) { + this.ownerID = ownerID; + this.count = count; + this.nodes = nodes; } - module.exports = { - isKeywordES5: isKeywordES5, - isKeywordES6: isKeywordES6, - isReservedWordES5: isReservedWordES5, - isReservedWordES6: isReservedWordES6, - isRestrictedWord: isRestrictedWord, - isIdentifierNameES5: isIdentifierNameES5, - isIdentifierNameES6: isIdentifierNameES6, - isIdentifierES5: isIdentifierES5, - isIdentifierES6: isIdentifierES6 + HashArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + var node = this.nodes[idx]; + return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue; }; - }()); - /* vim: set sw=4 ts=4 et tw=80 : */ + HashArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + var removed = value === NOT_SET; + var nodes = this.nodes; + var node = nodes[idx]; -/***/ }, -/* 10 */ -/***/ function(module, exports) { + if (removed && !node) { + return this; + } - "use strict"; + var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter); + if (newNode === node) { + return this; + } - Object.defineProperty(exports, "__esModule", { - value: true - }); - /** - * 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. - */ + var newCount = this.count; + if (!node) { + newCount++; + } else if (!newNode) { + newCount--; + if (newCount < MIN_HASH_ARRAY_MAP_SIZE) { + return packNodes(ownerID, nodes, newCount, idx); + } + } - var ErrorMessages = exports.ErrorMessages = { - UNEXPECTED_TOKEN: "Unexpected token {0}", - UNEXPECTED_ILLEGAL_TOKEN: "Unexpected {0}", - UNEXPECTED_NUMBER: "Unexpected number", - UNEXPECTED_STRING: "Unexpected string", - UNEXPECTED_IDENTIFIER: "Unexpected identifier", - UNEXPECTED_RESERVED_WORD: "Unexpected reserved word", - UNEXPECTED_TEMPLATE: "Unexpected template", - UNEXPECTED_EOS: "Unexpected end of input", - UNEXPECTED_LINE_TERMINATOR: "Unexpected line terminator", - NEWLINE_AFTER_THROW: "Illegal newline after throw", - UNTERMINATED_REGEXP: "Invalid regular expression: missing /", - INVALID_REGEXP_FLAGS: "Invalid regular expression flags", - INVALID_LHS_IN_ASSIGNMENT: "Invalid left-hand side in assignment", - INVALID_LHS_IN_FOR_IN: "Invalid left-hand side in for-in", - INVALID_LHS_IN_FOR_OF: "Invalid left-hand side in for-of", - INVALID_UPDATE_OPERAND: "Increment/decrement target must be an identifier or member expression", - MULTIPLE_DEFAULTS_IN_SWITCH: "More than one default clause in switch statement", - NO_CATCH_OR_FINALLY: "Missing catch or finally after try", - ILLEGAL_RETURN: "Illegal return statement", - ILLEGAL_ARROW_FUNCTION_PARAMS: "Illegal arrow function parameter list", - INVALID_VAR_INIT_FOR_IN: "Invalid variable declaration in for-in statement", - INVALID_VAR_INIT_FOR_OF: "Invalid variable declaration in for-of statement", - ILLEGAL_PROPERTY: "Illegal property initializer" - }; + var isEditable = ownerID && ownerID === this.ownerID; + var newNodes = setIn(nodes, idx, newNode, isEditable); -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { + if (isEditable) { + this.count = newCount; + this.nodes = newNodes; + return this; + } - /** - * Copyright (c) 2014-2015, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ + return new HashArrayMapNode(ownerID, newCount, newNodes); + }; - (function (global, factory) { - true ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.Immutable = factory()); - }(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice; - function createClass(ctor, superClass) { - if (superClass) { - ctor.prototype = Object.create(superClass.prototype); - } - ctor.prototype.constructor = ctor; - } - function Iterable(value) { - return isIterable(value) ? value : Seq(value); + + function HashCollisionNode(ownerID, keyHash, entries) { + this.ownerID = ownerID; + this.keyHash = keyHash; + this.entries = entries; } + HashCollisionNode.prototype.get = function(shift, keyHash, key, notSetValue) { + var entries = this.entries; + for (var ii = 0, len = entries.length; ii < len; ii++) { + if (is(key, entries[ii][0])) { + return entries[ii][1]; + } + } + return notSetValue; + }; - createClass(KeyedIterable, Iterable); - function KeyedIterable(value) { - return isKeyed(value) ? value : KeyedSeq(value); - } + HashCollisionNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var removed = value === NOT_SET; - createClass(IndexedIterable, Iterable); - function IndexedIterable(value) { - return isIndexed(value) ? value : IndexedSeq(value); - } + if (keyHash !== this.keyHash) { + if (removed) { + return this; + } + SetRef(didAlter); + SetRef(didChangeSize); + return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]); + } + var entries = this.entries; + var idx = 0; + for (var len = entries.length; idx < len; idx++) { + if (is(key, entries[idx][0])) { + break; + } + } + var exists = idx < len; - createClass(SetIterable, Iterable); - function SetIterable(value) { - return isIterable(value) && !isAssociative(value) ? value : SetSeq(value); - } + if (exists ? entries[idx][1] === value : removed) { + return this; + } + SetRef(didAlter); + (removed || !exists) && SetRef(didChangeSize); + if (removed && len === 2) { + return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]); + } - function isIterable(maybeIterable) { - return !!(maybeIterable && maybeIterable[IS_ITERABLE_SENTINEL]); - } + var isEditable = ownerID && ownerID === this.ownerID; + var newEntries = isEditable ? entries : arrCopy(entries); - function isKeyed(maybeKeyed) { - return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]); - } + if (exists) { + if (removed) { + idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); + } else { + newEntries[idx] = [key, value]; + } + } else { + newEntries.push([key, value]); + } - function isIndexed(maybeIndexed) { - return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]); - } + if (isEditable) { + this.entries = newEntries; + return this; + } - function isAssociative(maybeAssociative) { - return isKeyed(maybeAssociative) || isIndexed(maybeAssociative); - } + return new HashCollisionNode(ownerID, this.keyHash, newEntries); + }; - function isOrdered(maybeOrdered) { - return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]); - } - Iterable.isIterable = isIterable; - Iterable.isKeyed = isKeyed; - Iterable.isIndexed = isIndexed; - Iterable.isAssociative = isAssociative; - Iterable.isOrdered = isOrdered; - Iterable.Keyed = KeyedIterable; - Iterable.Indexed = IndexedIterable; - Iterable.Set = SetIterable; + function ValueNode(ownerID, keyHash, entry) { + this.ownerID = ownerID; + this.keyHash = keyHash; + this.entry = entry; + } - var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; - var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; - var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@'; - var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; + ValueNode.prototype.get = function(shift, keyHash, key, notSetValue) { + return is(key, this.entry[0]) ? this.entry[1] : notSetValue; + }; - // Used for setting prototype methods that IE8 chokes on. - var DELETE = 'delete'; + ValueNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + var removed = value === NOT_SET; + var keyMatch = is(key, this.entry[0]); + if (keyMatch ? value === this.entry[1] : removed) { + return this; + } - // Constants describing the size of trie nodes. - var SHIFT = 5; // Resulted in best performance after ______? - var SIZE = 1 << SHIFT; - var MASK = SIZE - 1; + SetRef(didAlter); - // A consistent shared value representing "not set" which equals nothing other - // than itself, and nothing that could be provided externally. - var NOT_SET = {}; + if (removed) { + SetRef(didChangeSize); + return; // undefined + } - // Boolean references, Rough equivalent of `bool &`. - var CHANGE_LENGTH = { value: false }; - var DID_ALTER = { value: false }; + if (keyMatch) { + if (ownerID && ownerID === this.ownerID) { + this.entry[1] = value; + return this; + } + return new ValueNode(ownerID, this.keyHash, [key, value]); + } - function MakeRef(ref) { - ref.value = false; - return ref; - } + SetRef(didChangeSize); + return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]); + }; - function SetRef(ref) { - ref && (ref.value = true); - } - // A function which returns a value representing an "owner" for transient writes - // to tries. The return value will only ever equal itself, and will not equal - // the return of any subsequent call of this function. - function OwnerID() {} - // http://jsperf.com/copy-array-inline - function arrCopy(arr, offset) { - offset = offset || 0; - var len = Math.max(0, arr.length - offset); - var newArr = new Array(len); - for (var ii = 0; ii < len; ii++) { - newArr[ii] = arr[ii + offset]; - } - return newArr; - } + // #pragma Iterators - function ensureSize(iter) { - if (iter.size === undefined) { - iter.size = iter.__iterate(returnTrue); + ArrayMapNode.prototype.iterate = + HashCollisionNode.prototype.iterate = function (fn, reverse) { + var entries = this.entries; + for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) { + if (fn(entries[reverse ? maxIndex - ii : ii]) === false) { + return false; + } } - return iter.size; } - function wrapIndex(iter, index) { - // This implements "is array index" which the ECMAString spec defines as: - // - // A String property name P is an array index if and only if - // ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal - // to 2^32−1. - // - // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects - if (typeof index !== 'number') { - var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32 - if ('' + uint32Index !== index || uint32Index === 4294967295) { - return NaN; + BitmapIndexedNode.prototype.iterate = + HashArrayMapNode.prototype.iterate = function (fn, reverse) { + var nodes = this.nodes; + for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) { + var node = nodes[reverse ? maxIndex - ii : ii]; + if (node && node.iterate(fn, reverse) === false) { + return false; } - index = uint32Index; } - return index < 0 ? ensureSize(iter) + index : index; } - function returnTrue() { - return true; + ValueNode.prototype.iterate = function (fn, reverse) { + return fn(this.entry); } - function wholeSlice(begin, end, size) { - return (begin === 0 || (size !== undefined && begin <= -size)) && - (end === undefined || (size !== undefined && end >= size)); + createClass(MapIterator, Iterator); + + function MapIterator(map, type, reverse) { + this._type = type; + this._reverse = reverse; + this._stack = map._root && mapIteratorFrame(map._root); + } + + MapIterator.prototype.next = function() { + var type = this._type; + var stack = this._stack; + while (stack) { + var node = stack.node; + var index = stack.index++; + var maxIndex; + if (node.entry) { + if (index === 0) { + return mapIteratorValue(type, node.entry); + } + } else if (node.entries) { + maxIndex = node.entries.length - 1; + if (index <= maxIndex) { + return mapIteratorValue(type, node.entries[this._reverse ? maxIndex - index : index]); + } + } else { + maxIndex = node.nodes.length - 1; + if (index <= maxIndex) { + var subNode = node.nodes[this._reverse ? maxIndex - index : index]; + if (subNode) { + if (subNode.entry) { + return mapIteratorValue(type, subNode.entry); + } + stack = this._stack = mapIteratorFrame(subNode, stack); + } + continue; + } + } + stack = this._stack = this._stack.__prev; + } + return iteratorDone(); + }; + + + function mapIteratorValue(type, entry) { + return iteratorValue(type, entry[0], entry[1]); } - function resolveBegin(begin, size) { - return resolveIndex(begin, size, 0); + function mapIteratorFrame(node, prev) { + return { + node: node, + index: 0, + __prev: prev + }; } - function resolveEnd(end, size) { - return resolveIndex(end, size, size); + function makeMap(size, root, ownerID, hash) { + var map = Object.create(MapPrototype); + map.size = size; + map._root = root; + map.__ownerID = ownerID; + map.__hash = hash; + map.__altered = false; + return map; } - function resolveIndex(index, size, defaultIndex) { - return index === undefined ? - defaultIndex : - index < 0 ? - Math.max(0, size + index) : - size === undefined ? - index : - Math.min(size, index); + var EMPTY_MAP; + function emptyMap() { + return EMPTY_MAP || (EMPTY_MAP = makeMap(0)); } - /* global Symbol */ + function updateMap(map, k, v) { + var newRoot; + var newSize; + if (!map._root) { + if (v === NOT_SET) { + return map; + } + newSize = 1; + newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]); + } else { + var didChangeSize = MakeRef(CHANGE_LENGTH); + var didAlter = MakeRef(DID_ALTER); + newRoot = updateNode(map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter); + if (!didAlter.value) { + return map; + } + newSize = map.size + (didChangeSize.value ? v === NOT_SET ? -1 : 1 : 0); + } + if (map.__ownerID) { + map.size = newSize; + map._root = newRoot; + map.__hash = undefined; + map.__altered = true; + return map; + } + return newRoot ? makeMap(newSize, newRoot) : emptyMap(); + } - var ITERATE_KEYS = 0; - var ITERATE_VALUES = 1; - var ITERATE_ENTRIES = 2; + function updateNode(node, ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (!node) { + if (value === NOT_SET) { + return node; + } + SetRef(didAlter); + SetRef(didChangeSize); + return new ValueNode(ownerID, keyHash, [key, value]); + } + return node.update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter); + } - var REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; - var FAUX_ITERATOR_SYMBOL = '@@iterator'; + function isLeafNode(node) { + return node.constructor === ValueNode || node.constructor === HashCollisionNode; + } - var ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL; + function mergeIntoNode(node, ownerID, shift, keyHash, entry) { + if (node.keyHash === keyHash) { + return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]); + } + + var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK; + var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + var newNode; + var nodes = idx1 === idx2 ? + [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] : + ((newNode = new ValueNode(ownerID, keyHash, entry)), idx1 < idx2 ? [node, newNode] : [newNode, node]); - function Iterator(next) { - this.next = next; + return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes); + } + + function createNodes(ownerID, entries, key, value) { + if (!ownerID) { + ownerID = new OwnerID(); + } + var node = new ValueNode(ownerID, hash(key), [key, value]); + for (var ii = 0; ii < entries.length; ii++) { + var entry = entries[ii]; + node = node.update(ownerID, 0, undefined, entry[0], entry[1]); } + return node; + } - Iterator.prototype.toString = function() { - return '[Iterator]'; - }; + function packNodes(ownerID, nodes, count, excluding) { + var bitmap = 0; + var packedII = 0; + var packedNodes = new Array(count); + for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) { + var node = nodes[ii]; + if (node !== undefined && ii !== excluding) { + bitmap |= bit; + packedNodes[packedII++] = node; + } + } + return new BitmapIndexedNode(ownerID, bitmap, packedNodes); + } + function expandNodes(ownerID, nodes, bitmap, including, node) { + var count = 0; + var expandedNodes = new Array(SIZE); + for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) { + expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined; + } + expandedNodes[including] = node; + return new HashArrayMapNode(ownerID, count + 1, expandedNodes); + } - Iterator.KEYS = ITERATE_KEYS; - Iterator.VALUES = ITERATE_VALUES; - Iterator.ENTRIES = ITERATE_ENTRIES; + function mergeIntoMapWith(map, merger, iterables) { + var iters = []; + for (var ii = 0; ii < iterables.length; ii++) { + var value = iterables[ii]; + var iter = KeyedIterable(value); + if (!isIterable(value)) { + iter = iter.map(function(v ) {return fromJS(v)}); + } + iters.push(iter); + } + return mergeIntoCollectionWith(map, merger, iters); + } - Iterator.prototype.inspect = - Iterator.prototype.toSource = function () { return this.toString(); } - Iterator.prototype[ITERATOR_SYMBOL] = function () { - return this; - }; + function deepMerger(existing, value, key) { + return existing && existing.mergeDeep && isIterable(value) ? + existing.mergeDeep(value) : + is(existing, value) ? existing : value; + } + function deepMergerWith(merger) { + return function(existing, value, key) { + if (existing && existing.mergeDeepWith && isIterable(value)) { + return existing.mergeDeepWith(merger, value); + } + var nextValue = merger(existing, value, key); + return is(existing, nextValue) ? existing : nextValue; + }; + } - function iteratorValue(type, k, v, iteratorResult) { - var value = type === 0 ? k : type === 1 ? v : [k, v]; - iteratorResult ? (iteratorResult.value = value) : (iteratorResult = { - value: value, done: false + function mergeIntoCollectionWith(collection, merger, iters) { + iters = iters.filter(function(x ) {return x.size !== 0}); + if (iters.length === 0) { + return collection; + } + if (collection.size === 0 && !collection.__ownerID && iters.length === 1) { + return collection.constructor(iters[0]); + } + return collection.withMutations(function(collection ) { + var mergeIntoMap = merger ? + function(value, key) { + collection.update(key, NOT_SET, function(existing ) + {return existing === NOT_SET ? value : merger(existing, value, key)} + ); + } : + function(value, key) { + collection.set(key, value); + } + for (var ii = 0; ii < iters.length; ii++) { + iters[ii].forEach(mergeIntoMap); + } }); - return iteratorResult; } - function iteratorDone() { - return { value: undefined, done: true }; + function updateInDeepMap(existing, keyPathIter, notSetValue, updater) { + var isNotSet = existing === NOT_SET; + var step = keyPathIter.next(); + if (step.done) { + var existingValue = isNotSet ? notSetValue : existing; + var newValue = updater(existingValue); + return newValue === existingValue ? existing : newValue; + } + invariant( + isNotSet || (existing && existing.set), + 'invalid keyPath' + ); + var key = step.value; + var nextExisting = isNotSet ? NOT_SET : existing.get(key, NOT_SET); + var nextUpdated = updateInDeepMap( + nextExisting, + keyPathIter, + notSetValue, + updater + ); + return nextUpdated === nextExisting ? existing : + nextUpdated === NOT_SET ? existing.remove(key) : + (isNotSet ? emptyMap() : existing).set(key, nextUpdated); } - function hasIterator(maybeIterable) { - return !!getIteratorFn(maybeIterable); + function popCount(x) { + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0f0f0f0f; + x = x + (x >> 8); + x = x + (x >> 16); + return x & 0x7f; } - function isIterator(maybeIterator) { - return maybeIterator && typeof maybeIterator.next === 'function'; + function setIn(array, idx, val, canEdit) { + var newArray = canEdit ? array : arrCopy(array); + newArray[idx] = val; + return newArray; } - function getIterator(iterable) { - var iteratorFn = getIteratorFn(iterable); - return iteratorFn && iteratorFn.call(iterable); + function spliceIn(array, idx, val, canEdit) { + var newLen = array.length + 1; + if (canEdit && idx + 1 === newLen) { + array[idx] = val; + return array; + } + var newArray = new Array(newLen); + var after = 0; + for (var ii = 0; ii < newLen; ii++) { + if (ii === idx) { + newArray[ii] = val; + after = -1; + } else { + newArray[ii] = array[ii + after]; + } + } + return newArray; } - function getIteratorFn(iterable) { - var iteratorFn = iterable && ( - (REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) || - iterable[FAUX_ITERATOR_SYMBOL] - ); - if (typeof iteratorFn === 'function') { - return iteratorFn; + function spliceOut(array, idx, canEdit) { + var newLen = array.length - 1; + if (canEdit && idx === newLen) { + array.pop(); + return array; + } + var newArray = new Array(newLen); + var after = 0; + for (var ii = 0; ii < newLen; ii++) { + if (ii === idx) { + after = 1; + } + newArray[ii] = array[ii + after]; } + return newArray; } - function isArrayLike(value) { - return value && typeof value.length === 'number'; - } + var MAX_ARRAY_MAP_SIZE = SIZE / 4; + var MAX_BITMAP_INDEXED_SIZE = SIZE / 2; + var MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4; - createClass(Seq, Iterable); - function Seq(value) { - return value === null || value === undefined ? emptySequence() : - isIterable(value) ? value.toSeq() : seqFromValue(value); + createClass(List, IndexedCollection); + + // @pragma Construction + + function List(value) { + var empty = emptyList(); + if (value === null || value === undefined) { + return empty; + } + if (isList(value)) { + return value; + } + var iter = IndexedIterable(value); + var size = iter.size; + if (size === 0) { + return empty; + } + assertNotInfinite(size); + if (size > 0 && size < SIZE) { + return makeList(0, size, SHIFT, null, new VNode(iter.toArray())); + } + return empty.withMutations(function(list ) { + list.setSize(size); + iter.forEach(function(v, i) {return list.set(i, v)}); + }); } - Seq.of = function(/*...values*/) { - return Seq(arguments); + List.of = function(/*...values*/) { + return this(arguments); }; - Seq.prototype.toSeq = function() { - return this; + List.prototype.toString = function() { + return this.__toString('List [', ']'); }; - Seq.prototype.toString = function() { - return this.__toString('Seq {', '}'); - }; + // @pragma Access - Seq.prototype.cacheResult = function() { - if (!this._cache && this.__iterateUncached) { - this._cache = this.entrySeq().toArray(); - this.size = this._cache.length; + List.prototype.get = function(index, notSetValue) { + index = wrapIndex(this, index); + if (index >= 0 && index < this.size) { + index += this._origin; + var node = listNodeFor(this, index); + return node && node.array[index & MASK]; } - return this; + return notSetValue; }; - // abstract __iterateUncached(fn, reverse) + // @pragma Modification - Seq.prototype.__iterate = function(fn, reverse) { - return seqIterate(this, fn, reverse, true); + List.prototype.set = function(index, value) { + return updateList(this, index, value); }; - // abstract __iteratorUncached(type, reverse) - - Seq.prototype.__iterator = function(type, reverse) { - return seqIterator(this, type, reverse, true); + List.prototype.remove = function(index) { + return !this.has(index) ? this : + index === 0 ? this.shift() : + index === this.size - 1 ? this.pop() : + this.splice(index, 1); }; + List.prototype.insert = function(index, value) { + return this.splice(index, 0, value); + }; + List.prototype.clear = function() { + if (this.size === 0) { + return this; + } + if (this.__ownerID) { + this.size = this._origin = this._capacity = 0; + this._level = SHIFT; + this._root = this._tail = null; + this.__hash = undefined; + this.__altered = true; + return this; + } + return emptyList(); + }; - createClass(KeyedSeq, Seq); - function KeyedSeq(value) { - return value === null || value === undefined ? - emptySequence().toKeyedSeq() : - isIterable(value) ? - (isKeyed(value) ? value.toSeq() : value.fromEntrySeq()) : - keyedSeqFromValue(value); - } + List.prototype.push = function(/*...values*/) { + var values = arguments; + var oldSize = this.size; + return this.withMutations(function(list ) { + setListBounds(list, 0, oldSize + values.length); + for (var ii = 0; ii < values.length; ii++) { + list.set(oldSize + ii, values[ii]); + } + }); + }; - KeyedSeq.prototype.toKeyedSeq = function() { - return this; + List.prototype.pop = function() { + return setListBounds(this, 0, -1); }; + List.prototype.unshift = function(/*...values*/) { + var values = arguments; + return this.withMutations(function(list ) { + setListBounds(list, -values.length); + for (var ii = 0; ii < values.length; ii++) { + list.set(ii, values[ii]); + } + }); + }; + List.prototype.shift = function() { + return setListBounds(this, 1); + }; - createClass(IndexedSeq, Seq); - function IndexedSeq(value) { - return value === null || value === undefined ? emptySequence() : - !isIterable(value) ? indexedSeqFromValue(value) : - isKeyed(value) ? value.entrySeq() : value.toIndexedSeq(); - } + // @pragma Composition - IndexedSeq.of = function(/*...values*/) { - return IndexedSeq(arguments); + List.prototype.merge = function(/*...iters*/) { + return mergeIntoListWith(this, undefined, arguments); }; - IndexedSeq.prototype.toIndexedSeq = function() { - return this; + List.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoListWith(this, merger, iters); }; - IndexedSeq.prototype.toString = function() { - return this.__toString('Seq [', ']'); + List.prototype.mergeDeep = function(/*...iters*/) { + return mergeIntoListWith(this, deepMerger, arguments); }; - IndexedSeq.prototype.__iterate = function(fn, reverse) { - return seqIterate(this, fn, reverse, false); + List.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoListWith(this, deepMergerWith(merger), iters); }; - IndexedSeq.prototype.__iterator = function(type, reverse) { - return seqIterator(this, type, reverse, false); + List.prototype.setSize = function(size) { + return setListBounds(this, 0, size); }; + // @pragma Iteration - - createClass(SetSeq, Seq); - function SetSeq(value) { - return ( - value === null || value === undefined ? emptySequence() : - !isIterable(value) ? indexedSeqFromValue(value) : - isKeyed(value) ? value.entrySeq() : value - ).toSetSeq(); - } - - SetSeq.of = function(/*...values*/) { - return SetSeq(arguments); + List.prototype.slice = function(begin, end) { + var size = this.size; + if (wholeSlice(begin, end, size)) { + return this; + } + return setListBounds( + this, + resolveBegin(begin, size), + resolveEnd(end, size) + ); }; - SetSeq.prototype.toSetSeq = function() { - return this; + List.prototype.__iterator = function(type, reverse) { + var index = 0; + var values = iterateList(this, reverse); + return new Iterator(function() { + var value = values(); + return value === DONE ? + iteratorDone() : + iteratorValue(type, index++, value); + }); }; + List.prototype.__iterate = function(fn, reverse) { + var index = 0; + var values = iterateList(this, reverse); + var value; + while ((value = values()) !== DONE) { + if (fn(value, index++, this) === false) { + break; + } + } + return index; + }; + List.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + if (!ownerID) { + this.__ownerID = ownerID; + return this; + } + return makeList(this._origin, this._capacity, this._level, this._root, this._tail, ownerID, this.__hash); + }; - Seq.isSeq = isSeq; - Seq.Keyed = KeyedSeq; - Seq.Set = SetSeq; - Seq.Indexed = IndexedSeq; - var IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@'; + function isList(maybeList) { + return !!(maybeList && maybeList[IS_LIST_SENTINEL]); + } - Seq.prototype[IS_SEQ_SENTINEL] = true; + List.isList = isList; + + var IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; + + var ListPrototype = List.prototype; + ListPrototype[IS_LIST_SENTINEL] = true; + ListPrototype[DELETE] = ListPrototype.remove; + ListPrototype.setIn = MapPrototype.setIn; + ListPrototype.deleteIn = + ListPrototype.removeIn = MapPrototype.removeIn; + ListPrototype.update = MapPrototype.update; + ListPrototype.updateIn = MapPrototype.updateIn; + ListPrototype.mergeIn = MapPrototype.mergeIn; + ListPrototype.mergeDeepIn = MapPrototype.mergeDeepIn; + ListPrototype.withMutations = MapPrototype.withMutations; + ListPrototype.asMutable = MapPrototype.asMutable; + ListPrototype.asImmutable = MapPrototype.asImmutable; + ListPrototype.wasAltered = MapPrototype.wasAltered; - createClass(ArraySeq, IndexedSeq); - function ArraySeq(array) { - this._array = array; - this.size = array.length; + function VNode(array, ownerID) { + this.array = array; + this.ownerID = ownerID; } - ArraySeq.prototype.get = function(index, notSetValue) { - return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue; - }; + // TODO: seems like these methods are very similar - ArraySeq.prototype.__iterate = function(fn, reverse) { - var array = this._array; - var maxIndex = array.length - 1; - for (var ii = 0; ii <= maxIndex; ii++) { - if (fn(array[reverse ? maxIndex - ii : ii], ii, this) === false) { - return ii + 1; + VNode.prototype.removeBefore = function(ownerID, level, index) { + if (index === level ? 1 << level : 0 || this.array.length === 0) { + return this; + } + var originIndex = (index >>> level) & MASK; + if (originIndex >= this.array.length) { + return new VNode([], ownerID); + } + var removingFirst = originIndex === 0; + var newChild; + if (level > 0) { + var oldChild = this.array[originIndex]; + newChild = oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index); + if (newChild === oldChild && removingFirst) { + return this; } } - return ii; - }; - - ArraySeq.prototype.__iterator = function(type, reverse) { - var array = this._array; - var maxIndex = array.length - 1; - var ii = 0; - return new Iterator(function() - {return ii > maxIndex ? - iteratorDone() : - iteratorValue(type, ii, array[reverse ? maxIndex - ii++ : ii++])} - ); + if (removingFirst && !newChild) { + return this; + } + var editable = editableVNode(this, ownerID); + if (!removingFirst) { + for (var ii = 0; ii < originIndex; ii++) { + editable.array[ii] = undefined; + } + } + if (newChild) { + editable.array[originIndex] = newChild; + } + return editable; }; + VNode.prototype.removeAfter = function(ownerID, level, index) { + if (index === (level ? 1 << level : 0) || this.array.length === 0) { + return this; + } + var sizeIndex = ((index - 1) >>> level) & MASK; + if (sizeIndex >= this.array.length) { + return this; + } + var newChild; + if (level > 0) { + var oldChild = this.array[sizeIndex]; + newChild = oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index); + if (newChild === oldChild && sizeIndex === this.array.length - 1) { + return this; + } + } - createClass(ObjectSeq, KeyedSeq); - function ObjectSeq(object) { - var keys = Object.keys(object); - this._object = object; - this._keys = keys; - this.size = keys.length; - } - - ObjectSeq.prototype.get = function(key, notSetValue) { - if (notSetValue !== undefined && !this.has(key)) { - return notSetValue; + var editable = editableVNode(this, ownerID); + editable.array.splice(sizeIndex + 1); + if (newChild) { + editable.array[sizeIndex] = newChild; } - return this._object[key]; + return editable; }; - ObjectSeq.prototype.has = function(key) { - return this._object.hasOwnProperty(key); - }; - ObjectSeq.prototype.__iterate = function(fn, reverse) { - var object = this._object; - var keys = this._keys; - var maxIndex = keys.length - 1; - for (var ii = 0; ii <= maxIndex; ii++) { - var key = keys[reverse ? maxIndex - ii : ii]; - if (fn(object[key], key, this) === false) { - return ii + 1; - } - } - return ii; - }; - ObjectSeq.prototype.__iterator = function(type, reverse) { - var object = this._object; - var keys = this._keys; - var maxIndex = keys.length - 1; - var ii = 0; - return new Iterator(function() { - var key = keys[reverse ? maxIndex - ii : ii]; - return ii++ > maxIndex ? - iteratorDone() : - iteratorValue(type, key, object[key]); - }); - }; + var DONE = {}; - ObjectSeq.prototype[IS_ORDERED_SENTINEL] = true; + function iterateList(list, reverse) { + var left = list._origin; + var right = list._capacity; + var tailPos = getTailOffset(right); + var tail = list._tail; + return iterateNodeOrLeaf(list._root, list._level, 0); - createClass(IterableSeq, IndexedSeq); - function IterableSeq(iterable) { - this._iterable = iterable; - this.size = iterable.length || iterable.size; + function iterateNodeOrLeaf(node, level, offset) { + return level === 0 ? + iterateLeaf(node, offset) : + iterateNode(node, level, offset); } - IterableSeq.prototype.__iterateUncached = function(fn, reverse) { - if (reverse) { - return this.cacheResult().__iterate(fn, reverse); + function iterateLeaf(node, offset) { + var array = offset === tailPos ? tail && tail.array : node && node.array; + var from = offset > left ? 0 : left - offset; + var to = right - offset; + if (to > SIZE) { + to = SIZE; } - var iterable = this._iterable; - var iterator = getIterator(iterable); - var iterations = 0; - if (isIterator(iterator)) { - var step; - while (!(step = iterator.next()).done) { - if (fn(step.value, iterations++, this) === false) { - break; - } + return function() { + if (from === to) { + return DONE; } - } - return iterations; - }; + var idx = reverse ? --to : from++; + return array && array[idx]; + }; + } - IterableSeq.prototype.__iteratorUncached = function(type, reverse) { - if (reverse) { - return this.cacheResult().__iterator(type, reverse); - } - var iterable = this._iterable; - var iterator = getIterator(iterable); - if (!isIterator(iterator)) { - return new Iterator(iteratorDone); + function iterateNode(node, level, offset) { + var values; + var array = node && node.array; + var from = offset > left ? 0 : (left - offset) >> level; + var to = ((right - offset) >> level) + 1; + if (to > SIZE) { + to = SIZE; } - var iterations = 0; - return new Iterator(function() { - var step = iterator.next(); - return step.done ? step : iteratorValue(type, iterations++, step.value); - }); - }; + return function() { + do { + if (values) { + var value = values(); + if (value !== DONE) { + return value; + } + values = null; + } + if (from === to) { + return DONE; + } + var idx = reverse ? --to : from++; + values = iterateNodeOrLeaf( + array && array[idx], level - SHIFT, offset + (idx << level) + ); + } while (true); + }; + } + } + + function makeList(origin, capacity, level, root, tail, ownerID, hash) { + var list = Object.create(ListPrototype); + list.size = capacity - origin; + list._origin = origin; + list._capacity = capacity; + list._level = level; + list._root = root; + list._tail = tail; + list.__ownerID = ownerID; + list.__hash = hash; + list.__altered = false; + return list; + } + var EMPTY_LIST; + function emptyList() { + return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT)); + } + function updateList(list, index, value) { + index = wrapIndex(list, index); - createClass(IteratorSeq, IndexedSeq); - function IteratorSeq(iterator) { - this._iterator = iterator; - this._iteratorCache = []; + if (index !== index) { + return list; } - IteratorSeq.prototype.__iterateUncached = function(fn, reverse) { - if (reverse) { - return this.cacheResult().__iterate(fn, reverse); - } - var iterator = this._iterator; - var cache = this._iteratorCache; - var iterations = 0; - while (iterations < cache.length) { - if (fn(cache[iterations], iterations++, this) === false) { - return iterations; - } - } - var step; - while (!(step = iterator.next()).done) { - var val = step.value; - cache[iterations] = val; - if (fn(val, iterations++, this) === false) { - break; - } - } - return iterations; - }; - - IteratorSeq.prototype.__iteratorUncached = function(type, reverse) { - if (reverse) { - return this.cacheResult().__iterator(type, reverse); - } - var iterator = this._iterator; - var cache = this._iteratorCache; - var iterations = 0; - return new Iterator(function() { - if (iterations >= cache.length) { - var step = iterator.next(); - if (step.done) { - return step; - } - cache[iterations] = step.value; - } - return iteratorValue(type, iterations, cache[iterations++]); + if (index >= list.size || index < 0) { + return list.withMutations(function(list ) { + index < 0 ? + setListBounds(list, index).set(0, value) : + setListBounds(list, 0, index + 1).set(index, value) }); - }; - + } + index += list._origin; + var newTail = list._tail; + var newRoot = list._root; + var didAlter = MakeRef(DID_ALTER); + if (index >= getTailOffset(list._capacity)) { + newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter); + } else { + newRoot = updateVNode(newRoot, list.__ownerID, list._level, index, value, didAlter); + } - // # pragma Helper functions + if (!didAlter.value) { + return list; + } - function isSeq(maybeSeq) { - return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]); + if (list.__ownerID) { + list._root = newRoot; + list._tail = newTail; + list.__hash = undefined; + list.__altered = true; + return list; + } + return makeList(list._origin, list._capacity, list._level, newRoot, newTail); } - var EMPTY_SEQ; + function updateVNode(node, ownerID, level, index, value, didAlter) { + var idx = (index >>> level) & MASK; + var nodeHas = node && idx < node.array.length; + if (!nodeHas && value === undefined) { + return node; + } - function emptySequence() { - return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([])); - } + var newNode; - function keyedSeqFromValue(value) { - var seq = - Array.isArray(value) ? new ArraySeq(value).fromEntrySeq() : - isIterator(value) ? new IteratorSeq(value).fromEntrySeq() : - hasIterator(value) ? new IterableSeq(value).fromEntrySeq() : - typeof value === 'object' ? new ObjectSeq(value) : - undefined; - if (!seq) { - throw new TypeError( - 'Expected Array or iterable object of [k, v] entries, '+ - 'or keyed object: ' + value - ); + if (level > 0) { + var lowerNode = node && node.array[idx]; + var newLowerNode = updateVNode(lowerNode, ownerID, level - SHIFT, index, value, didAlter); + if (newLowerNode === lowerNode) { + return node; + } + newNode = editableVNode(node, ownerID); + newNode.array[idx] = newLowerNode; + return newNode; } - return seq; - } - function indexedSeqFromValue(value) { - var seq = maybeIndexedSeqFromValue(value); - if (!seq) { - throw new TypeError( - 'Expected Array or iterable object of values: ' + value - ); + if (nodeHas && node.array[idx] === value) { + return node; } - return seq; - } - function seqFromValue(value) { - var seq = maybeIndexedSeqFromValue(value) || - (typeof value === 'object' && new ObjectSeq(value)); - if (!seq) { - throw new TypeError( - 'Expected Array or iterable object of values, or keyed object: ' + value - ); + SetRef(didAlter); + + newNode = editableVNode(node, ownerID); + if (value === undefined && idx === newNode.array.length - 1) { + newNode.array.pop(); + } else { + newNode.array[idx] = value; } - return seq; + return newNode; } - function maybeIndexedSeqFromValue(value) { - return ( - isArrayLike(value) ? new ArraySeq(value) : - isIterator(value) ? new IteratorSeq(value) : - hasIterator(value) ? new IterableSeq(value) : - undefined - ); + function editableVNode(node, ownerID) { + if (ownerID && node && ownerID === node.ownerID) { + return node; + } + return new VNode(node ? node.array.slice() : [], ownerID); } - function seqIterate(seq, fn, reverse, useKeys) { - var cache = seq._cache; - if (cache) { - var maxIndex = cache.length - 1; - for (var ii = 0; ii <= maxIndex; ii++) { - var entry = cache[reverse ? maxIndex - ii : ii]; - if (fn(entry[1], useKeys ? entry[0] : ii, seq) === false) { - return ii + 1; - } + function listNodeFor(list, rawIndex) { + if (rawIndex >= getTailOffset(list._capacity)) { + return list._tail; + } + if (rawIndex < 1 << (list._level + SHIFT)) { + var node = list._root; + var level = list._level; + while (node && level > 0) { + node = node.array[(rawIndex >>> level) & MASK]; + level -= SHIFT; } - return ii; + return node; } - return seq.__iterateUncached(fn, reverse); } - function seqIterator(seq, type, reverse, useKeys) { - var cache = seq._cache; - if (cache) { - var maxIndex = cache.length - 1; - var ii = 0; - return new Iterator(function() { - var entry = cache[reverse ? maxIndex - ii : ii]; - return ii++ > maxIndex ? - iteratorDone() : - iteratorValue(type, useKeys ? entry[0] : ii - 1, entry[1]); - }); + function setListBounds(list, begin, end) { + // Sanitize begin & end using this shorthand for ToInt32(argument) + // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 + if (begin !== undefined) { + begin = begin | 0; + } + if (end !== undefined) { + end = end | 0; + } + var owner = list.__ownerID || new OwnerID(); + var oldOrigin = list._origin; + var oldCapacity = list._capacity; + var newOrigin = oldOrigin + begin; + var newCapacity = end === undefined ? oldCapacity : end < 0 ? oldCapacity + end : oldOrigin + end; + if (newOrigin === oldOrigin && newCapacity === oldCapacity) { + return list; } - return seq.__iteratorUncached(type, reverse); - } - function fromJS(json, converter) { - return converter ? - fromJSWith(converter, json, '', {'': json}) : - fromJSDefault(json); - } + // If it's going to end after it starts, it's empty. + if (newOrigin >= newCapacity) { + return list.clear(); + } - function fromJSWith(converter, json, key, parentJSON) { - if (Array.isArray(json)) { - return converter.call(parentJSON, key, IndexedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)})); + var newLevel = list._level; + var newRoot = list._root; + + // New origin might need creating a higher root. + var offsetShift = 0; + while (newOrigin + offsetShift < 0) { + newRoot = new VNode(newRoot && newRoot.array.length ? [undefined, newRoot] : [], owner); + newLevel += SHIFT; + offsetShift += 1 << newLevel; } - if (isPlainObj(json)) { - return converter.call(parentJSON, key, KeyedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)})); + if (offsetShift) { + newOrigin += offsetShift; + oldOrigin += offsetShift; + newCapacity += offsetShift; + oldCapacity += offsetShift; } - return json; - } - function fromJSDefault(json) { - if (Array.isArray(json)) { - return IndexedSeq(json).map(fromJSDefault).toList(); - } - if (isPlainObj(json)) { - return KeyedSeq(json).map(fromJSDefault).toMap(); + var oldTailOffset = getTailOffset(oldCapacity); + var newTailOffset = getTailOffset(newCapacity); + + // New size might need creating a higher root. + while (newTailOffset >= 1 << (newLevel + SHIFT)) { + newRoot = new VNode(newRoot && newRoot.array.length ? [newRoot] : [], owner); + newLevel += SHIFT; } - return json; - } - function isPlainObj(value) { - return value && (value.constructor === Object || value.constructor === undefined); - } + // Locate or create the new tail. + var oldTail = list._tail; + var newTail = newTailOffset < oldTailOffset ? + listNodeFor(list, newCapacity - 1) : + newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail; - /** - * An extension of the "same-value" algorithm as [described for use by ES6 Map - * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality) - * - * NaN is considered the same as NaN, however -0 and 0 are considered the same - * value, which is different from the algorithm described by - * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). - * - * This is extended further to allow Objects to describe the values they - * represent, by way of `valueOf` or `equals` (and `hashCode`). - * - * Note: because of this extension, the key equality of Immutable.Map and the - * value equality of Immutable.Set will differ from ES6 Map and Set. - * - * ### Defining custom values - * - * The easiest way to describe the value an object represents is by implementing - * `valueOf`. For example, `Date` represents a value by returning a unix - * timestamp for `valueOf`: - * - * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ... - * var date2 = new Date(1234567890000); - * date1.valueOf(); // 1234567890000 - * assert( date1 !== date2 ); - * assert( Immutable.is( date1, date2 ) ); - * - * Note: overriding `valueOf` may have other implications if you use this object - * where JavaScript expects a primitive, such as implicit string coercion. - * - * For more complex types, especially collections, implementing `valueOf` may - * not be performant. An alternative is to implement `equals` and `hashCode`. - * - * `equals` takes another object, presumably of similar type, and returns true - * if the it is equal. Equality is symmetrical, so the same result should be - * returned if this and the argument are flipped. - * - * assert( a.equals(b) === b.equals(a) ); - * - * `hashCode` returns a 32bit integer number representing the object which will - * be used to determine how to store the value object in a Map or Set. You must - * provide both or neither methods, one must not exist without the other. - * - * Also, an important relationship between these methods must be upheld: if two - * values are equal, they *must* return the same hashCode. If the values are not - * equal, they might have the same hashCode; this is called a hash collision, - * and while undesirable for performance reasons, it is acceptable. - * - * if (a.equals(b)) { - * assert( a.hashCode() === b.hashCode() ); - * } - * - * All Immutable collections implement `equals` and `hashCode`. - * - */ - function is(valueA, valueB) { - if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { - return true; + // Merge Tail into tree. + if (oldTail && newTailOffset > oldTailOffset && newOrigin < oldCapacity && oldTail.array.length) { + newRoot = editableVNode(newRoot, owner); + var node = newRoot; + for (var level = newLevel; level > SHIFT; level -= SHIFT) { + var idx = (oldTailOffset >>> level) & MASK; + node = node.array[idx] = editableVNode(node.array[idx], owner); + } + node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail; } - if (!valueA || !valueB) { - return false; + + // If the size has been reduced, there's a chance the tail needs to be trimmed. + if (newCapacity < oldCapacity) { + newTail = newTail && newTail.removeAfter(owner, 0, newCapacity); } - if (typeof valueA.valueOf === 'function' && - typeof valueB.valueOf === 'function') { - valueA = valueA.valueOf(); - valueB = valueB.valueOf(); - if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { - return true; + + // If the new origin is within the tail, then we do not need a root. + if (newOrigin >= newTailOffset) { + newOrigin -= newTailOffset; + newCapacity -= newTailOffset; + newLevel = SHIFT; + newRoot = null; + newTail = newTail && newTail.removeBefore(owner, 0, newOrigin); + + // Otherwise, if the root has been trimmed, garbage collect. + } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) { + offsetShift = 0; + + // Identify the new top root node of the subtree of the old root. + while (newRoot) { + var beginIndex = (newOrigin >>> newLevel) & MASK; + if (beginIndex !== (newTailOffset >>> newLevel) & MASK) { + break; + } + if (beginIndex) { + offsetShift += (1 << newLevel) * beginIndex; + } + newLevel -= SHIFT; + newRoot = newRoot.array[beginIndex]; } - if (!valueA || !valueB) { - return false; + + // Trim the new sides of the new root. + if (newRoot && newOrigin > oldOrigin) { + newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift); + } + if (newRoot && newTailOffset < oldTailOffset) { + newRoot = newRoot.removeAfter(owner, newLevel, newTailOffset - offsetShift); + } + if (offsetShift) { + newOrigin -= offsetShift; + newCapacity -= offsetShift; } } - if (typeof valueA.equals === 'function' && - typeof valueB.equals === 'function' && - valueA.equals(valueB)) { - return true; + + if (list.__ownerID) { + list.size = newCapacity - newOrigin; + list._origin = newOrigin; + list._capacity = newCapacity; + list._level = newLevel; + list._root = newRoot; + list._tail = newTail; + list.__hash = undefined; + list.__altered = true; + return list; } - return false; + return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail); } - function deepEqual(a, b) { - if (a === b) { - return true; + function mergeIntoListWith(list, merger, iterables) { + var iters = []; + var maxSize = 0; + for (var ii = 0; ii < iterables.length; ii++) { + var value = iterables[ii]; + var iter = IndexedIterable(value); + if (iter.size > maxSize) { + maxSize = iter.size; + } + if (!isIterable(value)) { + iter = iter.map(function(v ) {return fromJS(v)}); + } + iters.push(iter); } - - if ( - !isIterable(b) || - a.size !== undefined && b.size !== undefined && a.size !== b.size || - a.__hash !== undefined && b.__hash !== undefined && a.__hash !== b.__hash || - isKeyed(a) !== isKeyed(b) || - isIndexed(a) !== isIndexed(b) || - isOrdered(a) !== isOrdered(b) - ) { - return false; + if (maxSize > list.size) { + list = list.setSize(maxSize); } + return mergeIntoCollectionWith(list, merger, iters); + } - if (a.size === 0 && b.size === 0) { - return true; - } + function getTailOffset(size) { + return size < SIZE ? 0 : (((size - 1) >>> SHIFT) << SHIFT); + } - var notAssociative = !isAssociative(a); + createClass(OrderedMap, Map); - if (isOrdered(a)) { - var entries = a.entries(); - return b.every(function(v, k) { - var entry = entries.next().value; - return entry && is(entry[1], v) && (notAssociative || is(entry[0], k)); - }) && entries.next().done; + // @pragma Construction + + function OrderedMap(value) { + return value === null || value === undefined ? emptyOrderedMap() : + isOrderedMap(value) ? value : + emptyOrderedMap().withMutations(function(map ) { + var iter = KeyedIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v, k) {return map.set(k, v)}); + }); } - var flipped = false; + OrderedMap.of = function(/*...values*/) { + return this(arguments); + }; - if (a.size === undefined) { - if (b.size === undefined) { - if (typeof a.cacheResult === 'function') { - a.cacheResult(); - } - } else { - flipped = true; - var _ = a; - a = b; - b = _; - } - } + OrderedMap.prototype.toString = function() { + return this.__toString('OrderedMap {', '}'); + }; - var allEqual = true; - var bSize = b.__iterate(function(v, k) { - if (notAssociative ? !a.has(v) : - flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)) { - allEqual = false; - return false; - } - }); + // @pragma Access - return allEqual && a.size === bSize; - } + OrderedMap.prototype.get = function(k, notSetValue) { + var index = this._map.get(k); + return index !== undefined ? this._list.get(index)[1] : notSetValue; + }; - createClass(Repeat, IndexedSeq); + // @pragma Modification - function Repeat(value, times) { - if (!(this instanceof Repeat)) { - return new Repeat(value, times); - } - this._value = value; - this.size = times === undefined ? Infinity : Math.max(0, times); + OrderedMap.prototype.clear = function() { if (this.size === 0) { - if (EMPTY_REPEAT) { - return EMPTY_REPEAT; - } - EMPTY_REPEAT = this; + return this; } - } - - Repeat.prototype.toString = function() { - if (this.size === 0) { - return 'Repeat []'; + if (this.__ownerID) { + this.size = 0; + this._map.clear(); + this._list.clear(); + return this; } - return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]'; + return emptyOrderedMap(); }; - Repeat.prototype.get = function(index, notSetValue) { - return this.has(index) ? this._value : notSetValue; + OrderedMap.prototype.set = function(k, v) { + return updateOrderedMap(this, k, v); }; - Repeat.prototype.includes = function(searchValue) { - return is(this._value, searchValue); + OrderedMap.prototype.remove = function(k) { + return updateOrderedMap(this, k, NOT_SET); }; - Repeat.prototype.slice = function(begin, end) { - var size = this.size; - return wholeSlice(begin, end, size) ? this : - new Repeat(this._value, resolveEnd(end, size) - resolveBegin(begin, size)); + OrderedMap.prototype.wasAltered = function() { + return this._map.wasAltered() || this._list.wasAltered(); }; - Repeat.prototype.reverse = function() { - return this; + OrderedMap.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._list.__iterate( + function(entry ) {return entry && fn(entry[1], entry[0], this$0)}, + reverse + ); }; - Repeat.prototype.indexOf = function(searchValue) { - if (is(this._value, searchValue)) { - return 0; - } - return -1; + OrderedMap.prototype.__iterator = function(type, reverse) { + return this._list.fromEntrySeq().__iterator(type, reverse); }; - Repeat.prototype.lastIndexOf = function(searchValue) { - if (is(this._value, searchValue)) { - return this.size; + OrderedMap.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; } - return -1; - }; - - Repeat.prototype.__iterate = function(fn, reverse) { - for (var ii = 0; ii < this.size; ii++) { - if (fn(this._value, ii, this) === false) { - return ii + 1; - } + var newMap = this._map.__ensureOwner(ownerID); + var newList = this._list.__ensureOwner(ownerID); + if (!ownerID) { + this.__ownerID = ownerID; + this._map = newMap; + this._list = newList; + return this; } - return ii; + return makeOrderedMap(newMap, newList, ownerID, this.__hash); }; - Repeat.prototype.__iterator = function(type, reverse) {var this$0 = this; - var ii = 0; - return new Iterator(function() - {return ii < this$0.size ? iteratorValue(type, ii++, this$0._value) : iteratorDone()} - ); - }; - Repeat.prototype.equals = function(other) { - return other instanceof Repeat ? - is(this._value, other._value) : - deepEqual(other); - }; + function isOrderedMap(maybeOrderedMap) { + return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap); + } + OrderedMap.isOrderedMap = isOrderedMap; - var EMPTY_REPEAT; + OrderedMap.prototype[IS_ORDERED_SENTINEL] = true; + OrderedMap.prototype[DELETE] = OrderedMap.prototype.remove; - function invariant(condition, error) { - if (!condition) throw new Error(error); + + + function makeOrderedMap(map, list, ownerID, hash) { + var omap = Object.create(OrderedMap.prototype); + omap.size = map ? map.size : 0; + omap._map = map; + omap._list = list; + omap.__ownerID = ownerID; + omap.__hash = hash; + return omap; } - createClass(Range, IndexedSeq); + var EMPTY_ORDERED_MAP; + function emptyOrderedMap() { + return EMPTY_ORDERED_MAP || (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList())); + } - function Range(start, end, step) { - if (!(this instanceof Range)) { - return new Range(start, end, step); - } - invariant(step !== 0, 'Cannot step a Range by 0'); - start = start || 0; - if (end === undefined) { - end = Infinity; + function updateOrderedMap(omap, k, v) { + var map = omap._map; + var list = omap._list; + var i = map.get(k); + var has = i !== undefined; + var newMap; + var newList; + if (v === NOT_SET) { // removed + if (!has) { + return omap; } - step = step === undefined ? 1 : Math.abs(step); - if (end < start) { - step = -step; + if (list.size >= SIZE && list.size >= map.size * 2) { + newList = list.filter(function(entry, idx) {return entry !== undefined && i !== idx}); + newMap = newList.toKeyedSeq().map(function(entry ) {return entry[0]}).flip().toMap(); + if (omap.__ownerID) { + newMap.__ownerID = newList.__ownerID = omap.__ownerID; + } + } else { + newMap = map.remove(k); + newList = i === list.size - 1 ? list.pop() : list.set(i, undefined); } - this._start = start; - this._end = end; - this._step = step; - this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1); - if (this.size === 0) { - if (EMPTY_RANGE) { - return EMPTY_RANGE; + } else { + if (has) { + if (v === list.get(i)[1]) { + return omap; } - EMPTY_RANGE = this; + newMap = map; + newList = list.set(i, [k, v]); + } else { + newMap = map.set(k, list.size); + newList = list.set(list.size, [k, v]); } } + if (omap.__ownerID) { + omap.size = newMap.size; + omap._map = newMap; + omap._list = newList; + omap.__hash = undefined; + return omap; + } + return makeOrderedMap(newMap, newList); + } - Range.prototype.toString = function() { - if (this.size === 0) { - return 'Range []'; - } - return 'Range [ ' + - this._start + '...' + this._end + - (this._step !== 1 ? ' by ' + this._step : '') + - ' ]'; + createClass(ToKeyedSequence, KeyedSeq); + function ToKeyedSequence(indexed, useKeys) { + this._iter = indexed; + this._useKeys = useKeys; + this.size = indexed.size; + } + + ToKeyedSequence.prototype.get = function(key, notSetValue) { + return this._iter.get(key, notSetValue); }; - Range.prototype.get = function(index, notSetValue) { - return this.has(index) ? - this._start + wrapIndex(this, index) * this._step : - notSetValue; + ToKeyedSequence.prototype.has = function(key) { + return this._iter.has(key); }; - Range.prototype.includes = function(searchValue) { - var possibleIndex = (searchValue - this._start) / this._step; - return possibleIndex >= 0 && - possibleIndex < this.size && - possibleIndex === Math.floor(possibleIndex); + ToKeyedSequence.prototype.valueSeq = function() { + return this._iter.valueSeq(); }; - Range.prototype.slice = function(begin, end) { - if (wholeSlice(begin, end, this.size)) { - return this; - } - begin = resolveBegin(begin, this.size); - end = resolveEnd(end, this.size); - if (end <= begin) { - return new Range(0, 0); + ToKeyedSequence.prototype.reverse = function() {var this$0 = this; + var reversedSequence = reverseFactory(this, true); + if (!this._useKeys) { + reversedSequence.valueSeq = function() {return this$0._iter.toSeq().reverse()}; } - return new Range(this.get(begin, this._end), this.get(end, this._end), this._step); + return reversedSequence; }; - Range.prototype.indexOf = function(searchValue) { - var offsetValue = searchValue - this._start; - if (offsetValue % this._step === 0) { - var index = offsetValue / this._step; - if (index >= 0 && index < this.size) { - return index - } + ToKeyedSequence.prototype.map = function(mapper, context) {var this$0 = this; + var mappedSequence = mapFactory(this, mapper, context); + if (!this._useKeys) { + mappedSequence.valueSeq = function() {return this$0._iter.toSeq().map(mapper, context)}; } - return -1; + return mappedSequence; }; - Range.prototype.lastIndexOf = function(searchValue) { - return this.indexOf(searchValue); + ToKeyedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + var ii; + return this._iter.__iterate( + this._useKeys ? + function(v, k) {return fn(v, k, this$0)} : + ((ii = reverse ? resolveSize(this) : 0), + function(v ) {return fn(v, reverse ? --ii : ii++, this$0)}), + reverse + ); }; - Range.prototype.__iterate = function(fn, reverse) { - var maxIndex = this.size - 1; - var step = this._step; - var value = reverse ? this._start + maxIndex * step : this._start; - for (var ii = 0; ii <= maxIndex; ii++) { - if (fn(value, ii, this) === false) { - return ii + 1; - } - value += reverse ? -step : step; + ToKeyedSequence.prototype.__iterator = function(type, reverse) { + if (this._useKeys) { + return this._iter.__iterator(type, reverse); } - return ii; - }; - - Range.prototype.__iterator = function(type, reverse) { - var maxIndex = this.size - 1; - var step = this._step; - var value = reverse ? this._start + maxIndex * step : this._start; - var ii = 0; + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + var ii = reverse ? resolveSize(this) : 0; return new Iterator(function() { - var v = value; - value += reverse ? -step : step; - return ii > maxIndex ? iteratorDone() : iteratorValue(type, ii++, v); + var step = iterator.next(); + return step.done ? step : + iteratorValue(type, reverse ? --ii : ii++, step.value, step); }); }; - Range.prototype.equals = function(other) { - return other instanceof Range ? - this._start === other._start && - this._end === other._end && - this._step === other._step : - deepEqual(this, other); - }; - + ToKeyedSequence.prototype[IS_ORDERED_SENTINEL] = true; - var EMPTY_RANGE; - createClass(Collection, Iterable); - function Collection() { - throw TypeError('Abstract'); + createClass(ToIndexedSequence, IndexedSeq); + function ToIndexedSequence(iter) { + this._iter = iter; + this.size = iter.size; } + ToIndexedSequence.prototype.includes = function(value) { + return this._iter.includes(value); + }; - createClass(KeyedCollection, Collection);function KeyedCollection() {} - - createClass(IndexedCollection, Collection);function IndexedCollection() {} - - createClass(SetCollection, Collection);function SetCollection() {} + ToIndexedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + var iterations = 0; + return this._iter.__iterate(function(v ) {return fn(v, iterations++, this$0)}, reverse); + }; - - Collection.Keyed = KeyedCollection; - Collection.Indexed = IndexedCollection; - Collection.Set = SetCollection; - - var imul = - typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ? - Math.imul : - function imul(a, b) { - a = a | 0; // int - b = b | 0; // int - var c = a & 0xffff; - var d = b & 0xffff; - // Shift by 0 fixes the sign on the high part. - return (c * d) + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0) | 0; // int + ToIndexedSequence.prototype.__iterator = function(type, reverse) { + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + var iterations = 0; + return new Iterator(function() { + var step = iterator.next(); + return step.done ? step : + iteratorValue(type, iterations++, step.value, step) + }); }; - // v8 has an optimization for storing 31-bit signed numbers. - // Values which have either 00 or 11 as the high order bits qualify. - // This function drops the highest order bit in a signed number, maintaining - // the sign bit. - function smi(i32) { - return ((i32 >>> 1) & 0x40000000) | (i32 & 0xBFFFFFFF); - } - function hash(o) { - if (o === false || o === null || o === undefined) { - return 0; - } - if (typeof o.valueOf === 'function') { - o = o.valueOf(); - if (o === false || o === null || o === undefined) { - return 0; - } - } - if (o === true) { - return 1; - } - var type = typeof o; - if (type === 'number') { - if (o !== o || o === Infinity) { - return 0; - } - var h = o | 0; - if (h !== o) { - h ^= o * 0xFFFFFFFF; - } - while (o > 0xFFFFFFFF) { - o /= 0xFFFFFFFF; - h ^= o; - } - return smi(h); - } - if (type === 'string') { - return o.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(o) : hashString(o); - } - if (typeof o.hashCode === 'function') { - return o.hashCode(); - } - if (type === 'object') { - return hashJSObj(o); - } - if (typeof o.toString === 'function') { - return hashString(o.toString()); - } - throw new Error('Value type ' + type + ' cannot be hashed.'); - } - function cachedHashString(string) { - var hash = stringHashCache[string]; - if (hash === undefined) { - hash = hashString(string); - if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) { - STRING_HASH_CACHE_SIZE = 0; - stringHashCache = {}; - } - STRING_HASH_CACHE_SIZE++; - stringHashCache[string] = hash; + createClass(ToSetSequence, SetSeq); + function ToSetSequence(iter) { + this._iter = iter; + this.size = iter.size; } - return hash; - } - // http://jsperf.com/hashing-strings - function hashString(string) { - // This is the hash from JVM - // The hash code for a string is computed as - // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1], - // where s[i] is the ith character of the string and n is the length of - // the string. We "mod" the result to make it between 0 (inclusive) and 2^31 - // (exclusive) by dropping high bits. - var hash = 0; - for (var ii = 0; ii < string.length; ii++) { - hash = 31 * hash + string.charCodeAt(ii) | 0; - } - return smi(hash); - } + ToSetSequence.prototype.has = function(key) { + return this._iter.includes(key); + }; - function hashJSObj(obj) { - var hash; - if (usingWeakMap) { - hash = weakMap.get(obj); - if (hash !== undefined) { - return hash; - } - } + ToSetSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._iter.__iterate(function(v ) {return fn(v, v, this$0)}, reverse); + }; - hash = obj[UID_HASH_KEY]; - if (hash !== undefined) { - return hash; - } + ToSetSequence.prototype.__iterator = function(type, reverse) { + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + return new Iterator(function() { + var step = iterator.next(); + return step.done ? step : + iteratorValue(type, step.value, step.value, step); + }); + }; - if (!canDefineProperty) { - hash = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY]; - if (hash !== undefined) { - return hash; - } - hash = getIENodeHash(obj); - if (hash !== undefined) { - return hash; - } - } - hash = ++objHashUID; - if (objHashUID & 0x40000000) { - objHashUID = 0; + createClass(FromEntriesSequence, KeyedSeq); + function FromEntriesSequence(entries) { + this._iter = entries; + this.size = entries.size; } - if (usingWeakMap) { - weakMap.set(obj, hash); - } else if (isExtensible !== undefined && isExtensible(obj) === false) { - throw new Error('Non-extensible objects are not allowed as keys.'); - } else if (canDefineProperty) { - Object.defineProperty(obj, UID_HASH_KEY, { - 'enumerable': false, - 'configurable': false, - 'writable': false, - 'value': hash + FromEntriesSequence.prototype.entrySeq = function() { + return this._iter.toSeq(); + }; + + FromEntriesSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._iter.__iterate(function(entry ) { + // Check if entry exists first so array access doesn't throw for holes + // in the parent iteration. + if (entry) { + validateEntry(entry); + var indexedIterable = isIterable(entry); + return fn( + indexedIterable ? entry.get(1) : entry[1], + indexedIterable ? entry.get(0) : entry[0], + this$0 + ); + } + }, reverse); + }; + + FromEntriesSequence.prototype.__iterator = function(type, reverse) { + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + return new Iterator(function() { + while (true) { + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + // Check if entry exists first so array access doesn't throw for holes + // in the parent iteration. + if (entry) { + validateEntry(entry); + var indexedIterable = isIterable(entry); + return iteratorValue( + type, + indexedIterable ? entry.get(0) : entry[0], + indexedIterable ? entry.get(1) : entry[1], + step + ); + } + } }); - } else if (obj.propertyIsEnumerable !== undefined && - obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable) { - // Since we can't define a non-enumerable property on the object - // we'll hijack one of the less-used non-enumerable properties to - // save our hash on it. Since this is a function it will not show up in - // `JSON.stringify` which is what we want. - obj.propertyIsEnumerable = function() { - return this.constructor.prototype.propertyIsEnumerable.apply(this, arguments); - }; - obj.propertyIsEnumerable[UID_HASH_KEY] = hash; - } else if (obj.nodeType !== undefined) { - // At this point we couldn't get the IE `uniqueID` to use as a hash - // and we couldn't use a non-enumerable property to exploit the - // dontEnum bug so we simply add the `UID_HASH_KEY` on the node - // itself. - obj[UID_HASH_KEY] = hash; - } else { - throw new Error('Unable to set a non-enumerable property on object.'); - } + }; - return hash; - } - // Get references to ES5 object methods. - var isExtensible = Object.isExtensible; + ToIndexedSequence.prototype.cacheResult = + ToKeyedSequence.prototype.cacheResult = + ToSetSequence.prototype.cacheResult = + FromEntriesSequence.prototype.cacheResult = + cacheResultThrough; - // True if Object.defineProperty works as expected. IE8 fails this test. - var canDefineProperty = (function() { - try { - Object.defineProperty({}, '@', {}); - return true; - } catch (e) { - return false; - } - }()); - // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it - // and avoid memory leaks from the IE cloneNode bug. - function getIENodeHash(node) { - if (node && node.nodeType > 0) { - switch (node.nodeType) { - case 1: // Element - return node.uniqueID; - case 9: // Document - return node.documentElement && node.documentElement.uniqueID; + function flipFactory(iterable) { + var flipSequence = makeSequence(iterable); + flipSequence._iter = iterable; + flipSequence.size = iterable.size; + flipSequence.flip = function() {return iterable}; + flipSequence.reverse = function () { + var reversedSequence = iterable.reverse.apply(this); // super.reverse() + reversedSequence.flip = function() {return iterable.reverse()}; + return reversedSequence; + }; + flipSequence.has = function(key ) {return iterable.includes(key)}; + flipSequence.includes = function(key ) {return iterable.has(key)}; + flipSequence.cacheResult = cacheResultThrough; + flipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + return iterable.__iterate(function(v, k) {return fn(k, v, this$0) !== false}, reverse); + } + flipSequence.__iteratorUncached = function(type, reverse) { + if (type === ITERATE_ENTRIES) { + var iterator = iterable.__iterator(type, reverse); + return new Iterator(function() { + var step = iterator.next(); + if (!step.done) { + var k = step.value[0]; + step.value[0] = step.value[1]; + step.value[1] = k; + } + return step; + }); } + return iterable.__iterator( + type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES, + reverse + ); } + return flipSequence; } - // If possible, use a WeakMap. - var usingWeakMap = typeof WeakMap === 'function'; - var weakMap; - if (usingWeakMap) { - weakMap = new WeakMap(); - } - - var objHashUID = 0; - var UID_HASH_KEY = '__immutablehash__'; - if (typeof Symbol === 'function') { - UID_HASH_KEY = Symbol(UID_HASH_KEY); + function mapFactory(iterable, mapper, context) { + var mappedSequence = makeSequence(iterable); + mappedSequence.size = iterable.size; + mappedSequence.has = function(key ) {return iterable.has(key)}; + mappedSequence.get = function(key, notSetValue) { + var v = iterable.get(key, NOT_SET); + return v === NOT_SET ? + notSetValue : + mapper.call(context, v, key, iterable); + }; + mappedSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + return iterable.__iterate( + function(v, k, c) {return fn(mapper.call(context, v, k, c), k, this$0) !== false}, + reverse + ); + } + mappedSequence.__iteratorUncached = function (type, reverse) { + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + return new Iterator(function() { + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + var key = entry[0]; + return iteratorValue( + type, + key, + mapper.call(context, entry[1], key, iterable), + step + ); + }); + } + return mappedSequence; } - var STRING_HASH_CACHE_MIN_STRLEN = 16; - var STRING_HASH_CACHE_MAX_SIZE = 255; - var STRING_HASH_CACHE_SIZE = 0; - var stringHashCache = {}; - function assertNotInfinite(size) { - invariant( - size !== Infinity, - 'Cannot perform this action with an infinite size.' - ); + function reverseFactory(iterable, useKeys) { + var reversedSequence = makeSequence(iterable); + reversedSequence._iter = iterable; + reversedSequence.size = iterable.size; + reversedSequence.reverse = function() {return iterable}; + if (iterable.flip) { + reversedSequence.flip = function () { + var flipSequence = flipFactory(iterable); + flipSequence.reverse = function() {return iterable.flip()}; + return flipSequence; + }; + } + reversedSequence.get = function(key, notSetValue) + {return iterable.get(useKeys ? key : -1 - key, notSetValue)}; + reversedSequence.has = function(key ) + {return iterable.has(useKeys ? key : -1 - key)}; + reversedSequence.includes = function(value ) {return iterable.includes(value)}; + reversedSequence.cacheResult = cacheResultThrough; + reversedSequence.__iterate = function (fn, reverse) {var this$0 = this; + return iterable.__iterate(function(v, k) {return fn(v, k, this$0)}, !reverse); + }; + reversedSequence.__iterator = + function(type, reverse) {return iterable.__iterator(type, !reverse)}; + return reversedSequence; } - createClass(Map, KeyedCollection); - - // @pragma Construction - function Map(value) { - return value === null || value === undefined ? emptyMap() : - isMap(value) && !isOrdered(value) ? value : - emptyMap().withMutations(function(map ) { - var iter = KeyedIterable(value); - assertNotInfinite(iter.size); - iter.forEach(function(v, k) {return map.set(k, v)}); - }); + function filterFactory(iterable, predicate, context, useKeys) { + var filterSequence = makeSequence(iterable); + if (useKeys) { + filterSequence.has = function(key ) { + var v = iterable.get(key, NOT_SET); + return v !== NOT_SET && !!predicate.call(context, v, key, iterable); + }; + filterSequence.get = function(key, notSetValue) { + var v = iterable.get(key, NOT_SET); + return v !== NOT_SET && predicate.call(context, v, key, iterable) ? + v : notSetValue; + }; } - - Map.of = function() {var keyValues = SLICE$0.call(arguments, 0); - return emptyMap().withMutations(function(map ) { - for (var i = 0; i < keyValues.length; i += 2) { - if (i + 1 >= keyValues.length) { - throw new Error('Missing value for key: ' + keyValues[i]); + filterSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + var iterations = 0; + iterable.__iterate(function(v, k, c) { + if (predicate.call(context, v, k, c)) { + iterations++; + return fn(v, useKeys ? k : iterations - 1, this$0); + } + }, reverse); + return iterations; + }; + filterSequence.__iteratorUncached = function (type, reverse) { + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + var iterations = 0; + return new Iterator(function() { + while (true) { + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + var key = entry[0]; + var value = entry[1]; + if (predicate.call(context, value, key, iterable)) { + return iteratorValue(type, useKeys ? key : iterations++, value, step); } - map.set(keyValues[i], keyValues[i + 1]); } }); - }; - - Map.prototype.toString = function() { - return this.__toString('Map {', '}'); - }; - - // @pragma Access - - Map.prototype.get = function(k, notSetValue) { - return this._root ? - this._root.get(0, undefined, k, notSetValue) : - notSetValue; - }; + } + return filterSequence; + } - // @pragma Modification - Map.prototype.set = function(k, v) { - return updateMap(this, k, v); - }; + function countByFactory(iterable, grouper, context) { + var groups = Map().asMutable(); + iterable.__iterate(function(v, k) { + groups.update( + grouper.call(context, v, k, iterable), + 0, + function(a ) {return a + 1} + ); + }); + return groups.asImmutable(); + } - Map.prototype.setIn = function(keyPath, v) { - return this.updateIn(keyPath, NOT_SET, function() {return v}); - }; - Map.prototype.remove = function(k) { - return updateMap(this, k, NOT_SET); - }; + function groupByFactory(iterable, grouper, context) { + var isKeyedIter = isKeyed(iterable); + var groups = (isOrdered(iterable) ? OrderedMap() : Map()).asMutable(); + iterable.__iterate(function(v, k) { + groups.update( + grouper.call(context, v, k, iterable), + function(a ) {return (a = a || [], a.push(isKeyedIter ? [k, v] : v), a)} + ); + }); + var coerce = iterableClass(iterable); + return groups.map(function(arr ) {return reify(iterable, coerce(arr))}); + } - Map.prototype.deleteIn = function(keyPath) { - return this.updateIn(keyPath, function() {return NOT_SET}); - }; - Map.prototype.update = function(k, notSetValue, updater) { - return arguments.length === 1 ? - k(this) : - this.updateIn([k], notSetValue, updater); - }; + function sliceFactory(iterable, begin, end, useKeys) { + var originalSize = iterable.size; - Map.prototype.updateIn = function(keyPath, notSetValue, updater) { - if (!updater) { - updater = notSetValue; - notSetValue = undefined; + // Sanitize begin & end using this shorthand for ToInt32(argument) + // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 + if (begin !== undefined) { + begin = begin | 0; + } + if (end !== undefined) { + if (end === Infinity) { + end = originalSize; + } else { + end = end | 0; } - var updatedValue = updateInDeepMap( - this, - forceIterator(keyPath), - notSetValue, - updater - ); - return updatedValue === NOT_SET ? undefined : updatedValue; - }; + } - Map.prototype.clear = function() { - if (this.size === 0) { - return this; - } - if (this.__ownerID) { - this.size = 0; - this._root = null; - this.__hash = undefined; - this.__altered = true; - return this; - } - return emptyMap(); - }; + if (wholeSlice(begin, end, originalSize)) { + return iterable; + } - // @pragma Composition + var resolvedBegin = resolveBegin(begin, originalSize); + var resolvedEnd = resolveEnd(end, originalSize); - Map.prototype.merge = function(/*...iters*/) { - return mergeIntoMapWith(this, undefined, arguments); - }; - - Map.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); - return mergeIntoMapWith(this, merger, iters); - }; - - Map.prototype.mergeIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1); - return this.updateIn( - keyPath, - emptyMap(), - function(m ) {return typeof m.merge === 'function' ? - m.merge.apply(m, iters) : - iters[iters.length - 1]} - ); - }; + // begin or end will be NaN if they were provided as negative numbers and + // this iterable's size is unknown. In that case, cache first so there is + // a known size and these do not resolve to NaN. + if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) { + return sliceFactory(iterable.toSeq().cacheResult(), begin, end, useKeys); + } - Map.prototype.mergeDeep = function(/*...iters*/) { - return mergeIntoMapWith(this, deepMerger, arguments); - }; + // Note: resolvedEnd is undefined when the original sequence's length is + // unknown and this slice did not supply an end and should contain all + // elements after resolvedBegin. + // In that case, resolvedSize will be NaN and sliceSize will remain undefined. + var resolvedSize = resolvedEnd - resolvedBegin; + var sliceSize; + if (resolvedSize === resolvedSize) { + sliceSize = resolvedSize < 0 ? 0 : resolvedSize; + } - Map.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1); - return mergeIntoMapWith(this, deepMergerWith(merger), iters); - }; + var sliceSeq = makeSequence(iterable); - Map.prototype.mergeDeepIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1); - return this.updateIn( - keyPath, - emptyMap(), - function(m ) {return typeof m.mergeDeep === 'function' ? - m.mergeDeep.apply(m, iters) : - iters[iters.length - 1]} - ); - }; + // If iterable.size is undefined, the size of the realized sliceSeq is + // unknown at this point unless the number of items to slice is 0 + sliceSeq.size = sliceSize === 0 ? sliceSize : iterable.size && sliceSize || undefined; - Map.prototype.sort = function(comparator) { - // Late binding - return OrderedMap(sortFactory(this, comparator)); - }; + if (!useKeys && isSeq(iterable) && sliceSize >= 0) { + sliceSeq.get = function (index, notSetValue) { + index = wrapIndex(this, index); + return index >= 0 && index < sliceSize ? + iterable.get(index + resolvedBegin, notSetValue) : + notSetValue; + } + } - Map.prototype.sortBy = function(mapper, comparator) { - // Late binding - return OrderedMap(sortFactory(this, comparator, mapper)); + sliceSeq.__iterateUncached = function(fn, reverse) {var this$0 = this; + if (sliceSize === 0) { + return 0; + } + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var skipped = 0; + var isSkipping = true; + var iterations = 0; + iterable.__iterate(function(v, k) { + if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) { + iterations++; + return fn(v, useKeys ? k : iterations - 1, this$0) !== false && + iterations !== sliceSize; + } + }); + return iterations; }; - // @pragma Mutability + sliceSeq.__iteratorUncached = function(type, reverse) { + if (sliceSize !== 0 && reverse) { + return this.cacheResult().__iterator(type, reverse); + } + // Don't bother instantiating parent iterator if taking 0. + var iterator = sliceSize !== 0 && iterable.__iterator(type, reverse); + var skipped = 0; + var iterations = 0; + return new Iterator(function() { + while (skipped++ < resolvedBegin) { + iterator.next(); + } + if (++iterations > sliceSize) { + return iteratorDone(); + } + var step = iterator.next(); + if (useKeys || type === ITERATE_VALUES) { + return step; + } else if (type === ITERATE_KEYS) { + return iteratorValue(type, iterations - 1, undefined, step); + } else { + return iteratorValue(type, iterations - 1, step.value[1], step); + } + }); + } - Map.prototype.withMutations = function(fn) { - var mutable = this.asMutable(); - fn(mutable); - return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this; - }; + return sliceSeq; + } - Map.prototype.asMutable = function() { - return this.__ownerID ? this : this.__ensureOwner(new OwnerID()); - }; - Map.prototype.asImmutable = function() { - return this.__ensureOwner(); + function takeWhileFactory(iterable, predicate, context) { + var takeSequence = makeSequence(iterable); + takeSequence.__iterateUncached = function(fn, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var iterations = 0; + iterable.__iterate(function(v, k, c) + {return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$0)} + ); + return iterations; }; - - Map.prototype.wasAltered = function() { - return this.__altered; + takeSequence.__iteratorUncached = function(type, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterator(type, reverse); + } + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + var iterating = true; + return new Iterator(function() { + if (!iterating) { + return iteratorDone(); + } + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + var k = entry[0]; + var v = entry[1]; + if (!predicate.call(context, v, k, this$0)) { + iterating = false; + return iteratorDone(); + } + return type === ITERATE_ENTRIES ? step : + iteratorValue(type, k, v, step); + }); }; + return takeSequence; + } - Map.prototype.__iterator = function(type, reverse) { - return new MapIterator(this, type, reverse); - }; - Map.prototype.__iterate = function(fn, reverse) {var this$0 = this; + function skipWhileFactory(iterable, predicate, context, useKeys) { + var skipSequence = makeSequence(iterable); + skipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var isSkipping = true; var iterations = 0; - this._root && this._root.iterate(function(entry ) { - iterations++; - return fn(entry[1], entry[0], this$0); - }, reverse); + iterable.__iterate(function(v, k, c) { + if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) { + iterations++; + return fn(v, useKeys ? k : iterations - 1, this$0); + } + }); return iterations; }; - - Map.prototype.__ensureOwner = function(ownerID) { - if (ownerID === this.__ownerID) { - return this; - } - if (!ownerID) { - this.__ownerID = ownerID; - this.__altered = false; - return this; + skipSequence.__iteratorUncached = function(type, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterator(type, reverse); } - return makeMap(this.size, this._root, ownerID, this.__hash); + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + var skipping = true; + var iterations = 0; + return new Iterator(function() { + var step, k, v; + do { + step = iterator.next(); + if (step.done) { + if (useKeys || type === ITERATE_VALUES) { + return step; + } else if (type === ITERATE_KEYS) { + return iteratorValue(type, iterations++, undefined, step); + } else { + return iteratorValue(type, iterations++, step.value[1], step); + } + } + var entry = step.value; + k = entry[0]; + v = entry[1]; + skipping && (skipping = predicate.call(context, v, k, this$0)); + } while (skipping); + return type === ITERATE_ENTRIES ? step : + iteratorValue(type, k, v, step); + }); }; + return skipSequence; + } - function isMap(maybeMap) { - return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]); - } + function concatFactory(iterable, values) { + var isKeyedIterable = isKeyed(iterable); + var iters = [iterable].concat(values).map(function(v ) { + if (!isIterable(v)) { + v = isKeyedIterable ? + keyedSeqFromValue(v) : + indexedSeqFromValue(Array.isArray(v) ? v : [v]); + } else if (isKeyedIterable) { + v = KeyedIterable(v); + } + return v; + }).filter(function(v ) {return v.size !== 0}); - Map.isMap = isMap; + if (iters.length === 0) { + return iterable; + } - var IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@'; + if (iters.length === 1) { + var singleton = iters[0]; + if (singleton === iterable || + isKeyedIterable && isKeyed(singleton) || + isIndexed(iterable) && isIndexed(singleton)) { + return singleton; + } + } - var MapPrototype = Map.prototype; - MapPrototype[IS_MAP_SENTINEL] = true; - MapPrototype[DELETE] = MapPrototype.remove; - MapPrototype.removeIn = MapPrototype.deleteIn; + var concatSeq = new ArraySeq(iters); + if (isKeyedIterable) { + concatSeq = concatSeq.toKeyedSeq(); + } else if (!isIndexed(iterable)) { + concatSeq = concatSeq.toSetSeq(); + } + concatSeq = concatSeq.flatten(true); + concatSeq.size = iters.reduce( + function(sum, seq) { + if (sum !== undefined) { + var size = seq.size; + if (size !== undefined) { + return sum + size; + } + } + }, + 0 + ); + return concatSeq; + } - // #pragma Trie Nodes + function flattenFactory(iterable, depth, useKeys) { + var flatSequence = makeSequence(iterable); + flatSequence.__iterateUncached = function(fn, reverse) { + var iterations = 0; + var stopped = false; + function flatDeep(iter, currentDepth) {var this$0 = this; + iter.__iterate(function(v, k) { + if ((!depth || currentDepth < depth) && isIterable(v)) { + flatDeep(v, currentDepth + 1); + } else if (fn(v, useKeys ? k : iterations++, this$0) === false) { + stopped = true; + } + return !stopped; + }, reverse); + } + flatDeep(iterable, 0); + return iterations; + } + flatSequence.__iteratorUncached = function(type, reverse) { + var iterator = iterable.__iterator(type, reverse); + var stack = []; + var iterations = 0; + return new Iterator(function() { + while (iterator) { + var step = iterator.next(); + if (step.done !== false) { + iterator = stack.pop(); + continue; + } + var v = step.value; + if (type === ITERATE_ENTRIES) { + v = v[1]; + } + if ((!depth || stack.length < depth) && isIterable(v)) { + stack.push(iterator); + iterator = v.__iterator(type, reverse); + } else { + return useKeys ? step : iteratorValue(type, iterations++, v, step); + } + } + return iteratorDone(); + }); + } + return flatSequence; + } + function flatMapFactory(iterable, mapper, context) { + var coerce = iterableClass(iterable); + return iterable.toSeq().map( + function(v, k) {return coerce(mapper.call(context, v, k, iterable))} + ).flatten(true); + } - function ArrayMapNode(ownerID, entries) { - this.ownerID = ownerID; - this.entries = entries; - } - ArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) { - var entries = this.entries; - for (var ii = 0, len = entries.length; ii < len; ii++) { - if (is(key, entries[ii][0])) { - return entries[ii][1]; + function interposeFactory(iterable, separator) { + var interposedSequence = makeSequence(iterable); + interposedSequence.size = iterable.size && iterable.size * 2 -1; + interposedSequence.__iterateUncached = function(fn, reverse) {var this$0 = this; + var iterations = 0; + iterable.__iterate(function(v, k) + {return (!iterations || fn(separator, iterations++, this$0) !== false) && + fn(v, iterations++, this$0) !== false}, + reverse + ); + return iterations; + }; + interposedSequence.__iteratorUncached = function(type, reverse) { + var iterator = iterable.__iterator(ITERATE_VALUES, reverse); + var iterations = 0; + var step; + return new Iterator(function() { + if (!step || iterations % 2) { + step = iterator.next(); + if (step.done) { + return step; + } } - } - return notSetValue; + return iterations % 2 ? + iteratorValue(type, iterations++, separator) : + iteratorValue(type, iterations++, step.value, step); + }); }; + return interposedSequence; + } - ArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { - var removed = value === NOT_SET; - - var entries = this.entries; - var idx = 0; - for (var len = entries.length; idx < len; idx++) { - if (is(key, entries[idx][0])) { - break; - } - } - var exists = idx < len; - if (exists ? entries[idx][1] === value : removed) { - return this; - } + function sortFactory(iterable, comparator, mapper) { + if (!comparator) { + comparator = defaultComparator; + } + var isKeyedIterable = isKeyed(iterable); + var index = 0; + var entries = iterable.toSeq().map( + function(v, k) {return [k, v, index++, mapper ? mapper(v, k, iterable) : v]} + ).toArray(); + entries.sort(function(a, b) {return comparator(a[3], b[3]) || a[2] - b[2]}).forEach( + isKeyedIterable ? + function(v, i) { entries[i].length = 2; } : + function(v, i) { entries[i] = v[1]; } + ); + return isKeyedIterable ? KeyedSeq(entries) : + isIndexed(iterable) ? IndexedSeq(entries) : + SetSeq(entries); + } - SetRef(didAlter); - (removed || !exists) && SetRef(didChangeSize); - if (removed && entries.length === 1) { - return; // undefined - } + function maxFactory(iterable, comparator, mapper) { + if (!comparator) { + comparator = defaultComparator; + } + if (mapper) { + var entry = iterable.toSeq() + .map(function(v, k) {return [v, mapper(v, k, iterable)]}) + .reduce(function(a, b) {return maxCompare(comparator, a[1], b[1]) ? b : a}); + return entry && entry[0]; + } else { + return iterable.reduce(function(a, b) {return maxCompare(comparator, a, b) ? b : a}); + } + } - if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) { - return createNodes(ownerID, entries, key, value); - } + function maxCompare(comparator, a, b) { + var comp = comparator(b, a); + // b is considered the new max if the comparator declares them equal, but + // they are not equal and b is in fact a nullish value. + return (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) || comp > 0; + } - var isEditable = ownerID && ownerID === this.ownerID; - var newEntries = isEditable ? entries : arrCopy(entries); - if (exists) { - if (removed) { - idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); - } else { - newEntries[idx] = [key, value]; + function zipWithFactory(keyIter, zipper, iters) { + var zipSequence = makeSequence(keyIter); + zipSequence.size = new ArraySeq(iters).map(function(i ) {return i.size}).min(); + // Note: this a generic base implementation of __iterate in terms of + // __iterator which may be more generically useful in the future. + zipSequence.__iterate = function(fn, reverse) { + /* generic: + var iterator = this.__iterator(ITERATE_ENTRIES, reverse); + var step; + var iterations = 0; + while (!(step = iterator.next()).done) { + iterations++; + if (fn(step.value[1], step.value[0], this) === false) { + break; } - } else { - newEntries.push([key, value]); } - - if (isEditable) { - this.entries = newEntries; - return this; + return iterations; + */ + // indexed: + var iterator = this.__iterator(ITERATE_VALUES, reverse); + var step; + var iterations = 0; + while (!(step = iterator.next()).done) { + if (fn(step.value, iterations++, this) === false) { + break; + } } - - return new ArrayMapNode(ownerID, newEntries); + return iterations; + }; + zipSequence.__iteratorUncached = function(type, reverse) { + var iterators = iters.map(function(i ) + {return (i = Iterable(i), getIterator(reverse ? i.reverse() : i))} + ); + var iterations = 0; + var isDone = false; + return new Iterator(function() { + var steps; + if (!isDone) { + steps = iterators.map(function(i ) {return i.next()}); + isDone = steps.some(function(s ) {return s.done}); + } + if (isDone) { + return iteratorDone(); + } + return iteratorValue( + type, + iterations++, + zipper.apply(null, steps.map(function(s ) {return s.value})) + ); + }); }; + return zipSequence + } + // #pragma Helper Functions + function reify(iter, seq) { + return isSeq(iter) ? seq : iter.constructor(seq); + } - function BitmapIndexedNode(ownerID, bitmap, nodes) { - this.ownerID = ownerID; - this.bitmap = bitmap; - this.nodes = nodes; + function validateEntry(entry) { + if (entry !== Object(entry)) { + throw new TypeError('Expected [K, V] tuple: ' + entry); } + } - BitmapIndexedNode.prototype.get = function(shift, keyHash, key, notSetValue) { - if (keyHash === undefined) { - keyHash = hash(key); - } - var bit = (1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK)); - var bitmap = this.bitmap; - return (bitmap & bit) === 0 ? notSetValue : - this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue); - }; + function resolveSize(iter) { + assertNotInfinite(iter.size); + return ensureSize(iter); + } - BitmapIndexedNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { - if (keyHash === undefined) { - keyHash = hash(key); - } - var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; - var bit = 1 << keyHashFrag; - var bitmap = this.bitmap; - var exists = (bitmap & bit) !== 0; + function iterableClass(iterable) { + return isKeyed(iterable) ? KeyedIterable : + isIndexed(iterable) ? IndexedIterable : + SetIterable; + } - if (!exists && value === NOT_SET) { - return this; - } + function makeSequence(iterable) { + return Object.create( + ( + isKeyed(iterable) ? KeyedSeq : + isIndexed(iterable) ? IndexedSeq : + SetSeq + ).prototype + ); + } - var idx = popCount(bitmap & (bit - 1)); - var nodes = this.nodes; - var node = exists ? nodes[idx] : undefined; - var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter); + function cacheResultThrough() { + if (this._iter.cacheResult) { + this._iter.cacheResult(); + this.size = this._iter.size; + return this; + } else { + return Seq.prototype.cacheResult.call(this); + } + } - if (newNode === node) { - return this; - } + function defaultComparator(a, b) { + return a > b ? 1 : a < b ? -1 : 0; + } - if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) { - return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode); + function forceIterator(keyPath) { + var iter = getIterator(keyPath); + if (!iter) { + // Array might not be iterable in this environment, so we need a fallback + // to our wrapped type. + if (!isArrayLike(keyPath)) { + throw new TypeError('Expected iterable or array-like: ' + keyPath); } + iter = getIterator(Iterable(keyPath)); + } + return iter; + } - if (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) { - return nodes[idx ^ 1]; - } + createClass(Record, KeyedCollection); - if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) { - return newNode; - } + function Record(defaultValues, name) { + var hasInitialized; - var isEditable = ownerID && ownerID === this.ownerID; - var newBitmap = exists ? newNode ? bitmap : bitmap ^ bit : bitmap | bit; - var newNodes = exists ? newNode ? - setIn(nodes, idx, newNode, isEditable) : - spliceOut(nodes, idx, isEditable) : - spliceIn(nodes, idx, newNode, isEditable); + var RecordType = function Record(values) { + if (values instanceof RecordType) { + return values; + } + if (!(this instanceof RecordType)) { + return new RecordType(values); + } + if (!hasInitialized) { + hasInitialized = true; + var keys = Object.keys(defaultValues); + setProps(RecordTypePrototype, keys); + RecordTypePrototype.size = keys.length; + RecordTypePrototype._name = name; + RecordTypePrototype._keys = keys; + RecordTypePrototype._defaultValues = defaultValues; + } + this._map = Map(values); + }; - if (isEditable) { - this.bitmap = newBitmap; - this.nodes = newNodes; - return this; - } + var RecordTypePrototype = RecordType.prototype = Object.create(RecordPrototype); + RecordTypePrototype.constructor = RecordType; - return new BitmapIndexedNode(ownerID, newBitmap, newNodes); + return RecordType; + } + + Record.prototype.toString = function() { + return this.__toString(recordName(this) + ' {', '}'); }; + // @pragma Access + Record.prototype.has = function(k) { + return this._defaultValues.hasOwnProperty(k); + }; + Record.prototype.get = function(k, notSetValue) { + if (!this.has(k)) { + return notSetValue; + } + var defaultVal = this._defaultValues[k]; + return this._map ? this._map.get(k, defaultVal) : defaultVal; + }; - function HashArrayMapNode(ownerID, count, nodes) { - this.ownerID = ownerID; - this.count = count; - this.nodes = nodes; - } + // @pragma Modification - HashArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) { - if (keyHash === undefined) { - keyHash = hash(key); + Record.prototype.clear = function() { + if (this.__ownerID) { + this._map && this._map.clear(); + return this; } - var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; - var node = this.nodes[idx]; - return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue; + var RecordType = this.constructor; + return RecordType._empty || (RecordType._empty = makeRecord(this, emptyMap())); }; - HashArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { - if (keyHash === undefined) { - keyHash = hash(key); + Record.prototype.set = function(k, v) { + if (!this.has(k)) { + throw new Error('Cannot set unknown key "' + k + '" on ' + recordName(this)); } - var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; - var removed = value === NOT_SET; - var nodes = this.nodes; - var node = nodes[idx]; - - if (removed && !node) { + if (this._map && !this._map.has(k)) { + var defaultVal = this._defaultValues[k]; + if (v === defaultVal) { + return this; + } + } + var newMap = this._map && this._map.set(k, v); + if (this.__ownerID || newMap === this._map) { return this; } + return makeRecord(this, newMap); + }; - var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter); - if (newNode === node) { + Record.prototype.remove = function(k) { + if (!this.has(k)) { return this; } - - var newCount = this.count; - if (!node) { - newCount++; - } else if (!newNode) { - newCount--; - if (newCount < MIN_HASH_ARRAY_MAP_SIZE) { - return packNodes(ownerID, nodes, newCount, idx); - } + var newMap = this._map && this._map.remove(k); + if (this.__ownerID || newMap === this._map) { + return this; } + return makeRecord(this, newMap); + }; - var isEditable = ownerID && ownerID === this.ownerID; - var newNodes = setIn(nodes, idx, newNode, isEditable); + Record.prototype.wasAltered = function() { + return this._map.wasAltered(); + }; - if (isEditable) { - this.count = newCount; - this.nodes = newNodes; + Record.prototype.__iterator = function(type, reverse) {var this$0 = this; + return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterator(type, reverse); + }; + + Record.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterate(fn, reverse); + }; + + Record.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { return this; } - - return new HashArrayMapNode(ownerID, newCount, newNodes); + var newMap = this._map && this._map.__ensureOwner(ownerID); + if (!ownerID) { + this.__ownerID = ownerID; + this._map = newMap; + return this; + } + return makeRecord(this, newMap, ownerID); }; + var RecordPrototype = Record.prototype; + RecordPrototype[DELETE] = RecordPrototype.remove; + RecordPrototype.deleteIn = + RecordPrototype.removeIn = MapPrototype.removeIn; + RecordPrototype.merge = MapPrototype.merge; + RecordPrototype.mergeWith = MapPrototype.mergeWith; + RecordPrototype.mergeIn = MapPrototype.mergeIn; + RecordPrototype.mergeDeep = MapPrototype.mergeDeep; + RecordPrototype.mergeDeepWith = MapPrototype.mergeDeepWith; + RecordPrototype.mergeDeepIn = MapPrototype.mergeDeepIn; + RecordPrototype.setIn = MapPrototype.setIn; + RecordPrototype.update = MapPrototype.update; + RecordPrototype.updateIn = MapPrototype.updateIn; + RecordPrototype.withMutations = MapPrototype.withMutations; + RecordPrototype.asMutable = MapPrototype.asMutable; + RecordPrototype.asImmutable = MapPrototype.asImmutable; - function HashCollisionNode(ownerID, keyHash, entries) { - this.ownerID = ownerID; - this.keyHash = keyHash; - this.entries = entries; + function makeRecord(likeRecord, map, ownerID) { + var record = Object.create(Object.getPrototypeOf(likeRecord)); + record._map = map; + record.__ownerID = ownerID; + return record; + } + + function recordName(record) { + return record._name || record.constructor.name || 'Record'; + } + + function setProps(prototype, names) { + try { + names.forEach(setProp.bind(undefined, prototype)); + } catch (error) { + // Object.defineProperty failed. Probably IE8. } + } - HashCollisionNode.prototype.get = function(shift, keyHash, key, notSetValue) { - var entries = this.entries; - for (var ii = 0, len = entries.length; ii < len; ii++) { - if (is(key, entries[ii][0])) { - return entries[ii][1]; - } + function setProp(prototype, name) { + Object.defineProperty(prototype, name, { + get: function() { + return this.get(name); + }, + set: function(value) { + invariant(this.__ownerID, 'Cannot set on an immutable record.'); + this.set(name, value); } - return notSetValue; + }); + } + + createClass(Set, SetCollection); + + // @pragma Construction + + function Set(value) { + return value === null || value === undefined ? emptySet() : + isSet(value) && !isOrdered(value) ? value : + emptySet().withMutations(function(set ) { + var iter = SetIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v ) {return set.add(v)}); + }); + } + + Set.of = function(/*...values*/) { + return this(arguments); }; - HashCollisionNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { - if (keyHash === undefined) { - keyHash = hash(key); - } + Set.fromKeys = function(value) { + return this(KeyedIterable(value).keySeq()); + }; - var removed = value === NOT_SET; + Set.prototype.toString = function() { + return this.__toString('Set {', '}'); + }; - if (keyHash !== this.keyHash) { - if (removed) { - return this; - } - SetRef(didAlter); - SetRef(didChangeSize); - return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]); - } + // @pragma Access - var entries = this.entries; - var idx = 0; - for (var len = entries.length; idx < len; idx++) { - if (is(key, entries[idx][0])) { - break; - } - } - var exists = idx < len; + Set.prototype.has = function(value) { + return this._map.has(value); + }; - if (exists ? entries[idx][1] === value : removed) { - return this; - } + // @pragma Modification - SetRef(didAlter); - (removed || !exists) && SetRef(didChangeSize); + Set.prototype.add = function(value) { + return updateSet(this, this._map.set(value, true)); + }; - if (removed && len === 2) { - return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]); - } + Set.prototype.remove = function(value) { + return updateSet(this, this._map.remove(value)); + }; - var isEditable = ownerID && ownerID === this.ownerID; - var newEntries = isEditable ? entries : arrCopy(entries); + Set.prototype.clear = function() { + return updateSet(this, this._map.clear()); + }; - if (exists) { - if (removed) { - idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); - } else { - newEntries[idx] = [key, value]; + // @pragma Composition + + Set.prototype.union = function() {var iters = SLICE$0.call(arguments, 0); + iters = iters.filter(function(x ) {return x.size !== 0}); + if (iters.length === 0) { + return this; + } + if (this.size === 0 && !this.__ownerID && iters.length === 1) { + return this.constructor(iters[0]); + } + return this.withMutations(function(set ) { + for (var ii = 0; ii < iters.length; ii++) { + SetIterable(iters[ii]).forEach(function(value ) {return set.add(value)}); } - } else { - newEntries.push([key, value]); + }); + }; + + Set.prototype.intersect = function() {var iters = SLICE$0.call(arguments, 0); + if (iters.length === 0) { + return this; } + iters = iters.map(function(iter ) {return SetIterable(iter)}); + var originalSet = this; + return this.withMutations(function(set ) { + originalSet.forEach(function(value ) { + if (!iters.every(function(iter ) {return iter.includes(value)})) { + set.remove(value); + } + }); + }); + }; - if (isEditable) { - this.entries = newEntries; + Set.prototype.subtract = function() {var iters = SLICE$0.call(arguments, 0); + if (iters.length === 0) { return this; } + iters = iters.map(function(iter ) {return SetIterable(iter)}); + var originalSet = this; + return this.withMutations(function(set ) { + originalSet.forEach(function(value ) { + if (iters.some(function(iter ) {return iter.includes(value)})) { + set.remove(value); + } + }); + }); + }; - return new HashCollisionNode(ownerID, this.keyHash, newEntries); + Set.prototype.merge = function() { + return this.union.apply(this, arguments); + }; + + Set.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return this.union.apply(this, iters); }; + Set.prototype.sort = function(comparator) { + // Late binding + return OrderedSet(sortFactory(this, comparator)); + }; + Set.prototype.sortBy = function(mapper, comparator) { + // Late binding + return OrderedSet(sortFactory(this, comparator, mapper)); + }; + Set.prototype.wasAltered = function() { + return this._map.wasAltered(); + }; - function ValueNode(ownerID, keyHash, entry) { - this.ownerID = ownerID; - this.keyHash = keyHash; - this.entry = entry; - } + Set.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._map.__iterate(function(_, k) {return fn(k, k, this$0)}, reverse); + }; - ValueNode.prototype.get = function(shift, keyHash, key, notSetValue) { - return is(key, this.entry[0]) ? this.entry[1] : notSetValue; + Set.prototype.__iterator = function(type, reverse) { + return this._map.map(function(_, k) {return k}).__iterator(type, reverse); }; - ValueNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { - var removed = value === NOT_SET; - var keyMatch = is(key, this.entry[0]); - if (keyMatch ? value === this.entry[1] : removed) { + Set.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { return this; } - - SetRef(didAlter); - - if (removed) { - SetRef(didChangeSize); - return; // undefined + var newMap = this._map.__ensureOwner(ownerID); + if (!ownerID) { + this.__ownerID = ownerID; + this._map = newMap; + return this; } + return this.__make(newMap, ownerID); + }; - if (keyMatch) { - if (ownerID && ownerID === this.ownerID) { - this.entry[1] = value; - return this; - } - return new ValueNode(ownerID, this.keyHash, [key, value]); - } - SetRef(didChangeSize); - return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]); - }; + function isSet(maybeSet) { + return !!(maybeSet && maybeSet[IS_SET_SENTINEL]); + } + Set.isSet = isSet; + var IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; - // #pragma Iterators + var SetPrototype = Set.prototype; + SetPrototype[IS_SET_SENTINEL] = true; + SetPrototype[DELETE] = SetPrototype.remove; + SetPrototype.mergeDeep = SetPrototype.merge; + SetPrototype.mergeDeepWith = SetPrototype.mergeWith; + SetPrototype.withMutations = MapPrototype.withMutations; + SetPrototype.asMutable = MapPrototype.asMutable; + SetPrototype.asImmutable = MapPrototype.asImmutable; - ArrayMapNode.prototype.iterate = - HashCollisionNode.prototype.iterate = function (fn, reverse) { - var entries = this.entries; - for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) { - if (fn(entries[reverse ? maxIndex - ii : ii]) === false) { - return false; - } + SetPrototype.__empty = emptySet; + SetPrototype.__make = makeSet; + + function updateSet(set, newMap) { + if (set.__ownerID) { + set.size = newMap.size; + set._map = newMap; + return set; } + return newMap === set._map ? set : + newMap.size === 0 ? set.__empty() : + set.__make(newMap); } - BitmapIndexedNode.prototype.iterate = - HashArrayMapNode.prototype.iterate = function (fn, reverse) { - var nodes = this.nodes; - for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) { - var node = nodes[reverse ? maxIndex - ii : ii]; - if (node && node.iterate(fn, reverse) === false) { - return false; - } - } + function makeSet(map, ownerID) { + var set = Object.create(SetPrototype); + set.size = map ? map.size : 0; + set._map = map; + set.__ownerID = ownerID; + return set; } - ValueNode.prototype.iterate = function (fn, reverse) { - return fn(this.entry); + var EMPTY_SET; + function emptySet() { + return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap())); } - createClass(MapIterator, Iterator); + createClass(OrderedSet, Set); - function MapIterator(map, type, reverse) { - this._type = type; - this._reverse = reverse; - this._stack = map._root && mapIteratorFrame(map._root); + // @pragma Construction + + function OrderedSet(value) { + return value === null || value === undefined ? emptyOrderedSet() : + isOrderedSet(value) ? value : + emptyOrderedSet().withMutations(function(set ) { + var iter = SetIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v ) {return set.add(v)}); + }); } - MapIterator.prototype.next = function() { - var type = this._type; - var stack = this._stack; - while (stack) { - var node = stack.node; - var index = stack.index++; - var maxIndex; - if (node.entry) { - if (index === 0) { - return mapIteratorValue(type, node.entry); - } - } else if (node.entries) { - maxIndex = node.entries.length - 1; - if (index <= maxIndex) { - return mapIteratorValue(type, node.entries[this._reverse ? maxIndex - index : index]); - } - } else { - maxIndex = node.nodes.length - 1; - if (index <= maxIndex) { - var subNode = node.nodes[this._reverse ? maxIndex - index : index]; - if (subNode) { - if (subNode.entry) { - return mapIteratorValue(type, subNode.entry); - } - stack = this._stack = mapIteratorFrame(subNode, stack); - } - continue; - } - } - stack = this._stack = this._stack.__prev; - } - return iteratorDone(); + OrderedSet.of = function(/*...values*/) { + return this(arguments); }; - - function mapIteratorValue(type, entry) { - return iteratorValue(type, entry[0], entry[1]); - } - - function mapIteratorFrame(node, prev) { - return { - node: node, - index: 0, - __prev: prev + OrderedSet.fromKeys = function(value) { + return this(KeyedIterable(value).keySeq()); }; - } - - function makeMap(size, root, ownerID, hash) { - var map = Object.create(MapPrototype); - map.size = size; - map._root = root; - map.__ownerID = ownerID; - map.__hash = hash; - map.__altered = false; - return map; - } - - var EMPTY_MAP; - function emptyMap() { - return EMPTY_MAP || (EMPTY_MAP = makeMap(0)); - } - - function updateMap(map, k, v) { - var newRoot; - var newSize; - if (!map._root) { - if (v === NOT_SET) { - return map; - } - newSize = 1; - newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]); - } else { - var didChangeSize = MakeRef(CHANGE_LENGTH); - var didAlter = MakeRef(DID_ALTER); - newRoot = updateNode(map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter); - if (!didAlter.value) { - return map; - } - newSize = map.size + (didChangeSize.value ? v === NOT_SET ? -1 : 1 : 0); - } - if (map.__ownerID) { - map.size = newSize; - map._root = newRoot; - map.__hash = undefined; - map.__altered = true; - return map; - } - return newRoot ? makeMap(newSize, newRoot) : emptyMap(); - } - - function updateNode(node, ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { - if (!node) { - if (value === NOT_SET) { - return node; - } - SetRef(didAlter); - SetRef(didChangeSize); - return new ValueNode(ownerID, keyHash, [key, value]); - } - return node.update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter); - } - - function isLeafNode(node) { - return node.constructor === ValueNode || node.constructor === HashCollisionNode; - } - - function mergeIntoNode(node, ownerID, shift, keyHash, entry) { - if (node.keyHash === keyHash) { - return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]); - } - - var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK; - var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; - - var newNode; - var nodes = idx1 === idx2 ? - [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] : - ((newNode = new ValueNode(ownerID, keyHash, entry)), idx1 < idx2 ? [node, newNode] : [newNode, node]); - - return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes); - } - - function createNodes(ownerID, entries, key, value) { - if (!ownerID) { - ownerID = new OwnerID(); - } - var node = new ValueNode(ownerID, hash(key), [key, value]); - for (var ii = 0; ii < entries.length; ii++) { - var entry = entries[ii]; - node = node.update(ownerID, 0, undefined, entry[0], entry[1]); - } - return node; - } - - function packNodes(ownerID, nodes, count, excluding) { - var bitmap = 0; - var packedII = 0; - var packedNodes = new Array(count); - for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) { - var node = nodes[ii]; - if (node !== undefined && ii !== excluding) { - bitmap |= bit; - packedNodes[packedII++] = node; - } - } - return new BitmapIndexedNode(ownerID, bitmap, packedNodes); - } - - function expandNodes(ownerID, nodes, bitmap, including, node) { - var count = 0; - var expandedNodes = new Array(SIZE); - for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) { - expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined; - } - expandedNodes[including] = node; - return new HashArrayMapNode(ownerID, count + 1, expandedNodes); - } - - function mergeIntoMapWith(map, merger, iterables) { - var iters = []; - for (var ii = 0; ii < iterables.length; ii++) { - var value = iterables[ii]; - var iter = KeyedIterable(value); - if (!isIterable(value)) { - iter = iter.map(function(v ) {return fromJS(v)}); - } - iters.push(iter); - } - return mergeIntoCollectionWith(map, merger, iters); - } - - function deepMerger(existing, value, key) { - return existing && existing.mergeDeep && isIterable(value) ? - existing.mergeDeep(value) : - is(existing, value) ? existing : value; - } - function deepMergerWith(merger) { - return function(existing, value, key) { - if (existing && existing.mergeDeepWith && isIterable(value)) { - return existing.mergeDeepWith(merger, value); - } - var nextValue = merger(existing, value, key); - return is(existing, nextValue) ? existing : nextValue; + OrderedSet.prototype.toString = function() { + return this.__toString('OrderedSet {', '}'); }; - } - function mergeIntoCollectionWith(collection, merger, iters) { - iters = iters.filter(function(x ) {return x.size !== 0}); - if (iters.length === 0) { - return collection; - } - if (collection.size === 0 && !collection.__ownerID && iters.length === 1) { - return collection.constructor(iters[0]); - } - return collection.withMutations(function(collection ) { - var mergeIntoMap = merger ? - function(value, key) { - collection.update(key, NOT_SET, function(existing ) - {return existing === NOT_SET ? value : merger(existing, value, key)} - ); - } : - function(value, key) { - collection.set(key, value); - } - for (var ii = 0; ii < iters.length; ii++) { - iters[ii].forEach(mergeIntoMap); - } - }); - } - function updateInDeepMap(existing, keyPathIter, notSetValue, updater) { - var isNotSet = existing === NOT_SET; - var step = keyPathIter.next(); - if (step.done) { - var existingValue = isNotSet ? notSetValue : existing; - var newValue = updater(existingValue); - return newValue === existingValue ? existing : newValue; - } - invariant( - isNotSet || (existing && existing.set), - 'invalid keyPath' - ); - var key = step.value; - var nextExisting = isNotSet ? NOT_SET : existing.get(key, NOT_SET); - var nextUpdated = updateInDeepMap( - nextExisting, - keyPathIter, - notSetValue, - updater - ); - return nextUpdated === nextExisting ? existing : - nextUpdated === NOT_SET ? existing.remove(key) : - (isNotSet ? emptyMap() : existing).set(key, nextUpdated); + function isOrderedSet(maybeOrderedSet) { + return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet); } - function popCount(x) { - x = x - ((x >> 1) & 0x55555555); - x = (x & 0x33333333) + ((x >> 2) & 0x33333333); - x = (x + (x >> 4)) & 0x0f0f0f0f; - x = x + (x >> 8); - x = x + (x >> 16); - return x & 0x7f; - } + OrderedSet.isOrderedSet = isOrderedSet; - function setIn(array, idx, val, canEdit) { - var newArray = canEdit ? array : arrCopy(array); - newArray[idx] = val; - return newArray; - } + var OrderedSetPrototype = OrderedSet.prototype; + OrderedSetPrototype[IS_ORDERED_SENTINEL] = true; - function spliceIn(array, idx, val, canEdit) { - var newLen = array.length + 1; - if (canEdit && idx + 1 === newLen) { - array[idx] = val; - return array; - } - var newArray = new Array(newLen); - var after = 0; - for (var ii = 0; ii < newLen; ii++) { - if (ii === idx) { - newArray[ii] = val; - after = -1; - } else { - newArray[ii] = array[ii + after]; - } - } - return newArray; - } + OrderedSetPrototype.__empty = emptyOrderedSet; + OrderedSetPrototype.__make = makeOrderedSet; - function spliceOut(array, idx, canEdit) { - var newLen = array.length - 1; - if (canEdit && idx === newLen) { - array.pop(); - return array; - } - var newArray = new Array(newLen); - var after = 0; - for (var ii = 0; ii < newLen; ii++) { - if (ii === idx) { - after = 1; - } - newArray[ii] = array[ii + after]; - } - return newArray; + function makeOrderedSet(map, ownerID) { + var set = Object.create(OrderedSetPrototype); + set.size = map ? map.size : 0; + set._map = map; + set.__ownerID = ownerID; + return set; } - var MAX_ARRAY_MAP_SIZE = SIZE / 4; - var MAX_BITMAP_INDEXED_SIZE = SIZE / 2; - var MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4; + var EMPTY_ORDERED_SET; + function emptyOrderedSet() { + return EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap())); + } - createClass(List, IndexedCollection); + createClass(Stack, IndexedCollection); // @pragma Construction - function List(value) { - var empty = emptyList(); - if (value === null || value === undefined) { - return empty; - } - if (isList(value)) { - return value; - } - var iter = IndexedIterable(value); - var size = iter.size; - if (size === 0) { - return empty; - } - assertNotInfinite(size); - if (size > 0 && size < SIZE) { - return makeList(0, size, SHIFT, null, new VNode(iter.toArray())); - } - return empty.withMutations(function(list ) { - list.setSize(size); - iter.forEach(function(v, i) {return list.set(i, v)}); - }); + function Stack(value) { + return value === null || value === undefined ? emptyStack() : + isStack(value) ? value : + emptyStack().unshiftAll(value); } - List.of = function(/*...values*/) { + Stack.of = function(/*...values*/) { return this(arguments); }; - List.prototype.toString = function() { - return this.__toString('List [', ']'); + Stack.prototype.toString = function() { + return this.__toString('Stack [', ']'); }; // @pragma Access - List.prototype.get = function(index, notSetValue) { + Stack.prototype.get = function(index, notSetValue) { + var head = this._head; index = wrapIndex(this, index); - if (index >= 0 && index < this.size) { - index += this._origin; - var node = listNodeFor(this, index); - return node && node.array[index & MASK]; + while (head && index--) { + head = head.next; } - return notSetValue; - }; - - // @pragma Modification - - List.prototype.set = function(index, value) { - return updateList(this, index, value); + return head ? head.value : notSetValue; }; - List.prototype.remove = function(index) { - return !this.has(index) ? this : - index === 0 ? this.shift() : - index === this.size - 1 ? this.pop() : - this.splice(index, 1); + Stack.prototype.peek = function() { + return this._head && this._head.value; }; - List.prototype.insert = function(index, value) { - return this.splice(index, 0, value); - }; + // @pragma Modification - List.prototype.clear = function() { - if (this.size === 0) { + Stack.prototype.push = function(/*...values*/) { + if (arguments.length === 0) { return this; } + var newSize = this.size + arguments.length; + var head = this._head; + for (var ii = arguments.length - 1; ii >= 0; ii--) { + head = { + value: arguments[ii], + next: head + }; + } if (this.__ownerID) { - this.size = this._origin = this._capacity = 0; - this._level = SHIFT; - this._root = this._tail = null; + this.size = newSize; + this._head = head; this.__hash = undefined; this.__altered = true; return this; } - return emptyList(); - }; - - List.prototype.push = function(/*...values*/) { - var values = arguments; - var oldSize = this.size; - return this.withMutations(function(list ) { - setListBounds(list, 0, oldSize + values.length); - for (var ii = 0; ii < values.length; ii++) { - list.set(oldSize + ii, values[ii]); - } - }); - }; - - List.prototype.pop = function() { - return setListBounds(this, 0, -1); + return makeStack(newSize, head); }; - List.prototype.unshift = function(/*...values*/) { - var values = arguments; - return this.withMutations(function(list ) { - setListBounds(list, -values.length); - for (var ii = 0; ii < values.length; ii++) { - list.set(ii, values[ii]); - } + Stack.prototype.pushAll = function(iter) { + iter = IndexedIterable(iter); + if (iter.size === 0) { + return this; + } + assertNotInfinite(iter.size); + var newSize = this.size; + var head = this._head; + iter.reverse().forEach(function(value ) { + newSize++; + head = { + value: value, + next: head + }; }); + if (this.__ownerID) { + this.size = newSize; + this._head = head; + this.__hash = undefined; + this.__altered = true; + return this; + } + return makeStack(newSize, head); }; - List.prototype.shift = function() { - return setListBounds(this, 1); - }; - - // @pragma Composition - - List.prototype.merge = function(/*...iters*/) { - return mergeIntoListWith(this, undefined, arguments); - }; - - List.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); - return mergeIntoListWith(this, merger, iters); + Stack.prototype.pop = function() { + return this.slice(1); }; - List.prototype.mergeDeep = function(/*...iters*/) { - return mergeIntoListWith(this, deepMerger, arguments); + Stack.prototype.unshift = function(/*...values*/) { + return this.push.apply(this, arguments); }; - List.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1); - return mergeIntoListWith(this, deepMergerWith(merger), iters); + Stack.prototype.unshiftAll = function(iter) { + return this.pushAll(iter); }; - List.prototype.setSize = function(size) { - return setListBounds(this, 0, size); + Stack.prototype.shift = function() { + return this.pop.apply(this, arguments); }; - // @pragma Iteration - - List.prototype.slice = function(begin, end) { - var size = this.size; - if (wholeSlice(begin, end, size)) { + Stack.prototype.clear = function() { + if (this.size === 0) { return this; } - return setListBounds( - this, - resolveBegin(begin, size), - resolveEnd(end, size) - ); - }; - - List.prototype.__iterator = function(type, reverse) { - var index = 0; - var values = iterateList(this, reverse); - return new Iterator(function() { - var value = values(); - return value === DONE ? - iteratorDone() : - iteratorValue(type, index++, value); - }); + if (this.__ownerID) { + this.size = 0; + this._head = undefined; + this.__hash = undefined; + this.__altered = true; + return this; + } + return emptyStack(); }; - List.prototype.__iterate = function(fn, reverse) { - var index = 0; - var values = iterateList(this, reverse); - var value; - while ((value = values()) !== DONE) { - if (fn(value, index++, this) === false) { - break; - } + Stack.prototype.slice = function(begin, end) { + if (wholeSlice(begin, end, this.size)) { + return this; } - return index; + var resolvedBegin = resolveBegin(begin, this.size); + var resolvedEnd = resolveEnd(end, this.size); + if (resolvedEnd !== this.size) { + // super.slice(begin, end); + return IndexedCollection.prototype.slice.call(this, begin, end); + } + var newSize = this.size - resolvedBegin; + var head = this._head; + while (resolvedBegin--) { + head = head.next; + } + if (this.__ownerID) { + this.size = newSize; + this._head = head; + this.__hash = undefined; + this.__altered = true; + return this; + } + return makeStack(newSize, head); }; - List.prototype.__ensureOwner = function(ownerID) { + // @pragma Mutability + + Stack.prototype.__ensureOwner = function(ownerID) { if (ownerID === this.__ownerID) { return this; } if (!ownerID) { this.__ownerID = ownerID; + this.__altered = false; return this; } - return makeList(this._origin, this._capacity, this._level, this._root, this._tail, ownerID, this.__hash); + return makeStack(this.size, this._head, ownerID, this.__hash); }; + // @pragma Iteration - function isList(maybeList) { - return !!(maybeList && maybeList[IS_LIST_SENTINEL]); - } - - List.isList = isList; - - var IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; - - var ListPrototype = List.prototype; - ListPrototype[IS_LIST_SENTINEL] = true; - ListPrototype[DELETE] = ListPrototype.remove; - ListPrototype.setIn = MapPrototype.setIn; - ListPrototype.deleteIn = - ListPrototype.removeIn = MapPrototype.removeIn; - ListPrototype.update = MapPrototype.update; - ListPrototype.updateIn = MapPrototype.updateIn; - ListPrototype.mergeIn = MapPrototype.mergeIn; - ListPrototype.mergeDeepIn = MapPrototype.mergeDeepIn; - ListPrototype.withMutations = MapPrototype.withMutations; - ListPrototype.asMutable = MapPrototype.asMutable; - ListPrototype.asImmutable = MapPrototype.asImmutable; - ListPrototype.wasAltered = MapPrototype.wasAltered; - - - - function VNode(array, ownerID) { - this.array = array; - this.ownerID = ownerID; - } - - // TODO: seems like these methods are very similar - - VNode.prototype.removeBefore = function(ownerID, level, index) { - if (index === level ? 1 << level : 0 || this.array.length === 0) { - return this; - } - var originIndex = (index >>> level) & MASK; - if (originIndex >= this.array.length) { - return new VNode([], ownerID); - } - var removingFirst = originIndex === 0; - var newChild; - if (level > 0) { - var oldChild = this.array[originIndex]; - newChild = oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index); - if (newChild === oldChild && removingFirst) { - return this; - } - } - if (removingFirst && !newChild) { - return this; + Stack.prototype.__iterate = function(fn, reverse) { + if (reverse) { + return this.reverse().__iterate(fn); } - var editable = editableVNode(this, ownerID); - if (!removingFirst) { - for (var ii = 0; ii < originIndex; ii++) { - editable.array[ii] = undefined; + var iterations = 0; + var node = this._head; + while (node) { + if (fn(node.value, iterations++, this) === false) { + break; } + node = node.next; } - if (newChild) { - editable.array[originIndex] = newChild; - } - return editable; + return iterations; }; - VNode.prototype.removeAfter = function(ownerID, level, index) { - if (index === (level ? 1 << level : 0) || this.array.length === 0) { - return this; - } - var sizeIndex = ((index - 1) >>> level) & MASK; - if (sizeIndex >= this.array.length) { - return this; + Stack.prototype.__iterator = function(type, reverse) { + if (reverse) { + return this.reverse().__iterator(type); } - - var newChild; - if (level > 0) { - var oldChild = this.array[sizeIndex]; - newChild = oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index); - if (newChild === oldChild && sizeIndex === this.array.length - 1) { - return this; + var iterations = 0; + var node = this._head; + return new Iterator(function() { + if (node) { + var value = node.value; + node = node.next; + return iteratorValue(type, iterations++, value); } - } - - var editable = editableVNode(this, ownerID); - editable.array.splice(sizeIndex + 1); - if (newChild) { - editable.array[sizeIndex] = newChild; - } - return editable; + return iteratorDone(); + }); }; + function isStack(maybeStack) { + return !!(maybeStack && maybeStack[IS_STACK_SENTINEL]); + } - var DONE = {}; - - function iterateList(list, reverse) { - var left = list._origin; - var right = list._capacity; - var tailPos = getTailOffset(right); - var tail = list._tail; + Stack.isStack = isStack; - return iterateNodeOrLeaf(list._root, list._level, 0); + var IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@'; - function iterateNodeOrLeaf(node, level, offset) { - return level === 0 ? - iterateLeaf(node, offset) : - iterateNode(node, level, offset); - } + var StackPrototype = Stack.prototype; + StackPrototype[IS_STACK_SENTINEL] = true; + StackPrototype.withMutations = MapPrototype.withMutations; + StackPrototype.asMutable = MapPrototype.asMutable; + StackPrototype.asImmutable = MapPrototype.asImmutable; + StackPrototype.wasAltered = MapPrototype.wasAltered; - function iterateLeaf(node, offset) { - var array = offset === tailPos ? tail && tail.array : node && node.array; - var from = offset > left ? 0 : left - offset; - var to = right - offset; - if (to > SIZE) { - to = SIZE; - } - return function() { - if (from === to) { - return DONE; - } - var idx = reverse ? --to : from++; - return array && array[idx]; - }; - } - function iterateNode(node, level, offset) { - var values; - var array = node && node.array; - var from = offset > left ? 0 : (left - offset) >> level; - var to = ((right - offset) >> level) + 1; - if (to > SIZE) { - to = SIZE; - } - return function() { - do { - if (values) { - var value = values(); - if (value !== DONE) { - return value; - } - values = null; - } - if (from === to) { - return DONE; - } - var idx = reverse ? --to : from++; - values = iterateNodeOrLeaf( - array && array[idx], level - SHIFT, offset + (idx << level) - ); - } while (true); - }; - } + function makeStack(size, head, ownerID, hash) { + var map = Object.create(StackPrototype); + map.size = size; + map._head = head; + map.__ownerID = ownerID; + map.__hash = hash; + map.__altered = false; + return map; } - function makeList(origin, capacity, level, root, tail, ownerID, hash) { - var list = Object.create(ListPrototype); - list.size = capacity - origin; - list._origin = origin; - list._capacity = capacity; - list._level = level; - list._root = root; - list._tail = tail; - list.__ownerID = ownerID; - list.__hash = hash; - list.__altered = false; - return list; + var EMPTY_STACK; + function emptyStack() { + return EMPTY_STACK || (EMPTY_STACK = makeStack(0)); } - var EMPTY_LIST; - function emptyList() { - return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT)); + /** + * Contributes additional methods to a constructor + */ + function mixin(ctor, methods) { + var keyCopier = function(key ) { ctor.prototype[key] = methods[key]; }; + Object.keys(methods).forEach(keyCopier); + Object.getOwnPropertySymbols && + Object.getOwnPropertySymbols(methods).forEach(keyCopier); + return ctor; } - function updateList(list, index, value) { - index = wrapIndex(list, index); + Iterable.Iterator = Iterator; - if (index !== index) { - return list; - } + mixin(Iterable, { - if (index >= list.size || index < 0) { - return list.withMutations(function(list ) { - index < 0 ? - setListBounds(list, index).set(0, value) : - setListBounds(list, 0, index + 1).set(index, value) - }); - } + // ### Conversion to other types - index += list._origin; + toArray: function() { + assertNotInfinite(this.size); + var array = new Array(this.size || 0); + this.valueSeq().__iterate(function(v, i) { array[i] = v; }); + return array; + }, - var newTail = list._tail; - var newRoot = list._root; - var didAlter = MakeRef(DID_ALTER); - if (index >= getTailOffset(list._capacity)) { - newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter); - } else { - newRoot = updateVNode(newRoot, list.__ownerID, list._level, index, value, didAlter); - } + toIndexedSeq: function() { + return new ToIndexedSequence(this); + }, - if (!didAlter.value) { - return list; - } + toJS: function() { + return this.toSeq().map( + function(value ) {return value && typeof value.toJS === 'function' ? value.toJS() : value} + ).__toJS(); + }, - if (list.__ownerID) { - list._root = newRoot; - list._tail = newTail; - list.__hash = undefined; - list.__altered = true; - return list; - } - return makeList(list._origin, list._capacity, list._level, newRoot, newTail); - } + toJSON: function() { + return this.toSeq().map( + function(value ) {return value && typeof value.toJSON === 'function' ? value.toJSON() : value} + ).__toJS(); + }, - function updateVNode(node, ownerID, level, index, value, didAlter) { - var idx = (index >>> level) & MASK; - var nodeHas = node && idx < node.array.length; - if (!nodeHas && value === undefined) { - return node; - } + toKeyedSeq: function() { + return new ToKeyedSequence(this, true); + }, - var newNode; + toMap: function() { + // Use Late Binding here to solve the circular dependency. + return Map(this.toKeyedSeq()); + }, - if (level > 0) { - var lowerNode = node && node.array[idx]; - var newLowerNode = updateVNode(lowerNode, ownerID, level - SHIFT, index, value, didAlter); - if (newLowerNode === lowerNode) { - return node; - } - newNode = editableVNode(node, ownerID); - newNode.array[idx] = newLowerNode; - return newNode; - } + toObject: function() { + assertNotInfinite(this.size); + var object = {}; + this.__iterate(function(v, k) { object[k] = v; }); + return object; + }, - if (nodeHas && node.array[idx] === value) { - return node; - } + toOrderedMap: function() { + // Use Late Binding here to solve the circular dependency. + return OrderedMap(this.toKeyedSeq()); + }, - SetRef(didAlter); + toOrderedSet: function() { + // Use Late Binding here to solve the circular dependency. + return OrderedSet(isKeyed(this) ? this.valueSeq() : this); + }, - newNode = editableVNode(node, ownerID); - if (value === undefined && idx === newNode.array.length - 1) { - newNode.array.pop(); - } else { - newNode.array[idx] = value; - } - return newNode; - } + toSet: function() { + // Use Late Binding here to solve the circular dependency. + return Set(isKeyed(this) ? this.valueSeq() : this); + }, - function editableVNode(node, ownerID) { - if (ownerID && node && ownerID === node.ownerID) { - return node; - } - return new VNode(node ? node.array.slice() : [], ownerID); - } + toSetSeq: function() { + return new ToSetSequence(this); + }, - function listNodeFor(list, rawIndex) { - if (rawIndex >= getTailOffset(list._capacity)) { - return list._tail; - } - if (rawIndex < 1 << (list._level + SHIFT)) { - var node = list._root; - var level = list._level; - while (node && level > 0) { - node = node.array[(rawIndex >>> level) & MASK]; - level -= SHIFT; - } - return node; - } - } + toSeq: function() { + return isIndexed(this) ? this.toIndexedSeq() : + isKeyed(this) ? this.toKeyedSeq() : + this.toSetSeq(); + }, - function setListBounds(list, begin, end) { - // Sanitize begin & end using this shorthand for ToInt32(argument) - // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 - if (begin !== undefined) { - begin = begin | 0; - } - if (end !== undefined) { - end = end | 0; - } - var owner = list.__ownerID || new OwnerID(); - var oldOrigin = list._origin; - var oldCapacity = list._capacity; - var newOrigin = oldOrigin + begin; - var newCapacity = end === undefined ? oldCapacity : end < 0 ? oldCapacity + end : oldOrigin + end; - if (newOrigin === oldOrigin && newCapacity === oldCapacity) { - return list; - } + toStack: function() { + // Use Late Binding here to solve the circular dependency. + return Stack(isKeyed(this) ? this.valueSeq() : this); + }, - // If it's going to end after it starts, it's empty. - if (newOrigin >= newCapacity) { - return list.clear(); - } + toList: function() { + // Use Late Binding here to solve the circular dependency. + return List(isKeyed(this) ? this.valueSeq() : this); + }, - var newLevel = list._level; - var newRoot = list._root; - // New origin might need creating a higher root. - var offsetShift = 0; - while (newOrigin + offsetShift < 0) { - newRoot = new VNode(newRoot && newRoot.array.length ? [undefined, newRoot] : [], owner); - newLevel += SHIFT; - offsetShift += 1 << newLevel; - } - if (offsetShift) { - newOrigin += offsetShift; - oldOrigin += offsetShift; - newCapacity += offsetShift; - oldCapacity += offsetShift; - } + // ### Common JavaScript methods and properties - var oldTailOffset = getTailOffset(oldCapacity); - var newTailOffset = getTailOffset(newCapacity); + toString: function() { + return '[Iterable]'; + }, - // New size might need creating a higher root. - while (newTailOffset >= 1 << (newLevel + SHIFT)) { - newRoot = new VNode(newRoot && newRoot.array.length ? [newRoot] : [], owner); - newLevel += SHIFT; - } + __toString: function(head, tail) { + if (this.size === 0) { + return head + tail; + } + return head + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + tail; + }, - // Locate or create the new tail. - var oldTail = list._tail; - var newTail = newTailOffset < oldTailOffset ? - listNodeFor(list, newCapacity - 1) : - newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail; - // Merge Tail into tree. - if (oldTail && newTailOffset > oldTailOffset && newOrigin < oldCapacity && oldTail.array.length) { - newRoot = editableVNode(newRoot, owner); - var node = newRoot; - for (var level = newLevel; level > SHIFT; level -= SHIFT) { - var idx = (oldTailOffset >>> level) & MASK; - node = node.array[idx] = editableVNode(node.array[idx], owner); - } - node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail; - } + // ### ES6 Collection methods (ES6 Array and Map) - // If the size has been reduced, there's a chance the tail needs to be trimmed. - if (newCapacity < oldCapacity) { - newTail = newTail && newTail.removeAfter(owner, 0, newCapacity); - } + concat: function() {var values = SLICE$0.call(arguments, 0); + return reify(this, concatFactory(this, values)); + }, - // If the new origin is within the tail, then we do not need a root. - if (newOrigin >= newTailOffset) { - newOrigin -= newTailOffset; - newCapacity -= newTailOffset; - newLevel = SHIFT; - newRoot = null; - newTail = newTail && newTail.removeBefore(owner, 0, newOrigin); + includes: function(searchValue) { + return this.some(function(value ) {return is(value, searchValue)}); + }, - // Otherwise, if the root has been trimmed, garbage collect. - } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) { - offsetShift = 0; + entries: function() { + return this.__iterator(ITERATE_ENTRIES); + }, - // Identify the new top root node of the subtree of the old root. - while (newRoot) { - var beginIndex = (newOrigin >>> newLevel) & MASK; - if (beginIndex !== (newTailOffset >>> newLevel) & MASK) { - break; - } - if (beginIndex) { - offsetShift += (1 << newLevel) * beginIndex; + every: function(predicate, context) { + assertNotInfinite(this.size); + var returnValue = true; + this.__iterate(function(v, k, c) { + if (!predicate.call(context, v, k, c)) { + returnValue = false; + return false; } - newLevel -= SHIFT; - newRoot = newRoot.array[beginIndex]; - } + }); + return returnValue; + }, - // Trim the new sides of the new root. - if (newRoot && newOrigin > oldOrigin) { - newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift); - } - if (newRoot && newTailOffset < oldTailOffset) { - newRoot = newRoot.removeAfter(owner, newLevel, newTailOffset - offsetShift); - } - if (offsetShift) { - newOrigin -= offsetShift; - newCapacity -= offsetShift; - } - } + filter: function(predicate, context) { + return reify(this, filterFactory(this, predicate, context, true)); + }, - if (list.__ownerID) { - list.size = newCapacity - newOrigin; - list._origin = newOrigin; - list._capacity = newCapacity; - list._level = newLevel; - list._root = newRoot; - list._tail = newTail; - list.__hash = undefined; - list.__altered = true; - return list; - } - return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail); - } + find: function(predicate, context, notSetValue) { + var entry = this.findEntry(predicate, context); + return entry ? entry[1] : notSetValue; + }, - function mergeIntoListWith(list, merger, iterables) { - var iters = []; - var maxSize = 0; - for (var ii = 0; ii < iterables.length; ii++) { - var value = iterables[ii]; - var iter = IndexedIterable(value); - if (iter.size > maxSize) { - maxSize = iter.size; - } - if (!isIterable(value)) { - iter = iter.map(function(v ) {return fromJS(v)}); - } - iters.push(iter); - } - if (maxSize > list.size) { - list = list.setSize(maxSize); - } - return mergeIntoCollectionWith(list, merger, iters); - } + forEach: function(sideEffect, context) { + assertNotInfinite(this.size); + return this.__iterate(context ? sideEffect.bind(context) : sideEffect); + }, - function getTailOffset(size) { - return size < SIZE ? 0 : (((size - 1) >>> SHIFT) << SHIFT); - } + join: function(separator) { + assertNotInfinite(this.size); + separator = separator !== undefined ? '' + separator : ','; + var joined = ''; + var isFirst = true; + this.__iterate(function(v ) { + isFirst ? (isFirst = false) : (joined += separator); + joined += v !== null && v !== undefined ? v.toString() : ''; + }); + return joined; + }, - createClass(OrderedMap, Map); + keys: function() { + return this.__iterator(ITERATE_KEYS); + }, - // @pragma Construction + map: function(mapper, context) { + return reify(this, mapFactory(this, mapper, context)); + }, - function OrderedMap(value) { - return value === null || value === undefined ? emptyOrderedMap() : - isOrderedMap(value) ? value : - emptyOrderedMap().withMutations(function(map ) { - var iter = KeyedIterable(value); - assertNotInfinite(iter.size); - iter.forEach(function(v, k) {return map.set(k, v)}); - }); - } + reduce: function(reducer, initialReduction, context) { + assertNotInfinite(this.size); + var reduction; + var useFirst; + if (arguments.length < 2) { + useFirst = true; + } else { + reduction = initialReduction; + } + this.__iterate(function(v, k, c) { + if (useFirst) { + useFirst = false; + reduction = v; + } else { + reduction = reducer.call(context, reduction, v, k, c); + } + }); + return reduction; + }, - OrderedMap.of = function(/*...values*/) { - return this(arguments); - }; + reduceRight: function(reducer, initialReduction, context) { + var reversed = this.toKeyedSeq().reverse(); + return reversed.reduce.apply(reversed, arguments); + }, - OrderedMap.prototype.toString = function() { - return this.__toString('OrderedMap {', '}'); - }; + reverse: function() { + return reify(this, reverseFactory(this, true)); + }, - // @pragma Access + slice: function(begin, end) { + return reify(this, sliceFactory(this, begin, end, true)); + }, - OrderedMap.prototype.get = function(k, notSetValue) { - var index = this._map.get(k); - return index !== undefined ? this._list.get(index)[1] : notSetValue; - }; + some: function(predicate, context) { + return !this.every(not(predicate), context); + }, - // @pragma Modification + sort: function(comparator) { + return reify(this, sortFactory(this, comparator)); + }, - OrderedMap.prototype.clear = function() { - if (this.size === 0) { - return this; - } - if (this.__ownerID) { - this.size = 0; - this._map.clear(); - this._list.clear(); - return this; - } - return emptyOrderedMap(); - }; + values: function() { + return this.__iterator(ITERATE_VALUES); + }, - OrderedMap.prototype.set = function(k, v) { - return updateOrderedMap(this, k, v); - }; - OrderedMap.prototype.remove = function(k) { - return updateOrderedMap(this, k, NOT_SET); - }; + // ### More sequential methods - OrderedMap.prototype.wasAltered = function() { - return this._map.wasAltered() || this._list.wasAltered(); - }; + butLast: function() { + return this.slice(0, -1); + }, - OrderedMap.prototype.__iterate = function(fn, reverse) {var this$0 = this; - return this._list.__iterate( - function(entry ) {return entry && fn(entry[1], entry[0], this$0)}, - reverse + isEmpty: function() { + return this.size !== undefined ? this.size === 0 : !this.some(function() {return true}); + }, + + count: function(predicate, context) { + return ensureSize( + predicate ? this.toSeq().filter(predicate, context) : this ); - }; + }, - OrderedMap.prototype.__iterator = function(type, reverse) { - return this._list.fromEntrySeq().__iterator(type, reverse); - }; + countBy: function(grouper, context) { + return countByFactory(this, grouper, context); + }, - OrderedMap.prototype.__ensureOwner = function(ownerID) { - if (ownerID === this.__ownerID) { - return this; - } - var newMap = this._map.__ensureOwner(ownerID); - var newList = this._list.__ensureOwner(ownerID); - if (!ownerID) { - this.__ownerID = ownerID; - this._map = newMap; - this._list = newList; - return this; + equals: function(other) { + return deepEqual(this, other); + }, + + entrySeq: function() { + var iterable = this; + if (iterable._cache) { + // We cache as an entries array, so we can just return the cache! + return new ArraySeq(iterable._cache); } - return makeOrderedMap(newMap, newList, ownerID, this.__hash); - }; + var entriesSequence = iterable.toSeq().map(entryMapper).toIndexedSeq(); + entriesSequence.fromEntrySeq = function() {return iterable.toSeq()}; + return entriesSequence; + }, + filterNot: function(predicate, context) { + return this.filter(not(predicate), context); + }, - function isOrderedMap(maybeOrderedMap) { - return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap); - } + findEntry: function(predicate, context, notSetValue) { + var found = notSetValue; + this.__iterate(function(v, k, c) { + if (predicate.call(context, v, k, c)) { + found = [k, v]; + return false; + } + }); + return found; + }, - OrderedMap.isOrderedMap = isOrderedMap; + findKey: function(predicate, context) { + var entry = this.findEntry(predicate, context); + return entry && entry[0]; + }, - OrderedMap.prototype[IS_ORDERED_SENTINEL] = true; - OrderedMap.prototype[DELETE] = OrderedMap.prototype.remove; + findLast: function(predicate, context, notSetValue) { + return this.toKeyedSeq().reverse().find(predicate, context, notSetValue); + }, + findLastEntry: function(predicate, context, notSetValue) { + return this.toKeyedSeq().reverse().findEntry(predicate, context, notSetValue); + }, + findLastKey: function(predicate, context) { + return this.toKeyedSeq().reverse().findKey(predicate, context); + }, - function makeOrderedMap(map, list, ownerID, hash) { - var omap = Object.create(OrderedMap.prototype); - omap.size = map ? map.size : 0; - omap._map = map; - omap._list = list; - omap.__ownerID = ownerID; - omap.__hash = hash; - return omap; - } + first: function() { + return this.find(returnTrue); + }, - var EMPTY_ORDERED_MAP; - function emptyOrderedMap() { - return EMPTY_ORDERED_MAP || (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList())); - } + flatMap: function(mapper, context) { + return reify(this, flatMapFactory(this, mapper, context)); + }, - function updateOrderedMap(omap, k, v) { - var map = omap._map; - var list = omap._list; - var i = map.get(k); - var has = i !== undefined; - var newMap; - var newList; - if (v === NOT_SET) { // removed - if (!has) { - return omap; - } - if (list.size >= SIZE && list.size >= map.size * 2) { - newList = list.filter(function(entry, idx) {return entry !== undefined && i !== idx}); - newMap = newList.toKeyedSeq().map(function(entry ) {return entry[0]}).flip().toMap(); - if (omap.__ownerID) { - newMap.__ownerID = newList.__ownerID = omap.__ownerID; - } - } else { - newMap = map.remove(k); - newList = i === list.size - 1 ? list.pop() : list.set(i, undefined); - } - } else { - if (has) { - if (v === list.get(i)[1]) { - return omap; + flatten: function(depth) { + return reify(this, flattenFactory(this, depth, true)); + }, + + fromEntrySeq: function() { + return new FromEntriesSequence(this); + }, + + get: function(searchKey, notSetValue) { + return this.find(function(_, key) {return is(key, searchKey)}, undefined, notSetValue); + }, + + getIn: function(searchKeyPath, notSetValue) { + var nested = this; + // Note: in an ES6 environment, we would prefer: + // for (var key of searchKeyPath) { + var iter = forceIterator(searchKeyPath); + var step; + while (!(step = iter.next()).done) { + var key = step.value; + nested = nested && nested.get ? nested.get(key, NOT_SET) : NOT_SET; + if (nested === NOT_SET) { + return notSetValue; } - newMap = map; - newList = list.set(i, [k, v]); - } else { - newMap = map.set(k, list.size); - newList = list.set(list.size, [k, v]); } - } - if (omap.__ownerID) { - omap.size = newMap.size; - omap._map = newMap; - omap._list = newList; - omap.__hash = undefined; - return omap; - } - return makeOrderedMap(newMap, newList); - } + return nested; + }, - createClass(ToKeyedSequence, KeyedSeq); - function ToKeyedSequence(indexed, useKeys) { - this._iter = indexed; - this._useKeys = useKeys; - this.size = indexed.size; - } + groupBy: function(grouper, context) { + return groupByFactory(this, grouper, context); + }, - ToKeyedSequence.prototype.get = function(key, notSetValue) { - return this._iter.get(key, notSetValue); - }; + has: function(searchKey) { + return this.get(searchKey, NOT_SET) !== NOT_SET; + }, - ToKeyedSequence.prototype.has = function(key) { - return this._iter.has(key); - }; + hasIn: function(searchKeyPath) { + return this.getIn(searchKeyPath, NOT_SET) !== NOT_SET; + }, - ToKeyedSequence.prototype.valueSeq = function() { - return this._iter.valueSeq(); - }; + isSubset: function(iter) { + iter = typeof iter.includes === 'function' ? iter : Iterable(iter); + return this.every(function(value ) {return iter.includes(value)}); + }, - ToKeyedSequence.prototype.reverse = function() {var this$0 = this; - var reversedSequence = reverseFactory(this, true); - if (!this._useKeys) { - reversedSequence.valueSeq = function() {return this$0._iter.toSeq().reverse()}; - } - return reversedSequence; - }; + isSuperset: function(iter) { + iter = typeof iter.isSubset === 'function' ? iter : Iterable(iter); + return iter.isSubset(this); + }, - ToKeyedSequence.prototype.map = function(mapper, context) {var this$0 = this; - var mappedSequence = mapFactory(this, mapper, context); - if (!this._useKeys) { - mappedSequence.valueSeq = function() {return this$0._iter.toSeq().map(mapper, context)}; - } - return mappedSequence; - }; + keyOf: function(searchValue) { + return this.findKey(function(value ) {return is(value, searchValue)}); + }, - ToKeyedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; - var ii; - return this._iter.__iterate( - this._useKeys ? - function(v, k) {return fn(v, k, this$0)} : - ((ii = reverse ? resolveSize(this) : 0), - function(v ) {return fn(v, reverse ? --ii : ii++, this$0)}), - reverse - ); - }; + keySeq: function() { + return this.toSeq().map(keyMapper).toIndexedSeq(); + }, - ToKeyedSequence.prototype.__iterator = function(type, reverse) { - if (this._useKeys) { - return this._iter.__iterator(type, reverse); - } - var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); - var ii = reverse ? resolveSize(this) : 0; - return new Iterator(function() { - var step = iterator.next(); - return step.done ? step : - iteratorValue(type, reverse ? --ii : ii++, step.value, step); - }); - }; + last: function() { + return this.toSeq().reverse().first(); + }, - ToKeyedSequence.prototype[IS_ORDERED_SENTINEL] = true; + lastKeyOf: function(searchValue) { + return this.toKeyedSeq().reverse().keyOf(searchValue); + }, + max: function(comparator) { + return maxFactory(this, comparator); + }, - createClass(ToIndexedSequence, IndexedSeq); - function ToIndexedSequence(iter) { - this._iter = iter; - this.size = iter.size; - } + maxBy: function(mapper, comparator) { + return maxFactory(this, comparator, mapper); + }, - ToIndexedSequence.prototype.includes = function(value) { - return this._iter.includes(value); - }; + min: function(comparator) { + return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator); + }, - ToIndexedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; - var iterations = 0; - return this._iter.__iterate(function(v ) {return fn(v, iterations++, this$0)}, reverse); - }; + minBy: function(mapper, comparator) { + return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator, mapper); + }, - ToIndexedSequence.prototype.__iterator = function(type, reverse) { - var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); - var iterations = 0; - return new Iterator(function() { - var step = iterator.next(); - return step.done ? step : - iteratorValue(type, iterations++, step.value, step) - }); - }; + rest: function() { + return this.slice(1); + }, + + skip: function(amount) { + return this.slice(Math.max(0, amount)); + }, + skipLast: function(amount) { + return reify(this, this.toSeq().reverse().skip(amount).reverse()); + }, + skipWhile: function(predicate, context) { + return reify(this, skipWhileFactory(this, predicate, context, true)); + }, - createClass(ToSetSequence, SetSeq); - function ToSetSequence(iter) { - this._iter = iter; - this.size = iter.size; - } + skipUntil: function(predicate, context) { + return this.skipWhile(not(predicate), context); + }, - ToSetSequence.prototype.has = function(key) { - return this._iter.includes(key); - }; + sortBy: function(mapper, comparator) { + return reify(this, sortFactory(this, comparator, mapper)); + }, - ToSetSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; - return this._iter.__iterate(function(v ) {return fn(v, v, this$0)}, reverse); - }; + take: function(amount) { + return this.slice(0, Math.max(0, amount)); + }, - ToSetSequence.prototype.__iterator = function(type, reverse) { - var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); - return new Iterator(function() { - var step = iterator.next(); - return step.done ? step : - iteratorValue(type, step.value, step.value, step); - }); - }; + takeLast: function(amount) { + return reify(this, this.toSeq().reverse().take(amount).reverse()); + }, + takeWhile: function(predicate, context) { + return reify(this, takeWhileFactory(this, predicate, context)); + }, + takeUntil: function(predicate, context) { + return this.takeWhile(not(predicate), context); + }, - createClass(FromEntriesSequence, KeyedSeq); - function FromEntriesSequence(entries) { - this._iter = entries; - this.size = entries.size; + valueSeq: function() { + return this.toIndexedSeq(); + }, + + + // ### Hashable Object + + hashCode: function() { + return this.__hash || (this.__hash = hashIterable(this)); } - FromEntriesSequence.prototype.entrySeq = function() { - return this._iter.toSeq(); - }; - FromEntriesSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; - return this._iter.__iterate(function(entry ) { - // Check if entry exists first so array access doesn't throw for holes - // in the parent iteration. - if (entry) { - validateEntry(entry); - var indexedIterable = isIterable(entry); - return fn( - indexedIterable ? entry.get(1) : entry[1], - indexedIterable ? entry.get(0) : entry[0], - this$0 - ); - } - }, reverse); - }; + // ### Internal - FromEntriesSequence.prototype.__iterator = function(type, reverse) { - var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); - return new Iterator(function() { - while (true) { - var step = iterator.next(); - if (step.done) { - return step; - } - var entry = step.value; - // Check if entry exists first so array access doesn't throw for holes - // in the parent iteration. - if (entry) { - validateEntry(entry); - var indexedIterable = isIterable(entry); - return iteratorValue( - type, - indexedIterable ? entry.get(0) : entry[0], - indexedIterable ? entry.get(1) : entry[1], - step - ); - } - } - }); - }; + // abstract __iterate(fn, reverse) + // abstract __iterator(type, reverse) + }); - ToIndexedSequence.prototype.cacheResult = - ToKeyedSequence.prototype.cacheResult = - ToSetSequence.prototype.cacheResult = - FromEntriesSequence.prototype.cacheResult = - cacheResultThrough; + // var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; + // var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; + // var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@'; + // var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; + var IterablePrototype = Iterable.prototype; + IterablePrototype[IS_ITERABLE_SENTINEL] = true; + IterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.values; + IterablePrototype.__toJS = IterablePrototype.toArray; + IterablePrototype.__toStringMapper = quoteString; + IterablePrototype.inspect = + IterablePrototype.toSource = function() { return this.toString(); }; + IterablePrototype.chain = IterablePrototype.flatMap; + IterablePrototype.contains = IterablePrototype.includes; - function flipFactory(iterable) { - var flipSequence = makeSequence(iterable); - flipSequence._iter = iterable; - flipSequence.size = iterable.size; - flipSequence.flip = function() {return iterable}; - flipSequence.reverse = function () { - var reversedSequence = iterable.reverse.apply(this); // super.reverse() - reversedSequence.flip = function() {return iterable.reverse()}; - return reversedSequence; - }; - flipSequence.has = function(key ) {return iterable.includes(key)}; - flipSequence.includes = function(key ) {return iterable.has(key)}; - flipSequence.cacheResult = cacheResultThrough; - flipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; - return iterable.__iterate(function(v, k) {return fn(k, v, this$0) !== false}, reverse); - } - flipSequence.__iteratorUncached = function(type, reverse) { - if (type === ITERATE_ENTRIES) { - var iterator = iterable.__iterator(type, reverse); - return new Iterator(function() { - var step = iterator.next(); - if (!step.done) { - var k = step.value[0]; - step.value[0] = step.value[1]; - step.value[1] = k; - } - return step; - }); - } - return iterable.__iterator( - type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES, - reverse - ); - } - return flipSequence; - } + mixin(KeyedIterable, { + // ### More sequential methods - function mapFactory(iterable, mapper, context) { - var mappedSequence = makeSequence(iterable); - mappedSequence.size = iterable.size; - mappedSequence.has = function(key ) {return iterable.has(key)}; - mappedSequence.get = function(key, notSetValue) { - var v = iterable.get(key, NOT_SET); - return v === NOT_SET ? - notSetValue : - mapper.call(context, v, key, iterable); - }; - mappedSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; - return iterable.__iterate( - function(v, k, c) {return fn(mapper.call(context, v, k, c), k, this$0) !== false}, - reverse - ); - } - mappedSequence.__iteratorUncached = function (type, reverse) { - var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); - return new Iterator(function() { - var step = iterator.next(); - if (step.done) { - return step; - } - var entry = step.value; - var key = entry[0]; - return iteratorValue( - type, - key, - mapper.call(context, entry[1], key, iterable), - step - ); - }); - } - return mappedSequence; - } + flip: function() { + return reify(this, flipFactory(this)); + }, + mapEntries: function(mapper, context) {var this$0 = this; + var iterations = 0; + return reify(this, + this.toSeq().map( + function(v, k) {return mapper.call(context, [k, v], iterations++, this$0)} + ).fromEntrySeq() + ); + }, - function reverseFactory(iterable, useKeys) { - var reversedSequence = makeSequence(iterable); - reversedSequence._iter = iterable; - reversedSequence.size = iterable.size; - reversedSequence.reverse = function() {return iterable}; - if (iterable.flip) { - reversedSequence.flip = function () { - var flipSequence = flipFactory(iterable); - flipSequence.reverse = function() {return iterable.flip()}; - return flipSequence; - }; + mapKeys: function(mapper, context) {var this$0 = this; + return reify(this, + this.toSeq().flip().map( + function(k, v) {return mapper.call(context, k, v, this$0)} + ).flip() + ); } - reversedSequence.get = function(key, notSetValue) - {return iterable.get(useKeys ? key : -1 - key, notSetValue)}; - reversedSequence.has = function(key ) - {return iterable.has(useKeys ? key : -1 - key)}; - reversedSequence.includes = function(value ) {return iterable.includes(value)}; - reversedSequence.cacheResult = cacheResultThrough; - reversedSequence.__iterate = function (fn, reverse) {var this$0 = this; - return iterable.__iterate(function(v, k) {return fn(v, k, this$0)}, !reverse); - }; - reversedSequence.__iterator = - function(type, reverse) {return iterable.__iterator(type, !reverse)}; - return reversedSequence; - } + }); - function filterFactory(iterable, predicate, context, useKeys) { - var filterSequence = makeSequence(iterable); - if (useKeys) { - filterSequence.has = function(key ) { - var v = iterable.get(key, NOT_SET); - return v !== NOT_SET && !!predicate.call(context, v, key, iterable); - }; - filterSequence.get = function(key, notSetValue) { - var v = iterable.get(key, NOT_SET); - return v !== NOT_SET && predicate.call(context, v, key, iterable) ? - v : notSetValue; - }; - } - filterSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; - var iterations = 0; - iterable.__iterate(function(v, k, c) { - if (predicate.call(context, v, k, c)) { - iterations++; - return fn(v, useKeys ? k : iterations - 1, this$0); - } - }, reverse); - return iterations; - }; - filterSequence.__iteratorUncached = function (type, reverse) { - var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); - var iterations = 0; - return new Iterator(function() { - while (true) { - var step = iterator.next(); - if (step.done) { - return step; - } - var entry = step.value; - var key = entry[0]; - var value = entry[1]; - if (predicate.call(context, value, key, iterable)) { - return iteratorValue(type, useKeys ? key : iterations++, value, step); - } - } - }); - } - return filterSequence; - } + var KeyedIterablePrototype = KeyedIterable.prototype; + KeyedIterablePrototype[IS_KEYED_SENTINEL] = true; + KeyedIterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.entries; + KeyedIterablePrototype.__toJS = IterablePrototype.toObject; + KeyedIterablePrototype.__toStringMapper = function(v, k) {return JSON.stringify(k) + ': ' + quoteString(v)}; - function countByFactory(iterable, grouper, context) { - var groups = Map().asMutable(); - iterable.__iterate(function(v, k) { - groups.update( - grouper.call(context, v, k, iterable), - 0, - function(a ) {return a + 1} - ); - }); - return groups.asImmutable(); - } + mixin(IndexedIterable, { - function groupByFactory(iterable, grouper, context) { - var isKeyedIter = isKeyed(iterable); - var groups = (isOrdered(iterable) ? OrderedMap() : Map()).asMutable(); - iterable.__iterate(function(v, k) { - groups.update( - grouper.call(context, v, k, iterable), - function(a ) {return (a = a || [], a.push(isKeyedIter ? [k, v] : v), a)} - ); - }); - var coerce = iterableClass(iterable); - return groups.map(function(arr ) {return reify(iterable, coerce(arr))}); - } + // ### Conversion to other types + toKeyedSeq: function() { + return new ToKeyedSequence(this, false); + }, - function sliceFactory(iterable, begin, end, useKeys) { - var originalSize = iterable.size; - // Sanitize begin & end using this shorthand for ToInt32(argument) - // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 - if (begin !== undefined) { - begin = begin | 0; - } - if (end !== undefined) { - if (end === Infinity) { - end = originalSize; - } else { - end = end | 0; - } - } + // ### ES6 Collection methods (ES6 Array and Map) - if (wholeSlice(begin, end, originalSize)) { - return iterable; - } + filter: function(predicate, context) { + return reify(this, filterFactory(this, predicate, context, false)); + }, - var resolvedBegin = resolveBegin(begin, originalSize); - var resolvedEnd = resolveEnd(end, originalSize); + findIndex: function(predicate, context) { + var entry = this.findEntry(predicate, context); + return entry ? entry[0] : -1; + }, - // begin or end will be NaN if they were provided as negative numbers and - // this iterable's size is unknown. In that case, cache first so there is - // a known size and these do not resolve to NaN. - if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) { - return sliceFactory(iterable.toSeq().cacheResult(), begin, end, useKeys); - } + indexOf: function(searchValue) { + var key = this.keyOf(searchValue); + return key === undefined ? -1 : key; + }, - // Note: resolvedEnd is undefined when the original sequence's length is - // unknown and this slice did not supply an end and should contain all - // elements after resolvedBegin. - // In that case, resolvedSize will be NaN and sliceSize will remain undefined. - var resolvedSize = resolvedEnd - resolvedBegin; - var sliceSize; - if (resolvedSize === resolvedSize) { - sliceSize = resolvedSize < 0 ? 0 : resolvedSize; - } + lastIndexOf: function(searchValue) { + var key = this.lastKeyOf(searchValue); + return key === undefined ? -1 : key; + }, - var sliceSeq = makeSequence(iterable); + reverse: function() { + return reify(this, reverseFactory(this, false)); + }, - // If iterable.size is undefined, the size of the realized sliceSeq is - // unknown at this point unless the number of items to slice is 0 - sliceSeq.size = sliceSize === 0 ? sliceSize : iterable.size && sliceSize || undefined; + slice: function(begin, end) { + return reify(this, sliceFactory(this, begin, end, false)); + }, - if (!useKeys && isSeq(iterable) && sliceSize >= 0) { - sliceSeq.get = function (index, notSetValue) { - index = wrapIndex(this, index); - return index >= 0 && index < sliceSize ? - iterable.get(index + resolvedBegin, notSetValue) : - notSetValue; + splice: function(index, removeNum /*, ...values*/) { + var numArgs = arguments.length; + removeNum = Math.max(removeNum | 0, 0); + if (numArgs === 0 || (numArgs === 2 && !removeNum)) { + return this; } - } + // If index is negative, it should resolve relative to the size of the + // collection. However size may be expensive to compute if not cached, so + // only call count() if the number is in fact negative. + index = resolveBegin(index, index < 0 ? this.count() : this.size); + var spliced = this.slice(0, index); + return reify( + this, + numArgs === 1 ? + spliced : + spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum)) + ); + }, - sliceSeq.__iterateUncached = function(fn, reverse) {var this$0 = this; - if (sliceSize === 0) { - return 0; - } - if (reverse) { - return this.cacheResult().__iterate(fn, reverse); - } - var skipped = 0; - var isSkipping = true; - var iterations = 0; - iterable.__iterate(function(v, k) { - if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) { - iterations++; - return fn(v, useKeys ? k : iterations - 1, this$0) !== false && - iterations !== sliceSize; - } - }); - return iterations; - }; - sliceSeq.__iteratorUncached = function(type, reverse) { - if (sliceSize !== 0 && reverse) { - return this.cacheResult().__iterator(type, reverse); - } - // Don't bother instantiating parent iterator if taking 0. - var iterator = sliceSize !== 0 && iterable.__iterator(type, reverse); - var skipped = 0; - var iterations = 0; - return new Iterator(function() { - while (skipped++ < resolvedBegin) { - iterator.next(); - } - if (++iterations > sliceSize) { - return iteratorDone(); - } - var step = iterator.next(); - if (useKeys || type === ITERATE_VALUES) { - return step; - } else if (type === ITERATE_KEYS) { - return iteratorValue(type, iterations - 1, undefined, step); - } else { - return iteratorValue(type, iterations - 1, step.value[1], step); - } - }); - } + // ### More collection methods - return sliceSeq; - } + findLastIndex: function(predicate, context) { + var entry = this.findLastEntry(predicate, context); + return entry ? entry[0] : -1; + }, + + first: function() { + return this.get(0); + }, + flatten: function(depth) { + return reify(this, flattenFactory(this, depth, false)); + }, - function takeWhileFactory(iterable, predicate, context) { - var takeSequence = makeSequence(iterable); - takeSequence.__iterateUncached = function(fn, reverse) {var this$0 = this; - if (reverse) { - return this.cacheResult().__iterate(fn, reverse); - } - var iterations = 0; - iterable.__iterate(function(v, k, c) - {return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$0)} + get: function(index, notSetValue) { + index = wrapIndex(this, index); + return (index < 0 || (this.size === Infinity || + (this.size !== undefined && index > this.size))) ? + notSetValue : + this.find(function(_, key) {return key === index}, undefined, notSetValue); + }, + + has: function(index) { + index = wrapIndex(this, index); + return index >= 0 && (this.size !== undefined ? + this.size === Infinity || index < this.size : + this.indexOf(index) !== -1 ); - return iterations; - }; - takeSequence.__iteratorUncached = function(type, reverse) {var this$0 = this; - if (reverse) { - return this.cacheResult().__iterator(type, reverse); - } - var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); - var iterating = true; - return new Iterator(function() { - if (!iterating) { - return iteratorDone(); - } - var step = iterator.next(); - if (step.done) { - return step; - } - var entry = step.value; - var k = entry[0]; - var v = entry[1]; - if (!predicate.call(context, v, k, this$0)) { - iterating = false; - return iteratorDone(); - } - return type === ITERATE_ENTRIES ? step : - iteratorValue(type, k, v, step); - }); - }; - return takeSequence; - } + }, + interpose: function(separator) { + return reify(this, interposeFactory(this, separator)); + }, - function skipWhileFactory(iterable, predicate, context, useKeys) { - var skipSequence = makeSequence(iterable); - skipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; - if (reverse) { - return this.cacheResult().__iterate(fn, reverse); - } - var isSkipping = true; - var iterations = 0; - iterable.__iterate(function(v, k, c) { - if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) { - iterations++; - return fn(v, useKeys ? k : iterations - 1, this$0); - } - }); - return iterations; - }; - skipSequence.__iteratorUncached = function(type, reverse) {var this$0 = this; - if (reverse) { - return this.cacheResult().__iterator(type, reverse); + interleave: function(/*...iterables*/) { + var iterables = [this].concat(arrCopy(arguments)); + var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, iterables); + var interleaved = zipped.flatten(true); + if (zipped.size) { + interleaved.size = zipped.size * iterables.length; } - var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); - var skipping = true; - var iterations = 0; - return new Iterator(function() { - var step, k, v; - do { - step = iterator.next(); - if (step.done) { - if (useKeys || type === ITERATE_VALUES) { - return step; - } else if (type === ITERATE_KEYS) { - return iteratorValue(type, iterations++, undefined, step); - } else { - return iteratorValue(type, iterations++, step.value[1], step); - } - } - var entry = step.value; - k = entry[0]; - v = entry[1]; - skipping && (skipping = predicate.call(context, v, k, this$0)); - } while (skipping); - return type === ITERATE_ENTRIES ? step : - iteratorValue(type, k, v, step); - }); - }; - return skipSequence; - } + return reify(this, interleaved); + }, + keySeq: function() { + return Range(0, this.size); + }, - function concatFactory(iterable, values) { - var isKeyedIterable = isKeyed(iterable); - var iters = [iterable].concat(values).map(function(v ) { - if (!isIterable(v)) { - v = isKeyedIterable ? - keyedSeqFromValue(v) : - indexedSeqFromValue(Array.isArray(v) ? v : [v]); - } else if (isKeyedIterable) { - v = KeyedIterable(v); - } - return v; - }).filter(function(v ) {return v.size !== 0}); + last: function() { + return this.get(-1); + }, - if (iters.length === 0) { - return iterable; - } + skipWhile: function(predicate, context) { + return reify(this, skipWhileFactory(this, predicate, context, false)); + }, - if (iters.length === 1) { - var singleton = iters[0]; - if (singleton === iterable || - isKeyedIterable && isKeyed(singleton) || - isIndexed(iterable) && isIndexed(singleton)) { - return singleton; - } - } + zip: function(/*, ...iterables */) { + var iterables = [this].concat(arrCopy(arguments)); + return reify(this, zipWithFactory(this, defaultZipper, iterables)); + }, - var concatSeq = new ArraySeq(iters); - if (isKeyedIterable) { - concatSeq = concatSeq.toKeyedSeq(); - } else if (!isIndexed(iterable)) { - concatSeq = concatSeq.toSetSeq(); + zipWith: function(zipper/*, ...iterables */) { + var iterables = arrCopy(arguments); + iterables[0] = this; + return reify(this, zipWithFactory(this, zipper, iterables)); } - concatSeq = concatSeq.flatten(true); - concatSeq.size = iters.reduce( - function(sum, seq) { - if (sum !== undefined) { - var size = seq.size; - if (size !== undefined) { - return sum + size; - } - } - }, - 0 - ); - return concatSeq; - } + }); - function flattenFactory(iterable, depth, useKeys) { - var flatSequence = makeSequence(iterable); - flatSequence.__iterateUncached = function(fn, reverse) { - var iterations = 0; - var stopped = false; - function flatDeep(iter, currentDepth) {var this$0 = this; - iter.__iterate(function(v, k) { - if ((!depth || currentDepth < depth) && isIterable(v)) { - flatDeep(v, currentDepth + 1); - } else if (fn(v, useKeys ? k : iterations++, this$0) === false) { - stopped = true; - } - return !stopped; - }, reverse); - } - flatDeep(iterable, 0); - return iterations; - } - flatSequence.__iteratorUncached = function(type, reverse) { - var iterator = iterable.__iterator(type, reverse); - var stack = []; - var iterations = 0; - return new Iterator(function() { - while (iterator) { - var step = iterator.next(); - if (step.done !== false) { - iterator = stack.pop(); - continue; - } - var v = step.value; - if (type === ITERATE_ENTRIES) { - v = v[1]; - } - if ((!depth || stack.length < depth) && isIterable(v)) { - stack.push(iterator); - iterator = v.__iterator(type, reverse); - } else { - return useKeys ? step : iteratorValue(type, iterations++, v, step); - } - } - return iteratorDone(); - }); - } - return flatSequence; - } + IndexedIterable.prototype[IS_INDEXED_SENTINEL] = true; + IndexedIterable.prototype[IS_ORDERED_SENTINEL] = true; - function flatMapFactory(iterable, mapper, context) { - var coerce = iterableClass(iterable); - return iterable.toSeq().map( - function(v, k) {return coerce(mapper.call(context, v, k, iterable))} - ).flatten(true); - } + mixin(SetIterable, { - function interposeFactory(iterable, separator) { - var interposedSequence = makeSequence(iterable); - interposedSequence.size = iterable.size && iterable.size * 2 -1; - interposedSequence.__iterateUncached = function(fn, reverse) {var this$0 = this; - var iterations = 0; - iterable.__iterate(function(v, k) - {return (!iterations || fn(separator, iterations++, this$0) !== false) && - fn(v, iterations++, this$0) !== false}, - reverse - ); - return iterations; - }; - interposedSequence.__iteratorUncached = function(type, reverse) { - var iterator = iterable.__iterator(ITERATE_VALUES, reverse); - var iterations = 0; - var step; - return new Iterator(function() { - if (!step || iterations % 2) { - step = iterator.next(); - if (step.done) { - return step; - } - } - return iterations % 2 ? - iteratorValue(type, iterations++, separator) : - iteratorValue(type, iterations++, step.value, step); - }); - }; - return interposedSequence; - } + // ### ES6 Collection methods (ES6 Array and Map) + get: function(value, notSetValue) { + return this.has(value) ? value : notSetValue; + }, - function sortFactory(iterable, comparator, mapper) { - if (!comparator) { - comparator = defaultComparator; - } - var isKeyedIterable = isKeyed(iterable); - var index = 0; - var entries = iterable.toSeq().map( - function(v, k) {return [k, v, index++, mapper ? mapper(v, k, iterable) : v]} - ).toArray(); - entries.sort(function(a, b) {return comparator(a[3], b[3]) || a[2] - b[2]}).forEach( - isKeyedIterable ? - function(v, i) { entries[i].length = 2; } : - function(v, i) { entries[i] = v[1]; } - ); - return isKeyedIterable ? KeyedSeq(entries) : - isIndexed(iterable) ? IndexedSeq(entries) : - SetSeq(entries); - } + includes: function(value) { + return this.has(value); + }, - function maxFactory(iterable, comparator, mapper) { - if (!comparator) { - comparator = defaultComparator; - } - if (mapper) { - var entry = iterable.toSeq() - .map(function(v, k) {return [v, mapper(v, k, iterable)]}) - .reduce(function(a, b) {return maxCompare(comparator, a[1], b[1]) ? b : a}); - return entry && entry[0]; - } else { - return iterable.reduce(function(a, b) {return maxCompare(comparator, a, b) ? b : a}); + // ### More sequential methods + + keySeq: function() { + return this.valueSeq(); } - } - function maxCompare(comparator, a, b) { - var comp = comparator(b, a); - // b is considered the new max if the comparator declares them equal, but - // they are not equal and b is in fact a nullish value. - return (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) || comp > 0; - } + }); + SetIterable.prototype.has = IterablePrototype.includes; + SetIterable.prototype.contains = SetIterable.prototype.includes; - function zipWithFactory(keyIter, zipper, iters) { - var zipSequence = makeSequence(keyIter); - zipSequence.size = new ArraySeq(iters).map(function(i ) {return i.size}).min(); - // Note: this a generic base implementation of __iterate in terms of - // __iterator which may be more generically useful in the future. - zipSequence.__iterate = function(fn, reverse) { - /* generic: - var iterator = this.__iterator(ITERATE_ENTRIES, reverse); - var step; - var iterations = 0; - while (!(step = iterator.next()).done) { - iterations++; - if (fn(step.value[1], step.value[0], this) === false) { - break; - } - } - return iterations; - */ - // indexed: - var iterator = this.__iterator(ITERATE_VALUES, reverse); - var step; - var iterations = 0; - while (!(step = iterator.next()).done) { - if (fn(step.value, iterations++, this) === false) { - break; - } - } - return iterations; - }; - zipSequence.__iteratorUncached = function(type, reverse) { - var iterators = iters.map(function(i ) - {return (i = Iterable(i), getIterator(reverse ? i.reverse() : i))} - ); - var iterations = 0; - var isDone = false; - return new Iterator(function() { - var steps; - if (!isDone) { - steps = iterators.map(function(i ) {return i.next()}); - isDone = steps.some(function(s ) {return s.done}); - } - if (isDone) { - return iteratorDone(); - } - return iteratorValue( - type, - iterations++, - zipper.apply(null, steps.map(function(s ) {return s.value})) - ); - }); - }; - return zipSequence - } + // Mixin subclasses - // #pragma Helper Functions + mixin(KeyedSeq, KeyedIterable.prototype); + mixin(IndexedSeq, IndexedIterable.prototype); + mixin(SetSeq, SetIterable.prototype); - function reify(iter, seq) { - return isSeq(iter) ? seq : iter.constructor(seq); + mixin(KeyedCollection, KeyedIterable.prototype); + mixin(IndexedCollection, IndexedIterable.prototype); + mixin(SetCollection, SetIterable.prototype); + + + // #pragma Helper functions + + function keyMapper(v, k) { + return k; } - function validateEntry(entry) { - if (entry !== Object(entry)) { - throw new TypeError('Expected [K, V] tuple: ' + entry); - } + function entryMapper(v, k) { + return [k, v]; } - function resolveSize(iter) { - assertNotInfinite(iter.size); - return ensureSize(iter); + function not(predicate) { + return function() { + return !predicate.apply(this, arguments); + } } - function iterableClass(iterable) { - return isKeyed(iterable) ? KeyedIterable : - isIndexed(iterable) ? IndexedIterable : - SetIterable; + function neg(predicate) { + return function() { + return -predicate.apply(this, arguments); + } } - function makeSequence(iterable) { - return Object.create( - ( - isKeyed(iterable) ? KeyedSeq : - isIndexed(iterable) ? IndexedSeq : - SetSeq - ).prototype - ); + function quoteString(value) { + return typeof value === 'string' ? JSON.stringify(value) : String(value); } - function cacheResultThrough() { - if (this._iter.cacheResult) { - this._iter.cacheResult(); - this.size = this._iter.size; - return this; - } else { - return Seq.prototype.cacheResult.call(this); - } + function defaultZipper() { + return arrCopy(arguments); } - function defaultComparator(a, b) { - return a > b ? 1 : a < b ? -1 : 0; + function defaultNegComparator(a, b) { + return a < b ? 1 : a > b ? -1 : 0; } - function forceIterator(keyPath) { - var iter = getIterator(keyPath); - if (!iter) { - // Array might not be iterable in this environment, so we need a fallback - // to our wrapped type. - if (!isArrayLike(keyPath)) { - throw new TypeError('Expected iterable or array-like: ' + keyPath); - } - iter = getIterator(Iterable(keyPath)); + function hashIterable(iterable) { + if (iterable.size === Infinity) { + return 0; } - return iter; + var ordered = isOrdered(iterable); + var keyed = isKeyed(iterable); + var h = ordered ? 1 : 0; + var size = iterable.__iterate( + keyed ? + ordered ? + function(v, k) { h = 31 * h + hashMerge(hash(v), hash(k)) | 0; } : + function(v, k) { h = h + hashMerge(hash(v), hash(k)) | 0; } : + ordered ? + function(v ) { h = 31 * h + hash(v) | 0; } : + function(v ) { h = h + hash(v) | 0; } + ); + return murmurHashOfSize(size, h); } - createClass(Record, KeyedCollection); + function murmurHashOfSize(size, h) { + h = imul(h, 0xCC9E2D51); + h = imul(h << 15 | h >>> -15, 0x1B873593); + h = imul(h << 13 | h >>> -13, 5); + h = (h + 0xE6546B64 | 0) ^ size; + h = imul(h ^ h >>> 16, 0x85EBCA6B); + h = imul(h ^ h >>> 13, 0xC2B2AE35); + h = smi(h ^ h >>> 16); + return h; + } - function Record(defaultValues, name) { - var hasInitialized; + function hashMerge(a, b) { + return a ^ b + 0x9E3779B9 + (a << 6) + (a >> 2) | 0; // int + } - var RecordType = function Record(values) { - if (values instanceof RecordType) { - return values; - } - if (!(this instanceof RecordType)) { - return new RecordType(values); - } - if (!hasInitialized) { - hasInitialized = true; - var keys = Object.keys(defaultValues); - setProps(RecordTypePrototype, keys); - RecordTypePrototype.size = keys.length; - RecordTypePrototype._name = name; - RecordTypePrototype._keys = keys; - RecordTypePrototype._defaultValues = defaultValues; - } - this._map = Map(values); - }; + var Immutable = { - var RecordTypePrototype = RecordType.prototype = Object.create(RecordPrototype); - RecordTypePrototype.constructor = RecordType; + Iterable: Iterable, - return RecordType; - } + Seq: Seq, + Collection: Collection, + Map: Map, + OrderedMap: OrderedMap, + List: List, + Stack: Stack, + Set: Set, + OrderedSet: OrderedSet, - Record.prototype.toString = function() { - return this.__toString(recordName(this) + ' {', '}'); - }; + Record: Record, + Range: Range, + Repeat: Repeat, - // @pragma Access + is: is, + fromJS: fromJS - Record.prototype.has = function(k) { - return this._defaultValues.hasOwnProperty(k); - }; + }; - Record.prototype.get = function(k, notSetValue) { - if (!this.has(k)) { - return notSetValue; - } - var defaultVal = this._defaultValues[k]; - return this._map ? this._map.get(k, defaultVal) : defaultVal; - }; + return Immutable; - // @pragma Modification + })); - Record.prototype.clear = function() { - if (this.__ownerID) { - this._map && this._map.clear(); - return this; - } - var RecordType = this.constructor; - return RecordType._empty || (RecordType._empty = makeRecord(this, emptyMap())); - }; +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { - Record.prototype.set = function(k, v) { - if (!this.has(k)) { - throw new Error('Cannot set unknown key "' + k + '" on ' + recordName(this)); - } - if (this._map && !this._map.has(k)) { - var defaultVal = this._defaultValues[k]; - if (v === defaultVal) { - return this; - } - } - var newMap = this._map && this._map.set(k, v); - if (this.__ownerID || newMap === this._map) { - return this; - } - return makeRecord(this, newMap); - }; + "use strict"; - Record.prototype.remove = function(k) { - if (!this.has(k)) { - return this; - } - var newMap = this._map && this._map.remove(k); - if (this.__ownerID || newMap === this._map) { - return this; - } - return makeRecord(this, newMap); - }; + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.MonoidalReducer = exports.CloneReducer = undefined; + exports.default = reduce; - Record.prototype.wasAltered = function() { - return this._map.wasAltered(); - }; + var _cloneReducer = __webpack_require__(5); - Record.prototype.__iterator = function(type, reverse) {var this$0 = this; - return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterator(type, reverse); - }; + Object.defineProperty(exports, "CloneReducer", { + enumerable: true, + get: function get() { + return _cloneReducer.default; + } + }); - Record.prototype.__iterate = function(fn, reverse) {var this$0 = this; - return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterate(fn, reverse); - }; + var _monoidalReducer = __webpack_require__(7); - Record.prototype.__ensureOwner = function(ownerID) { - if (ownerID === this.__ownerID) { - return this; - } - var newMap = this._map && this._map.__ensureOwner(ownerID); - if (!ownerID) { - this.__ownerID = ownerID; - this._map = newMap; - return this; - } - return makeRecord(this, newMap, ownerID); - }; + Object.defineProperty(exports, "MonoidalReducer", { + enumerable: true, + get: function get() { + return _monoidalReducer.default; + } + }); + var _shiftSpec = __webpack_require__(6); - var RecordPrototype = Record.prototype; - RecordPrototype[DELETE] = RecordPrototype.remove; - RecordPrototype.deleteIn = - RecordPrototype.removeIn = MapPrototype.removeIn; - RecordPrototype.merge = MapPrototype.merge; - RecordPrototype.mergeWith = MapPrototype.mergeWith; - RecordPrototype.mergeIn = MapPrototype.mergeIn; - RecordPrototype.mergeDeep = MapPrototype.mergeDeep; - RecordPrototype.mergeDeepWith = MapPrototype.mergeDeepWith; - RecordPrototype.mergeDeepIn = MapPrototype.mergeDeepIn; - RecordPrototype.setIn = MapPrototype.setIn; - RecordPrototype.update = MapPrototype.update; - RecordPrototype.updateIn = MapPrototype.updateIn; - RecordPrototype.withMutations = MapPrototype.withMutations; - RecordPrototype.asMutable = MapPrototype.asMutable; - RecordPrototype.asImmutable = MapPrototype.asImmutable; + var _shiftSpec2 = _interopRequireDefault(_shiftSpec); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function makeRecord(likeRecord, map, ownerID) { - var record = Object.create(Object.getPrototypeOf(likeRecord)); - record._map = map; - record.__ownerID = ownerID; - return record; + function transformWithSpec(transformer, node, spec) { + switch (spec.typeName) { + case "Enum": + case "String": + case "Number": + case "Boolean": + case "SourceSpan": + return node; + case "Const": + // TODO: checked version + return transformWithSpec(transformer, node, spec.argument); + case "Maybe": + return node && transformWithSpec(transformer, node, spec.argument); + case "List": + return node.map(function (e) { + return transformWithSpec(transformer, e, spec.argument); + }); + case "Union": + // TODO: checked version + return transformWithSpec(transformer, node, _shiftSpec2.default[node.type]); + default: + var state = {}; + spec.fields.forEach(function (field) { + var v = transformWithSpec(transformer, node[field.name], field.type); + state[field.name] = v == null ? null : v; + }); + if (typeof transformer["reduce" + node.type] !== "function") { + throw new Error("Encountered " + node.type + ", which the provided reducer does not handle."); + } + return transformer["reduce" + node.type](node, state); } + } /** + * 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. + */ - function recordName(record) { - return record._name || record.constructor.name || 'Record'; - } + function reduce(reducer, reducible) { + return transformWithSpec(reducer, reducible, _shiftSpec2.default[reducible.type]); + } - function setProps(prototype, names) { - try { - names.forEach(setProp.bind(undefined, prototype)); - } catch (error) { - // Object.defineProperty failed. Probably IE8. - } - } +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { - function setProp(prototype, name) { - Object.defineProperty(prototype, name, { - get: function() { - return this.get(name); - }, - set: function(value) { - invariant(this.__ownerID, 'Cannot set on an immutable record.'); - this.set(name, value); - } - }); - } + "use strict"; - createClass(Set, SetCollection); + Object.defineProperty(exports, "__esModule", { + value: true + }); - // @pragma Construction + var _shiftSpec = __webpack_require__(6); - function Set(value) { - return value === null || value === undefined ? emptySet() : - isSet(value) && !isOrdered(value) ? value : - emptySet().withMutations(function(set ) { - var iter = SetIterable(value); - assertNotInfinite(iter.size); - iter.forEach(function(v ) {return set.add(v)}); - }); - } + var _shiftSpec2 = _interopRequireDefault(_shiftSpec); - Set.of = function(/*...values*/) { - return this(arguments); - }; + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - Set.fromKeys = function(value) { - return this(KeyedIterable(value).keySeq()); - }; + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** + * 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. + */ - Set.prototype.toString = function() { - return this.__toString('Set {', '}'); - }; + var CloneReducer = function CloneReducer() { + _classCallCheck(this, CloneReducer); + }; - // @pragma Access + exports.default = CloneReducer; - Set.prototype.has = function(value) { - return this._map.has(value); - }; + for (var typeName in _shiftSpec2.default) { + var type = _shiftSpec2.default[typeName]; + Object.defineProperty(CloneReducer.prototype, "reduce" + typeName, { + value: function value(node, state) { + return state; + } + }); + } - // @pragma Modification +/***/ }, +/* 6 */ +/***/ function(module, exports) { - Set.prototype.add = function(value) { - return updateSet(this, this._map.set(value, true)); - }; + // Generated by src/generate-spec.js. - Set.prototype.remove = function(value) { - return updateSet(this, this._map.remove(value)); - }; + /** + * Copyright 2015 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. + */ - Set.prototype.clear = function() { - return updateSet(this, this._map.clear()); - }; + // Hack to make Babel6 import this as a module. + Object.defineProperty(exports, "__esModule", { + value: true + }); - // @pragma Composition + // Meta data generated from spec.idl. + exports.default = (function() { + var SPEC = {}; - Set.prototype.union = function() {var iters = SLICE$0.call(arguments, 0); - iters = iters.filter(function(x ) {return x.size !== 0}); - if (iters.length === 0) { - return this; - } - if (this.size === 0 && !this.__ownerID && iters.length === 1) { - return this.constructor(iters[0]); - } - return this.withMutations(function(set ) { - for (var ii = 0; ii < iters.length; ii++) { - SetIterable(iters[ii]).forEach(function(value ) {return set.add(value)}); - } - }); - }; + var BOOLEAN = { typeName: "Boolean" }; + var DOUBLE = { typeName: "Number" }; + var STRING = { typeName: "String" }; + function Maybe(arg) { return { typeName: "Maybe", argument: arg }; } + function List(arg) { return { typeName: "List", argument: arg }; } + function Const(arg) { return { typeName: "Const", argument: arg }; } + function Union() { return { typeName: "Union", arguments: [].slice.call(arguments, 0) }; } - Set.prototype.intersect = function() {var iters = SLICE$0.call(arguments, 0); - if (iters.length === 0) { - return this; - } - iters = iters.map(function(iter ) {return SetIterable(iter)}); - var originalSet = this; - return this.withMutations(function(set ) { - originalSet.forEach(function(value ) { - if (!iters.every(function(iter ) {return iter.includes(value)})) { - set.remove(value); - } - }); - }); - }; + var TYPE_INDICATOR = { + typeName: "Enum", + values: ["ArrayBinding", "ArrayExpression", "ArrowExpression", "AssignmentExpression", "BinaryExpression", "BindingIdentifier", "BindingProperty", "BindingPropertyIdentifier", "BindingPropertyProperty", "BindingWithDefault", "Block", "BlockStatement", "BreakStatement", "CallExpression", "CatchClause", "Class", "ClassDeclaration", "ClassElement", "ClassExpression", "CompoundAssignmentExpression", "ComputedMemberExpression", "ComputedPropertyName", "ConditionalExpression", "ContinueStatement", "DataProperty", "DebuggerStatement", "Directive", "DoWhileStatement", "EmptyStatement", "Export", "ExportAllFrom", "ExportDeclaration", "ExportDefault", "ExportFrom", "ExportSpecifier", "Expression", "ExpressionStatement", "ForInStatement", "ForOfStatement", "ForStatement", "FormalParameters", "Function", "FunctionBody", "FunctionDeclaration", "FunctionExpression", "Getter", "IdentifierExpression", "IfStatement", "Import", "ImportDeclaration", "ImportNamespace", "ImportSpecifier", "IterationStatement", "LabeledStatement", "LiteralBooleanExpression", "LiteralInfinityExpression", "LiteralNullExpression", "LiteralNumericExpression", "LiteralRegExpExpression", "LiteralStringExpression", "MemberExpression", "Method", "MethodDefinition", "Module", "NamedObjectProperty", "NewExpression", "NewTargetExpression", "Node", "ObjectBinding", "ObjectExpression", "ObjectProperty", "PropertyName", "ReturnStatement", "Script", "Setter", "ShorthandProperty", "SourceLocation", "SourceSpan", "SpreadElement", "Statement", "StaticMemberExpression", "StaticPropertyName", "Super", "SwitchCase", "SwitchDefault", "SwitchStatement", "SwitchStatementWithDefault", "TemplateElement", "TemplateExpression", "ThisExpression", "ThrowStatement", "TryCatchStatement", "TryFinallyStatement", "UnaryExpression", "UpdateExpression", "VariableDeclaration", "VariableDeclarationStatement", "VariableDeclarator", "WhileStatement", "WithStatement", "YieldExpression", "YieldGeneratorExpression"] + }; - Set.prototype.subtract = function() {var iters = SLICE$0.call(arguments, 0); - if (iters.length === 0) { - return this; - } - iters = iters.map(function(iter ) {return SetIterable(iter)}); - var originalSet = this; - return this.withMutations(function(set ) { - originalSet.forEach(function(value ) { - if (iters.some(function(iter ) {return iter.includes(value)})) { - set.remove(value); - } - }); - }); - }; + var VariableDeclarationKind = { + typeName: "Enum", + values: ["var", "let", "const"] + }; - Set.prototype.merge = function() { - return this.union.apply(this, arguments); - }; + var CompoundAssignmentOperator = { + typeName: "Enum", + values: ["+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "|=", "^=", "&="] + }; - Set.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); - return this.union.apply(this, iters); - }; + var BinaryOperator = { + typeName: "Enum", + values: ["==", "!=", "===", "!==", "<", "<=", ">", ">=", "in", "instanceof", "<<", ">>", ">>>", "+", "-", "*", "/", "%", ",", "||", "&&", "|", "^", "&"] + }; - Set.prototype.sort = function(comparator) { - // Late binding - return OrderedSet(sortFactory(this, comparator)); - }; + var UnaryOperator = { + typeName: "Enum", + values: ["+", "-", "!", "~", "typeof", "void", "delete"] + }; - Set.prototype.sortBy = function(mapper, comparator) { - // Late binding - return OrderedSet(sortFactory(this, comparator, mapper)); - }; + var UpdateOperator = { + typeName: "Enum", + values: ["++", "--"] + }; - Set.prototype.wasAltered = function() { - return this._map.wasAltered(); - }; + var SourceLocation = SPEC.SourceLocation = {}; + var SourceSpan = SPEC.SourceSpan = {}; + var BindingWithDefault = SPEC.BindingWithDefault = {}; + var BindingIdentifier = SPEC.BindingIdentifier = {}; + var ArrayBinding = SPEC.ArrayBinding = {}; + var ObjectBinding = SPEC.ObjectBinding = {}; + var BindingPropertyIdentifier = SPEC.BindingPropertyIdentifier = {}; + var BindingPropertyProperty = SPEC.BindingPropertyProperty = {}; + var ClassExpression = SPEC.ClassExpression = {}; + var ClassDeclaration = SPEC.ClassDeclaration = {}; + var ClassElement = SPEC.ClassElement = {}; + var Module = SPEC.Module = {}; + var Import = SPEC.Import = {}; + var ImportNamespace = SPEC.ImportNamespace = {}; + var ImportSpecifier = SPEC.ImportSpecifier = {}; + var ExportAllFrom = SPEC.ExportAllFrom = {}; + var ExportFrom = SPEC.ExportFrom = {}; + var Export = SPEC.Export = {}; + var ExportDefault = SPEC.ExportDefault = {}; + var ExportSpecifier = SPEC.ExportSpecifier = {}; + var Method = SPEC.Method = {}; + var Getter = SPEC.Getter = {}; + var Setter = SPEC.Setter = {}; + var DataProperty = SPEC.DataProperty = {}; + var ShorthandProperty = SPEC.ShorthandProperty = {}; + var ComputedPropertyName = SPEC.ComputedPropertyName = {}; + var StaticPropertyName = SPEC.StaticPropertyName = {}; + var LiteralBooleanExpression = SPEC.LiteralBooleanExpression = {}; + var LiteralInfinityExpression = SPEC.LiteralInfinityExpression = {}; + var LiteralNullExpression = SPEC.LiteralNullExpression = {}; + var LiteralNumericExpression = SPEC.LiteralNumericExpression = {}; + var LiteralRegExpExpression = SPEC.LiteralRegExpExpression = {}; + var LiteralStringExpression = SPEC.LiteralStringExpression = {}; + var ArrayExpression = SPEC.ArrayExpression = {}; + var ArrowExpression = SPEC.ArrowExpression = {}; + var AssignmentExpression = SPEC.AssignmentExpression = {}; + var BinaryExpression = SPEC.BinaryExpression = {}; + var CallExpression = SPEC.CallExpression = {}; + var CompoundAssignmentExpression = SPEC.CompoundAssignmentExpression = {}; + var ComputedMemberExpression = SPEC.ComputedMemberExpression = {}; + var ConditionalExpression = SPEC.ConditionalExpression = {}; + var FunctionExpression = SPEC.FunctionExpression = {}; + var IdentifierExpression = SPEC.IdentifierExpression = {}; + var NewExpression = SPEC.NewExpression = {}; + var NewTargetExpression = SPEC.NewTargetExpression = {}; + var ObjectExpression = SPEC.ObjectExpression = {}; + var UnaryExpression = SPEC.UnaryExpression = {}; + var StaticMemberExpression = SPEC.StaticMemberExpression = {}; + var TemplateExpression = SPEC.TemplateExpression = {}; + var ThisExpression = SPEC.ThisExpression = {}; + var UpdateExpression = SPEC.UpdateExpression = {}; + var YieldExpression = SPEC.YieldExpression = {}; + var YieldGeneratorExpression = SPEC.YieldGeneratorExpression = {}; + var BlockStatement = SPEC.BlockStatement = {}; + var BreakStatement = SPEC.BreakStatement = {}; + var ContinueStatement = SPEC.ContinueStatement = {}; + var DebuggerStatement = SPEC.DebuggerStatement = {}; + var DoWhileStatement = SPEC.DoWhileStatement = {}; + var EmptyStatement = SPEC.EmptyStatement = {}; + var ExpressionStatement = SPEC.ExpressionStatement = {}; + var ForInStatement = SPEC.ForInStatement = {}; + var ForOfStatement = SPEC.ForOfStatement = {}; + var ForStatement = SPEC.ForStatement = {}; + var IfStatement = SPEC.IfStatement = {}; + var LabeledStatement = SPEC.LabeledStatement = {}; + var ReturnStatement = SPEC.ReturnStatement = {}; + var SwitchStatement = SPEC.SwitchStatement = {}; + var SwitchStatementWithDefault = SPEC.SwitchStatementWithDefault = {}; + var ThrowStatement = SPEC.ThrowStatement = {}; + var TryCatchStatement = SPEC.TryCatchStatement = {}; + var TryFinallyStatement = SPEC.TryFinallyStatement = {}; + var VariableDeclarationStatement = SPEC.VariableDeclarationStatement = {}; + var WhileStatement = SPEC.WhileStatement = {}; + var WithStatement = SPEC.WithStatement = {}; + var Block = SPEC.Block = {}; + var CatchClause = SPEC.CatchClause = {}; + var Directive = SPEC.Directive = {}; + var FormalParameters = SPEC.FormalParameters = {}; + var FunctionBody = SPEC.FunctionBody = {}; + var FunctionDeclaration = SPEC.FunctionDeclaration = {}; + var Script = SPEC.Script = {}; + var SpreadElement = SPEC.SpreadElement = {}; + var Super = SPEC.Super = {}; + var SwitchCase = SPEC.SwitchCase = {}; + var SwitchDefault = SPEC.SwitchDefault = {}; + var TemplateElement = SPEC.TemplateElement = {}; + var VariableDeclaration = SPEC.VariableDeclaration = {}; + var VariableDeclarator = SPEC.VariableDeclarator = {}; - Set.prototype.__iterate = function(fn, reverse) {var this$0 = this; - return this._map.__iterate(function(_, k) {return fn(k, k, this$0)}, reverse); - }; + var Class = Union(ClassExpression, ClassDeclaration); + var BindingProperty = Union(BindingPropertyIdentifier, BindingPropertyProperty); + var ExportDeclaration = Union(ExportAllFrom, ExportFrom, Export, ExportDefault); + var ImportDeclaration = Union(Import, ImportNamespace); + var MethodDefinition = Union(Method, Getter, Setter); + var NamedObjectProperty = Union(MethodDefinition, DataProperty); + var ObjectProperty = Union(NamedObjectProperty, ShorthandProperty); + var PropertyName = Union(ComputedPropertyName, StaticPropertyName); + var MemberExpression = Union(ComputedMemberExpression, StaticMemberExpression); + var Expression = Union(MemberExpression, ClassExpression, LiteralBooleanExpression, LiteralInfinityExpression, LiteralNullExpression, LiteralNumericExpression, LiteralRegExpExpression, LiteralStringExpression, ArrayExpression, ArrowExpression, AssignmentExpression, BinaryExpression, CallExpression, CompoundAssignmentExpression, ConditionalExpression, FunctionExpression, IdentifierExpression, NewExpression, NewTargetExpression, ObjectExpression, UnaryExpression, TemplateExpression, ThisExpression, UpdateExpression, YieldExpression, YieldGeneratorExpression); + var IterationStatement = Union(DoWhileStatement, ForInStatement, ForOfStatement, ForStatement, WhileStatement); + var Statement = Union(IterationStatement, ClassDeclaration, BlockStatement, BreakStatement, ContinueStatement, DebuggerStatement, EmptyStatement, ExpressionStatement, IfStatement, LabeledStatement, ReturnStatement, SwitchStatement, SwitchStatementWithDefault, ThrowStatement, TryCatchStatement, TryFinallyStatement, VariableDeclarationStatement, WithStatement, FunctionDeclaration); + var Node = Union(Statement, Expression, PropertyName, ObjectProperty, ImportDeclaration, ExportDeclaration, BindingWithDefault, BindingIdentifier, ArrayBinding, ObjectBinding, BindingProperty, ClassElement, Module, ImportSpecifier, ExportSpecifier, Block, CatchClause, Directive, FormalParameters, FunctionBody, Script, SpreadElement, Super, SwitchCase, SwitchDefault, TemplateElement, VariableDeclaration, VariableDeclarator); + var Function = Union(FunctionExpression, FunctionDeclaration); - Set.prototype.__iterator = function(type, reverse) { - return this._map.map(function(_, k) {return k}).__iterator(type, reverse); - }; + SourceLocation.typeName = "SourceLocation"; + SourceLocation.fields = [ + { name: "line", type: DOUBLE }, + { name: "column", type: DOUBLE }, + { name: "offset", type: DOUBLE }, + ]; - Set.prototype.__ensureOwner = function(ownerID) { - if (ownerID === this.__ownerID) { - return this; - } - var newMap = this._map.__ensureOwner(ownerID); - if (!ownerID) { - this.__ownerID = ownerID; - this._map = newMap; - return this; - } - return this.__make(newMap, ownerID); - }; + SourceSpan.typeName = "SourceSpan"; + SourceSpan.fields = [ + { name: "source", type: Maybe(STRING) }, + { name: "start", type: SourceLocation }, + { name: "end", type: SourceLocation }, + ]; + BindingWithDefault.typeName = "BindingWithDefault"; + BindingWithDefault.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "BindingWithDefault" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, + { name: "init", type: Expression }, + ]; - function isSet(maybeSet) { - return !!(maybeSet && maybeSet[IS_SET_SENTINEL]); - } + BindingIdentifier.typeName = "BindingIdentifier"; + BindingIdentifier.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "BindingIdentifier" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: STRING }, + ]; - Set.isSet = isSet; + ArrayBinding.typeName = "ArrayBinding"; + ArrayBinding.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ArrayBinding" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "elements", type: List(Maybe(Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault))) }, + { name: "restElement", type: Maybe(Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression)) }, + ]; - var IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; + ObjectBinding.typeName = "ObjectBinding"; + ObjectBinding.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ObjectBinding" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "properties", type: List(BindingProperty) }, + ]; - var SetPrototype = Set.prototype; - SetPrototype[IS_SET_SENTINEL] = true; - SetPrototype[DELETE] = SetPrototype.remove; - SetPrototype.mergeDeep = SetPrototype.merge; - SetPrototype.mergeDeepWith = SetPrototype.mergeWith; - SetPrototype.withMutations = MapPrototype.withMutations; - SetPrototype.asMutable = MapPrototype.asMutable; - SetPrototype.asImmutable = MapPrototype.asImmutable; + BindingPropertyIdentifier.typeName = "BindingPropertyIdentifier"; + BindingPropertyIdentifier.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "BindingPropertyIdentifier" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "binding", type: BindingIdentifier }, + { name: "init", type: Maybe(Expression) }, + ]; - SetPrototype.__empty = emptySet; - SetPrototype.__make = makeSet; + BindingPropertyProperty.typeName = "BindingPropertyProperty"; + BindingPropertyProperty.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "BindingPropertyProperty" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: PropertyName }, + { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault) }, + ]; - function updateSet(set, newMap) { - if (set.__ownerID) { - set.size = newMap.size; - set._map = newMap; - return set; - } - return newMap === set._map ? set : - newMap.size === 0 ? set.__empty() : - set.__make(newMap); - } + ClassExpression.typeName = "ClassExpression"; + ClassExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ClassExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: Maybe(BindingIdentifier) }, + { name: "super", type: Maybe(Expression) }, + { name: "elements", type: List(ClassElement) }, + ]; - function makeSet(map, ownerID) { - var set = Object.create(SetPrototype); - set.size = map ? map.size : 0; - set._map = map; - set.__ownerID = ownerID; - return set; - } + ClassDeclaration.typeName = "ClassDeclaration"; + ClassDeclaration.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ClassDeclaration" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: BindingIdentifier }, + { name: "super", type: Maybe(Expression) }, + { name: "elements", type: List(ClassElement) }, + ]; - var EMPTY_SET; - function emptySet() { - return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap())); - } + ClassElement.typeName = "ClassElement"; + ClassElement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ClassElement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "isStatic", type: BOOLEAN }, + { name: "method", type: MethodDefinition }, + ]; - createClass(OrderedSet, Set); + Module.typeName = "Module"; + Module.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Module" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "directives", type: List(Directive) }, + { name: "items", type: List(Union(ImportDeclaration, ExportDeclaration, Statement)) }, + ]; - // @pragma Construction + Import.typeName = "Import"; + Import.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Import" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "moduleSpecifier", type: STRING }, + { name: "defaultBinding", type: Maybe(BindingIdentifier) }, + { name: "namedImports", type: List(ImportSpecifier) }, + ]; - function OrderedSet(value) { - return value === null || value === undefined ? emptyOrderedSet() : - isOrderedSet(value) ? value : - emptyOrderedSet().withMutations(function(set ) { - var iter = SetIterable(value); - assertNotInfinite(iter.size); - iter.forEach(function(v ) {return set.add(v)}); - }); - } + ImportNamespace.typeName = "ImportNamespace"; + ImportNamespace.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ImportNamespace" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "moduleSpecifier", type: STRING }, + { name: "defaultBinding", type: Maybe(BindingIdentifier) }, + { name: "namespaceBinding", type: BindingIdentifier }, + ]; - OrderedSet.of = function(/*...values*/) { - return this(arguments); - }; + ImportSpecifier.typeName = "ImportSpecifier"; + ImportSpecifier.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ImportSpecifier" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: Maybe(STRING) }, + { name: "binding", type: BindingIdentifier }, + ]; - OrderedSet.fromKeys = function(value) { - return this(KeyedIterable(value).keySeq()); - }; + ExportAllFrom.typeName = "ExportAllFrom"; + ExportAllFrom.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ExportAllFrom" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "moduleSpecifier", type: STRING }, + ]; - OrderedSet.prototype.toString = function() { - return this.__toString('OrderedSet {', '}'); - }; + ExportFrom.typeName = "ExportFrom"; + ExportFrom.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ExportFrom" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "namedExports", type: List(ExportSpecifier) }, + { name: "moduleSpecifier", type: Maybe(STRING) }, + ]; + Export.typeName = "Export"; + Export.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Export" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "declaration", type: Union(FunctionDeclaration, ClassDeclaration, VariableDeclaration) }, + ]; - function isOrderedSet(maybeOrderedSet) { - return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet); - } + ExportDefault.typeName = "ExportDefault"; + ExportDefault.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ExportDefault" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "body", type: Union(FunctionDeclaration, ClassDeclaration, Expression) }, + ]; - OrderedSet.isOrderedSet = isOrderedSet; + ExportSpecifier.typeName = "ExportSpecifier"; + ExportSpecifier.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ExportSpecifier" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: Maybe(STRING) }, + { name: "exportedName", type: STRING }, + ]; - var OrderedSetPrototype = OrderedSet.prototype; - OrderedSetPrototype[IS_ORDERED_SENTINEL] = true; + Method.typeName = "Method"; + Method.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Method" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: PropertyName }, + { name: "isGenerator", type: BOOLEAN }, + { name: "params", type: FormalParameters }, + { name: "body", type: FunctionBody }, + ]; - OrderedSetPrototype.__empty = emptyOrderedSet; - OrderedSetPrototype.__make = makeOrderedSet; + Getter.typeName = "Getter"; + Getter.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Getter" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: PropertyName }, + { name: "body", type: FunctionBody }, + ]; - function makeOrderedSet(map, ownerID) { - var set = Object.create(OrderedSetPrototype); - set.size = map ? map.size : 0; - set._map = map; - set.__ownerID = ownerID; - return set; - } + Setter.typeName = "Setter"; + Setter.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Setter" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: PropertyName }, + { name: "param", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault) }, + { name: "body", type: FunctionBody }, + ]; - var EMPTY_ORDERED_SET; - function emptyOrderedSet() { - return EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap())); - } + DataProperty.typeName = "DataProperty"; + DataProperty.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "DataProperty" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: PropertyName }, + { name: "expression", type: Expression }, + ]; - createClass(Stack, IndexedCollection); + ShorthandProperty.typeName = "ShorthandProperty"; + ShorthandProperty.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ShorthandProperty" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: STRING }, + ]; - // @pragma Construction + ComputedPropertyName.typeName = "ComputedPropertyName"; + ComputedPropertyName.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ComputedPropertyName" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "expression", type: Expression }, + ]; - function Stack(value) { - return value === null || value === undefined ? emptyStack() : - isStack(value) ? value : - emptyStack().unshiftAll(value); - } + StaticPropertyName.typeName = "StaticPropertyName"; + StaticPropertyName.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "StaticPropertyName" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "value", type: STRING }, + ]; - Stack.of = function(/*...values*/) { - return this(arguments); - }; + LiteralBooleanExpression.typeName = "LiteralBooleanExpression"; + LiteralBooleanExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralBooleanExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "value", type: BOOLEAN }, + ]; - Stack.prototype.toString = function() { - return this.__toString('Stack [', ']'); - }; + LiteralInfinityExpression.typeName = "LiteralInfinityExpression"; + LiteralInfinityExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralInfinityExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + ]; - // @pragma Access + LiteralNullExpression.typeName = "LiteralNullExpression"; + LiteralNullExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralNullExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + ]; - Stack.prototype.get = function(index, notSetValue) { - var head = this._head; - index = wrapIndex(this, index); - while (head && index--) { - head = head.next; - } - return head ? head.value : notSetValue; - }; + LiteralNumericExpression.typeName = "LiteralNumericExpression"; + LiteralNumericExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralNumericExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "value", type: DOUBLE }, + ]; - Stack.prototype.peek = function() { - return this._head && this._head.value; - }; + LiteralRegExpExpression.typeName = "LiteralRegExpExpression"; + LiteralRegExpExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralRegExpExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "pattern", type: STRING }, + { name: "flags", type: STRING }, + ]; - // @pragma Modification + LiteralStringExpression.typeName = "LiteralStringExpression"; + LiteralStringExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralStringExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "value", type: STRING }, + ]; - Stack.prototype.push = function(/*...values*/) { - if (arguments.length === 0) { - return this; - } - var newSize = this.size + arguments.length; - var head = this._head; - for (var ii = arguments.length - 1; ii >= 0; ii--) { - head = { - value: arguments[ii], - next: head - }; - } - if (this.__ownerID) { - this.size = newSize; - this._head = head; - this.__hash = undefined; - this.__altered = true; - return this; - } - return makeStack(newSize, head); - }; + ArrayExpression.typeName = "ArrayExpression"; + ArrayExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ArrayExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "elements", type: List(Maybe(Union(SpreadElement, Expression))) }, + ]; - Stack.prototype.pushAll = function(iter) { - iter = IndexedIterable(iter); - if (iter.size === 0) { - return this; - } - assertNotInfinite(iter.size); - var newSize = this.size; - var head = this._head; - iter.reverse().forEach(function(value ) { - newSize++; - head = { - value: value, - next: head - }; - }); - if (this.__ownerID) { - this.size = newSize; - this._head = head; - this.__hash = undefined; - this.__altered = true; - return this; - } - return makeStack(newSize, head); - }; + ArrowExpression.typeName = "ArrowExpression"; + ArrowExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ArrowExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "params", type: FormalParameters }, + { name: "body", type: Union(FunctionBody, Expression) }, + ]; - Stack.prototype.pop = function() { - return this.slice(1); - }; + AssignmentExpression.typeName = "AssignmentExpression"; + AssignmentExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "AssignmentExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, + { name: "expression", type: Expression }, + ]; - Stack.prototype.unshift = function(/*...values*/) { - return this.push.apply(this, arguments); - }; + BinaryExpression.typeName = "BinaryExpression"; + BinaryExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "BinaryExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "operator", type: BinaryOperator }, + { name: "left", type: Expression }, + { name: "right", type: Expression }, + ]; - Stack.prototype.unshiftAll = function(iter) { - return this.pushAll(iter); - }; + CallExpression.typeName = "CallExpression"; + CallExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "CallExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "callee", type: Union(Expression, Super) }, + { name: "arguments", type: List(Union(SpreadElement, Expression)) }, + ]; - Stack.prototype.shift = function() { - return this.pop.apply(this, arguments); - }; + CompoundAssignmentExpression.typeName = "CompoundAssignmentExpression"; + CompoundAssignmentExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "CompoundAssignmentExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "operator", type: CompoundAssignmentOperator }, + { name: "binding", type: Union(BindingIdentifier, MemberExpression) }, + { name: "expression", type: Expression }, + ]; - Stack.prototype.clear = function() { - if (this.size === 0) { - return this; - } - if (this.__ownerID) { - this.size = 0; - this._head = undefined; - this.__hash = undefined; - this.__altered = true; - return this; - } - return emptyStack(); - }; + ComputedMemberExpression.typeName = "ComputedMemberExpression"; + ComputedMemberExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ComputedMemberExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "object", type: Union(Expression, Super) }, + { name: "expression", type: Expression }, + ]; - Stack.prototype.slice = function(begin, end) { - if (wholeSlice(begin, end, this.size)) { - return this; - } - var resolvedBegin = resolveBegin(begin, this.size); - var resolvedEnd = resolveEnd(end, this.size); - if (resolvedEnd !== this.size) { - // super.slice(begin, end); - return IndexedCollection.prototype.slice.call(this, begin, end); - } - var newSize = this.size - resolvedBegin; - var head = this._head; - while (resolvedBegin--) { - head = head.next; - } - if (this.__ownerID) { - this.size = newSize; - this._head = head; - this.__hash = undefined; - this.__altered = true; - return this; - } - return makeStack(newSize, head); - }; + ConditionalExpression.typeName = "ConditionalExpression"; + ConditionalExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ConditionalExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "test", type: Expression }, + { name: "consequent", type: Expression }, + { name: "alternate", type: Expression }, + ]; - // @pragma Mutability + FunctionExpression.typeName = "FunctionExpression"; + FunctionExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "FunctionExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "isGenerator", type: BOOLEAN }, + { name: "name", type: Maybe(BindingIdentifier) }, + { name: "params", type: FormalParameters }, + { name: "body", type: FunctionBody }, + ]; - Stack.prototype.__ensureOwner = function(ownerID) { - if (ownerID === this.__ownerID) { - return this; - } - if (!ownerID) { - this.__ownerID = ownerID; - this.__altered = false; - return this; - } - return makeStack(this.size, this._head, ownerID, this.__hash); - }; + IdentifierExpression.typeName = "IdentifierExpression"; + IdentifierExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "IdentifierExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "name", type: STRING }, + ]; - // @pragma Iteration + NewExpression.typeName = "NewExpression"; + NewExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "NewExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "callee", type: Expression }, + { name: "arguments", type: List(Union(SpreadElement, Expression)) }, + ]; - Stack.prototype.__iterate = function(fn, reverse) { - if (reverse) { - return this.reverse().__iterate(fn); - } - var iterations = 0; - var node = this._head; - while (node) { - if (fn(node.value, iterations++, this) === false) { - break; - } - node = node.next; - } - return iterations; - }; + NewTargetExpression.typeName = "NewTargetExpression"; + NewTargetExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "NewTargetExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + ]; - Stack.prototype.__iterator = function(type, reverse) { - if (reverse) { - return this.reverse().__iterator(type); - } - var iterations = 0; - var node = this._head; - return new Iterator(function() { - if (node) { - var value = node.value; - node = node.next; - return iteratorValue(type, iterations++, value); - } - return iteratorDone(); - }); - }; + ObjectExpression.typeName = "ObjectExpression"; + ObjectExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ObjectExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "properties", type: List(ObjectProperty) }, + ]; + UnaryExpression.typeName = "UnaryExpression"; + UnaryExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "UnaryExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "operator", type: UnaryOperator }, + { name: "operand", type: Expression }, + ]; - function isStack(maybeStack) { - return !!(maybeStack && maybeStack[IS_STACK_SENTINEL]); - } + StaticMemberExpression.typeName = "StaticMemberExpression"; + StaticMemberExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "StaticMemberExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "object", type: Union(Expression, Super) }, + { name: "property", type: STRING }, + ]; - Stack.isStack = isStack; + TemplateExpression.typeName = "TemplateExpression"; + TemplateExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "TemplateExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "tag", type: Maybe(Expression) }, + { name: "elements", type: List(Union(Expression, TemplateElement)) }, + ]; - var IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@'; + ThisExpression.typeName = "ThisExpression"; + ThisExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ThisExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + ]; - var StackPrototype = Stack.prototype; - StackPrototype[IS_STACK_SENTINEL] = true; - StackPrototype.withMutations = MapPrototype.withMutations; - StackPrototype.asMutable = MapPrototype.asMutable; - StackPrototype.asImmutable = MapPrototype.asImmutable; - StackPrototype.wasAltered = MapPrototype.wasAltered; + UpdateExpression.typeName = "UpdateExpression"; + UpdateExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "UpdateExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "isPrefix", type: BOOLEAN }, + { name: "operator", type: UpdateOperator }, + { name: "operand", type: Union(BindingIdentifier, MemberExpression) }, + ]; + YieldExpression.typeName = "YieldExpression"; + YieldExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "YieldExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "expression", type: Maybe(Expression) }, + ]; - function makeStack(size, head, ownerID, hash) { - var map = Object.create(StackPrototype); - map.size = size; - map._head = head; - map.__ownerID = ownerID; - map.__hash = hash; - map.__altered = false; - return map; - } + YieldGeneratorExpression.typeName = "YieldGeneratorExpression"; + YieldGeneratorExpression.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "YieldGeneratorExpression" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "expression", type: Expression }, + ]; - var EMPTY_STACK; - function emptyStack() { - return EMPTY_STACK || (EMPTY_STACK = makeStack(0)); - } + BlockStatement.typeName = "BlockStatement"; + BlockStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "BlockStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "block", type: Block }, + ]; - /** - * Contributes additional methods to a constructor - */ - function mixin(ctor, methods) { - var keyCopier = function(key ) { ctor.prototype[key] = methods[key]; }; - Object.keys(methods).forEach(keyCopier); - Object.getOwnPropertySymbols && - Object.getOwnPropertySymbols(methods).forEach(keyCopier); - return ctor; - } + BreakStatement.typeName = "BreakStatement"; + BreakStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "BreakStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "label", type: Maybe(STRING) }, + ]; - Iterable.Iterator = Iterator; + ContinueStatement.typeName = "ContinueStatement"; + ContinueStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ContinueStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "label", type: Maybe(STRING) }, + ]; - mixin(Iterable, { + DebuggerStatement.typeName = "DebuggerStatement"; + DebuggerStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "DebuggerStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + ]; - // ### Conversion to other types + DoWhileStatement.typeName = "DoWhileStatement"; + DoWhileStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "DoWhileStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "body", type: Statement }, + { name: "test", type: Expression }, + ]; - toArray: function() { - assertNotInfinite(this.size); - var array = new Array(this.size || 0); - this.valueSeq().__iterate(function(v, i) { array[i] = v; }); - return array; - }, + EmptyStatement.typeName = "EmptyStatement"; + EmptyStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "EmptyStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + ]; - toIndexedSeq: function() { - return new ToIndexedSequence(this); - }, + ExpressionStatement.typeName = "ExpressionStatement"; + ExpressionStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ExpressionStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "expression", type: Expression }, + ]; - toJS: function() { - return this.toSeq().map( - function(value ) {return value && typeof value.toJS === 'function' ? value.toJS() : value} - ).__toJS(); - }, + ForInStatement.typeName = "ForInStatement"; + ForInStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ForInStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "left", type: Union(VariableDeclaration, ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, + { name: "right", type: Expression }, + { name: "body", type: Statement }, + ]; - toJSON: function() { - return this.toSeq().map( - function(value ) {return value && typeof value.toJSON === 'function' ? value.toJSON() : value} - ).__toJS(); - }, + ForOfStatement.typeName = "ForOfStatement"; + ForOfStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ForOfStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "left", type: Union(VariableDeclaration, ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, + { name: "right", type: Expression }, + { name: "body", type: Statement }, + ]; - toKeyedSeq: function() { - return new ToKeyedSequence(this, true); - }, + ForStatement.typeName = "ForStatement"; + ForStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ForStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "init", type: Maybe(Union(VariableDeclaration, Expression)) }, + { name: "test", type: Maybe(Expression) }, + { name: "update", type: Maybe(Expression) }, + { name: "body", type: Statement }, + ]; - toMap: function() { - // Use Late Binding here to solve the circular dependency. - return Map(this.toKeyedSeq()); - }, + IfStatement.typeName = "IfStatement"; + IfStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "IfStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "test", type: Expression }, + { name: "consequent", type: Statement }, + { name: "alternate", type: Maybe(Statement) }, + ]; - toObject: function() { - assertNotInfinite(this.size); - var object = {}; - this.__iterate(function(v, k) { object[k] = v; }); - return object; - }, + LabeledStatement.typeName = "LabeledStatement"; + LabeledStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "LabeledStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "label", type: STRING }, + { name: "body", type: Statement }, + ]; - toOrderedMap: function() { - // Use Late Binding here to solve the circular dependency. - return OrderedMap(this.toKeyedSeq()); - }, + ReturnStatement.typeName = "ReturnStatement"; + ReturnStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ReturnStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "expression", type: Maybe(Expression) }, + ]; - toOrderedSet: function() { - // Use Late Binding here to solve the circular dependency. - return OrderedSet(isKeyed(this) ? this.valueSeq() : this); - }, + SwitchStatement.typeName = "SwitchStatement"; + SwitchStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "discriminant", type: Expression }, + { name: "cases", type: List(SwitchCase) }, + ]; - toSet: function() { - // Use Late Binding here to solve the circular dependency. - return Set(isKeyed(this) ? this.valueSeq() : this); - }, + SwitchStatementWithDefault.typeName = "SwitchStatementWithDefault"; + SwitchStatementWithDefault.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchStatementWithDefault" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "discriminant", type: Expression }, + { name: "preDefaultCases", type: List(SwitchCase) }, + { name: "defaultCase", type: SwitchDefault }, + { name: "postDefaultCases", type: List(SwitchCase) }, + ]; - toSetSeq: function() { - return new ToSetSequence(this); - }, + ThrowStatement.typeName = "ThrowStatement"; + ThrowStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "ThrowStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "expression", type: Expression }, + ]; - toSeq: function() { - return isIndexed(this) ? this.toIndexedSeq() : - isKeyed(this) ? this.toKeyedSeq() : - this.toSetSeq(); - }, + TryCatchStatement.typeName = "TryCatchStatement"; + TryCatchStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "TryCatchStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "body", type: Block }, + { name: "catchClause", type: CatchClause }, + ]; - toStack: function() { - // Use Late Binding here to solve the circular dependency. - return Stack(isKeyed(this) ? this.valueSeq() : this); - }, + TryFinallyStatement.typeName = "TryFinallyStatement"; + TryFinallyStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "TryFinallyStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "body", type: Block }, + { name: "catchClause", type: Maybe(CatchClause) }, + { name: "finalizer", type: Block }, + ]; - toList: function() { - // Use Late Binding here to solve the circular dependency. - return List(isKeyed(this) ? this.valueSeq() : this); - }, + VariableDeclarationStatement.typeName = "VariableDeclarationStatement"; + VariableDeclarationStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "VariableDeclarationStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "declaration", type: VariableDeclaration }, + ]; + WhileStatement.typeName = "WhileStatement"; + WhileStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "WhileStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "test", type: Expression }, + { name: "body", type: Statement }, + ]; - // ### Common JavaScript methods and properties + WithStatement.typeName = "WithStatement"; + WithStatement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "WithStatement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "object", type: Expression }, + { name: "body", type: Statement }, + ]; - toString: function() { - return '[Iterable]'; - }, + Block.typeName = "Block"; + Block.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Block" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "statements", type: List(Statement) }, + ]; - __toString: function(head, tail) { - if (this.size === 0) { - return head + tail; - } - return head + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + tail; - }, + CatchClause.typeName = "CatchClause"; + CatchClause.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "CatchClause" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, + { name: "body", type: Block }, + ]; + Directive.typeName = "Directive"; + Directive.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Directive" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "rawValue", type: STRING }, + ]; - // ### ES6 Collection methods (ES6 Array and Map) + FormalParameters.typeName = "FormalParameters"; + FormalParameters.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "FormalParameters" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "items", type: List(Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault)) }, + { name: "rest", type: Maybe(BindingIdentifier) }, + ]; - concat: function() {var values = SLICE$0.call(arguments, 0); - return reify(this, concatFactory(this, values)); - }, + FunctionBody.typeName = "FunctionBody"; + FunctionBody.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "FunctionBody" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "directives", type: List(Directive) }, + { name: "statements", type: List(Statement) }, + ]; - includes: function(searchValue) { - return this.some(function(value ) {return is(value, searchValue)}); - }, + FunctionDeclaration.typeName = "FunctionDeclaration"; + FunctionDeclaration.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "FunctionDeclaration" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "isGenerator", type: BOOLEAN }, + { name: "name", type: BindingIdentifier }, + { name: "params", type: FormalParameters }, + { name: "body", type: FunctionBody }, + ]; - entries: function() { - return this.__iterator(ITERATE_ENTRIES); - }, + Script.typeName = "Script"; + Script.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Script" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "directives", type: List(Directive) }, + { name: "statements", type: List(Statement) }, + ]; - every: function(predicate, context) { - assertNotInfinite(this.size); - var returnValue = true; - this.__iterate(function(v, k, c) { - if (!predicate.call(context, v, k, c)) { - returnValue = false; - return false; - } - }); - return returnValue; - }, + SpreadElement.typeName = "SpreadElement"; + SpreadElement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "SpreadElement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "expression", type: Expression }, + ]; - filter: function(predicate, context) { - return reify(this, filterFactory(this, predicate, context, true)); - }, + Super.typeName = "Super"; + Super.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "Super" }, + { name: "loc", type: Maybe(SourceSpan) }, + ]; - find: function(predicate, context, notSetValue) { - var entry = this.findEntry(predicate, context); - return entry ? entry[1] : notSetValue; - }, + SwitchCase.typeName = "SwitchCase"; + SwitchCase.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchCase" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "test", type: Expression }, + { name: "consequent", type: List(Statement) }, + ]; - forEach: function(sideEffect, context) { - assertNotInfinite(this.size); - return this.__iterate(context ? sideEffect.bind(context) : sideEffect); - }, + SwitchDefault.typeName = "SwitchDefault"; + SwitchDefault.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchDefault" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "consequent", type: List(Statement) }, + ]; - join: function(separator) { - assertNotInfinite(this.size); - separator = separator !== undefined ? '' + separator : ','; - var joined = ''; - var isFirst = true; - this.__iterate(function(v ) { - isFirst ? (isFirst = false) : (joined += separator); - joined += v !== null && v !== undefined ? v.toString() : ''; - }); - return joined; - }, + TemplateElement.typeName = "TemplateElement"; + TemplateElement.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "TemplateElement" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "rawValue", type: STRING }, + ]; - keys: function() { - return this.__iterator(ITERATE_KEYS); - }, + VariableDeclaration.typeName = "VariableDeclaration"; + VariableDeclaration.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "VariableDeclaration" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "kind", type: VariableDeclarationKind }, + { name: "declarators", type: List(VariableDeclarator) }, + ]; - map: function(mapper, context) { - return reify(this, mapFactory(this, mapper, context)); - }, + VariableDeclarator.typeName = "VariableDeclarator"; + VariableDeclarator.fields = [ + { name: "type", type: Const(TYPE_INDICATOR), value: "VariableDeclarator" }, + { name: "loc", type: Maybe(SourceSpan) }, + { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, + { name: "init", type: Maybe(Expression) }, + ]; - reduce: function(reducer, initialReduction, context) { - assertNotInfinite(this.size); - var reduction; - var useFirst; - if (arguments.length < 2) { - useFirst = true; - } else { - reduction = initialReduction; - } - this.__iterate(function(v, k, c) { - if (useFirst) { - useFirst = false; - reduction = v; - } else { - reduction = reducer.call(context, reduction, v, k, c); - } - }); - return reduction; - }, + return SPEC; + }()); - reduceRight: function(reducer, initialReduction, context) { - var reversed = this.toKeyedSeq().reverse(); - return reversed.reduce.apply(reversed, arguments); - }, - reverse: function() { - return reify(this, reverseFactory(this, true)); - }, +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { - slice: function(begin, end) { - return reify(this, sliceFactory(this, begin, end, true)); - }, + "use strict"; - some: function(predicate, context) { - return !this.every(not(predicate), context); - }, + 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; }; }(); - sort: function(comparator) { - return reify(this, sortFactory(this, comparator)); - }, + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; /** + * 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. + */ - values: function() { - return this.__iterator(ITERATE_VALUES); - }, + Object.defineProperty(exports, "__esModule", { + value: true + }); + var _shiftSpec = __webpack_require__(6); - // ### More sequential methods + var _shiftSpec2 = _interopRequireDefault(_shiftSpec); - butLast: function() { - return this.slice(0, -1); - }, + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - isEmpty: function() { - return this.size !== undefined ? this.size === 0 : !this.some(function() {return true}); - }, + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - count: function(predicate, context) { - return ensureSize( - predicate ? this.toSeq().filter(predicate, context) : this - ); - }, + var methods = {}; - countBy: function(grouper, context) { - return countByFactory(this, grouper, context); - }, + function id(x) { + return x; + } - equals: function(other) { - return deepEqual(this, other); - }, + function handlerForFieldOfType(type) { + switch (type.typeName) { + case "Enum": + case "String": + case "Boolean": + case "Number": + case "SourceSpan": + return null; + case "Const": + return handlerForFieldOfType(type.argument); + case "Maybe": + { + var _ret = function () { + var subHandler = handlerForFieldOfType(type.argument); + if (subHandler == null) return { + v: null + }; + return { + v: function v(t) { + return t == null ? this.identity : subHandler.call(this, t); + } + }; + }(); - entrySeq: function() { - var iterable = this; - if (iterable._cache) { - // We cache as an entries array, so we can just return the cache! - return new ArraySeq(iterable._cache); + if ((typeof _ret === "undefined" ? "undefined" : _typeof(_ret)) === "object") return _ret.v; } - var entriesSequence = iterable.toSeq().map(entryMapper).toIndexedSeq(); - entriesSequence.fromEntrySeq = function() {return iterable.toSeq()}; - return entriesSequence; - }, + case "List": + { + var _ret2 = function () { + var subHandler = handlerForFieldOfType(type.argument); + if (subHandler == null) return { + v: null + }; + return { + v: function v(t) { + var _this = this; - filterNot: function(predicate, context) { - return this.filter(not(predicate), context); - }, + return this.fold(t.map(function (x) { + return subHandler.call(_this, x); + })); + } + }; + }(); - findEntry: function(predicate, context, notSetValue) { - var found = notSetValue; - this.__iterate(function(v, k, c) { - if (predicate.call(context, v, k, c)) { - found = [k, v]; - return false; - } - }); - return found; - }, + if ((typeof _ret2 === "undefined" ? "undefined" : _typeof(_ret2)) === "object") return _ret2.v; + } + default: + return id; + } + } - findKey: function(predicate, context) { - var entry = this.findEntry(predicate, context); - return entry && entry[0]; - }, + var _loop = function _loop(typeName) { + var type = _shiftSpec2.default[typeName]; - findLast: function(predicate, context, notSetValue) { - return this.toKeyedSeq().reverse().find(predicate, context, notSetValue); - }, + var handlers = {}; + type.fields.forEach(function (field) { + var handler = handlerForFieldOfType(field.type); + if (handler != null) handlers[field.name] = handler; + }); + var fieldNames = Object.keys(handlers); - findLastEntry: function(predicate, context, notSetValue) { - return this.toKeyedSeq().reverse().findEntry(predicate, context, notSetValue); - }, + methods["reduce" + typeName] = { + value: function value(node, state) { + var _this3 = this; - findLastKey: function(predicate, context) { - return this.toKeyedSeq().reverse().findKey(predicate, context); - }, + return this.fold(fieldNames.map(function (fieldName) { + return handlers[fieldName].call(_this3, state[fieldName]); + })); + } + }; + }; - first: function() { - return this.find(returnTrue); - }, + for (var typeName in _shiftSpec2.default) { + _loop(typeName); + } - flatMap: function(mapper, context) { - return reify(this, flatMapFactory(this, mapper, context)); - }, + var MonoidalReducer = function () { + function MonoidalReducer(monoid) { + _classCallCheck(this, MonoidalReducer); - flatten: function(depth) { - return reify(this, flattenFactory(this, depth, true)); - }, + this.identity = monoid.empty(); + var concat = monoid.prototype && monoid.prototype.concat || monoid.concat; + this.append = function (a, b) { + return concat.call(a, b); + }; + } - fromEntrySeq: function() { - return new FromEntriesSequence(this); - }, + _createClass(MonoidalReducer, [{ + key: "fold", + value: function fold(list, a) { + var _this2 = this; - get: function(searchKey, notSetValue) { - return this.find(function(_, key) {return is(key, searchKey)}, undefined, notSetValue); - }, + return list.reduce(function (memo, x) { + return _this2.append(memo, x); + }, a == null ? this.identity : a); + } + }]); - getIn: function(searchKeyPath, notSetValue) { - var nested = this; - // Note: in an ES6 environment, we would prefer: - // for (var key of searchKeyPath) { - var iter = forceIterator(searchKeyPath); - var step; - while (!(step = iter.next()).done) { - var key = step.value; - nested = nested && nested.get ? nested.get(key, NOT_SET) : NOT_SET; - if (nested === NOT_SET) { - return notSetValue; - } - } - return nested; - }, + return MonoidalReducer; + }(); - groupBy: function(grouper, context) { - return groupByFactory(this, grouper, context); - }, + exports.default = MonoidalReducer; - has: function(searchKey) { - return this.get(searchKey, NOT_SET) !== NOT_SET; - }, + Object.defineProperties(MonoidalReducer.prototype, methods); - hasIn: function(searchKeyPath) { - return this.getIn(searchKeyPath, NOT_SET) !== NOT_SET; - }, +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { - isSubset: function(iter) { - iter = typeof iter.includes === 'function' ? iter : Iterable(iter); - return this.every(function(value ) {return iter.includes(value)}); - }, - - isSuperset: function(iter) { - iter = typeof iter.isSubset === 'function' ? iter : Iterable(iter); - return iter.isSubset(this); - }, - - keyOf: function(searchValue) { - return this.findKey(function(value ) {return is(value, searchValue)}); - }, - - keySeq: function() { - return this.toSeq().map(keyMapper).toIndexedSeq(); - }, - - last: function() { - return this.toSeq().reverse().first(); - }, - - lastKeyOf: function(searchValue) { - return this.toKeyedSeq().reverse().keyOf(searchValue); - }, - - max: function(comparator) { - return maxFactory(this, comparator); - }, - - maxBy: function(mapper, comparator) { - return maxFactory(this, comparator, mapper); - }, - - min: function(comparator) { - return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator); - }, - - minBy: function(mapper, comparator) { - return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator, mapper); - }, - - rest: function() { - return this.slice(1); - }, - - skip: function(amount) { - return this.slice(Math.max(0, amount)); - }, - - skipLast: function(amount) { - return reify(this, this.toSeq().reverse().skip(amount).reverse()); - }, - - skipWhile: function(predicate, context) { - return reify(this, skipWhileFactory(this, predicate, context, true)); - }, - - skipUntil: function(predicate, context) { - return this.skipWhile(not(predicate), context); - }, - - sortBy: function(mapper, comparator) { - return reify(this, sortFactory(this, comparator, mapper)); - }, - - take: function(amount) { - return this.slice(0, Math.max(0, amount)); - }, - - takeLast: function(amount) { - return reify(this, this.toSeq().reverse().take(amount).reverse()); - }, - - takeWhile: function(predicate, context) { - return reify(this, takeWhileFactory(this, predicate, context)); - }, - - takeUntil: function(predicate, context) { - return this.takeWhile(not(predicate), context); - }, - - valueSeq: function() { - return this.toIndexedSeq(); - }, - - - // ### Hashable Object - - hashCode: function() { - return this.__hash || (this.__hash = hashIterable(this)); - } - - - // ### Internal - - // abstract __iterate(fn, reverse) - - // abstract __iterator(type, reverse) - }); - - // var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; - // var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; - // var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@'; - // var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; - - var IterablePrototype = Iterable.prototype; - IterablePrototype[IS_ITERABLE_SENTINEL] = true; - IterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.values; - IterablePrototype.__toJS = IterablePrototype.toArray; - IterablePrototype.__toStringMapper = quoteString; - IterablePrototype.inspect = - IterablePrototype.toSource = function() { return this.toString(); }; - IterablePrototype.chain = IterablePrototype.flatMap; - IterablePrototype.contains = IterablePrototype.includes; - - mixin(KeyedIterable, { - - // ### More sequential methods - - flip: function() { - return reify(this, flipFactory(this)); - }, - - mapEntries: function(mapper, context) {var this$0 = this; - var iterations = 0; - return reify(this, - this.toSeq().map( - function(v, k) {return mapper.call(context, [k, v], iterations++, this$0)} - ).fromEntrySeq() - ); - }, - - mapKeys: function(mapper, context) {var this$0 = this; - return reify(this, - this.toSeq().flip().map( - function(k, v) {return mapper.call(context, k, v, this$0)} - ).flip() - ); - } - - }); - - var KeyedIterablePrototype = KeyedIterable.prototype; - KeyedIterablePrototype[IS_KEYED_SENTINEL] = true; - KeyedIterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.entries; - KeyedIterablePrototype.__toJS = IterablePrototype.toObject; - KeyedIterablePrototype.__toStringMapper = function(v, k) {return JSON.stringify(k) + ': ' + quoteString(v)}; - - - - mixin(IndexedIterable, { - - // ### Conversion to other types - - toKeyedSeq: function() { - return new ToKeyedSequence(this, false); - }, - - - // ### ES6 Collection methods (ES6 Array and Map) - - filter: function(predicate, context) { - return reify(this, filterFactory(this, predicate, context, false)); - }, - - findIndex: function(predicate, context) { - var entry = this.findEntry(predicate, context); - return entry ? entry[0] : -1; - }, - - indexOf: function(searchValue) { - var key = this.keyOf(searchValue); - return key === undefined ? -1 : key; - }, - - lastIndexOf: function(searchValue) { - var key = this.lastKeyOf(searchValue); - return key === undefined ? -1 : key; - }, - - reverse: function() { - return reify(this, reverseFactory(this, false)); - }, - - slice: function(begin, end) { - return reify(this, sliceFactory(this, begin, end, false)); - }, - - splice: function(index, removeNum /*, ...values*/) { - var numArgs = arguments.length; - removeNum = Math.max(removeNum | 0, 0); - if (numArgs === 0 || (numArgs === 2 && !removeNum)) { - return this; - } - // If index is negative, it should resolve relative to the size of the - // collection. However size may be expensive to compute if not cached, so - // only call count() if the number is in fact negative. - index = resolveBegin(index, index < 0 ? this.count() : this.size); - var spliced = this.slice(0, index); - return reify( - this, - numArgs === 1 ? - spliced : - spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum)) - ); - }, - - - // ### More collection methods - - findLastIndex: function(predicate, context) { - var entry = this.findLastEntry(predicate, context); - return entry ? entry[0] : -1; - }, - - first: function() { - return this.get(0); - }, - - flatten: function(depth) { - return reify(this, flattenFactory(this, depth, false)); - }, - - get: function(index, notSetValue) { - index = wrapIndex(this, index); - return (index < 0 || (this.size === Infinity || - (this.size !== undefined && index > this.size))) ? - notSetValue : - this.find(function(_, key) {return key === index}, undefined, notSetValue); - }, - - has: function(index) { - index = wrapIndex(this, index); - return index >= 0 && (this.size !== undefined ? - this.size === Infinity || index < this.size : - this.indexOf(index) !== -1 - ); - }, - - interpose: function(separator) { - return reify(this, interposeFactory(this, separator)); - }, - - interleave: function(/*...iterables*/) { - var iterables = [this].concat(arrCopy(arguments)); - var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, iterables); - var interleaved = zipped.flatten(true); - if (zipped.size) { - interleaved.size = zipped.size * iterables.length; - } - return reify(this, interleaved); - }, - - keySeq: function() { - return Range(0, this.size); - }, - - last: function() { - return this.get(-1); - }, - - skipWhile: function(predicate, context) { - return reify(this, skipWhileFactory(this, predicate, context, false)); - }, - - zip: function(/*, ...iterables */) { - var iterables = [this].concat(arrCopy(arguments)); - return reify(this, zipWithFactory(this, defaultZipper, iterables)); - }, + "use strict"; - zipWith: function(zipper/*, ...iterables */) { - var iterables = arrCopy(arguments); - iterables[0] = this; - return reify(this, zipWithFactory(this, zipper, iterables)); - } + Object.defineProperty(exports, "__esModule", { + value: true + }); - }); + var _terms = __webpack_require__(9); - IndexedIterable.prototype[IS_INDEXED_SENTINEL] = true; - IndexedIterable.prototype[IS_ORDERED_SENTINEL] = true; + var _terms2 = _interopRequireDefault(_terms); + var _shiftReducer = __webpack_require__(4); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - mixin(SetIterable, { + class ParseReducer extends _shiftReducer.CloneReducer { + constructor(context) { + super(); + this.context = context; + } + reduceModule(node, state) { + return new _terms2.default("Module", { + directives: state.directives.toArray(), + items: state.items.toArray() + }); + } - // ### ES6 Collection methods (ES6 Array and Map) + reduceImport(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('Import', { + defaultBinding: state.defaultBinding, + namedImports: state.namedImports.toArray(), + moduleSpecifier: moduleSpecifier, + forSyntax: node.forSyntax + }); + } - get: function(value, notSetValue) { - return this.has(value) ? value : notSetValue; - }, + reduceImportNamespace(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('ImportNamespace', { + defaultBinding: state.defaultBinding, + namespaceBinding: state.namespaceBinding, + moduleSpecifier: moduleSpecifier, + forSyntax: node.forSyntax + }); + } - includes: function(value) { - return this.has(value); - }, + reduceExport(node, state) { + return new _terms2.default('Export', { + declaration: state.declaration + }); + } + reduceExportAllFrom(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('ExportAllFrom', { moduleSpecifier: moduleSpecifier }); + } - // ### More sequential methods + reduceExportFrom(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('ExportFrom', { + moduleSpecifier: moduleSpecifier, + namedExports: state.namedExports.toArray() + }); + } - keySeq: function() { - return this.valueSeq(); + reduceExportSpecifier(node, state) { + let name = state.name, + exportedName = state.exportedName; + if (name == null) { + name = exportedName.resolve(this.context.phase); + exportedName = exportedName.val(); + } else { + name = name.resolve(this.context.phase); + exportedName = exportedName.val(); } - - }); - - SetIterable.prototype.has = IterablePrototype.includes; - SetIterable.prototype.contains = SetIterable.prototype.includes; - - - // Mixin subclasses - - mixin(KeyedSeq, KeyedIterable.prototype); - mixin(IndexedSeq, IndexedIterable.prototype); - mixin(SetSeq, SetIterable.prototype); - - mixin(KeyedCollection, KeyedIterable.prototype); - mixin(IndexedCollection, IndexedIterable.prototype); - mixin(SetCollection, SetIterable.prototype); - - - // #pragma Helper functions - - function keyMapper(v, k) { - return k; + return new _terms2.default('ExportSpecifier', { + name: name, exportedName: exportedName + }); } - function entryMapper(v, k) { - return [k, v]; + reduceImportSpecifier(node, state) { + let name = state.name ? state.name.resolve(this.context.phase) : null; + return new _terms2.default('ImportSpecifier', { + name: name, + binding: state.binding + }); } - function not(predicate) { - return function() { - return !predicate.apply(this, arguments); - } + reduceIdentifierExpression(node) { + return new _terms2.default("IdentifierExpression", { + name: node.name.resolve(this.context.phase) + }); } - function neg(predicate) { - return function() { - return -predicate.apply(this, arguments); - } + reduceLiteralNumericExpression(node) { + return new _terms2.default("LiteralNumericExpression", { + value: node.value.val() + }); } - function quoteString(value) { - return typeof value === 'string' ? JSON.stringify(value) : String(value); + reduceLiteralBooleanExpression(node) { + return new _terms2.default("LiteralBooleanExpression", { + value: node.value.val() === 'true' + }); } - function defaultZipper() { - return arrCopy(arguments); + reduceLiteralStringExpression(node) { + return new _terms2.default("LiteralStringExpression", { + value: node.value.token.str + }); } - function defaultNegComparator(a, b) { - return a < b ? 1 : a > b ? -1 : 0; + reduceCallExpression(node, state) { + return new _terms2.default("CallExpression", { + callee: state.callee, + arguments: state.arguments.toArray() + }); } - function hashIterable(iterable) { - if (iterable.size === Infinity) { - return 0; - } - var ordered = isOrdered(iterable); - var keyed = isKeyed(iterable); - var h = ordered ? 1 : 0; - var size = iterable.__iterate( - keyed ? - ordered ? - function(v, k) { h = 31 * h + hashMerge(hash(v), hash(k)) | 0; } : - function(v, k) { h = h + hashMerge(hash(v), hash(k)) | 0; } : - ordered ? - function(v ) { h = 31 * h + hash(v) | 0; } : - function(v ) { h = h + hash(v) | 0; } - ); - return murmurHashOfSize(size, h); + reduceFunctionBody(node, state) { + return new _terms2.default("FunctionBody", { + directives: state.directives.toArray(), + statements: state.statements.toArray() + }); } - function murmurHashOfSize(size, h) { - h = imul(h, 0xCC9E2D51); - h = imul(h << 15 | h >>> -15, 0x1B873593); - h = imul(h << 13 | h >>> -13, 5); - h = (h + 0xE6546B64 | 0) ^ size; - h = imul(h ^ h >>> 16, 0x85EBCA6B); - h = imul(h ^ h >>> 13, 0xC2B2AE35); - h = smi(h ^ h >>> 16); - return h; + reduceFormalParameters(node, state) { + return new _terms2.default("FormalParameters", { + items: state.items.toArray(), + rest: state.rest + }); } - function hashMerge(a, b) { - return a ^ b + 0x9E3779B9 + (a << 6) + (a >> 2) | 0; // int + reduceBindingIdentifier(node) { + return new _terms2.default("BindingIdentifier", { + name: node.name.resolve(this.context.phase) + }); } - var Immutable = { - - Iterable: Iterable, + reduceBinaryExpression(node, state) { + return new _terms2.default("BinaryExpression", { + left: state.left, + operator: node.operator.val(), + right: state.right + }); + } - Seq: Seq, - Collection: Collection, - Map: Map, - OrderedMap: OrderedMap, - List: List, - Stack: Stack, - Set: Set, - OrderedSet: OrderedSet, + reduceObjectExpression(node, state) { + return new _terms2.default("ObjectExpression", { + properties: state.properties.toArray() + }); + } - Record: Record, - Range: Range, - Repeat: Repeat, + reduceVariableDeclaration(node, state) { + return new _terms2.default("VariableDeclaration", { + kind: state.kind, + declarators: state.declarators.toArray() + }); + } - is: is, - fromJS: fromJS + reduceStaticPropertyName(node) { + return new _terms2.default("StaticPropertyName", { + value: node.value.val().toString() + }); + } - }; + reduceArrayExpression(node, state) { + return new _terms2.default("ArrayExpression", { + elements: state.elements.toArray() + }); + } - return Immutable; + reduceStaticMemberExpression(node, state) { + return new _terms2.default("StaticMemberExpression", { + object: state.object, + property: state.property.val() + }); + } - })); + } + exports.default = ParseReducer; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJzZS1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFFZSxNQUFNLFlBQU4sb0NBQXdDO0FBQ3JELGNBQVksT0FBWixFQUFxQjtBQUNuQjtBQUNBLFNBQUssT0FBTCxHQUFlLE9BQWY7QUFDRDtBQUNELGVBQWEsSUFBYixFQUFtQixLQUFuQixFQUEwQjtBQUN4QixXQUFPLG9CQUFTLFFBQVQsRUFBbUI7QUFDeEIsa0JBQVksTUFBTSxVQUFOLENBQWlCLE9BQWpCLEVBRFk7QUFFeEIsYUFBTyxNQUFNLEtBQU4sQ0FBWSxPQUFaO0FBRmlCLEtBQW5CLENBQVA7QUFJRDs7QUFFRCxlQUFhLElBQWIsRUFBbUIsS0FBbkIsRUFBMEI7QUFDeEIsUUFBSSxrQkFBa0IsTUFBTSxlQUFOLEdBQXdCLE1BQU0sZUFBTixDQUFzQixHQUF0QixFQUF4QixHQUFzRCxJQUE1RTtBQUNBLFdBQU8sb0JBQVMsUUFBVCxFQUFtQjtBQUN4QixzQkFBZ0IsTUFBTSxjQURFO0FBRXhCLG9CQUFjLE1BQU0sWUFBTixDQUFtQixPQUFuQixFQUZVO0FBR3hCLHNDQUh3QjtBQUl4QixpQkFBVyxLQUFLO0FBSlEsS0FBbkIsQ0FBUDtBQU1EOztBQUVELHdCQUFzQixJQUF0QixFQUE0QixLQUE1QixFQUFtQztBQUNqQyxRQUFJLGtCQUFrQixNQUFNLGVBQU4sR0FBd0IsTUFBTSxlQUFOLENBQXNCLEdBQXRCLEVBQXhCLEdBQXNELElBQTVFO0FBQ0EsV0FBTyxvQkFBUyxpQkFBVCxFQUE0QjtBQUNqQyxzQkFBZ0IsTUFBTSxjQURXO0FBRWpDLHdCQUFrQixNQUFNLGdCQUZTO0FBR2pDLHNDQUhpQztBQUlqQyxpQkFBVyxLQUFLO0FBSmlCLEtBQTVCLENBQVA7QUFNRDs7QUFFRCxlQUFhLElBQWIsRUFBbUIsS0FBbkIsRUFBMEI7QUFDeEIsV0FBTyxvQkFBUyxRQUFULEVBQW1CO0FBQ3hCLG1CQUFhLE1BQU07QUFE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QyxLQUFuQyxFQUEwQztBQUN4QyxXQUFPLG9CQUFTLHdCQUFULEVBQW1DO0FBQ3hDLGNBQVEsTUFBTSxNQUQwQjtBQUV4QyxnQkFBVSxNQUFNLFFBQU4sQ0FBZSxHQUFmO0FBRjhCLEtBQW5DLENBQVA7QUFJRDs7QUFsS29EO2tCQUFsQyxZIiwiZmlsZSI6InBhcnNlLXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVybSBmcm9tIFwiLi90ZXJtc1wiO1xuaW1wb3J0IHsgQ2xvbmVSZWR1Y2VyIH0gZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VSZWR1Y2VyIGV4dGVuZHMgQ2xvbmVSZWR1Y2VyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuICByZWR1Y2VNb2R1bGUobm9kZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJNb2R1bGVcIiwge1xuICAgICAgZGlyZWN0aXZlczogc3RhdGUuZGlyZWN0aXZlcy50b0FycmF5KCksXG4gICAgICBpdGVtczogc3RhdGUuaXRlbXMudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VJbXBvcnQobm9kZSwgc3RhdGUpIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gc3RhdGUubW9kdWxlU3BlY2lmaWVyID8gc3RhdGUubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0ltcG9ydCcsIHtcbiAgICAgIGRlZmF1bHRCaW5kaW5nOiBzdGF0ZS5kZWZhdWx0QmluZGluZyxcbiAgICAgIG5hbWVkSW1wb3J0czogc3RhdGUubmFtZWRJbXBvcnRzLnRvQXJyYXkoKSxcbiAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIGZvclN5bnRheDogbm9kZS5mb3JTeW50YXhcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUltcG9ydE5hbWVzcGFjZShub2RlLCBzdGF0ZSkge1xuICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSBzdGF0ZS5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZS5tb2R1bGVTcGVjaWZpZXIudmFsKCkgOiBudWxsO1xuICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0TmFtZXNwYWNlJywge1xuICAgICAgZGVmYXVsdEJpbmRpbmc6IHN0YXRlLmRlZmF1bHRCaW5kaW5nLFxuICAgICAgbmFtZXNwYWNlQmluZGluZzogc3RhdGUubmFtZXNwYWNlQmluZGluZyxcbiAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIGZvclN5bnRheDogbm9kZS5mb3JTeW50YXhcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUV4cG9ydChub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0Jywge1xuICAgICAgZGVjbGFyYXRpb246IHN0YXRlLmRlY2xhcmF0aW9uXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VFeHBvcnRBbGxGcm9tKG5vZGUsIHN0YXRlKSB7XG4gICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHN0YXRlLm1vZHVsZVNwZWNpZmllciA/IHN0YXRlLm1vZHVsZVNwZWNpZmllci52YWwoKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnRBbGxGcm9tJywgeyBtb2R1bGVTcGVjaWZpZXIgfSk7XG4gIH1cblxuICByZWR1Y2VFeHBvcnRGcm9tKG5vZGUsIHN0YXRlKSB7XG4gICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHN0YXRlLm1vZHVsZVNwZWNpZmllciA/IHN0YXRlLm1vZHVsZVNwZWNpZmllci52YWwoKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnRGcm9tJywge1xuICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgbmFtZWRFeHBvcnRzOiBzdGF0ZS5uYW1lZEV4cG9ydHMudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VFeHBvcnRTcGVjaWZpZXIobm9kZSwgc3RhdGUpIHtcbiAgICBsZXQgbmFtZSA9IHN0YXRlLm5hbWUsIGV4cG9ydGVkTmFtZSA9IHN0YXRlLmV4cG9ydGVkTmFtZTtcbiAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICBuYW1lID0gZXhwb3J0ZWROYW1lLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgIGV4cG9ydGVkTmFtZSA9IGV4cG9ydGVkTmFtZS52YWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgZXhwb3J0ZWROYW1lID0gZXhwb3J0ZWROYW1lLnZhbCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydFNwZWNpZmllcicsIHtcbiAgICAgIG5hbWUsIGV4cG9ydGVkTmFtZVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlSW1wb3J0U3BlY2lmaWVyKG5vZGUsIHN0YXRlKSB7XG4gICAgbGV0IG5hbWUgPSBzdGF0ZS5uYW1lID8gc3RhdGUubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkgOiBudWxsO1xuICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0U3BlY2lmaWVyJywge1xuICAgICAgbmFtZSxcbiAgICAgIGJpbmRpbmc6IHN0YXRlLmJpbmRpbmdcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUlkZW50aWZpZXJFeHByZXNzaW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBuYW1lOiBub2RlLm5hbWUucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24obm9kZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwiLCB7XG4gICAgICB2YWx1ZTogbm9kZS52YWx1ZS52YWwoKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlTGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIiwge1xuICAgICAgdmFsdWU6IG5vZGUudmFsdWUudmFsKCkgPT09ICd0cnVlJ1xuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb24obm9kZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiBub2RlLnZhbHVlLnRva2VuLnN0clxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlQ2FsbEV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYWxsRXhwcmVzc2lvblwiLCB7XG4gICAgICBjYWxsZWU6IHN0YXRlLmNhbGxlZSxcbiAgICAgIGFyZ3VtZW50czogc3RhdGUuYXJndW1lbnRzLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlRnVuY3Rpb25Cb2R5KG5vZGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRnVuY3Rpb25Cb2R5XCIsIHtcbiAgICAgIGRpcmVjdGl2ZXM6IHN0YXRlLmRpcmVjdGl2ZXMudG9BcnJheSgpLFxuICAgICAgc3RhdGVtZW50czogc3RhdGUuc3RhdGVtZW50cy50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUZvcm1hbFBhcmFtZXRlcnMobm9kZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGb3JtYWxQYXJhbWV0ZXJzXCIsIHtcbiAgICAgIGl0ZW1zOiBzdGF0ZS5pdGVtcy50b0FycmF5KCksXG4gICAgICByZXN0OiBzdGF0ZS5yZXN0XG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VCaW5kaW5nSWRlbnRpZmllcihub2RlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge1xuICAgICAgbmFtZTogbm9kZS5uYW1lLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlQmluYXJ5RXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge1xuICAgICAgbGVmdDogc3RhdGUubGVmdCxcbiAgICAgIG9wZXJhdG9yOiBub2RlLm9wZXJhdG9yLnZhbCgpLFxuICAgICAgcmlnaHQ6IHN0YXRlLnJpZ2h0XG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VPYmplY3RFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7XG4gICAgICBwcm9wZXJ0aWVzOiBzdGF0ZS5wcm9wZXJ0aWVzLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiwge1xuICAgICAga2luZDogc3RhdGUua2luZCxcbiAgICAgIGRlY2xhcmF0b3JzOiBzdGF0ZS5kZWNsYXJhdG9ycy50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZVN0YXRpY1Byb3BlcnR5TmFtZShub2RlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljUHJvcGVydHlOYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBub2RlLnZhbHVlLnZhbCgpLnRvU3RyaW5nKClcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUFycmF5RXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkFycmF5RXhwcmVzc2lvblwiLCB7XG4gICAgICBlbGVtZW50czogc3RhdGUuZWxlbWVudHMudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VTdGF0aWNNZW1iZXJFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBvYmplY3Q6IHN0YXRlLm9iamVjdCxcbiAgICAgIHByb3BlcnR5OiBzdGF0ZS5wcm9wZXJ0eS52YWwoKVxuICAgIH0pO1xuICB9XG5cbn1cbiJdfQ== /***/ }, -/* 12 */ +/* 9 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -7684,609 +6586,264 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack Object.defineProperty(exports, "__esModule", { value: true }); - exports.ALL_PHASES = exports.Types = undefined; - - var _immutable = __webpack_require__(11); - - var _errors = __webpack_require__(13); - - var _bindingMap = __webpack_require__(14); - - var _bindingMap2 = _interopRequireDefault(_bindingMap); + exports.isImportDeclaration = exports.isCompiletimeStatement = exports.isCompiletimeDeclaration = exports.isSyntaxDeclarationStatement = exports.isExportSyntax = exports.isParenthesizedExpression = exports.isFunctionWithName = exports.isFunctionTerm = exports.isSyntaxrecDeclaration = exports.isSyntaxDeclaration = exports.isEOF = exports.isVariableDeclarator = exports.isVariableDeclaration = exports.isSyntaxTemplate = exports.isTemplateElement = exports.isSwitchDefault = exports.isSwitchCase = exports.isSuper = exports.isSpreadElement = exports.isScript = exports.isFunctionDeclaration = exports.isFunctionBody = exports.isFormalParameters = exports.isDirective = exports.isCatchClause = exports.isBlock = exports.isPragma = exports.isWithStatement = exports.isWhileStatement = exports.isVariableDeclarationStatement = exports.isTryFinallyStatement = exports.isTryCatchStatement = exports.isThrowStatement = exports.isSwitchStatementWithDefault = exports.isSwitchStatement = exports.isReturnStatement = exports.isLabeledStatement = exports.isIfStatement = exports.isForStatement = exports.isForOfStatement = exports.isForInStatement = exports.isExpressionStatement = exports.isEmptyStatement = exports.isDoWhileStatement = exports.isDebuggerStatement = exports.isCompoundAssignmentExpression = exports.isContinueStatement = exports.isBreakStatement = exports.isBlockStatement = exports.isYieldGeneratorExpression = exports.isYieldExpression = exports.isUpdateExpression = exports.isThisExpression = exports.isTemplateExpression = exports.isStaticMemberExpression = exports.isUnaryExpression = exports.isObjectExpression = exports.isNewTargetExpression = exports.isNewExpression = exports.isIdentifierExpression = exports.isFunctionExpression = exports.isConditionalExpression = exports.isComputedMemberExpression = exports.isComputedAssignmentExpression = exports.isCallExpression = exports.isBinaryExpression = exports.isAssignmentExpression = exports.isArrowExpression = exports.isArrayExpression = exports.isLiteralStringExpression = exports.isLiteralRegExpExpression = exports.isLiteralNumericExpression = exports.isLiteralNullExpression = exports.isLiteralInfinityExpression = exports.isLiteralBooleanExpression = exports.isStaticPropertyName = exports.isComputedPropertyName = exports.isShorthandProperty = exports.isDataProperty = exports.isSetter = exports.isGetter = exports.isMethod = exports.isExportSpecifier = exports.isExportDefault = exports.isExport = exports.isExportFrom = exports.isExportAllFrom = exports.isImportSpecifier = exports.isImportNamespace = exports.isImport = exports.isModule = exports.isClassElement = exports.isClassDeclaration = exports.isClassExpression = exports.isBindingPropertyProperty = exports.isBindingPropertyIdentifier = exports.isObjectBinding = exports.isArrayBinding = exports.isBindingIdentifier = exports.isBindingWithDefault = undefined; - var _ramdaFantasy = __webpack_require__(15); + var _immutable = __webpack_require__(3); - var _tokenizer = __webpack_require__(4); + var _ramda = __webpack_require__(10); - var _ramda = __webpack_require__(27); + var R = _interopRequireWildcard(_ramda); - var _ = _interopRequireWildcard(_ramda); + var _sweetSpec = __webpack_require__(11); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + var _sweetSpec2 = _interopRequireDefault(_sweetSpec); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - const Just_825 = _ramdaFantasy.Maybe.Just; - const Nothing_826 = _ramdaFantasy.Maybe.Nothing; - function getFirstSlice_827(stx_831) { - if (!stx_831 || typeof stx_831.isDelimiter !== "function") return null; - if (!stx_831.isDelimiter()) { - return stx_831.token.slice; - } - return stx_831.token.get(0).token.slice; - } - function sizeDecending_828(a_832, b_833) { - if (a_832.scopes.size > b_833.scopes.size) { - return -1; - } else if (b_833.scopes.size > a_832.scopes.size) { - return 1; - } else { - return 0; - } - } - let Types_829 = { null: { match: token_834 => !Types_829.delimiter.match(token_834) && token_834.type === _tokenizer.TokenType.NULL, create: (value_835, stx_836) => new Syntax({ type: _tokenizer.TokenType.NULL, value: null }, stx_836) }, number: { match: token_837 => !Types_829.delimiter.match(token_837) && token_837.type.klass === _tokenizer.TokenClass.NumericLiteral, create: (value_838, stx_839) => new Syntax({ type: _tokenizer.TokenType.NUMBER, value: value_838 }, stx_839) }, string: { match: token_840 => !Types_829.delimiter.match(token_840) && token_840.type.klass === _tokenizer.TokenClass.StringLiteral, create: (value_841, stx_842) => new Syntax({ type: _tokenizer.TokenType.STRING, str: value_841 }, stx_842) }, punctuator: { match: token_843 => !Types_829.delimiter.match(token_843) && token_843.type.klass === _tokenizer.TokenClass.Punctuator, create: (value_844, stx_845) => new Syntax({ type: { klass: _tokenizer.TokenClass.Punctuator, name: value_844 }, value: value_844 }, stx_845) }, keyword: { match: token_846 => !Types_829.delimiter.match(token_846) && token_846.type.klass === _tokenizer.TokenClass.Keyword, create: (value_847, stx_848) => new Syntax({ type: { klass: _tokenizer.TokenClass.Keyword, name: value_847 }, value: value_847 }, stx_848) }, identifier: { match: token_849 => !Types_829.delimiter.match(token_849) && token_849.type.klass === _tokenizer.TokenClass.Ident, create: (value_850, stx_851) => new Syntax({ type: _tokenizer.TokenType.IDENTIFIER, value: value_850 }, stx_851) }, regularExpression: { match: token_852 => !Types_829.delimiter.match(token_852) && token_852.type.klass === _tokenizer.TokenClass.RegularExpression, create: (value_853, stx_854) => new Syntax({ type: _tokenizer.TokenType.REGEXP, value: value_853 }, stx_854) }, braces: { match: token_855 => Types_829.delimiter.match(token_855) && token_855.get(0).token.type === _tokenizer.TokenType.LBRACE, create: (inner_856, stx_857) => { - let left_858 = new Syntax({ type: _tokenizer.TokenType.LBRACE, value: "{", slice: getFirstSlice_827(stx_857) }); - let right_859 = new Syntax({ type: _tokenizer.TokenType.RBRACE, value: "}", slice: getFirstSlice_827(stx_857) }); - return new Syntax(_immutable.List.of(left_858).concat(inner_856).push(right_859), stx_857); - } }, brackets: { match: token_860 => Types_829.delimiter.match(token_860) && token_860.get(0).token.type === _tokenizer.TokenType.LBRACK, create: (inner_861, stx_862) => { - let left_863 = new Syntax({ type: _tokenizer.TokenType.LBRACK, value: "[", slice: getFirstSlice_827(stx_862) }); - let right_864 = new Syntax({ type: _tokenizer.TokenType.RBRACK, value: "]", slice: getFirstSlice_827(stx_862) }); - return new Syntax(_immutable.List.of(left_863).concat(inner_861).push(right_864), stx_862); - } }, parens: { match: token_865 => Types_829.delimiter.match(token_865) && token_865.get(0).token.type === _tokenizer.TokenType.LPAREN, create: (inner_866, stx_867) => { - let left_868 = new Syntax({ type: _tokenizer.TokenType.LPAREN, value: "(", slice: getFirstSlice_827(stx_867) }); - let right_869 = new Syntax({ type: _tokenizer.TokenType.RPAREN, value: ")", slice: getFirstSlice_827(stx_867) }); - return new Syntax(_immutable.List.of(left_868).concat(inner_866).push(right_869), stx_867); - } }, assign: { match: token_870 => { - if (Types_829.punctuator.match(token_870)) { - switch (token_870.value) { - case "=": - case "|=": - case "^=": - case "&=": - case "<<=": - case ">>=": - case ">>>=": - case "+=": - case "-=": - case "*=": - case "/=": - case "%=": - return true; - default: - return false; - } - } - return false; - } }, boolean: { match: token_871 => !Types_829.delimiter.match(token_871) && token_871.type === _tokenizer.TokenType.TRUE || token_871.type === _tokenizer.TokenType.FALSE }, template: { match: token_872 => !Types_829.delimiter.match(token_872) && token_872.type === _tokenizer.TokenType.TEMPLATE }, delimiter: { match: token_873 => _immutable.List.isList(token_873) }, syntaxTemplate: { match: token_874 => Types_829.delimiter.match(token_874) && token_874.get(0).val() === "#`" }, eof: { match: token_875 => !Types_829.delimiter.match(token_875) && token_875.type === _tokenizer.TokenType.EOS } }; - ; - const ALL_PHASES_830 = {}; - ; - class Syntax { - constructor(token_876) { - let oldstx_877 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - this.token = token_876; - this.bindings = oldstx_877.bindings != null ? oldstx_877.bindings : new _bindingMap2.default(); - this.scopesets = oldstx_877.scopesets != null ? oldstx_877.scopesets : { all: (0, _immutable.List)(), phase: (0, _immutable.Map)() }; - Object.freeze(this); - } - static of(token_878) { - let stx_879 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + const attrName = a => a.attrName; - return new Syntax(token_878, stx_879); - } - static from(type_880, value_881) { - let stx_882 = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + class Term { - if (!Types_829[type_880]) { - throw new Error(type_880 + " is not a valid type"); - } else if (!Types_829[type_880].create) { - throw new Error("Cannot create a syntax from type " + type_880); + constructor(type, props) { + let spec = _sweetSpec2.default.getDescendant(type); + if (spec == null) { + throw new Error(`Unknown term: ${ type }`); } - let newstx_883 = Types_829[type_880].create(value_881, stx_882); - let slice_884 = getFirstSlice_827(stx_882); - if (slice_884 != null) { - newstx_883.token.slice = slice_884; + this.type = type; + this.loc = null; + this.spec = spec; + let propKeys = Object.keys(props); + let fieldNames = spec.getAttributes().map(attrName); + let diff = R.symmetricDifference(propKeys, fieldNames); + if (diff.length !== 0) { + throw new Error(`Unexpected properties for term ${ type }: ${ diff }`); } - return newstx_883; - } - from(type_885, value_886) { - return Syntax.from(type_885, value_886, this); - } - fromNull() { - return this.from("null", null); + Object.assign(this, props); } - fromNumber(value_887) { - return this.from("number", value_887); - } - fromString(value_888) { - return this.from("string", value_888); - } - fromPunctuator(value_889) { - return this.from("punctuator", value_889); - } - fromKeyword(value_890) { - return this.from("keyword"); - } - fromIdentifier(value_891) { - return this.from("identifier", value_891); - } - fromRegularExpression(value_892) { - return this.from("regularExpression", value_892); - } - fromBraces(inner_893) { - return this.from("braces", inner_893); - } - fromBrackets(inner_894) { - return this.from("brackets", inner_894); - } - fromParens(inner_895) { - return this.from("parens", inner_895); - } - static fromNull() { - let stx_896 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - return Syntax.from("null", null, stx_896); - } - static fromNumber(value_897) { - let stx_898 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + extend(props) { + let specAttrNames = this.spec.getAttributes().map(attrName); + let newProps = R.pick(specAttrNames, this); - return Syntax.from("number", value_897, stx_898); - } - static fromString(value_899) { - let stx_900 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + let invalidAttrs = R.difference(Object.keys(props), specAttrNames); + if (invalidAttrs.length > 0) { + throw new Error(`Unexpected properties for term ${ this.type }: ${ invalidAttrs }`); + } - return Syntax.from("string", value_899, stx_900); + return new Term(this.type, Object.assign(newProps, props)); } - static fromPunctuator(value_901) { - let stx_902 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("punctuator", value_901, stx_902); + // TODO: remove + gen() { + let includeImports = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + let next = {}; + for (let field of this.spec.getAttributes()) { + if (this[field.attrName] == null) { + next[field.attrName] = null; + } else if (this[field.attrName] instanceof Term) { + next[field.attrName] = this[field.attrName].gen(includeImports); + } else if (_immutable.List.isList(this[field.attrName])) { + let pred = includeImports ? R.complement(isCompiletimeStatement) : R.both(R.complement(isImportDeclaration), R.complement(isCompiletimeStatement)); + next[field.attrName] = this[field.attrName].filter(pred).map(term => term instanceof Term ? term.gen(includeImports) : term); + } else { + next[field.attrName] = this[field.attrName]; + } + } + return new Term(this.type, next); } - static fromKeyword(value_903) { - let stx_904 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("keyword", value_903, stx_904); + // TODO: remove + visit(f) { + let next = {}; + for (let field of _sweetSpec2.default.getDescendant(this.type).getAttributes()) { + if (this[field.attrName] == null) { + next[field.attrName] = null; + } else if (_immutable.List.isList(this[field.attrName])) { + next[field.attrName] = this[field.attrName].map(field => field != null ? f(field) : null); + } else { + next[field.attrName] = f(this[field.attrName]); + } + } + return this.extend(next); } - static fromIdentifier(value_905) { - let stx_906 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("identifier", value_905, stx_906); + // TODO: remove + addScope(scope, bindings, phase, options) { + return this.visit(term => { + if (typeof term.addScope === 'function') { + return term.addScope(scope, bindings, phase, options); + } + return term; + }); } - static fromRegularExpression(value_907) { - let stx_908 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("regularExpression", value_907, stx_908); + // TODO: remove + removeScope(scope, phase) { + return this.visit(term => { + if (typeof term.removeScope === 'function') { + return term.removeScope(scope, phase); + } + return term; + }); } - static fromBraces(inner_909) { - let stx_910 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("braces", inner_909, stx_910); + // TODO: this is very wrong + lineNumber() { + for (let field of _sweetSpec2.default.getDescendant(this.type).getAttributes()) { + if (typeof this[field.attrName] && this[field.attrName].lineNumber === 'function') { + return this[field.attrName].lineNumber(); + } + } } - static fromBrackets(inner_911) { - let stx_912 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("brackets", inner_911, stx_912); + setLineNumber(line) { + let next = {}; + for (let field of _sweetSpec2.default.getDescendant(this.type).getAttributes()) { + if (this[field.attrName] == null) { + next[field.attrName] = null; + } else if (typeof this[field.attrName].setLineNumber === 'function') { + next[field.attrName] = this[field.attrName].setLineNumber(line); + } else if (_immutable.List.isList(this[field.attrName])) { + next[field.attrName] = this[field.attrName].map(f => f.setLineNumber(line)); + } else { + next[field.attrName] = this[field.attrName]; + } + } + return new Term(this.type, next); } - static fromParens(inner_913) { - let stx_914 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + } - return Syntax.from("parens", inner_913, stx_914); - } - resolve(phase_915) { - (0, _errors.assert)(phase_915 != null, "must provide a phase to resolve"); - let allScopes_916 = this.scopesets.all; - let stxScopes_917 = this.scopesets.phase.has(phase_915) ? this.scopesets.phase.get(phase_915) : (0, _immutable.List)(); - stxScopes_917 = allScopes_916.concat(stxScopes_917); - if (stxScopes_917.size === 0 || !(this.match("identifier") || this.match("keyword"))) { - return this.token.value; - } - let scope_918 = stxScopes_917.last(); - let bindings_919 = this.bindings; - if (scope_918) { - let scopesetBindingList = bindings_919.get(this); - if (scopesetBindingList) { - let biggestBindingPair = scopesetBindingList.filter(_ref => { - let scopes = _ref.scopes; - let binding = _ref.binding; + exports.default = Term; // bindings + + const isBindingWithDefault = exports.isBindingWithDefault = R.whereEq({ type: "BindingWithDefault" }); + const isBindingIdentifier = exports.isBindingIdentifier = R.whereEq({ type: "BindingIdentifier" }); + const isArrayBinding = exports.isArrayBinding = R.whereEq({ type: "ArrayBinding" }); + const isObjectBinding = exports.isObjectBinding = R.whereEq({ type: "ObjectBinding" }); + const isBindingPropertyIdentifier = exports.isBindingPropertyIdentifier = R.whereEq({ type: "BindingPropertyIdentifier" }); + const isBindingPropertyProperty = exports.isBindingPropertyProperty = R.whereEq({ type: "BindingPropertyIdentifier" }); + + // class + const isClassExpression = exports.isClassExpression = R.whereEq({ type: "ClassExpression" }); + const isClassDeclaration = exports.isClassDeclaration = R.whereEq({ type: "ClassDeclaration" }); + const isClassElement = exports.isClassElement = R.whereEq({ type: "ClassElement" }); + + // modules + const isModule = exports.isModule = R.whereEq({ type: "Module" }); + const isImport = exports.isImport = R.whereEq({ type: "Import" }); + const isImportNamespace = exports.isImportNamespace = R.whereEq({ type: "ImportNamespace" }); + const isImportSpecifier = exports.isImportSpecifier = R.whereEq({ type: "ImportSpecifier" }); + const isExportAllFrom = exports.isExportAllFrom = R.whereEq({ type: "ExportAllFrom" }); + const isExportFrom = exports.isExportFrom = R.whereEq({ type: "ExportFrom" }); + const isExport = exports.isExport = R.whereEq({ type: "Export" }); + const isExportDefault = exports.isExportDefault = R.whereEq({ type: "ExportDefault" }); + const isExportSpecifier = exports.isExportSpecifier = R.whereEq({ type: "ExportSpecifier" }); + + // property definition + const isMethod = exports.isMethod = R.whereEq({ type: "Method" }); + const isGetter = exports.isGetter = R.whereEq({ type: "Getter" }); + const isSetter = exports.isSetter = R.whereEq({ type: "Setter" }); + const isDataProperty = exports.isDataProperty = R.whereEq({ type: "DataProperty" }); + const isShorthandProperty = exports.isShorthandProperty = R.whereEq({ type: "ShorthandProperty" }); + const isComputedPropertyName = exports.isComputedPropertyName = R.whereEq({ type: "ComputedPropertyName" }); + const isStaticPropertyName = exports.isStaticPropertyName = R.whereEq({ type: "StaticPropertyName" }); + + // literals + const isLiteralBooleanExpression = exports.isLiteralBooleanExpression = R.whereEq({ type: "LiteralBooleanExpression" }); + const isLiteralInfinityExpression = exports.isLiteralInfinityExpression = R.whereEq({ type: "LiteralInfinityExpression" }); + const isLiteralNullExpression = exports.isLiteralNullExpression = R.whereEq({ type: "LiteralNullExpression" }); + const isLiteralNumericExpression = exports.isLiteralNumericExpression = R.whereEq({ type: "LiteralNumericExpression" }); + const isLiteralRegExpExpression = exports.isLiteralRegExpExpression = R.whereEq({ type: "LiteralRegExpExpression" }); + const isLiteralStringExpression = exports.isLiteralStringExpression = R.whereEq({ type: "LiteralStringExpression" }); + + // expressions + const isArrayExpression = exports.isArrayExpression = R.whereEq({ type: "ArrayExpression" }); + const isArrowExpression = exports.isArrowExpression = R.whereEq({ type: "ArrowExpression" }); + const isAssignmentExpression = exports.isAssignmentExpression = R.whereEq({ type: "AssignmentExpression" }); + const isBinaryExpression = exports.isBinaryExpression = R.whereEq({ type: "BinaryExpression" }); + const isCallExpression = exports.isCallExpression = R.whereEq({ type: "CallExpression" }); + const isComputedAssignmentExpression = exports.isComputedAssignmentExpression = R.whereEq({ type: "ComputedAssignmentExpression" }); + const isComputedMemberExpression = exports.isComputedMemberExpression = R.whereEq({ type: "ComputedMemberExpression" }); + const isConditionalExpression = exports.isConditionalExpression = R.whereEq({ type: "ConditionalExpression" }); + const isFunctionExpression = exports.isFunctionExpression = R.whereEq({ type: "FunctionExpression" }); + const isIdentifierExpression = exports.isIdentifierExpression = R.whereEq({ type: "IdentifierExpression" }); + const isNewExpression = exports.isNewExpression = R.whereEq({ type: "NewExpression" }); + const isNewTargetExpression = exports.isNewTargetExpression = R.whereEq({ type: "NewTargetExpression" }); + const isObjectExpression = exports.isObjectExpression = R.whereEq({ type: "ObjectExpression" }); + const isUnaryExpression = exports.isUnaryExpression = R.whereEq({ type: "UnaryExpression" }); + const isStaticMemberExpression = exports.isStaticMemberExpression = R.whereEq({ type: "StaticMemberExpression" }); + const isTemplateExpression = exports.isTemplateExpression = R.whereEq({ type: "TemplateExpression" }); + const isThisExpression = exports.isThisExpression = R.whereEq({ type: "ThisExpression" }); + const isUpdateExpression = exports.isUpdateExpression = R.whereEq({ type: "UpdateExpression" }); + const isYieldExpression = exports.isYieldExpression = R.whereEq({ type: "YieldExpression" }); + const isYieldGeneratorExpression = exports.isYieldGeneratorExpression = R.whereEq({ type: "YieldGeneratorExpression" }); + + // statements + const isBlockStatement = exports.isBlockStatement = R.whereEq({ type: "BlockStatement" }); + const isBreakStatement = exports.isBreakStatement = R.whereEq({ type: "BreakStatement" }); + const isContinueStatement = exports.isContinueStatement = R.whereEq({ type: "ContinueStatement" }); + const isCompoundAssignmentExpression = exports.isCompoundAssignmentExpression = R.whereEq({ type: "CompoundAssignmentExpression" }); + const isDebuggerStatement = exports.isDebuggerStatement = R.whereEq({ type: "DebuggerStatement" }); + const isDoWhileStatement = exports.isDoWhileStatement = R.whereEq({ type: "DoWhileStatement" }); + const isEmptyStatement = exports.isEmptyStatement = R.whereEq({ type: "EmptyStatement" }); + const isExpressionStatement = exports.isExpressionStatement = R.whereEq({ type: "ExpressionStatement" }); + const isForInStatement = exports.isForInStatement = R.whereEq({ type: "ForInStatement" }); + const isForOfStatement = exports.isForOfStatement = R.whereEq({ type: "ForOfStatement" }); + const isForStatement = exports.isForStatement = R.whereEq({ type: "ForStatement" }); + const isIfStatement = exports.isIfStatement = R.whereEq({ type: "IfStatement" }); + const isLabeledStatement = exports.isLabeledStatement = R.whereEq({ type: "LabeledStatement" }); + const isReturnStatement = exports.isReturnStatement = R.whereEq({ type: "ReturnStatement" }); + const isSwitchStatement = exports.isSwitchStatement = R.whereEq({ type: "SwitchStatement" }); + const isSwitchStatementWithDefault = exports.isSwitchStatementWithDefault = R.whereEq({ type: "SwitchStatementWithDefault" }); + const isThrowStatement = exports.isThrowStatement = R.whereEq({ type: "ThrowStatement" }); + const isTryCatchStatement = exports.isTryCatchStatement = R.whereEq({ type: "TryCatchStatement" }); + const isTryFinallyStatement = exports.isTryFinallyStatement = R.whereEq({ type: "TryFinallyStatement" }); + const isVariableDeclarationStatement = exports.isVariableDeclarationStatement = R.whereEq({ type: "VariableDeclarationStatement" }); + const isWhileStatement = exports.isWhileStatement = R.whereEq({ type: "WhileStatement" }); + const isWithStatement = exports.isWithStatement = R.whereEq({ type: "WithStatement" }); + + // other + const isPragma = exports.isPragma = R.whereEq({ type: 'Pragma' }); + const isBlock = exports.isBlock = R.whereEq({ type: "Block" }); + const isCatchClause = exports.isCatchClause = R.whereEq({ type: "CatchClause" }); + const isDirective = exports.isDirective = R.whereEq({ type: "Directive" }); + const isFormalParameters = exports.isFormalParameters = R.whereEq({ type: "FormalParameters" }); + const isFunctionBody = exports.isFunctionBody = R.whereEq({ type: "FunctionBody" }); + const isFunctionDeclaration = exports.isFunctionDeclaration = R.whereEq({ type: "FunctionDeclaration" }); + const isScript = exports.isScript = R.whereEq({ type: "Script" }); + const isSpreadElement = exports.isSpreadElement = R.whereEq({ type: "SpreadElement" }); + const isSuper = exports.isSuper = R.whereEq({ type: "Super" }); + const isSwitchCase = exports.isSwitchCase = R.whereEq({ type: "SwitchCase" }); + const isSwitchDefault = exports.isSwitchDefault = R.whereEq({ type: "SwitchDefault" }); + const isTemplateElement = exports.isTemplateElement = R.whereEq({ type: "TemplateElement" }); + const isSyntaxTemplate = exports.isSyntaxTemplate = R.whereEq({ type: "SyntaxTemplate" }); + const isVariableDeclaration = exports.isVariableDeclaration = R.whereEq({ type: "VariableDeclaration" }); + const isVariableDeclarator = exports.isVariableDeclarator = R.whereEq({ type: "VariableDeclarator" }); + const isEOF = exports.isEOF = R.whereEq({ type: 'EOF' }); + const isSyntaxDeclaration = exports.isSyntaxDeclaration = R.both(isVariableDeclaration, R.whereEq({ kind: 'syntax' })); + const isSyntaxrecDeclaration = exports.isSyntaxrecDeclaration = R.both(isVariableDeclaration, R.whereEq({ kind: 'syntaxrec' })); + const isFunctionTerm = exports.isFunctionTerm = R.either(isFunctionDeclaration, isFunctionExpression); + const isFunctionWithName = exports.isFunctionWithName = R.and(isFunctionTerm, R.complement(R.where({ name: R.isNil }))); + const isParenthesizedExpression = exports.isParenthesizedExpression = R.whereEq({ type: 'ParenthesizedExpression' }); + const isExportSyntax = exports.isExportSyntax = R.both(isExport, exp => R.or(isSyntaxDeclaration(exp.declaration), isSyntaxrecDeclaration(exp.declaration))); + const isSyntaxDeclarationStatement = exports.isSyntaxDeclarationStatement = R.both(isVariableDeclarationStatement, decl => isCompiletimeDeclaration(decl.declaration)); + + const isCompiletimeDeclaration = exports.isCompiletimeDeclaration = R.either(isSyntaxDeclaration, isSyntaxrecDeclaration); + const isCompiletimeStatement = exports.isCompiletimeStatement = term => { + return term instanceof Term && isVariableDeclarationStatement(term) && isCompiletimeDeclaration(term.declaration); + }; + const isImportDeclaration = exports.isImportDeclaration = R.either(isImport, isImportNamespace); + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXJtcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0lBQVksQzs7QUFDWjs7Ozs7Ozs7QUFFQSxNQUFNLFdBQVcsS0FBSyxFQUFFLFFBQXhCOztBQUVlLE1BQU0sSUFBTixDQUFXOztBQUt4QixjQUFZLElBQVosRUFBMEIsS0FBMUIsRUFBcUM7QUFDbkMsUUFBSSxPQUFPLG9CQUFTLGFBQVQsQ0FBdUIsSUFBdkIsQ0FBWDtBQUNBLFFBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLFlBQU0sSUFBSSxLQUFKLENBQVcsa0JBQWdCLElBQUssR0FBaEMsQ0FBTjtBQUNEO0FBQ0QsU0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFNBQUssR0FBTCxHQUFXLElBQVg7QUFDQSxTQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsUUFBSSxXQUFXLE9BQU8sSUFBUCxDQUFZLEtBQVosQ0FBZjtBQUNBLFFBQUksYUFBYSxLQUFLLGFBQUwsR0FBcUIsR0FBckIsQ0FBeUIsUUFBekIsQ0FBakI7QUFDQSxRQUFJLE9BQU8sRUFBRSxtQkFBRixDQUFzQixRQUF0QixFQUFnQyxVQUFoQyxDQUFYO0FBQ0EsUUFBSSxLQUFLLE1BQUwsS0FBZ0IsQ0FBcEIsRUFBdUI7QUFDckIsWUFBTSxJQUFJLEtBQUosQ0FBVyxtQ0FBaUMsSUFBSyxPQUFJLElBQUssR0FBMUQsQ0FBTjtBQUNEO0FBQ0QsV0FBTyxNQUFQLENBQWMsSUFBZCxFQUFvQixLQUFwQjtBQUNEOztBQUVELFNBQU8sS0FBUCxFQUFrQjtBQUNoQixRQUFJLGdCQUFnQixLQUFLLElBQUwsQ0FBVSxhQUFWLEdBQTBCLEdBQTFCLENBQThCLFFBQTlCLENBQXBCO0FBQ0EsUUFBSSxXQUFXLEVBQUUsSUFBRixDQUFPLGFBQVAsRUFBc0IsSUFBdEIsQ0FBZjs7QUFFQSxRQUFJLGVBQWUsRUFBRSxVQUFGLENBQWEsT0FBTyxJQUFQLENBQVksS0FBWixDQUFiLEVBQWlDLGFBQWpDLENBQW5CO0FBQ0EsUUFBSSxhQUFhLE1BQWIsR0FBc0IsQ0FBMUIsRUFBNkI7QUFDM0IsWUFBTSxJQUFJLEtBQUosQ0FBVyxtQ0FBaUMsS0FBSyxJQUFLLE9BQUksWUFBYSxHQUF2RSxDQUFOO0FBQ0Q7O0FBRUQsV0FBTyxJQUFJLElBQUosQ0FBUyxLQUFLLElBQWQsRUFBb0IsT0FBTyxNQUFQLENBQWMsUUFBZCxFQUF3QixLQUF4QixDQUFwQixDQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFvQztBQUFBLFFBQWhDLGNBQWdDLHlEQUFOLElBQU07O0FBQ2xDLFFBQUksT0FBTyxFQUFYO0FBQ0EsU0FBSyxJQUFJLEtBQVQsSUFBa0IsS0FBSyxJQUFMLENBQVUsYUFBVixFQUFsQixFQUE2QztBQUMzQyxVQUFJLEtBQUssTUFBTSxRQUFYLEtBQXdCLElBQTVCLEVBQWtDO0FBQ2hDLGFBQUssTUFBTSxRQUFYLElBQXVCLElBQXZCO0FBQ0QsT0FGRCxNQUVPLElBQUksS0FBSyxNQUFNLFFBQVgsYUFBZ0MsSUFBcEMsRUFBMEM7QUFDL0MsYUFBSyxNQUFNLFFBQVgsSUFBdUIsS0FBSyxNQUFNLFFBQVgsRUFBcUIsR0FBckIsQ0FBeUIsY0FBekIsQ0FBdkI7QUFDRCxPQUZNLE1BRUEsSUFBSSxnQkFBSyxNQUFMLENBQVksS0FBSyxNQUFNLFFBQVgsQ0FBWixDQUFKLEVBQXVDO0FBQzVDLFlBQUksT0FBTyxpQkFBaUIsRUFBRSxVQUFGLENBQWEsc0JBQWIsQ0FBakIsR0FBd0QsRUFBRSxJQUFGLENBQU8sRUFBRSxVQUFGLENBQWEsbUJBQWIsQ0FBUCxFQUEwQyxFQUFFLFVBQUYsQ0FBYSxzQkFBYixDQUExQyxDQUFuRTtBQUNBLGFBQUssTUFBTSxRQUFYLElBQXVCLEtBQUssTUFBTSxRQUFYLEVBQXFCLE1BQXJCLENBQTRCLElBQTVCLEVBQ0csR0FESCxDQUNPLFFBQVEsZ0JBQWdCLElBQWhCLEdBQXVCLEtBQUssR0FBTCxDQUFTLGNBQVQsQ0FBdkIsR0FBa0QsSUFEakUsQ0FBdkI7QUFFRCxPQUpNLE1BSUE7QUFDTCxhQUFLLE1BQU0sUUFBWCxJQUF1QixLQUFLLE1BQU0sUUFBWCxDQUF2QjtBQUNEO0FBQ0Y7QUFDRCxXQUFPLElBQUksSUFBSixDQUFTLEtBQUssSUFBZCxFQUFvQixJQUFwQixDQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFNLENBQU4sRUFBUztBQUNQLFFBQUksT0FBTyxFQUFYO0FBQ0EsU0FBSyxJQUFJLEtBQVQsSUFBa0Isb0JBQVMsYUFBVCxDQUF1QixLQUFLLElBQTVCLEVBQWtDLGFBQWxDLEVBQWxCLEVBQXFFO0FBQ25FLFVBQUksS0FBSyxNQUFNLFFBQVgsS0FBd0IsSUFBNUIsRUFBa0M7QUFDaEMsYUFBSyxNQUFNLFFBQVgsSUFBdUIsSUFBdkI7QUFDRCxPQUZELE1BRU8sSUFBSSxnQkFBSyxNQUFMLENBQVksS0FBSyxNQUFNLFFBQVgsQ0FBWixDQUFKLEVBQXVDO0FBQzVDLGFBQUssTUFBTSxRQUFYLElBQXVCLEtBQUssTUFBTSxRQUFYLEVBQXFCLEdBQXJCLENBQXlCLFNBQVMsU0FBUyxJQUFULEdBQWdCLEVBQUUsS0FBRixDQUFoQixHQUEyQixJQUE3RCxDQUF2QjtBQUNELE9BRk0sTUFFQTtBQUNMLGFBQUssTUFBTSxRQUFYLElBQXVCLEVBQUUsS0FBSyxNQUFNLFFBQVgsQ0FBRixDQUF2QjtBQUNEO0FBQ0Y7QUFDRCxXQUFPLEtBQUssTUFBTCxDQUFZLElBQVosQ0FBUDtBQUNEOztBQUVEO0FBQ0EsV0FBUyxLQUFULEVBQWdCLFFBQWhCLEVBQTBCLEtBQTFCLEVBQWlDLE9BQWpDLEVBQTBDO0FBQ3hDLFdBQU8sS0FBSyxLQUFMLENBQVcsUUFBUTtBQUN4QixVQUFJLE9BQU8sS0FBSyxRQUFaLEtBQXlCLFVBQTdCLEVBQXlDO0FBQ3ZDLGVBQU8sS0FBSyxRQUFMLENBQWMsS0FBZCxFQUFxQixRQUFyQixFQUErQixLQUEvQixFQUFzQyxPQUF0QyxDQUFQO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRCxLQUxNLENBQVA7QUFNRDs7QUFFRDtBQUNBLGNBQVksS0FBWixFQUFtQixLQUFuQixFQUEwQjtBQUN4QixXQUFPLEtBQUssS0FBTCxDQUFXLFFBQVE7QUFDeEIsVUFBSSxPQUFPLEtBQUssV0FBWixLQUE0QixVQUFoQyxFQUE0QztBQUMxQyxlQUFPLEtBQUssV0FBTCxDQUFpQixLQUFqQixFQUF3QixLQUF4QixDQUFQO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRCxLQUxNLENBQVA7QUFNRDs7QUFFRDtBQUNBLGVBQWE7QUFDWCxTQUFLLElBQUksS0FBVCxJQUFrQixvQkFBUyxhQUFULENBQXVCLEtBQUssSUFBNUIsRUFBa0MsYUFBbEMsRUFBbEIsRUFBcUU7QUFDbkUsVUFBSSxPQUFPLEtBQUssTUFBTSxRQUFYLENBQVAsSUFBK0IsS0FBSyxNQUFNLFFBQVgsRUFBcUIsVUFBckIsS0FBb0MsVUFBdkUsRUFBbUY7QUFDakYsZUFBTyxLQUFLLE1BQU0sUUFBWCxFQUFxQixVQUFyQixFQUFQO0FBQ0Q7QUFDRjtBQUNGOztBQUVELGdCQUFjLElBQWQsRUFBb0I7QUFDbEIsUUFBSSxPQUFPLEVBQVg7QUFDQSxTQUFLLElBQUksS0FBVCxJQUFrQixvQkFBUyxhQUFULENBQXVCLEtBQUssSUFBNUIsRUFBa0MsYUFBbEMsRUFBbEIsRUFBcUU7QUFDbkUsVUFBSSxLQUFLLE1BQU0sUUFBWCxLQUF3QixJQUE1QixFQUFrQztBQUNoQyxhQUFLLE1BQU0sUUFBWCxJQUF1QixJQUF2QjtBQUNELE9BRkQsTUFFTyxJQUFJLE9BQU8sS0FBSyxNQUFNLFFBQVgsRUFBcUIsYUFBNUIsS0FBOEMsVUFBbEQsRUFBOEQ7QUFDbkUsYUFBSyxNQUFNLFFBQVgsSUFBdUIsS0FBSyxNQUFNLFFBQVgsRUFBcUIsYUFBckIsQ0FBbUMsSUFBbkMsQ0FBdkI7QUFDRCxPQUZNLE1BRUEsSUFBSSxnQkFBSyxNQUFMLENBQVksS0FBSyxNQUFNLFFBQVgsQ0FBWixDQUFKLEVBQXVDO0FBQzVDLGFBQUssTUFBTSxRQUFYLElBQXVCLEtBQUssTUFBTSxRQUFYLEVBQXFCLEdBQXJCLENBQXlCLEtBQUssRUFBRSxhQUFGLENBQWdCLElBQWhCLENBQTlCLENBQXZCO0FBQ0QsT0FGTSxNQUVBO0FBQ0wsYUFBSyxNQUFNLFFBQVgsSUFBdUIsS0FBSyxNQUFNLFFBQVgsQ0FBdkI7QUFDRDtBQUNGO0FBQ0QsV0FBTyxJQUFJLElBQUosQ0FBUyxLQUFLLElBQWQsRUFBb0IsSUFBcEIsQ0FBUDtBQUNEO0FBL0d1Qjs7a0JBQUwsSSxDQW1IckI7O0FBQ08sTUFBTSxzREFBdUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLG9CQUFSLEVBQVYsQ0FBN0I7QUFDQSxNQUFNLG9EQUFzQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sbUJBQVIsRUFBVixDQUE1QjtBQUNBLE1BQU0sMENBQWlCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxjQUFSLEVBQVYsQ0FBdkI7QUFDQSxNQUFNLDRDQUFrQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sZUFBUixFQUFWLENBQXhCO0FBQ0EsTUFBTSxvRUFBOEIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLDJCQUFSLEVBQVYsQ0FBcEM7QUFDQSxNQUFNLGdFQUE0QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sMkJBQVIsRUFBVixDQUFsQzs7QUFFUDtBQUNPLE1BQU0sZ0RBQW9CLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxpQkFBUixFQUFWLENBQTFCO0FBQ0EsTUFBTSxrREFBcUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGtCQUFSLEVBQVYsQ0FBM0I7QUFDQSxNQUFNLDBDQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sY0FBUixFQUFWLENBQXZCOztBQUVQO0FBQ08sTUFBTSw4QkFBVyxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sUUFBUixFQUFWLENBQWpCO0FBQ0EsTUFBTSw4QkFBVyxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sUUFBUixFQUFWLENBQWpCO0FBQ0EsTUFBTSxnREFBb0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGlCQUFSLEVBQVYsQ0FBMUI7QUFDQSxNQUFNLGdEQUFvQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0saUJBQVIsRUFBVixDQUExQjtBQUNBLE1BQU0sNENBQWtCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxlQUFSLEVBQVYsQ0FBeEI7QUFDQSxNQUFNLHNDQUFlLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxZQUFSLEVBQVYsQ0FBckI7QUFDQSxNQUFNLDhCQUFXLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxRQUFSLEVBQVYsQ0FBakI7QUFDQSxNQUFNLDRDQUFrQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sZUFBUixFQUFWLENBQXhCO0FBQ0EsTUFBTSxnREFBb0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGlCQUFSLEVBQVYsQ0FBMUI7O0FBRVA7QUFDTyxNQUFNLDhCQUFXLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxRQUFSLEVBQVYsQ0FBakI7QUFDQSxNQUFNLDhCQUFXLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxRQUFSLEVBQVYsQ0FBakI7QUFDQSxNQUFNLDhCQUFXLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxRQUFSLEVBQVYsQ0FBakI7QUFDQSxNQUFNLDBDQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sY0FBUixFQUFWLENBQXZCO0FBQ0EsTUFBTSxvREFBc0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLG1CQUFSLEVBQVYsQ0FBNUI7QUFDQSxNQUFNLDBEQUF5QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sc0JBQVIsRUFBVixDQUEvQjtBQUNBLE1BQU0sc0RBQXVCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxvQkFBUixFQUFWLENBQTdCOztBQUVQO0FBQ08sTUFBTSxrRUFBNkIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLDBCQUFSLEVBQVYsQ0FBbkM7QUFDQSxNQUFNLG9FQUE4QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sMkJBQVIsRUFBVixDQUFwQztBQUNBLE1BQU0sNERBQTBCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSx1QkFBUixFQUFWLENBQWhDO0FBQ0EsTUFBTSxrRUFBNkIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLDBCQUFSLEVBQVYsQ0FBbkM7QUFDQSxNQUFNLGdFQUE0QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0seUJBQVIsRUFBVixDQUFsQztBQUNBLE1BQU0sZ0VBQTRCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSx5QkFBUixFQUFWLENBQWxDOztBQUVQO0FBQ08sTUFBTSxnREFBb0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGlCQUFSLEVBQVYsQ0FBMUI7QUFDQSxNQUFNLGdEQUFvQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0saUJBQVIsRUFBVixDQUExQjtBQUNBLE1BQU0sMERBQXlCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxzQkFBUixFQUFWLENBQS9CO0FBQ0EsTUFBTSxrREFBcUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGtCQUFSLEVBQVYsQ0FBM0I7QUFDQSxNQUFNLDhDQUFtQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sZ0JBQVIsRUFBVixDQUF6QjtBQUNBLE1BQU0sMEVBQWlDLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSw4QkFBUixFQUFWLENBQXZDO0FBQ0EsTUFBTSxrRUFBNkIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLDBCQUFSLEVBQVYsQ0FBbkM7QUFDQSxNQUFNLDREQUEwQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sdUJBQVIsRUFBVixDQUFoQztBQUNBLE1BQU0sc0RBQXVCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxvQkFBUixFQUFWLENBQTdCO0FBQ0EsTUFBTSwwREFBeUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHNCQUFSLEVBQVYsQ0FBL0I7QUFDQSxNQUFNLDRDQUFrQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sZUFBUixFQUFWLENBQXhCO0FBQ0EsTUFBTSx3REFBd0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFSLEVBQVYsQ0FBOUI7QUFDQSxNQUFNLGtEQUFxQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sa0JBQVIsRUFBVixDQUEzQjtBQUNBLE1BQU0sZ0RBQW9CLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxpQkFBUixFQUFWLENBQTFCO0FBQ0EsTUFBTSw4REFBMkIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHdCQUFSLEVBQVYsQ0FBakM7QUFDQSxNQUFNLHNEQUF1QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sb0JBQVIsRUFBVixDQUE3QjtBQUNBLE1BQU0sOENBQW1CLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxnQkFBUixFQUFWLENBQXpCO0FBQ0EsTUFBTSxrREFBcUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGtCQUFSLEVBQVYsQ0FBM0I7QUFDQSxNQUFNLGdEQUFvQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0saUJBQVIsRUFBVixDQUExQjtBQUNBLE1BQU0sa0VBQTZCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSwwQkFBUixFQUFWLENBQW5DOztBQUVQO0FBQ08sTUFBTSw4Q0FBbUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGdCQUFSLEVBQVYsQ0FBekI7QUFDQSxNQUFNLDhDQUFtQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sZ0JBQVIsRUFBVixDQUF6QjtBQUNBLE1BQU0sb0RBQXNCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxtQkFBUixFQUFWLENBQTVCO0FBQ0EsTUFBTSwwRUFBaUMsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLDhCQUFSLEVBQVYsQ0FBdkM7QUFDQSxNQUFNLG9EQUFzQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sbUJBQVIsRUFBVixDQUE1QjtBQUNBLE1BQU0sa0RBQXFCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxrQkFBUixFQUFWLENBQTNCO0FBQ0EsTUFBTSw4Q0FBbUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGdCQUFSLEVBQVYsQ0FBekI7QUFDQSxNQUFNLHdEQUF3QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0scUJBQVIsRUFBVixDQUE5QjtBQUNBLE1BQU0sOENBQW1CLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxnQkFBUixFQUFWLENBQXpCO0FBQ0EsTUFBTSw4Q0FBbUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGdCQUFSLEVBQVYsQ0FBekI7QUFDQSxNQUFNLDBDQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sY0FBUixFQUFWLENBQXZCO0FBQ0EsTUFBTSx3Q0FBZ0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGFBQVIsRUFBVixDQUF0QjtBQUNBLE1BQU0sa0RBQXFCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxrQkFBUixFQUFWLENBQTNCO0FBQ0EsTUFBTSxnREFBb0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGlCQUFSLEVBQVYsQ0FBMUI7QUFDQSxNQUFNLGdEQUFvQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0saUJBQVIsRUFBVixDQUExQjtBQUNBLE1BQU0sc0VBQStCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSw0QkFBUixFQUFWLENBQXJDO0FBQ0EsTUFBTSw4Q0FBbUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGdCQUFSLEVBQVYsQ0FBekI7QUFDQSxNQUFNLG9EQUFzQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sbUJBQVIsRUFBVixDQUE1QjtBQUNBLE1BQU0sd0RBQXdCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxxQkFBUixFQUFWLENBQTlCO0FBQ0EsTUFBTSwwRUFBaUMsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLDhCQUFSLEVBQVYsQ0FBdkM7QUFDQSxNQUFNLDhDQUFtQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sZ0JBQVIsRUFBVixDQUF6QjtBQUNBLE1BQU0sNENBQWtCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxlQUFSLEVBQVYsQ0FBeEI7O0FBRVA7QUFDTyxNQUFNLDhCQUFXLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxRQUFSLEVBQVYsQ0FBakI7QUFDQSxNQUFNLDRCQUFVLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxPQUFSLEVBQVYsQ0FBaEI7QUFDQSxNQUFNLHdDQUFnQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sYUFBUixFQUFWLENBQXRCO0FBQ0EsTUFBTSxvQ0FBYyxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sV0FBUixFQUFWLENBQXBCO0FBQ0EsTUFBTSxrREFBcUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGtCQUFSLEVBQVYsQ0FBM0I7QUFDQSxNQUFNLDBDQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sY0FBUixFQUFWLENBQXZCO0FBQ0EsTUFBTSx3REFBd0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFSLEVBQVYsQ0FBOUI7QUFDQSxNQUFNLDhCQUFXLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxRQUFSLEVBQVYsQ0FBakI7QUFDQSxNQUFNLDRDQUFrQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sZUFBUixFQUFWLENBQXhCO0FBQ0EsTUFBTSw0QkFBVSxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sT0FBUixFQUFWLENBQWhCO0FBQ0EsTUFBTSxzQ0FBZSxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sWUFBUixFQUFWLENBQXJCO0FBQ0EsTUFBTSw0Q0FBa0IsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGVBQVIsRUFBVixDQUF4QjtBQUNBLE1BQU0sZ0RBQW9CLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxpQkFBUixFQUFWLENBQTFCO0FBQ0EsTUFBTSw4Q0FBbUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLGdCQUFSLEVBQVYsQ0FBekI7QUFDQSxNQUFNLHdEQUF3QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0scUJBQVIsRUFBVixDQUE5QjtBQUNBLE1BQU0sc0RBQXVCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxvQkFBUixFQUFWLENBQTdCO0FBQ0EsTUFBTSx3QkFBUSxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sS0FBUixFQUFWLENBQWQ7QUFDQSxNQUFNLG9EQUFzQixFQUFFLElBQUYsQ0FBTyxxQkFBUCxFQUE4QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0sUUFBUixFQUFWLENBQTlCLENBQTVCO0FBQ0EsTUFBTSwwREFBeUIsRUFBRSxJQUFGLENBQU8scUJBQVAsRUFBOEIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLFdBQVIsRUFBVixDQUE5QixDQUEvQjtBQUNBLE1BQU0sMENBQWlCLEVBQUUsTUFBRixDQUFTLHFCQUFULEVBQWdDLG9CQUFoQyxDQUF2QjtBQUNBLE1BQU0sa0RBQXFCLEVBQUUsR0FBRixDQUFNLGNBQU4sRUFBc0IsRUFBRSxVQUFGLENBQWEsRUFBRSxLQUFGLENBQVEsRUFBRSxNQUFNLEVBQUUsS0FBVixFQUFSLENBQWIsQ0FBdEIsQ0FBM0I7QUFDQSxNQUFNLGdFQUE0QixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0seUJBQVIsRUFBVixDQUFsQztBQUNBLE1BQU0sMENBQWlCLEVBQUUsSUFBRixDQUFPLFFBQVAsRUFBaUIsT0FBTyxFQUFFLEVBQUYsQ0FBSyxvQkFBb0IsSUFBSSxXQUF4QixDQUFMLEVBQTJDLHVCQUF1QixJQUFJLFdBQTNCLENBQTNDLENBQXhCLENBQXZCO0FBQ0EsTUFBTSxzRUFBK0IsRUFBRSxJQUFGLENBQU8sOEJBQVAsRUFBdUMsUUFBUSx5QkFBeUIsS0FBSyxXQUE5QixDQUEvQyxDQUFyQzs7QUFHQSxNQUFNLDhEQUEyQixFQUFFLE1BQUYsQ0FBUyxtQkFBVCxFQUE4QixzQkFBOUIsQ0FBakM7QUFDQSxNQUFNLDBEQUF5QixRQUFRO0FBQzVDLFNBQVEsZ0JBQWdCLElBQWpCLElBQTBCLCtCQUErQixJQUEvQixDQUExQixJQUFrRSx5QkFBeUIsS0FBSyxXQUE5QixDQUF6RTtBQUNELENBRk07QUFHQSxNQUFNLG9EQUFzQixFQUFFLE1BQUYsQ0FBUyxRQUFULEVBQW1CLGlCQUFuQixDQUE1QiIsImZpbGUiOiJ0ZXJtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgKiBhcyBSIGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IFRlcm1TcGVjIGZyb20gJ3N3ZWV0LXNwZWMnO1xuXG5jb25zdCBhdHRyTmFtZSA9IGEgPT4gYS5hdHRyTmFtZTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVybSB7XG4gIHR5cGU6IHN0cmluZztcbiAgbG9jOiBudWxsO1xuICBzcGVjOiB0eXBlb2YgVGVybVNwZWM7XG5cbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBwcm9wczoge30pIHtcbiAgICBsZXQgc3BlYyA9IFRlcm1TcGVjLmdldERlc2NlbmRhbnQodHlwZSk7XG4gICAgaWYgKHNwZWMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRlcm06ICR7dHlwZX1gKTtcbiAgICB9XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmxvYyA9IG51bGw7XG4gICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICBsZXQgcHJvcEtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgbGV0IGZpZWxkTmFtZXMgPSBzcGVjLmdldEF0dHJpYnV0ZXMoKS5tYXAoYXR0ck5hbWUpO1xuICAgIGxldCBkaWZmID0gUi5zeW1tZXRyaWNEaWZmZXJlbmNlKHByb3BLZXlzLCBmaWVsZE5hbWVzKTtcbiAgICBpZiAoZGlmZi5sZW5ndGggIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIGZvciB0ZXJtICR7dHlwZX06ICR7ZGlmZn1gKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBwcm9wcyk7XG4gIH1cblxuICBleHRlbmQocHJvcHM6IHt9KSB7XG4gICAgbGV0IHNwZWNBdHRyTmFtZXMgPSB0aGlzLnNwZWMuZ2V0QXR0cmlidXRlcygpLm1hcChhdHRyTmFtZSk7XG4gICAgbGV0IG5ld1Byb3BzID0gUi5waWNrKHNwZWNBdHRyTmFtZXMsIHRoaXMpO1xuXG4gICAgbGV0IGludmFsaWRBdHRycyA9IFIuZGlmZmVyZW5jZShPYmplY3Qua2V5cyhwcm9wcyksIHNwZWNBdHRyTmFtZXMpO1xuICAgIGlmIChpbnZhbGlkQXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgZm9yIHRlcm0gJHt0aGlzLnR5cGV9OiAke2ludmFsaWRBdHRyc31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRlcm0odGhpcy50eXBlLCBPYmplY3QuYXNzaWduKG5ld1Byb3BzLCBwcm9wcykpO1xuICB9XG5cbiAgLy8gVE9ETzogcmVtb3ZlXG4gIGdlbihpbmNsdWRlSW1wb3J0czogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBsZXQgbmV4dCA9IHt9O1xuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuc3BlYy5nZXRBdHRyaWJ1dGVzKCkpIHtcbiAgICAgIGlmICh0aGlzW2ZpZWxkLmF0dHJOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpc1tmaWVsZC5hdHRyTmFtZV0gaW5zdGFuY2VvZiBUZXJtKSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gdGhpc1tmaWVsZC5hdHRyTmFtZV0uZ2VuKGluY2x1ZGVJbXBvcnRzKTtcbiAgICAgIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodGhpc1tmaWVsZC5hdHRyTmFtZV0pKSB7XG4gICAgICAgIGxldCBwcmVkID0gaW5jbHVkZUltcG9ydHMgPyBSLmNvbXBsZW1lbnQoaXNDb21waWxldGltZVN0YXRlbWVudCkgOiBSLmJvdGgoUi5jb21wbGVtZW50KGlzSW1wb3J0RGVjbGFyYXRpb24pLCBSLmNvbXBsZW1lbnQoaXNDb21waWxldGltZVN0YXRlbWVudCkpO1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IHRoaXNbZmllbGQuYXR0ck5hbWVdLmZpbHRlcihwcmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBUZXJtID8gdGVybS5nZW4oaW5jbHVkZUltcG9ydHMpIDogdGVybSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IHRoaXNbZmllbGQuYXR0ck5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odGhpcy50eXBlLCBuZXh0KTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZVxuICB2aXNpdChmKSB7XG4gICAgbGV0IG5leHQgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5nZXREZXNjZW5kYW50KHRoaXMudHlwZSkuZ2V0QXR0cmlidXRlcygpKSB7XG4gICAgICBpZiAodGhpc1tmaWVsZC5hdHRyTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHRoaXNbZmllbGQuYXR0ck5hbWVdKSkge1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IHRoaXNbZmllbGQuYXR0ck5hbWVdLm1hcChmaWVsZCA9PiBmaWVsZCAhPSBudWxsID8gZihmaWVsZCkgOiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gZih0aGlzW2ZpZWxkLmF0dHJOYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4dGVuZChuZXh0KTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZVxuICBhZGRTY29wZShzY29wZSwgYmluZGluZ3MsIHBoYXNlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXQodGVybSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRlcm0uYWRkU2NvcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRlcm0uYWRkU2NvcGUoc2NvcGUsIGJpbmRpbmdzLCBwaGFzZSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZVxuICByZW1vdmVTY29wZShzY29wZSwgcGhhc2UpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpdCh0ZXJtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGVybS5yZW1vdmVTY29wZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGVybS5yZW1vdmVTY29wZShzY29wZSwgcGhhc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfSk7XG4gIH1cblxuICAvLyBUT0RPOiB0aGlzIGlzIHZlcnkgd3JvbmdcbiAgbGluZU51bWJlcigpIHtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5nZXREZXNjZW5kYW50KHRoaXMudHlwZSkuZ2V0QXR0cmlidXRlcygpKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXNbZmllbGQuYXR0ck5hbWVdICYmIHRoaXNbZmllbGQuYXR0ck5hbWVdLmxpbmVOdW1iZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbZmllbGQuYXR0ck5hbWVdLmxpbmVOdW1iZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRMaW5lTnVtYmVyKGxpbmUpIHtcbiAgICBsZXQgbmV4dCA9IHt9O1xuICAgIGZvciAobGV0IGZpZWxkIG9mIFRlcm1TcGVjLmdldERlc2NlbmRhbnQodGhpcy50eXBlKS5nZXRBdHRyaWJ1dGVzKCkpIHtcbiAgICAgIGlmICh0aGlzW2ZpZWxkLmF0dHJOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXNbZmllbGQuYXR0ck5hbWVdLnNldExpbmVOdW1iZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmV4dFtmaWVsZC5hdHRyTmFtZV0gPSB0aGlzW2ZpZWxkLmF0dHJOYW1lXS5zZXRMaW5lTnVtYmVyKGxpbmUpO1xuICAgICAgfSBlbHNlIGlmIChMaXN0LmlzTGlzdCh0aGlzW2ZpZWxkLmF0dHJOYW1lXSkpIHtcbiAgICAgICAgbmV4dFtmaWVsZC5hdHRyTmFtZV0gPSB0aGlzW2ZpZWxkLmF0dHJOYW1lXS5tYXAoZiA9PiBmLnNldExpbmVOdW1iZXIobGluZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFtmaWVsZC5hdHRyTmFtZV0gPSB0aGlzW2ZpZWxkLmF0dHJOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKHRoaXMudHlwZSwgbmV4dCk7XG4gIH1cbn1cblxuXG4vLyBiaW5kaW5nc1xuZXhwb3J0IGNvbnN0IGlzQmluZGluZ1dpdGhEZWZhdWx0ID0gUi53aGVyZUVxKHsgdHlwZTogXCJCaW5kaW5nV2l0aERlZmF1bHRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmRpbmdJZGVudGlmaWVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJCaW5kaW5nSWRlbnRpZmllclwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQXJyYXlCaW5kaW5nID0gUi53aGVyZUVxKHsgdHlwZTogXCJBcnJheUJpbmRpbmdcIiB9KTtcbmV4cG9ydCBjb25zdCBpc09iamVjdEJpbmRpbmcgPSBSLndoZXJlRXEoeyB0eXBlOiBcIk9iamVjdEJpbmRpbmdcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXIgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5ID0gUi53aGVyZUVxKHsgdHlwZTogXCJCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXCIgfSk7XG5cbi8vIGNsYXNzXG5leHBvcnQgY29uc3QgaXNDbGFzc0V4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkNsYXNzRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ2xhc3NEZWNsYXJhdGlvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ2xhc3NEZWNsYXJhdGlvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ2xhc3NFbGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJDbGFzc0VsZW1lbnRcIiB9KTtcblxuLy8gbW9kdWxlc1xuZXhwb3J0IGNvbnN0IGlzTW9kdWxlID0gUi53aGVyZUVxKHsgdHlwZTogXCJNb2R1bGVcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0ltcG9ydCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiSW1wb3J0XCIgfSk7XG5leHBvcnQgY29uc3QgaXNJbXBvcnROYW1lc3BhY2UgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkltcG9ydE5hbWVzcGFjZVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzSW1wb3J0U3BlY2lmaWVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJJbXBvcnRTcGVjaWZpZXJcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0V4cG9ydEFsbEZyb20gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkV4cG9ydEFsbEZyb21cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0V4cG9ydEZyb20gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkV4cG9ydEZyb21cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0V4cG9ydCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRXhwb3J0XCIgfSk7XG5leHBvcnQgY29uc3QgaXNFeHBvcnREZWZhdWx0ID0gUi53aGVyZUVxKHsgdHlwZTogXCJFeHBvcnREZWZhdWx0XCIgfSk7XG5leHBvcnQgY29uc3QgaXNFeHBvcnRTcGVjaWZpZXIgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkV4cG9ydFNwZWNpZmllclwiIH0pO1xuXG4vLyBwcm9wZXJ0eSBkZWZpbml0aW9uXG5leHBvcnQgY29uc3QgaXNNZXRob2QgPSBSLndoZXJlRXEoeyB0eXBlOiBcIk1ldGhvZFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzR2V0dGVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJHZXR0ZXJcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1NldHRlciA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU2V0dGVyXCIgfSk7XG5leHBvcnQgY29uc3QgaXNEYXRhUHJvcGVydHkgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkRhdGFQcm9wZXJ0eVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU2hvcnRoYW5kUHJvcGVydHkgPSBSLndoZXJlRXEoeyB0eXBlOiBcIlNob3J0aGFuZFByb3BlcnR5XCIgfSk7XG5leHBvcnQgY29uc3QgaXNDb21wdXRlZFByb3BlcnR5TmFtZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29tcHV0ZWRQcm9wZXJ0eU5hbWVcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N0YXRpY1Byb3BlcnR5TmFtZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3RhdGljUHJvcGVydHlOYW1lXCIgfSk7XG5cbi8vIGxpdGVyYWxzXG5leHBvcnQgY29uc3QgaXNMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkxpdGVyYWxCb29sZWFuRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzTGl0ZXJhbE51bGxFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJMaXRlcmFsTnVsbEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0xpdGVyYWxOdW1lcmljRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNMaXRlcmFsUmVnRXhwRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0xpdGVyYWxTdHJpbmdFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJMaXRlcmFsU3RyaW5nRXhwcmVzc2lvblwiIH0pO1xuXG4vLyBleHByZXNzaW9uc1xuZXhwb3J0IGNvbnN0IGlzQXJyYXlFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJBcnJheUV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0Fycm93RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQXJyb3dFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNBc3NpZ25tZW50RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmFyeUV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJpbmFyeUV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0NhbGxFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJDYWxsRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0NvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNGdW5jdGlvbkV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzSWRlbnRpZmllckV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNOZXdFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJOZXdFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNOZXdUYXJnZXRFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJOZXdUYXJnZXRFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNPYmplY3RFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJPYmplY3RFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNVbmFyeUV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIlVuYXJ5RXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3RhdGljTWVtYmVyRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc1RoaXNFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJUaGlzRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVXBkYXRlRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiVXBkYXRlRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzWWllbGRFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJZaWVsZEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc1lpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXCIgfSk7XG5cbi8vIHN0YXRlbWVudHNcbmV4cG9ydCBjb25zdCBpc0Jsb2NrU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJCbG9ja1N0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQnJlYWtTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJyZWFrU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNDb250aW51ZVN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29udGludWVTdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0NvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0RlYnVnZ2VyU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJEZWJ1Z2dlclN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRG9XaGlsZVN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRG9XaGlsZVN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRW1wdHlTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkVtcHR5U3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNFeHByZXNzaW9uU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNGb3JJblN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRm9ySW5TdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0Zvck9mU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJGb3JPZlN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRm9yU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJGb3JTdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0lmU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJJZlN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzTGFiZWxlZFN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGFiZWxlZFN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzUmV0dXJuU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJSZXR1cm5TdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N3aXRjaFN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1Rocm93U3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJUaHJvd1N0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVHJ5Q2F0Y2hTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIlRyeUNhdGNoU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNUcnlGaW5hbGx5U3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJUcnlGaW5hbGx5U3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNXaGlsZVN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiV2hpbGVTdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1dpdGhTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIldpdGhTdGF0ZW1lbnRcIiB9KTtcblxuLy8gb3RoZXJcbmV4cG9ydCBjb25zdCBpc1ByYWdtYSA9IFIud2hlcmVFcSh7IHR5cGU6ICdQcmFnbWEnIH0pO1xuZXhwb3J0IGNvbnN0IGlzQmxvY2sgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJsb2NrXCIgfSk7XG5leHBvcnQgY29uc3QgaXNDYXRjaENsYXVzZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ2F0Y2hDbGF1c2VcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0RpcmVjdGl2ZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRGlyZWN0aXZlXCIgfSk7XG5leHBvcnQgY29uc3QgaXNGb3JtYWxQYXJhbWV0ZXJzID0gUi53aGVyZUVxKHsgdHlwZTogXCJGb3JtYWxQYXJhbWV0ZXJzXCIgfSk7XG5leHBvcnQgY29uc3QgaXNGdW5jdGlvbkJvZHkgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkZ1bmN0aW9uQm9keVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRnVuY3Rpb25EZWNsYXJhdGlvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU2NyaXB0ID0gUi53aGVyZUVxKHsgdHlwZTogXCJTY3JpcHRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1NwcmVhZEVsZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIlNwcmVhZEVsZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N1cGVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJTdXBlclwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3dpdGNoQ2FzZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoQ2FzZVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3dpdGNoRGVmYXVsdCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoRGVmYXVsdFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVFbGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJUZW1wbGF0ZUVsZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N5bnRheFRlbXBsYXRlID0gUi53aGVyZUVxKHsgdHlwZTogXCJTeW50YXhUZW1wbGF0ZVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdGlvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdG9yID0gUi53aGVyZUVxKHsgdHlwZTogXCJWYXJpYWJsZURlY2xhcmF0b3JcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0VPRiA9IFIud2hlcmVFcSh7IHR5cGU6ICdFT0YnIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb24gPSBSLmJvdGgoaXNWYXJpYWJsZURlY2xhcmF0aW9uLCBSLndoZXJlRXEoeyBraW5kOiAnc3ludGF4JyB9KSk7XG5leHBvcnQgY29uc3QgaXNTeW50YXhyZWNEZWNsYXJhdGlvbiA9IFIuYm90aChpc1ZhcmlhYmxlRGVjbGFyYXRpb24sIFIud2hlcmVFcSh7IGtpbmQ6ICdzeW50YXhyZWMnIH0pKTtcbmV4cG9ydCBjb25zdCBpc0Z1bmN0aW9uVGVybSA9IFIuZWl0aGVyKGlzRnVuY3Rpb25EZWNsYXJhdGlvbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24pO1xuZXhwb3J0IGNvbnN0IGlzRnVuY3Rpb25XaXRoTmFtZSA9IFIuYW5kKGlzRnVuY3Rpb25UZXJtLCBSLmNvbXBsZW1lbnQoUi53aGVyZSh7IG5hbWU6IFIuaXNOaWwgfSkpKTtcbmV4cG9ydCBjb25zdCBpc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogJ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uJ30pO1xuZXhwb3J0IGNvbnN0IGlzRXhwb3J0U3ludGF4ID0gUi5ib3RoKGlzRXhwb3J0LCBleHAgPT4gUi5vcihpc1N5bnRheERlY2xhcmF0aW9uKGV4cC5kZWNsYXJhdGlvbiksIGlzU3ludGF4cmVjRGVjbGFyYXRpb24oZXhwLmRlY2xhcmF0aW9uKSkpO1xuZXhwb3J0IGNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb25TdGF0ZW1lbnQgPSBSLmJvdGgoaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LCBkZWNsID0+IGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbihkZWNsLmRlY2xhcmF0aW9uKSk7XG5cblxuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbiA9IFIuZWl0aGVyKGlzU3ludGF4RGVjbGFyYXRpb24sIGlzU3ludGF4cmVjRGVjbGFyYXRpb24pO1xuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZXRpbWVTdGF0ZW1lbnQgPSB0ZXJtID0+IHtcbiAgcmV0dXJuICh0ZXJtIGluc3RhbmNlb2YgVGVybSkgJiYgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRlcm0pICYmIGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbih0ZXJtLmRlY2xhcmF0aW9uKTtcbn07XG5leHBvcnQgY29uc3QgaXNJbXBvcnREZWNsYXJhdGlvbiA9IFIuZWl0aGVyKGlzSW1wb3J0LCBpc0ltcG9ydE5hbWVzcGFjZSk7XG4iXX0= - return scopes.isSubset(stxScopes_917); - }).sort(sizeDecending_828); - if (biggestBindingPair.size >= 2 && biggestBindingPair.get(0).scopes.size === biggestBindingPair.get(1).scopes.size) { - let debugBase = "{" + stxScopes_917.map(s_920 => s_920.toString()).join(", ") + "}"; - let debugAmbigousScopesets = biggestBindingPair.map(_ref2 => { - let scopes = _ref2.scopes; +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { - return "{" + scopes.map(s_921 => s_921.toString()).join(", ") + "}"; - }).join(", "); - throw new Error("Scopeset " + debugBase + " has ambiguous subsets " + debugAmbigousScopesets); - } else if (biggestBindingPair.size !== 0) { - let bindingStr = biggestBindingPair.get(0).binding.toString(); - if (_ramdaFantasy.Maybe.isJust(biggestBindingPair.get(0).alias)) { - return biggestBindingPair.get(0).alias.getOrElse(null).resolve(phase_915); - } - return bindingStr; - } - } - } - return this.token.value; - } - val() { - (0, _errors.assert)(!this.match("delimiter"), "cannot get the val of a delimiter"); - if (this.match("string")) { - return this.token.str; - } - if (this.match("template")) { - return this.token.items.map(el_922 => { - if (typeof el_922.match === "function" && el_922.match("delimiter")) { - return "${...}"; - } - return el_922.slice.text; - }).join(""); - } - return this.token.value; - } - lineNumber() { - if (!this.match("delimiter")) { - return this.token.slice.startLocation.line; - } else { - return this.token.get(0).lineNumber(); - } - } - setLineNumber(line_923) { - let newTok_924 = {}; - if (this.isDelimiter()) { - newTok_924 = this.token.map(s_925 => s_925.setLineNumber(line_923)); - } else { - for (let key of Object.keys(this.token)) { - newTok_924[key] = this.token[key]; - } - (0, _errors.assert)(newTok_924.slice && newTok_924.slice.startLocation, "all tokens must have line info"); - newTok_924.slice.startLocation.line = line_923; - } - return new Syntax(newTok_924, this); - } - inner() { - (0, _errors.assert)(this.match("delimiter"), "can only get the inner of a delimiter"); - return this.token.slice(1, this.token.size - 1); - } - addScope(scope_926, bindings_927, phase_928) { - let options_929 = arguments.length <= 3 || arguments[3] === undefined ? { flip: false } : arguments[3]; - - let token_930 = this.match("delimiter") ? this.token.map(s_934 => s_934.addScope(scope_926, bindings_927, phase_928, options_929)) : this.token; - if (this.match("template")) { - token_930 = _.merge(token_930, { items: token_930.items.map(it_935 => { - if (it_935 instanceof Syntax && it_935.match("delimiter")) { - return it_935.addScope(scope_926, bindings_927, phase_928, options_929); - } - return it_935; - }) }); - } - let oldScopeset_931; - if (phase_928 === ALL_PHASES_830) { - oldScopeset_931 = this.scopesets.all; - } else { - oldScopeset_931 = this.scopesets.phase.has(phase_928) ? this.scopesets.phase.get(phase_928) : (0, _immutable.List)(); - } - let newScopeset_932; - if (options_929.flip) { - let index = oldScopeset_931.indexOf(scope_926); - if (index !== -1) { - newScopeset_932 = oldScopeset_931.remove(index); - } else { - newScopeset_932 = oldScopeset_931.push(scope_926); - } - } else { - newScopeset_932 = oldScopeset_931.push(scope_926); - } - let newstx_933 = { bindings: bindings_927, scopesets: { all: this.scopesets.all, phase: this.scopesets.phase } }; - if (phase_928 === ALL_PHASES_830) { - newstx_933.scopesets.all = newScopeset_932; - } else { - newstx_933.scopesets.phase = newstx_933.scopesets.phase.set(phase_928, newScopeset_932); - } - return new Syntax(token_930, newstx_933); - } - removeScope(scope_936, phase_937) { - let token_938 = this.match("delimiter") ? this.token.map(s_944 => s_944.removeScope(scope_936, phase_937)) : this.token; - let phaseScopeset_939 = this.scopesets.phase.has(phase_937) ? this.scopesets.phase.get(phase_937) : (0, _immutable.List)(); - let allScopeset_940 = this.scopesets.all; - let newstx_941 = { bindings: this.bindings, scopesets: { all: this.scopesets.all, phase: this.scopesets.phase } }; - let phaseIndex_942 = phaseScopeset_939.indexOf(scope_936); - let allIndex_943 = allScopeset_940.indexOf(scope_936); - if (phaseIndex_942 !== -1) { - newstx_941.scopesets.phase = this.scopesets.phase.set(phase_937, phaseScopeset_939.remove(phaseIndex_942)); - } else if (allIndex_943 !== -1) { - newstx_941.scopesets.all = allScopeset_940.remove(allIndex_943); - } - return new Syntax(token_938, newstx_941); - } - match(type_945, value_946) { - if (!Types_829[type_945]) { - throw new Error(type_945 + " is an invalid type"); - } - return Types_829[type_945].match(this.token) && (value_946 == null || (value_946 instanceof RegExp ? value_946.test(this.val()) : this.val() == value_946)); - } - isIdentifier(value_947) { - return this.match("identifier", value_947); - } - isAssign(value_948) { - return this.match("assign", value_948); - } - isBooleanLiteral(value_949) { - return this.match("boolean", value_949); - } - isKeyword(value_950) { - return this.match("keyword", value_950); - } - isNullLiteral(value_951) { - return this.match("null", value_951); - } - isNumericLiteral(value_952) { - return this.match("number", value_952); - } - isPunctuator(value_953) { - return this.match("punctuator", value_953); - } - isStringLiteral(value_954) { - return this.match("string", value_954); - } - isRegularExpression(value_955) { - return this.match("regularExpression", value_955); - } - isTemplate(value_956) { - return this.match("template", value_956); - } - isDelimiter(value_957) { - return this.match("delimiter", value_957); - } - isParens(value_958) { - return this.match("parens", value_958); - } - isBraces(value_959) { - return this.match("braces", value_959); - } - isBrackets(value_960) { - return this.match("brackets", value_960); - } - isSyntaxTemplate(value_961) { - return this.match("syntaxTemplate", value_961); - } - isEOF(value_962) { - return this.match("eof", value_962); - } - toString() { - if (this.match("delimiter")) { - return this.token.map(s_963 => s_963.toString()).join(" "); - } - if (this.match("string")) { - return "'" + this.token.str; - } - if (this.match("template")) { - return this.val(); - } - return this.token.value; - } - } - exports.default = Syntax; - exports.Types = Types_829; - exports.ALL_PHASES = ALL_PHASES_830; - //# sourceMappingURL=data:application/json;base64,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QUFDRCxRQUFNLFNBQU4sRUFBaUI7QUFDZixXQUFPLEtBQUssS0FBTCxDQUFXLEtBQVgsRUFBa0IsU0FBbEIsQ0FBUDtBQUNEO0FBQ0QsYUFBVztBQUNULFFBQUksS0FBSyxLQUFMLENBQVcsV0FBWCxDQUFKLEVBQTZCO0FBQzNCLGFBQU8sS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFNBQVMsTUFBTSxRQUFOLEVBQXhCLEVBQTBDLElBQTFDLENBQStDLEdBQS9DLENBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFKLEVBQTBCO0FBQ3hCLGFBQU8sTUFBTSxLQUFLLEtBQUwsQ0FBVyxHQUF4QjtBQUNEO0FBQ0QsUUFBSSxLQUFLLEtBQUwsQ0FBVyxVQUFYLENBQUosRUFBNEI7QUFDMUIsYUFBTyxLQUFLLEdBQUwsRUFBUDtBQUNEO0FBQ0QsV0FBTyxLQUFLLEtBQUwsQ0FBVyxLQUFsQjtBQUNEO0FBaFJ5QjtrQkFBUCxNO1FBa1JBLEssR0FBYixTO1FBQ2tCLFUsR0FBbEIsYyIsImZpbGUiOiJzeW50YXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3QsIE1hcH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXBcIjtcbmltcG9ydCB7TWF5YmV9IGZyb20gXCJyYW1kYS1mYW50YXN5XCI7XG5pbXBvcnQge1Rva2VuVHlwZSwgVG9rZW5DbGFzc30gZnJvbSBcInNoaWZ0LXBhcnNlci9kaXN0L3Rva2VuaXplclwiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5jb25zdCBKdXN0XzgyNSA9IE1heWJlLkp1c3Q7XG5jb25zdCBOb3RoaW5nXzgyNiA9IE1heWJlLk5vdGhpbmc7XG5mdW5jdGlvbiBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODMxKSB7XG4gIGlmICghc3R4XzgzMSB8fCB0eXBlb2Ygc3R4XzgzMS5pc0RlbGltaXRlciAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFzdHhfODMxLmlzRGVsaW1pdGVyKCkpIHtcbiAgICByZXR1cm4gc3R4XzgzMS50b2tlbi5zbGljZTtcbiAgfVxuICByZXR1cm4gc3R4XzgzMS50b2tlbi5nZXQoMCkudG9rZW4uc2xpY2U7XG59XG5mdW5jdGlvbiBzaXplRGVjZW5kaW5nXzgyOChhXzgzMiwgYl84MzMpIHtcbiAgaWYgKGFfODMyLnNjb3Blcy5zaXplID4gYl84MzMuc2NvcGVzLnNpemUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYl84MzMuc2NvcGVzLnNpemUgPiBhXzgzMi5zY29wZXMuc2l6ZSkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5sZXQgVHlwZXNfODI5ID0ge251bGw6IHttYXRjaDogdG9rZW5fODM0ID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzgzNCkgJiYgdG9rZW5fODM0LnR5cGUgPT09IFRva2VuVHlwZS5OVUxMLCBjcmVhdGU6ICh2YWx1ZV84MzUsIHN0eF84MzYpID0+IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5OVUxMLCB2YWx1ZTogbnVsbH0sIHN0eF84MzYpfSwgbnVtYmVyOiB7bWF0Y2g6IHRva2VuXzgzNyA9PiAhVHlwZXNfODI5LmRlbGltaXRlci5tYXRjaCh0b2tlbl84MzcpICYmIHRva2VuXzgzNy50eXBlLmtsYXNzID09PSBUb2tlbkNsYXNzLk51bWVyaWNMaXRlcmFsLCBjcmVhdGU6ICh2YWx1ZV84MzgsIHN0eF84MzkpID0+IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5OVU1CRVIsIHZhbHVlOiB2YWx1ZV84Mzh9LCBzdHhfODM5KX0sIHN0cmluZzoge21hdGNoOiB0b2tlbl84NDAgPT4gIVR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODQwKSAmJiB0b2tlbl84NDAudHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5TdHJpbmdMaXRlcmFsLCBjcmVhdGU6ICh2YWx1ZV84NDEsIHN0eF84NDIpID0+IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5TVFJJTkcsIHN0cjogdmFsdWVfODQxfSwgc3R4Xzg0Mil9LCBwdW5jdHVhdG9yOiB7bWF0Y2g6IHRva2VuXzg0MyA9PiAhVHlwZXNfODI5LmRlbGltaXRlci5tYXRjaCh0b2tlbl84NDMpICYmIHRva2VuXzg0My50eXBlLmtsYXNzID09PSBUb2tlbkNsYXNzLlB1bmN0dWF0b3IsIGNyZWF0ZTogKHZhbHVlXzg0NCwgc3R4Xzg0NSkgPT4gbmV3IFN5bnRheCh7dHlwZToge2tsYXNzOiBUb2tlbkNsYXNzLlB1bmN0dWF0b3IsIG5hbWU6IHZhbHVlXzg0NH0sIHZhbHVlOiB2YWx1ZV84NDR9LCBzdHhfODQ1KX0sIGtleXdvcmQ6IHttYXRjaDogdG9rZW5fODQ2ID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg0NikgJiYgdG9rZW5fODQ2LnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuS2V5d29yZCwgY3JlYXRlOiAodmFsdWVfODQ3LCBzdHhfODQ4KSA9PiBuZXcgU3ludGF4KHt0eXBlOiB7a2xhc3M6IFRva2VuQ2xhc3MuS2V5d29yZCwgbmFtZTogdmFsdWVfODQ3fSwgdmFsdWU6IHZhbHVlXzg0N30sIHN0eF84NDgpfSwgaWRlbnRpZmllcjoge21hdGNoOiB0b2tlbl84NDkgPT4gIVR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODQ5KSAmJiB0b2tlbl84NDkudHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5JZGVudCwgY3JlYXRlOiAodmFsdWVfODUwLCBzdHhfODUxKSA9PiBuZXcgU3ludGF4KHt0eXBlOiBUb2tlblR5cGUuSURFTlRJRklFUiwgdmFsdWU6IHZhbHVlXzg1MH0sIHN0eF84NTEpfSwgcmVndWxhckV4cHJlc3Npb246IHttYXRjaDogdG9rZW5fODUyID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg1MikgJiYgdG9rZW5fODUyLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuUmVndWxhckV4cHJlc3Npb24sIGNyZWF0ZTogKHZhbHVlXzg1Mywgc3R4Xzg1NCkgPT4gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLlJFR0VYUCwgdmFsdWU6IHZhbHVlXzg1M30sIHN0eF84NTQpfSwgYnJhY2VzOiB7bWF0Y2g6IHRva2VuXzg1NSA9PiBUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg1NSkgJiYgdG9rZW5fODU1LmdldCgwKS50b2tlbi50eXBlID09PSBUb2tlblR5cGUuTEJSQUNFLCBjcmVhdGU6IChpbm5lcl84NTYsIHN0eF84NTcpID0+IHtcbiAgbGV0IGxlZnRfODU4ID0gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLkxCUkFDRSwgdmFsdWU6IFwie1wiLCBzbGljZTogZ2V0Rmlyc3RTbGljZV84Mjcoc3R4Xzg1Nyl9KTtcbiAgbGV0IHJpZ2h0Xzg1OSA9IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5SQlJBQ0UsIHZhbHVlOiBcIn1cIiwgc2xpY2U6IGdldEZpcnN0U2xpY2VfODI3KHN0eF84NTcpfSk7XG4gIHJldHVybiBuZXcgU3ludGF4KExpc3Qub2YobGVmdF84NTgpLmNvbmNhdChpbm5lcl84NTYpLnB1c2gocmlnaHRfODU5KSwgc3R4Xzg1Nyk7XG59fSwgYnJhY2tldHM6IHttYXRjaDogdG9rZW5fODYwID0+IFR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODYwKSAmJiB0b2tlbl84NjAuZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MQlJBQ0ssIGNyZWF0ZTogKGlubmVyXzg2MSwgc3R4Xzg2MikgPT4ge1xuICBsZXQgbGVmdF84NjMgPSBuZXcgU3ludGF4KHt0eXBlOiBUb2tlblR5cGUuTEJSQUNLLCB2YWx1ZTogXCJbXCIsIHNsaWNlOiBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODYyKX0pO1xuICBsZXQgcmlnaHRfODY0ID0gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLlJCUkFDSywgdmFsdWU6IFwiXVwiLCBzbGljZTogZ2V0Rmlyc3RTbGljZV84Mjcoc3R4Xzg2Mil9KTtcbiAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0Xzg2MykuY29uY2F0KGlubmVyXzg2MSkucHVzaChyaWdodF84NjQpLCBzdHhfODYyKTtcbn19LCBwYXJlbnM6IHttYXRjaDogdG9rZW5fODY1ID0+IFR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODY1KSAmJiB0b2tlbl84NjUuZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MUEFSRU4sIGNyZWF0ZTogKGlubmVyXzg2Niwgc3R4Xzg2NykgPT4ge1xuICBsZXQgbGVmdF84NjggPSBuZXcgU3ludGF4KHt0eXBlOiBUb2tlblR5cGUuTFBBUkVOLCB2YWx1ZTogXCIoXCIsIHNsaWNlOiBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODY3KX0pO1xuICBsZXQgcmlnaHRfODY5ID0gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLlJQQVJFTiwgdmFsdWU6IFwiKVwiLCBzbGljZTogZ2V0Rmlyc3RTbGljZV84Mjcoc3R4Xzg2Nyl9KTtcbiAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0Xzg2OCkuY29uY2F0KGlubmVyXzg2NikucHVzaChyaWdodF84NjkpLCBzdHhfODY3KTtcbn19LCBhc3NpZ246IHttYXRjaDogdG9rZW5fODcwID0+IHtcbiAgaWYgKFR5cGVzXzgyOS5wdW5jdHVhdG9yLm1hdGNoKHRva2VuXzg3MCkpIHtcbiAgICBzd2l0Y2ggKHRva2VuXzg3MC52YWx1ZSkge1xuICAgICAgY2FzZSBcIj1cIjpcbiAgICAgIGNhc2UgXCJ8PVwiOlxuICAgICAgY2FzZSBcIl49XCI6XG4gICAgICBjYXNlIFwiJj1cIjpcbiAgICAgIGNhc2UgXCI8PD1cIjpcbiAgICAgIGNhc2UgXCI+Pj1cIjpcbiAgICAgIGNhc2UgXCI+Pj49XCI6XG4gICAgICBjYXNlIFwiKz1cIjpcbiAgICAgIGNhc2UgXCItPVwiOlxuICAgICAgY2FzZSBcIio9XCI6XG4gICAgICBjYXNlIFwiLz1cIjpcbiAgICAgIGNhc2UgXCIlPVwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufX0sIGJvb2xlYW46IHttYXRjaDogdG9rZW5fODcxID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg3MSkgJiYgdG9rZW5fODcxLnR5cGUgPT09IFRva2VuVHlwZS5UUlVFIHx8IHRva2VuXzg3MS50eXBlID09PSBUb2tlblR5cGUuRkFMU0V9LCB0ZW1wbGF0ZToge21hdGNoOiB0b2tlbl84NzIgPT4gIVR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODcyKSAmJiB0b2tlbl84NzIudHlwZSA9PT0gVG9rZW5UeXBlLlRFTVBMQVRFfSwgZGVsaW1pdGVyOiB7bWF0Y2g6IHRva2VuXzg3MyA9PiBMaXN0LmlzTGlzdCh0b2tlbl84NzMpfSwgc3ludGF4VGVtcGxhdGU6IHttYXRjaDogdG9rZW5fODc0ID0+IFR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODc0KSAmJiB0b2tlbl84NzQuZ2V0KDApLnZhbCgpID09PSBcIiNgXCJ9LCBlb2Y6IHttYXRjaDogdG9rZW5fODc1ID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg3NSkgJiYgdG9rZW5fODc1LnR5cGUgPT09IFRva2VuVHlwZS5FT1N9fTtcbjtcbmNvbnN0IEFMTF9QSEFTRVNfODMwID0ge307XG47XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW50YXgge1xuICBjb25zdHJ1Y3Rvcih0b2tlbl84NzYsIG9sZHN0eF84NzcgPSB7fSkge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbl84NzY7XG4gICAgdGhpcy5iaW5kaW5ncyA9IG9sZHN0eF84NzcuYmluZGluZ3MgIT0gbnVsbCA/IG9sZHN0eF84NzcuYmluZGluZ3MgOiBuZXcgQmluZGluZ01hcDtcbiAgICB0aGlzLnNjb3Blc2V0cyA9IG9sZHN0eF84Nzcuc2NvcGVzZXRzICE9IG51bGwgPyBvbGRzdHhfODc3LnNjb3Blc2V0cyA6IHthbGw6IExpc3QoKSwgcGhhc2U6IE1hcCgpfTtcbiAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICB9XG4gIHN0YXRpYyBvZih0b2tlbl84NzgsIHN0eF84NzkgPSB7fSkge1xuICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuXzg3OCwgc3R4Xzg3OSk7XG4gIH1cbiAgc3RhdGljIGZyb20odHlwZV84ODAsIHZhbHVlXzg4MSwgc3R4Xzg4MiA9IHt9KSB7XG4gICAgaWYgKCFUeXBlc184MjlbdHlwZV84ODBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZV84ODAgKyBcIiBpcyBub3QgYSB2YWxpZCB0eXBlXCIpO1xuICAgIH0gZWxzZSBpZiAoIVR5cGVzXzgyOVt0eXBlXzg4MF0uY3JlYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGEgc3ludGF4IGZyb20gdHlwZSBcIiArIHR5cGVfODgwKTtcbiAgICB9XG4gICAgbGV0IG5ld3N0eF84ODMgPSBUeXBlc184MjlbdHlwZV84ODBdLmNyZWF0ZSh2YWx1ZV84ODEsIHN0eF84ODIpO1xuICAgIGxldCBzbGljZV84ODQgPSBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODgyKTtcbiAgICBpZiAoc2xpY2VfODg0ICE9IG51bGwpIHtcbiAgICAgIG5ld3N0eF84ODMudG9rZW4uc2xpY2UgPSBzbGljZV84ODQ7XG4gICAgfVxuICAgIHJldHVybiBuZXdzdHhfODgzO1xuICB9XG4gIGZyb20odHlwZV84ODUsIHZhbHVlXzg4Nikge1xuICAgIHJldHVybiBTeW50YXguZnJvbSh0eXBlXzg4NSwgdmFsdWVfODg2LCB0aGlzKTtcbiAgfVxuICBmcm9tTnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwibnVsbFwiLCBudWxsKTtcbiAgfVxuICBmcm9tTnVtYmVyKHZhbHVlXzg4Nykge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJudW1iZXJcIiwgdmFsdWVfODg3KTtcbiAgfVxuICBmcm9tU3RyaW5nKHZhbHVlXzg4OCkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJzdHJpbmdcIiwgdmFsdWVfODg4KTtcbiAgfVxuICBmcm9tUHVuY3R1YXRvcih2YWx1ZV84ODkpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZV84ODkpO1xuICB9XG4gIGZyb21LZXl3b3JkKHZhbHVlXzg5MCkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJrZXl3b3JkXCIpO1xuICB9XG4gIGZyb21JZGVudGlmaWVyKHZhbHVlXzg5MSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlXzg5MSk7XG4gIH1cbiAgZnJvbVJlZ3VsYXJFeHByZXNzaW9uKHZhbHVlXzg5Mikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZV84OTIpO1xuICB9XG4gIGZyb21CcmFjZXMoaW5uZXJfODkzKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImJyYWNlc1wiLCBpbm5lcl84OTMpO1xuICB9XG4gIGZyb21CcmFja2V0cyhpbm5lcl84OTQpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXJfODk0KTtcbiAgfVxuICBmcm9tUGFyZW5zKGlubmVyXzg5NSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJwYXJlbnNcIiwgaW5uZXJfODk1KTtcbiAgfVxuICBzdGF0aWMgZnJvbU51bGwoc3R4Xzg5NiA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwibnVsbFwiLCBudWxsLCBzdHhfODk2KTtcbiAgfVxuICBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZV84OTcsIHN0eF84OTggPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcIm51bWJlclwiLCB2YWx1ZV84OTcsIHN0eF84OTgpO1xuICB9XG4gIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlXzg5OSwgc3R4XzkwMCA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwic3RyaW5nXCIsIHZhbHVlXzg5OSwgc3R4XzkwMCk7XG4gIH1cbiAgc3RhdGljIGZyb21QdW5jdHVhdG9yKHZhbHVlXzkwMSwgc3R4XzkwMiA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZV85MDEsIHN0eF85MDIpO1xuICB9XG4gIHN0YXRpYyBmcm9tS2V5d29yZCh2YWx1ZV85MDMsIHN0eF85MDQgPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcImtleXdvcmRcIiwgdmFsdWVfOTAzLCBzdHhfOTA0KTtcbiAgfVxuICBzdGF0aWMgZnJvbUlkZW50aWZpZXIodmFsdWVfOTA1LCBzdHhfOTA2ID0ge30pIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlXzkwNSwgc3R4XzkwNik7XG4gIH1cbiAgc3RhdGljIGZyb21SZWd1bGFyRXhwcmVzc2lvbih2YWx1ZV85MDcsIHN0eF85MDggPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInJlZ3VsYXJFeHByZXNzaW9uXCIsIHZhbHVlXzkwNywgc3R4XzkwOCk7XG4gIH1cbiAgc3RhdGljIGZyb21CcmFjZXMoaW5uZXJfOTA5LCBzdHhfOTEwID0ge30pIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20oXCJicmFjZXNcIiwgaW5uZXJfOTA5LCBzdHhfOTEwKTtcbiAgfVxuICBzdGF0aWMgZnJvbUJyYWNrZXRzKGlubmVyXzkxMSwgc3R4XzkxMiA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXJfOTExLCBzdHhfOTEyKTtcbiAgfVxuICBzdGF0aWMgZnJvbVBhcmVucyhpbm5lcl85MTMsIHN0eF85MTQgPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInBhcmVuc1wiLCBpbm5lcl85MTMsIHN0eF85MTQpO1xuICB9XG4gIHJlc29sdmUocGhhc2VfOTE1KSB7XG4gICAgYXNzZXJ0KHBoYXNlXzkxNSAhPSBudWxsLCBcIm11c3QgcHJvdmlkZSBhIHBoYXNlIHRvIHJlc29sdmVcIik7XG4gICAgbGV0IGFsbFNjb3Blc185MTYgPSB0aGlzLnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHN0eFNjb3Blc185MTcgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2VfOTE1KSA/IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmdldChwaGFzZV85MTUpIDogTGlzdCgpO1xuICAgIHN0eFNjb3Blc185MTcgPSBhbGxTY29wZXNfOTE2LmNvbmNhdChzdHhTY29wZXNfOTE3KTtcbiAgICBpZiAoc3R4U2NvcGVzXzkxNy5zaXplID09PSAwIHx8ICEodGhpcy5tYXRjaChcImlkZW50aWZpZXJcIikgfHwgdGhpcy5tYXRjaChcImtleXdvcmRcIikpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi52YWx1ZTtcbiAgICB9XG4gICAgbGV0IHNjb3BlXzkxOCA9IHN0eFNjb3Blc185MTcubGFzdCgpO1xuICAgIGxldCBiaW5kaW5nc185MTkgPSB0aGlzLmJpbmRpbmdzO1xuICAgIGlmIChzY29wZV85MTgpIHtcbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gYmluZGluZ3NfOTE5LmdldCh0aGlzKTtcbiAgICAgIGlmIChzY29wZXNldEJpbmRpbmdMaXN0KSB7XG4gICAgICAgIGxldCBiaWdnZXN0QmluZGluZ1BhaXIgPSBzY29wZXNldEJpbmRpbmdMaXN0LmZpbHRlcigoe3Njb3BlcywgYmluZGluZ30pID0+IHtcbiAgICAgICAgICByZXR1cm4gc2NvcGVzLmlzU3Vic2V0KHN0eFNjb3Blc185MTcpO1xuICAgICAgICB9KS5zb3J0KHNpemVEZWNlbmRpbmdfODI4KTtcbiAgICAgICAgaWYgKGJpZ2dlc3RCaW5kaW5nUGFpci5zaXplID49IDIgJiYgYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgwKS5zY29wZXMuc2l6ZSA9PT0gYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgxKS5zY29wZXMuc2l6ZSkge1xuICAgICAgICAgIGxldCBkZWJ1Z0Jhc2UgPSBcIntcIiArIHN0eFNjb3Blc185MTcubWFwKHNfOTIwID0+IHNfOTIwLnRvU3RyaW5nKCkpLmpvaW4oXCIsIFwiKSArIFwifVwiO1xuICAgICAgICAgIGxldCBkZWJ1Z0FtYmlnb3VzU2NvcGVzZXRzID0gYmlnZ2VzdEJpbmRpbmdQYWlyLm1hcCgoe3Njb3Blc30pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBcIntcIiArIHNjb3Blcy5tYXAoc185MjEgPT4gc185MjEudG9TdHJpbmcoKSkuam9pbihcIiwgXCIpICsgXCJ9XCI7XG4gICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3Blc2V0IFwiICsgZGVidWdCYXNlICsgXCIgaGFzIGFtYmlndW91cyBzdWJzZXRzIFwiICsgZGVidWdBbWJpZ291c1Njb3Blc2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlnZ2VzdEJpbmRpbmdQYWlyLnNpemUgIT09IDApIHtcbiAgICAgICAgICBsZXQgYmluZGluZ1N0ciA9IGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMCkuYmluZGluZy50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChNYXliZS5pc0p1c3QoYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgwKS5hbGlhcykpIHtcbiAgICAgICAgICAgIHJldHVybiBiaWdnZXN0QmluZGluZ1BhaXIuZ2V0KDApLmFsaWFzLmdldE9yRWxzZShudWxsKS5yZXNvbHZlKHBoYXNlXzkxNSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBiaW5kaW5nU3RyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuICB9XG4gIHZhbCgpIHtcbiAgICBhc3NlcnQoIXRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2Fubm90IGdldCB0aGUgdmFsIG9mIGEgZGVsaW1pdGVyXCIpO1xuICAgIGlmICh0aGlzLm1hdGNoKFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5zdHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFwidGVtcGxhdGVcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLml0ZW1zLm1hcChlbF85MjIgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGVsXzkyMi5tYXRjaCA9PT0gXCJmdW5jdGlvblwiICYmIGVsXzkyMi5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgICAgICAgIHJldHVybiBcIiR7Li4ufVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbF85MjIuc2xpY2UudGV4dDtcbiAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuICB9XG4gIGxpbmVOdW1iZXIoKSB7XG4gICAgaWYgKCF0aGlzLm1hdGNoKFwiZGVsaW1pdGVyXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5zbGljZS5zdGFydExvY2F0aW9uLmxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLmdldCgwKS5saW5lTnVtYmVyKCk7XG4gICAgfVxuICB9XG4gIHNldExpbmVOdW1iZXIobGluZV85MjMpIHtcbiAgICBsZXQgbmV3VG9rXzkyNCA9IHt9O1xuICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKCkpIHtcbiAgICAgIG5ld1Rva185MjQgPSB0aGlzLnRva2VuLm1hcChzXzkyNSA9PiBzXzkyNS5zZXRMaW5lTnVtYmVyKGxpbmVfOTIzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnRva2VuKSkge1xuICAgICAgICBuZXdUb2tfOTI0W2tleV0gPSB0aGlzLnRva2VuW2tleV07XG4gICAgICB9XG4gICAgICBhc3NlcnQobmV3VG9rXzkyNC5zbGljZSAmJiBuZXdUb2tfOTI0LnNsaWNlLnN0YXJ0TG9jYXRpb24sIFwiYWxsIHRva2VucyBtdXN0IGhhdmUgbGluZSBpbmZvXCIpO1xuICAgICAgbmV3VG9rXzkyNC5zbGljZS5zdGFydExvY2F0aW9uLmxpbmUgPSBsaW5lXzkyMztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTeW50YXgobmV3VG9rXzkyNCwgdGhpcyk7XG4gIH1cbiAgaW5uZXIoKSB7XG4gICAgYXNzZXJ0KHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2FuIG9ubHkgZ2V0IHRoZSBpbm5lciBvZiBhIGRlbGltaXRlclwiKTtcbiAgICByZXR1cm4gdGhpcy50b2tlbi5zbGljZSgxLCB0aGlzLnRva2VuLnNpemUgLSAxKTtcbiAgfVxuICBhZGRTY29wZShzY29wZV85MjYsIGJpbmRpbmdzXzkyNywgcGhhc2VfOTI4LCBvcHRpb25zXzkyOSA9IHtmbGlwOiBmYWxzZX0pIHtcbiAgICBsZXQgdG9rZW5fOTMwID0gdGhpcy5tYXRjaChcImRlbGltaXRlclwiKSA/IHRoaXMudG9rZW4ubWFwKHNfOTM0ID0+IHNfOTM0LmFkZFNjb3BlKHNjb3BlXzkyNiwgYmluZGluZ3NfOTI3LCBwaGFzZV85MjgsIG9wdGlvbnNfOTI5KSkgOiB0aGlzLnRva2VuO1xuICAgIGlmICh0aGlzLm1hdGNoKFwidGVtcGxhdGVcIikpIHtcbiAgICAgIHRva2VuXzkzMCA9IF8ubWVyZ2UodG9rZW5fOTMwLCB7aXRlbXM6IHRva2VuXzkzMC5pdGVtcy5tYXAoaXRfOTM1ID0+IHtcbiAgICAgICAgaWYgKGl0XzkzNSBpbnN0YW5jZW9mIFN5bnRheCAmJiBpdF85MzUubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgICAgICByZXR1cm4gaXRfOTM1LmFkZFNjb3BlKHNjb3BlXzkyNiwgYmluZGluZ3NfOTI3LCBwaGFzZV85MjgsIG9wdGlvbnNfOTI5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRfOTM1O1xuICAgICAgfSl9KTtcbiAgICB9XG4gICAgbGV0IG9sZFNjb3Blc2V0XzkzMTtcbiAgICBpZiAocGhhc2VfOTI4ID09PSBBTExfUEhBU0VTXzgzMCkge1xuICAgICAgb2xkU2NvcGVzZXRfOTMxID0gdGhpcy5zY29wZXNldHMuYWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbGRTY29wZXNldF85MzEgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2VfOTI4KSA/IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmdldChwaGFzZV85MjgpIDogTGlzdCgpO1xuICAgIH1cbiAgICBsZXQgbmV3U2NvcGVzZXRfOTMyO1xuICAgIGlmIChvcHRpb25zXzkyOS5mbGlwKSB7XG4gICAgICBsZXQgaW5kZXggPSBvbGRTY29wZXNldF85MzEuaW5kZXhPZihzY29wZV85MjYpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBuZXdTY29wZXNldF85MzIgPSBvbGRTY29wZXNldF85MzEucmVtb3ZlKGluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1Njb3Blc2V0XzkzMiA9IG9sZFNjb3Blc2V0XzkzMS5wdXNoKHNjb3BlXzkyNik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1Njb3Blc2V0XzkzMiA9IG9sZFNjb3Blc2V0XzkzMS5wdXNoKHNjb3BlXzkyNik7XG4gICAgfVxuICAgIGxldCBuZXdzdHhfOTMzID0ge2JpbmRpbmdzOiBiaW5kaW5nc185MjcsIHNjb3Blc2V0czoge2FsbDogdGhpcy5zY29wZXNldHMuYWxsLCBwaGFzZTogdGhpcy5zY29wZXNldHMucGhhc2V9fTtcbiAgICBpZiAocGhhc2VfOTI4ID09PSBBTExfUEhBU0VTXzgzMCkge1xuICAgICAgbmV3c3R4XzkzMy5zY29wZXNldHMuYWxsID0gbmV3U2NvcGVzZXRfOTMyO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdzdHhfOTMzLnNjb3Blc2V0cy5waGFzZSA9IG5ld3N0eF85MzMuc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZV85MjgsIG5ld1Njb3Blc2V0XzkzMik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuXzkzMCwgbmV3c3R4XzkzMyk7XG4gIH1cbiAgcmVtb3ZlU2NvcGUoc2NvcGVfOTM2LCBwaGFzZV85MzcpIHtcbiAgICBsZXQgdG9rZW5fOTM4ID0gdGhpcy5tYXRjaChcImRlbGltaXRlclwiKSA/IHRoaXMudG9rZW4ubWFwKHNfOTQ0ID0+IHNfOTQ0LnJlbW92ZVNjb3BlKHNjb3BlXzkzNiwgcGhhc2VfOTM3KSkgOiB0aGlzLnRva2VuO1xuICAgIGxldCBwaGFzZVNjb3Blc2V0XzkzOSA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmhhcyhwaGFzZV85MzcpID8gdGhpcy5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlXzkzNykgOiBMaXN0KCk7XG4gICAgbGV0IGFsbFNjb3Blc2V0Xzk0MCA9IHRoaXMuc2NvcGVzZXRzLmFsbDtcbiAgICBsZXQgbmV3c3R4Xzk0MSA9IHtiaW5kaW5nczogdGhpcy5iaW5kaW5ncywgc2NvcGVzZXRzOiB7YWxsOiB0aGlzLnNjb3Blc2V0cy5hbGwsIHBoYXNlOiB0aGlzLnNjb3Blc2V0cy5waGFzZX19O1xuICAgIGxldCBwaGFzZUluZGV4Xzk0MiA9IHBoYXNlU2NvcGVzZXRfOTM5LmluZGV4T2Yoc2NvcGVfOTM2KTtcbiAgICBsZXQgYWxsSW5kZXhfOTQzID0gYWxsU2NvcGVzZXRfOTQwLmluZGV4T2Yoc2NvcGVfOTM2KTtcbiAgICBpZiAocGhhc2VJbmRleF85NDIgIT09IC0xKSB7XG4gICAgICBuZXdzdHhfOTQxLnNjb3Blc2V0cy5waGFzZSA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZV85MzcsIHBoYXNlU2NvcGVzZXRfOTM5LnJlbW92ZShwaGFzZUluZGV4Xzk0MikpO1xuICAgIH0gZWxzZSBpZiAoYWxsSW5kZXhfOTQzICE9PSAtMSkge1xuICAgICAgbmV3c3R4Xzk0MS5zY29wZXNldHMuYWxsID0gYWxsU2NvcGVzZXRfOTQwLnJlbW92ZShhbGxJbmRleF85NDMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbl85MzgsIG5ld3N0eF85NDEpO1xuICB9XG4gIG1hdGNoKHR5cGVfOTQ1LCB2YWx1ZV85NDYpIHtcbiAgICBpZiAoIVR5cGVzXzgyOVt0eXBlXzk0NV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlXzk0NSArIFwiIGlzIGFuIGludmFsaWQgdHlwZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFR5cGVzXzgyOVt0eXBlXzk0NV0ubWF0Y2godGhpcy50b2tlbikgJiYgKHZhbHVlXzk0NiA9PSBudWxsIHx8ICh2YWx1ZV85NDYgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWx1ZV85NDYudGVzdCh0aGlzLnZhbCgpKSA6IHRoaXMudmFsKCkgPT0gdmFsdWVfOTQ2KSk7XG4gIH1cbiAgaXNJZGVudGlmaWVyKHZhbHVlXzk0Nykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiaWRlbnRpZmllclwiLCB2YWx1ZV85NDcpO1xuICB9XG4gIGlzQXNzaWduKHZhbHVlXzk0OCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYXNzaWduXCIsIHZhbHVlXzk0OCk7XG4gIH1cbiAgaXNCb29sZWFuTGl0ZXJhbCh2YWx1ZV85NDkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJvb2xlYW5cIiwgdmFsdWVfOTQ5KTtcbiAgfVxuICBpc0tleXdvcmQodmFsdWVfOTUwKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJrZXl3b3JkXCIsIHZhbHVlXzk1MCk7XG4gIH1cbiAgaXNOdWxsTGl0ZXJhbCh2YWx1ZV85NTEpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcIm51bGxcIiwgdmFsdWVfOTUxKTtcbiAgfVxuICBpc051bWVyaWNMaXRlcmFsKHZhbHVlXzk1Mikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwibnVtYmVyXCIsIHZhbHVlXzk1Mik7XG4gIH1cbiAgaXNQdW5jdHVhdG9yKHZhbHVlXzk1Mykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicHVuY3R1YXRvclwiLCB2YWx1ZV85NTMpO1xuICB9XG4gIGlzU3RyaW5nTGl0ZXJhbCh2YWx1ZV85NTQpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInN0cmluZ1wiLCB2YWx1ZV85NTQpO1xuICB9XG4gIGlzUmVndWxhckV4cHJlc3Npb24odmFsdWVfOTU1KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZV85NTUpO1xuICB9XG4gIGlzVGVtcGxhdGUodmFsdWVfOTU2KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJ0ZW1wbGF0ZVwiLCB2YWx1ZV85NTYpO1xuICB9XG4gIGlzRGVsaW1pdGVyKHZhbHVlXzk1Nykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZGVsaW1pdGVyXCIsIHZhbHVlXzk1Nyk7XG4gIH1cbiAgaXNQYXJlbnModmFsdWVfOTU4KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwYXJlbnNcIiwgdmFsdWVfOTU4KTtcbiAgfVxuICBpc0JyYWNlcyh2YWx1ZV85NTkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJyYWNlc1wiLCB2YWx1ZV85NTkpO1xuICB9XG4gIGlzQnJhY2tldHModmFsdWVfOTYwKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJicmFja2V0c1wiLCB2YWx1ZV85NjApO1xuICB9XG4gIGlzU3ludGF4VGVtcGxhdGUodmFsdWVfOTYxKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzeW50YXhUZW1wbGF0ZVwiLCB2YWx1ZV85NjEpO1xuICB9XG4gIGlzRU9GKHZhbHVlXzk2Mikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZW9mXCIsIHZhbHVlXzk2Mik7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLm1hcChzXzk2MyA9PiBzXzk2My50b1N0cmluZygpKS5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBcIidcIiArIHRoaXMudG9rZW4uc3RyO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChcInRlbXBsYXRlXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWwoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9rZW4udmFsdWU7XG4gIH1cbn1cbmV4cG9ydCB7VHlwZXNfODI5IGFzIFR5cGVzfTtcbmV4cG9ydCB7QUxMX1BIQVNFU184MzAgYXMgQUxMX1BIQVNFU30iXX0= - -/***/ }, -/* 13 */ -/***/ function(module, exports) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - function expect_336(cond_338, message_339, offendingSyntax_340, rest_341) { - if (!cond_338) { - let ctx = ""; - if (rest_341) { - let ctx = rest_341.slice(0, 20).map(s_342 => { - let val_343 = s_342.isDelimiter() ? "( ... )" : s_342.val(); - if (s_342 === offendingSyntax_340) { - return "__" + val_343 + "__"; - } - return val_343; - }).join(" "); - } - throw new Error("[error]: " + message_339 + "\n" + ctx); - } - } - function assert_337(cond_344, message_345) { - if (!cond_344) { - throw new Error("[assertion error]: " + message_345); - } - } - exports.expect = expect_336; - exports.assert = assert_337; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2Vycm9ycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLFNBQVMsVUFBVCxDQUFvQixRQUFwQixFQUE4QixXQUE5QixFQUEyQyxtQkFBM0MsRUFBZ0UsUUFBaEUsRUFBMEU7QUFDeEUsTUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLFFBQUksTUFBTSxFQUFWO0FBQ0EsUUFBSSxRQUFKLEVBQWM7QUFDWixVQUFJLE1BQU0sU0FBUyxLQUFULENBQWUsQ0FBZixFQUFrQixFQUFsQixFQUFzQixHQUF0QixDQUEwQixTQUFTO0FBQzNDLFlBQUksVUFBVSxNQUFNLFdBQU4sS0FBc0IsU0FBdEIsR0FBa0MsTUFBTSxHQUFOLEVBQWhEO0FBQ0EsWUFBSSxVQUFVLG1CQUFkLEVBQW1DO0FBQ2pDLGlCQUFPLE9BQU8sT0FBUCxHQUFpQixJQUF4QjtBQUNEO0FBQ0QsZUFBTyxPQUFQO0FBQ0QsT0FOUyxFQU1QLElBTk8sQ0FNRixHQU5FLENBQVY7QUFPRDtBQUNELFVBQU0sSUFBSSxLQUFKLENBQVUsY0FBYyxXQUFkLEdBQTRCLElBQTVCLEdBQW1DLEdBQTdDLENBQU47QUFDRDtBQUNGO0FBQ0QsU0FBUyxVQUFULENBQW9CLFFBQXBCLEVBQThCLFdBQTlCLEVBQTJDO0FBQ3pDLE1BQUksQ0FBQyxRQUFMLEVBQWU7QUFDYixVQUFNLElBQUksS0FBSixDQUFVLHdCQUF3QixXQUFsQyxDQUFOO0FBQ0Q7QUFDRjtRQUNxQixNLEdBQWQsVTtRQUNjLE0sR0FBZCxVIiwiZmlsZSI6ImVycm9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGV4cGVjdF8zMzYoY29uZF8zMzgsIG1lc3NhZ2VfMzM5LCBvZmZlbmRpbmdTeW50YXhfMzQwLCByZXN0XzM0MSkge1xuICBpZiAoIWNvbmRfMzM4KSB7XG4gICAgbGV0IGN0eCA9IFwiXCI7XG4gICAgaWYgKHJlc3RfMzQxKSB7XG4gICAgICBsZXQgY3R4ID0gcmVzdF8zNDEuc2xpY2UoMCwgMjApLm1hcChzXzM0MiA9PiB7XG4gICAgICAgIGxldCB2YWxfMzQzID0gc18zNDIuaXNEZWxpbWl0ZXIoKSA/IFwiKCAuLi4gKVwiIDogc18zNDIudmFsKCk7XG4gICAgICAgIGlmIChzXzM0MiA9PT0gb2ZmZW5kaW5nU3ludGF4XzM0MCkge1xuICAgICAgICAgIHJldHVybiBcIl9fXCIgKyB2YWxfMzQzICsgXCJfX1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxfMzQzO1xuICAgICAgfSkuam9pbihcIiBcIik7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIltlcnJvcl06IFwiICsgbWVzc2FnZV8zMzkgKyBcIlxcblwiICsgY3R4KTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0XzMzNyhjb25kXzM0NCwgbWVzc2FnZV8zNDUpIHtcbiAgaWYgKCFjb25kXzM0NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlthc3NlcnRpb24gZXJyb3JdOiBcIiArIG1lc3NhZ2VfMzQ1KTtcbiAgfVxufVxuZXhwb3J0IHtleHBlY3RfMzM2IGFzIGV4cGVjdH07XG5leHBvcnQge2Fzc2VydF8zMzcgYXMgYXNzZXJ0fSJdfQ== - -/***/ }, -/* 14 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _immutable = __webpack_require__(11); - - var _errors = __webpack_require__(13); - - var _ramdaFantasy = __webpack_require__(15); - - var _syntax = __webpack_require__(12); - - class BindingMap { - constructor() { - this._map = new Map(); - } - add(stx_20, _ref) { - let binding = _ref.binding; - let phase = _ref.phase; - var _ref$skipDup = _ref.skipDup; - let skipDup = _ref$skipDup === undefined ? false : _ref$skipDup; - - let stxName_21 = stx_20.val(); - let allScopeset_22 = stx_20.scopesets.all; - let scopeset_23 = stx_20.scopesets.phase.has(phase) ? stx_20.scopesets.phase.get(phase) : (0, _immutable.List)(); - scopeset_23 = allScopeset_22.concat(scopeset_23); - (0, _errors.assert)(phase != null, "must provide a phase for binding add"); - if (this._map.has(stxName_21)) { - let scopesetBindingList = this._map.get(stxName_21); - if (skipDup && scopesetBindingList.some(s_24 => s_24.scopes.equals(scopeset_23))) { - return; - } - this._map.set(stxName_21, scopesetBindingList.push({ scopes: scopeset_23, binding: binding, alias: _ramdaFantasy.Maybe.Nothing() })); - } else { - this._map.set(stxName_21, _immutable.List.of({ scopes: scopeset_23, binding: binding, alias: _ramdaFantasy.Maybe.Nothing() })); - } - } - addForward(stx_25, forwardStx_26, binding_27, phase_28) { - let stxName_29 = stx_25.token.value; - let allScopeset_30 = stx_25.scopesets.all; - let scopeset_31 = stx_25.scopesets.phase.has(phase_28) ? stx_25.scopesets.phase.get(phase_28) : (0, _immutable.List)(); - scopeset_31 = allScopeset_30.concat(scopeset_31); - (0, _errors.assert)(phase_28 != null, "must provide a phase for binding add"); - if (this._map.has(stxName_29)) { - let scopesetBindingList = this._map.get(stxName_29); - this._map.set(stxName_29, scopesetBindingList.push({ scopes: scopeset_31, binding: binding_27, alias: _ramdaFantasy.Maybe.of(forwardStx_26) })); - } else { - this._map.set(stxName_29, _immutable.List.of({ scopes: scopeset_31, binding: binding_27, alias: _ramdaFantasy.Maybe.of(forwardStx_26) })); - } - } - get(stx_32) { - return this._map.get(stx_32.token.value); - } - } - exports.default = BindingMap; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2JpbmRpbmctbWFwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNlLE1BQU0sVUFBTixDQUFpQjtBQUM5QixnQkFBYztBQUNaLFNBQUssSUFBTCxHQUFZLElBQUksR0FBSixFQUFaO0FBQ0Q7QUFDRCxNQUFJLE1BQUosUUFBK0M7QUFBQSxRQUFsQyxPQUFrQyxRQUFsQyxPQUFrQztBQUFBLFFBQXpCLEtBQXlCLFFBQXpCLEtBQXlCO0FBQUEsNEJBQWxCLE9BQWtCO0FBQUEsUUFBbEIsT0FBa0IsZ0NBQVIsS0FBUTs7QUFDN0MsUUFBSSxhQUFhLE9BQU8sR0FBUCxFQUFqQjtBQUNBLFFBQUksaUJBQWlCLE9BQU8sU0FBUCxDQUFpQixHQUF0QztBQUNBLFFBQUksY0FBYyxPQUFPLFNBQVAsQ0FBaUIsS0FBakIsQ0FBdUIsR0FBdkIsQ0FBMkIsS0FBM0IsSUFBb0MsT0FBTyxTQUFQLENBQWlCLEtBQWpCLENBQXVCLEdBQXZCLENBQTJCLEtBQTNCLENBQXBDLEdBQXdFLHNCQUExRjtBQUNBLGtCQUFjLGVBQWUsTUFBZixDQUFzQixXQUF0QixDQUFkO0FBQ0Esd0JBQU8sU0FBUyxJQUFoQixFQUFzQixzQ0FBdEI7QUFDQSxRQUFJLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxVQUFkLENBQUosRUFBK0I7QUFDN0IsVUFBSSxzQkFBc0IsS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLFVBQWQsQ0FBMUI7QUFDQSxVQUFJLFdBQVcsb0JBQW9CLElBQXBCLENBQXlCLFFBQVEsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixXQUFuQixDQUFqQyxDQUFmLEVBQWtGO0FBQ2hGO0FBQ0Q7QUFDRCxXQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxFQUEwQixvQkFBb0IsSUFBcEIsQ0FBeUIsRUFBQyxRQUFRLFdBQVQsRUFBc0IsU0FBUyxPQUEvQixFQUF3QyxPQUFPLG9CQUFNLE9BQU4sRUFBL0MsRUFBekIsQ0FBMUI7QUFDRCxLQU5ELE1BTU87QUFDTCxXQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxFQUEwQixnQkFBSyxFQUFMLENBQVEsRUFBQyxRQUFRLFdBQVQsRUFBc0IsU0FBUyxPQUEvQixFQUF3QyxPQUFPLG9CQUFNLE9BQU4sRUFBL0MsRUFBUixDQUExQjtBQUNEO0FBQ0Y7QUFDRCxhQUFXLE1BQVgsRUFBbUIsYUFBbkIsRUFBa0MsVUFBbEMsRUFBOEMsUUFBOUMsRUFBd0Q7QUFDdEQsUUFBSSxhQUFhLE9BQU8sS0FBUCxDQUFhLEtBQTlCO0FBQ0EsUUFBSSxpQkFBaUIsT0FBTyxTQUFQLENBQWlCLEdBQXRDO0FBQ0EsUUFBSSxjQUFjLE9BQU8sU0FBUCxDQUFpQixLQUFqQixDQUF1QixHQUF2QixDQUEyQixRQUEzQixJQUF1QyxPQUFPLFNBQVAsQ0FBaUIsS0FBakIsQ0FBdUIsR0FBdkIsQ0FBMkIsUUFBM0IsQ0FBdkMsR0FBOEUsc0JBQWhHO0FBQ0Esa0JBQWMsZUFBZSxNQUFmLENBQXNCLFdBQXRCLENBQWQ7QUFDQSx3QkFBTyxZQUFZLElBQW5CLEVBQXlCLHNDQUF6QjtBQUNBLFFBQUksS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLFVBQWQsQ0FBSixFQUErQjtBQUM3QixVQUFJLHNCQUFzQixLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxDQUExQjtBQUNBLFdBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxVQUFkLEVBQTBCLG9CQUFvQixJQUFwQixDQUF5QixFQUFDLFFBQVEsV0FBVCxFQUFzQixTQUFTLFVBQS9CLEVBQTJDLE9BQU8sb0JBQU0sRUFBTixDQUFTLGFBQVQsQ0FBbEQsRUFBekIsQ0FBMUI7QUFDRCxLQUhELE1BR087QUFDTCxXQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxFQUEwQixnQkFBSyxFQUFMLENBQVEsRUFBQyxRQUFRLFdBQVQsRUFBc0IsU0FBUyxVQUEvQixFQUEyQyxPQUFPLG9CQUFNLEVBQU4sQ0FBUyxhQUFULENBQWxELEVBQVIsQ0FBMUI7QUFDRDtBQUNGO0FBQ0QsTUFBSSxNQUFKLEVBQVk7QUFDVixXQUFPLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxPQUFPLEtBQVAsQ0FBYSxLQUEzQixDQUFQO0FBQ0Q7QUFuQzZCO2tCQUFYLFUiLCJmaWxlIjoiYmluZGluZy1tYXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3R9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCB7ZXhwZWN0LCBhc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtNYXliZX0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmltcG9ydCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCaW5kaW5nTWFwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fbWFwID0gbmV3IE1hcDtcbiAgfVxuICBhZGQoc3R4XzIwLCB7YmluZGluZywgcGhhc2UsIHNraXBEdXAgPSBmYWxzZX0pIHtcbiAgICBsZXQgc3R4TmFtZV8yMSA9IHN0eF8yMC52YWwoKTtcbiAgICBsZXQgYWxsU2NvcGVzZXRfMjIgPSBzdHhfMjAuc2NvcGVzZXRzLmFsbDtcbiAgICBsZXQgc2NvcGVzZXRfMjMgPSBzdHhfMjAuc2NvcGVzZXRzLnBoYXNlLmhhcyhwaGFzZSkgPyBzdHhfMjAuc2NvcGVzZXRzLnBoYXNlLmdldChwaGFzZSkgOiBMaXN0KCk7XG4gICAgc2NvcGVzZXRfMjMgPSBhbGxTY29wZXNldF8yMi5jb25jYXQoc2NvcGVzZXRfMjMpO1xuICAgIGFzc2VydChwaGFzZSAhPSBudWxsLCBcIm11c3QgcHJvdmlkZSBhIHBoYXNlIGZvciBiaW5kaW5nIGFkZFwiKTtcbiAgICBpZiAodGhpcy5fbWFwLmhhcyhzdHhOYW1lXzIxKSkge1xuICAgICAgbGV0IHNjb3Blc2V0QmluZGluZ0xpc3QgPSB0aGlzLl9tYXAuZ2V0KHN0eE5hbWVfMjEpO1xuICAgICAgaWYgKHNraXBEdXAgJiYgc2NvcGVzZXRCaW5kaW5nTGlzdC5zb21lKHNfMjQgPT4gc18yNC5zY29wZXMuZXF1YWxzKHNjb3Blc2V0XzIzKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbWFwLnNldChzdHhOYW1lXzIxLCBzY29wZXNldEJpbmRpbmdMaXN0LnB1c2goe3Njb3Blczogc2NvcGVzZXRfMjMsIGJpbmRpbmc6IGJpbmRpbmcsIGFsaWFzOiBNYXliZS5Ob3RoaW5nKCl9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZV8yMSwgTGlzdC5vZih7c2NvcGVzOiBzY29wZXNldF8yMywgYmluZGluZzogYmluZGluZywgYWxpYXM6IE1heWJlLk5vdGhpbmcoKX0pKTtcbiAgICB9XG4gIH1cbiAgYWRkRm9yd2FyZChzdHhfMjUsIGZvcndhcmRTdHhfMjYsIGJpbmRpbmdfMjcsIHBoYXNlXzI4KSB7XG4gICAgbGV0IHN0eE5hbWVfMjkgPSBzdHhfMjUudG9rZW4udmFsdWU7XG4gICAgbGV0IGFsbFNjb3Blc2V0XzMwID0gc3R4XzI1LnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHNjb3Blc2V0XzMxID0gc3R4XzI1LnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2VfMjgpID8gc3R4XzI1LnNjb3Blc2V0cy5waGFzZS5nZXQocGhhc2VfMjgpIDogTGlzdCgpO1xuICAgIHNjb3Blc2V0XzMxID0gYWxsU2NvcGVzZXRfMzAuY29uY2F0KHNjb3Blc2V0XzMxKTtcbiAgICBhc3NlcnQocGhhc2VfMjggIT0gbnVsbCwgXCJtdXN0IHByb3ZpZGUgYSBwaGFzZSBmb3IgYmluZGluZyBhZGRcIik7XG4gICAgaWYgKHRoaXMuX21hcC5oYXMoc3R4TmFtZV8yOSkpIHtcbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gdGhpcy5fbWFwLmdldChzdHhOYW1lXzI5KTtcbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZV8yOSwgc2NvcGVzZXRCaW5kaW5nTGlzdC5wdXNoKHtzY29wZXM6IHNjb3Blc2V0XzMxLCBiaW5kaW5nOiBiaW5kaW5nXzI3LCBhbGlhczogTWF5YmUub2YoZm9yd2FyZFN0eF8yNil9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZV8yOSwgTGlzdC5vZih7c2NvcGVzOiBzY29wZXNldF8zMSwgYmluZGluZzogYmluZGluZ18yNywgYWxpYXM6IE1heWJlLm9mKGZvcndhcmRTdHhfMjYpfSkpO1xuICAgIH1cbiAgfVxuICBnZXQoc3R4XzMyKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcC5nZXQoc3R4XzMyLnRva2VuLnZhbHVlKTtcbiAgfVxufVxuIl19 - -/***/ }, -/* 15 */ -/***/ function(module, exports, __webpack_require__) { - - module.exports = { - Either: __webpack_require__(16), - Future: __webpack_require__(19), - Identity: __webpack_require__(20), - IO: __webpack_require__(21), - lift2: __webpack_require__(22), - lift3: __webpack_require__(23), - Maybe: __webpack_require__(24), - Tuple: __webpack_require__(25), - Reader: __webpack_require__(26) - }; - - -/***/ }, -/* 16 */ -/***/ function(module, exports, __webpack_require__) { - - var R = __webpack_require__(17); - - var util = __webpack_require__(18); - - - function Either(left, right) { - switch (arguments.length) { - case 0: - throw new TypeError('no arguments to Either'); - case 1: - return function(right) { - return right == null ? Either.Left(left) : Either.Right(right); - }; - default: - return right == null ? Either.Left(left) : Either.Right(right); - } - } - - Either.prototype.map = util.returnThis; - - Either.of = Either.prototype.of = function(value) { - return Either.Right(value); - }; - - Either.prototype.chain = util.returnThis; // throw? - - Either.equals = Either.prototype.equals = util.getEquals(Either); - - - // Right - function _Right(x) { - this.value = x; - } - util.extend(_Right, Either); - - _Right.prototype.map = function(fn) { - return new _Right(fn(this.value)); - }; - - _Right.prototype.ap = function(that) { - return that.map(this.value); - }; - - _Right.prototype.chain = function(f) { - return f(this.value); - }; - - _Right.prototype.bimap = function(_, f) { - return new _Right(f(this.value)); - }; - - _Right.prototype.extend = function(f) { - return new _Right(f(this)); - }; - - _Right.prototype.toString = function() { - return 'Either.Right(' + R.toString(this.value) + ')'; - }; - - Either.Right = function(value) { - return new _Right(value); - }; - - - // Left - function _Left(x) { - this.value = x; - } - util.extend(_Left, Either); - - _Left.prototype.ap = function(that) { return that; }; - - _Left.prototype.bimap = function(f) { - return new _Left(f(this.value)); - }; - - _Left.prototype.extend = util.returnThis; - - _Left.prototype.toString = function() { - return 'Either.Left(' + R.toString(this.value) + ')'; - }; - - Either.Left = function(value) { - return new _Left(value); - }; - - - module.exports = Either; - - -/***/ }, -/* 17 */ -/***/ function(module, exports, __webpack_require__) { - - // Ramda v0.17.1 + // Ramda v0.19.1 // https://github.com/ramda/ramda - // (c) 2013-2015 Scott Sauyet, Michael Hurley, and David Chambers + // (c) 2013-2016 Scott Sauyet, Michael Hurley, and David Chambers // Ramda may be freely distributed under the MIT license. ;(function() { @@ -8295,10 +6852,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /** * A special placeholder value used to specify "gaps" within curried functions, - * allowing partial application of any combination of arguments, - * regardless of their positions. + * allowing partial application of any combination of arguments, regardless of + * their positions. * - * If `g` is a curried ternary function and `_` is `R.__`, the following are equivalent: + * If `g` is a curried ternary function and `_` is `R.__`, the following are + * equivalent: * * - `g(1, 2, 3)` * - `g(_, 2, 3)(1)` @@ -8311,6 +6869,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @constant * @memberOf R + * @since v0.6.0 * @category Function * @example * @@ -8319,9 +6878,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack */ var __ = { '@@functional/placeholder': true }; - // jshint unused:vars + /* eslint-disable no-unused-vars */ var _arity = function _arity(n, fn) { - // jshint unused:vars + /* eslint-disable no-unused-vars */ switch (n) { case 0: return function () { @@ -8372,6 +6931,15 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack } }; + var _arrayFromIterator = function _arrayFromIterator(iter) { + var list = []; + var next; + while (!(next = iter.next()).done) { + list.push(next.value); + } + return list; + }; + var _cloneRegExp = function _cloneRegExp(pattern) { return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : '')); }; @@ -8414,7 +6982,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; var _containsWith = function _containsWith(pred, x, list) { - var idx = 0, len = list.length; + var idx = 0; + var len = list.length; while (idx < len) { if (pred(x, list[idx])) { return true; @@ -8424,161 +6993,10 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return false; }; - /** - * Optimized internal two-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ - var _curry1 = function _curry1(fn) { - return function f1(a) { - if (arguments.length === 0) { - return f1; - } else if (a != null && a['@@functional/placeholder'] === true) { - return f1; - } else { - return fn.apply(this, arguments); - } - }; - }; - - /** - * Optimized internal two-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ - var _curry2 = function _curry2(fn) { - return function f2(a, b) { - var n = arguments.length; - if (n === 0) { - return f2; - } else if (n === 1 && a != null && a['@@functional/placeholder'] === true) { - return f2; - } else if (n === 1) { - return _curry1(function (b) { - return fn(a, b); - }); - } else if (n === 2 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true) { - return f2; - } else if (n === 2 && a != null && a['@@functional/placeholder'] === true) { - return _curry1(function (a) { - return fn(a, b); - }); - } else if (n === 2 && b != null && b['@@functional/placeholder'] === true) { - return _curry1(function (b) { - return fn(a, b); - }); - } else { - return fn(a, b); - } - }; - }; - - /** - * Optimized internal three-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ - var _curry3 = function _curry3(fn) { - return function f3(a, b, c) { - var n = arguments.length; - if (n === 0) { - return f3; - } else if (n === 1 && a != null && a['@@functional/placeholder'] === true) { - return f3; - } else if (n === 1) { - return _curry2(function (b, c) { - return fn(a, b, c); - }); - } else if (n === 2 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true) { - return f3; - } else if (n === 2 && a != null && a['@@functional/placeholder'] === true) { - return _curry2(function (a, c) { - return fn(a, b, c); - }); - } else if (n === 2 && b != null && b['@@functional/placeholder'] === true) { - return _curry2(function (b, c) { - return fn(a, b, c); - }); - } else if (n === 2) { - return _curry1(function (c) { - return fn(a, b, c); - }); - } else if (n === 3 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true && c != null && c['@@functional/placeholder'] === true) { - return f3; - } else if (n === 3 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true) { - return _curry2(function (a, b) { - return fn(a, b, c); - }); - } else if (n === 3 && a != null && a['@@functional/placeholder'] === true && c != null && c['@@functional/placeholder'] === true) { - return _curry2(function (a, c) { - return fn(a, b, c); - }); - } else if (n === 3 && b != null && b['@@functional/placeholder'] === true && c != null && c['@@functional/placeholder'] === true) { - return _curry2(function (b, c) { - return fn(a, b, c); - }); - } else if (n === 3 && a != null && a['@@functional/placeholder'] === true) { - return _curry1(function (a) { - return fn(a, b, c); - }); - } else if (n === 3 && b != null && b['@@functional/placeholder'] === true) { - return _curry1(function (b) { - return fn(a, b, c); - }); - } else if (n === 3 && c != null && c['@@functional/placeholder'] === true) { - return _curry1(function (c) { - return fn(a, b, c); - }); - } else { - return fn(a, b, c); - } - }; - }; - - /** - * Internal curryN function. - * - * @private - * @category Function - * @param {Number} length The arity of the curried function. - * @return {array} An array of arguments received thus far. - * @param {Function} fn The function to curry. - */ - var _curryN = function _curryN(length, received, fn) { - return function () { - var combined = []; - var argsIdx = 0; - var left = length; - var combinedIdx = 0; - while (combinedIdx < received.length || argsIdx < arguments.length) { - var result; - if (combinedIdx < received.length && (received[combinedIdx] == null || received[combinedIdx]['@@functional/placeholder'] !== true || argsIdx >= arguments.length)) { - result = received[combinedIdx]; - } else { - result = arguments[argsIdx]; - argsIdx += 1; - } - combined[combinedIdx] = result; - if (result == null || result['@@functional/placeholder'] !== true) { - left -= 1; - } - combinedIdx += 1; - } - return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn)); - }; - }; - var _filter = function _filter(fn, list) { - var idx = 0, len = list.length, result = []; + var idx = 0; + var len = list.length; + var result = []; while (idx < len) { if (fn(list[idx])) { result[result.length] = list[idx]; @@ -8595,19 +7013,6 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; }; - /** - * @private - * @param {Function} fn The strategy for extracting function names from an object - * @return {Function} A function that takes an object and returns an array of function names. - */ - var _functionsWith = function _functionsWith(fn) { - return function (obj) { - return _filter(function (key) { - return typeof obj[key] === 'function'; - }, fn(obj)); - }; - }; - var _has = function _has(prop, obj) { return Object.prototype.hasOwnProperty.call(obj, prop); }; @@ -8616,6 +7021,15 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return x; }; + var _isArguments = function () { + var toString = Object.prototype.toString; + return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) { + return toString.call(x) === '[object Arguments]'; + } : function _isArguments(x) { + return _has('callee', x); + }; + }(); + /** * Tests whether or not an object is an array. * @@ -8648,6 +7062,18 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return Object.prototype.toString.call(x) === '[object Number]'; }; + var _isObject = function _isObject(x) { + return Object.prototype.toString.call(x) === '[object Object]'; + }; + + var _isPlaceholder = function _isPlaceholder(a) { + return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true; + }; + + var _isRegExp = function _isRegExp(x) { + return Object.prototype.toString.call(x) === '[object RegExp]'; + }; + var _isString = function _isString(x) { return Object.prototype.toString.call(x) === '[object String]'; }; @@ -8656,15 +7082,21 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return typeof obj['@@transducer/step'] === 'function'; }; - var _map = function _map(fn, list) { - var idx = 0, len = list.length, result = Array(len); + var _map = function _map(fn, functor) { + var idx = 0; + var len = functor.length; + var result = Array(len); while (idx < len) { - result[idx] = fn(list[idx]); + result[idx] = fn(functor[idx]); idx += 1; } return result; }; + var _of = function _of(x) { + return [x]; + }; + var _pipe = function _pipe(f, g) { return function () { return g.call(this, f.apply(this, arguments)); @@ -8680,8 +7112,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; }; + // \b matches word boundary; [\b] matches backspace var _quote = function _quote(s) { - return '"' + s.replace(/"/g, '\\"') + '"'; + var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace + .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0'); + return '"' + escaped.replace(/"/g, '\\"') + '"'; }; var _reduced = function _reduced(x) { @@ -8740,34 +7175,6 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; }(); - var _xdropRepeatsWith = function () { - function XDropRepeatsWith(pred, xf) { - this.xf = xf; - this.pred = pred; - this.lastValue = undefined; - this.seenFirstValue = false; - } - XDropRepeatsWith.prototype['@@transducer/init'] = function () { - return this.xf['@@transducer/init'](); - }; - XDropRepeatsWith.prototype['@@transducer/result'] = function (result) { - return this.xf['@@transducer/result'](result); - }; - XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) { - var sameAsLast = false; - if (!this.seenFirstValue) { - this.seenFirstValue = true; - } else if (this.pred(this.lastValue, input)) { - sameAsLast = true; - } - this.lastValue = input; - return sameAsLast ? result : this.xf['@@transducer/step'](result, input); - }; - return _curry2(function _xdropRepeatsWith(pred, xf) { - return new XDropRepeatsWith(pred, xf); - }); - }(); - var _xfBase = { init: function () { return this.xf['@@transducer/init'](); @@ -8777,15 +7184,412 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack } }; - var _xfilter = function () { - function XFilter(f, xf) { - this.xf = xf; - this.f = f; + var _xwrap = function () { + function XWrap(fn) { + this.f = fn; } - XFilter.prototype['@@transducer/init'] = _xfBase.init; - XFilter.prototype['@@transducer/result'] = _xfBase.result; - XFilter.prototype['@@transducer/step'] = function (result, input) { - return this.f(input) ? this.xf['@@transducer/step'](result, input) : result; + XWrap.prototype['@@transducer/init'] = function () { + throw new Error('init not implemented on XWrap'); + }; + XWrap.prototype['@@transducer/result'] = function (acc) { + return acc; + }; + XWrap.prototype['@@transducer/step'] = function (acc, x) { + return this.f(acc, x); + }; + return function _xwrap(fn) { + return new XWrap(fn); + }; + }(); + + var _aperture = function _aperture(n, list) { + var idx = 0; + var limit = list.length - (n - 1); + var acc = new Array(limit >= 0 ? limit : 0); + while (idx < limit) { + acc[idx] = _slice(list, idx, idx + n); + idx += 1; + } + return acc; + }; + + /** + * Similar to hasMethod, this checks whether a function has a [methodname] + * function. If it isn't an array it will execute that function otherwise it + * will default to the ramda implementation. + * + * @private + * @param {Function} fn ramda implemtation + * @param {String} methodname property to check for a custom implementation + * @return {Object} Whatever the return value of the method is. + */ + var _checkForMethod = function _checkForMethod(methodname, fn) { + return function () { + var length = arguments.length; + if (length === 0) { + return fn(); + } + var obj = arguments[length - 1]; + return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, _slice(arguments, 0, length - 1)); + }; + }; + + /** + * Optimized internal one-arity curry function. + * + * @private + * @category Function + * @param {Function} fn The function to curry. + * @return {Function} The curried function. + */ + var _curry1 = function _curry1(fn) { + return function f1(a) { + if (arguments.length === 0 || _isPlaceholder(a)) { + return f1; + } else { + return fn.apply(this, arguments); + } + }; + }; + + /** + * Optimized internal two-arity curry function. + * + * @private + * @category Function + * @param {Function} fn The function to curry. + * @return {Function} The curried function. + */ + var _curry2 = function _curry2(fn) { + return function f2(a, b) { + switch (arguments.length) { + case 0: + return f2; + case 1: + return _isPlaceholder(a) ? f2 : _curry1(function (_b) { + return fn(a, _b); + }); + default: + return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) { + return fn(_a, b); + }) : _isPlaceholder(b) ? _curry1(function (_b) { + return fn(a, _b); + }) : fn(a, b); + } + }; + }; + + /** + * Optimized internal three-arity curry function. + * + * @private + * @category Function + * @param {Function} fn The function to curry. + * @return {Function} The curried function. + */ + var _curry3 = function _curry3(fn) { + return function f3(a, b, c) { + switch (arguments.length) { + case 0: + return f3; + case 1: + return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) { + return fn(a, _b, _c); + }); + case 2: + return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) { + return fn(_a, b, _c); + }) : _isPlaceholder(b) ? _curry2(function (_b, _c) { + return fn(a, _b, _c); + }) : _curry1(function (_c) { + return fn(a, b, _c); + }); + default: + return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) { + return fn(_a, _b, c); + }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) { + return fn(_a, b, _c); + }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) { + return fn(a, _b, _c); + }) : _isPlaceholder(a) ? _curry1(function (_a) { + return fn(_a, b, c); + }) : _isPlaceholder(b) ? _curry1(function (_b) { + return fn(a, _b, c); + }) : _isPlaceholder(c) ? _curry1(function (_c) { + return fn(a, b, _c); + }) : fn(a, b, c); + } + }; + }; + + /** + * Internal curryN function. + * + * @private + * @category Function + * @param {Number} length The arity of the curried function. + * @param {Array} received An array of arguments received thus far. + * @param {Function} fn The function to curry. + * @return {Function} The curried function. + */ + var _curryN = function _curryN(length, received, fn) { + return function () { + var combined = []; + var argsIdx = 0; + var left = length; + var combinedIdx = 0; + while (combinedIdx < received.length || argsIdx < arguments.length) { + var result; + if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) { + result = received[combinedIdx]; + } else { + result = arguments[argsIdx]; + argsIdx += 1; + } + combined[combinedIdx] = result; + if (!_isPlaceholder(result)) { + left -= 1; + } + combinedIdx += 1; + } + return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn)); + }; + }; + + /** + * Returns a function that dispatches with different strategies based on the + * object in list position (last argument). If it is an array, executes [fn]. + * Otherwise, if it has a function with [methodname], it will execute that + * function (functor case). Otherwise, if it is a transformer, uses transducer + * [xf] to return a new transformer (transducer case). Otherwise, it will + * default to executing [fn]. + * + * @private + * @param {String} methodname property to check for a custom implementation + * @param {Function} xf transducer to initialize if object is transformer + * @param {Function} fn default ramda implementation + * @return {Function} A function that dispatches on object in list position + */ + var _dispatchable = function _dispatchable(methodname, xf, fn) { + return function () { + var length = arguments.length; + if (length === 0) { + return fn(); + } + var obj = arguments[length - 1]; + if (!_isArray(obj)) { + var args = _slice(arguments, 0, length - 1); + if (typeof obj[methodname] === 'function') { + return obj[methodname].apply(obj, args); + } + if (_isTransformer(obj)) { + var transducer = xf.apply(null, args); + return transducer(obj); + } + } + return fn.apply(this, arguments); + }; + }; + + var _dropLastWhile = function dropLastWhile(pred, list) { + var idx = list.length - 1; + while (idx >= 0 && pred(list[idx])) { + idx -= 1; + } + return _slice(list, 0, idx + 1); + }; + + var _xall = function () { + function XAll(f, xf) { + this.xf = xf; + this.f = f; + this.all = true; + } + XAll.prototype['@@transducer/init'] = _xfBase.init; + XAll.prototype['@@transducer/result'] = function (result) { + if (this.all) { + result = this.xf['@@transducer/step'](result, true); + } + return this.xf['@@transducer/result'](result); + }; + XAll.prototype['@@transducer/step'] = function (result, input) { + if (!this.f(input)) { + this.all = false; + result = _reduced(this.xf['@@transducer/step'](result, false)); + } + return result; + }; + return _curry2(function _xall(f, xf) { + return new XAll(f, xf); + }); + }(); + + var _xany = function () { + function XAny(f, xf) { + this.xf = xf; + this.f = f; + this.any = false; + } + XAny.prototype['@@transducer/init'] = _xfBase.init; + XAny.prototype['@@transducer/result'] = function (result) { + if (!this.any) { + result = this.xf['@@transducer/step'](result, false); + } + return this.xf['@@transducer/result'](result); + }; + XAny.prototype['@@transducer/step'] = function (result, input) { + if (this.f(input)) { + this.any = true; + result = _reduced(this.xf['@@transducer/step'](result, true)); + } + return result; + }; + return _curry2(function _xany(f, xf) { + return new XAny(f, xf); + }); + }(); + + var _xaperture = function () { + function XAperture(n, xf) { + this.xf = xf; + this.pos = 0; + this.full = false; + this.acc = new Array(n); + } + XAperture.prototype['@@transducer/init'] = _xfBase.init; + XAperture.prototype['@@transducer/result'] = function (result) { + this.acc = null; + return this.xf['@@transducer/result'](result); + }; + XAperture.prototype['@@transducer/step'] = function (result, input) { + this.store(input); + return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result; + }; + XAperture.prototype.store = function (input) { + this.acc[this.pos] = input; + this.pos += 1; + if (this.pos === this.acc.length) { + this.pos = 0; + this.full = true; + } + }; + XAperture.prototype.getCopy = function () { + return _concat(_slice(this.acc, this.pos), _slice(this.acc, 0, this.pos)); + }; + return _curry2(function _xaperture(n, xf) { + return new XAperture(n, xf); + }); + }(); + + var _xdrop = function () { + function XDrop(n, xf) { + this.xf = xf; + this.n = n; + } + XDrop.prototype['@@transducer/init'] = _xfBase.init; + XDrop.prototype['@@transducer/result'] = _xfBase.result; + XDrop.prototype['@@transducer/step'] = function (result, input) { + if (this.n > 0) { + this.n -= 1; + return result; + } + return this.xf['@@transducer/step'](result, input); + }; + return _curry2(function _xdrop(n, xf) { + return new XDrop(n, xf); + }); + }(); + + var _xdropLast = function () { + function XDropLast(n, xf) { + this.xf = xf; + this.pos = 0; + this.full = false; + this.acc = new Array(n); + } + XDropLast.prototype['@@transducer/init'] = _xfBase.init; + XDropLast.prototype['@@transducer/result'] = function (result) { + this.acc = null; + return this.xf['@@transducer/result'](result); + }; + XDropLast.prototype['@@transducer/step'] = function (result, input) { + if (this.full) { + result = this.xf['@@transducer/step'](result, this.acc[this.pos]); + } + this.store(input); + return result; + }; + XDropLast.prototype.store = function (input) { + this.acc[this.pos] = input; + this.pos += 1; + if (this.pos === this.acc.length) { + this.pos = 0; + this.full = true; + } + }; + return _curry2(function _xdropLast(n, xf) { + return new XDropLast(n, xf); + }); + }(); + + var _xdropRepeatsWith = function () { + function XDropRepeatsWith(pred, xf) { + this.xf = xf; + this.pred = pred; + this.lastValue = undefined; + this.seenFirstValue = false; + } + XDropRepeatsWith.prototype['@@transducer/init'] = function () { + return this.xf['@@transducer/init'](); + }; + XDropRepeatsWith.prototype['@@transducer/result'] = function (result) { + return this.xf['@@transducer/result'](result); + }; + XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) { + var sameAsLast = false; + if (!this.seenFirstValue) { + this.seenFirstValue = true; + } else if (this.pred(this.lastValue, input)) { + sameAsLast = true; + } + this.lastValue = input; + return sameAsLast ? result : this.xf['@@transducer/step'](result, input); + }; + return _curry2(function _xdropRepeatsWith(pred, xf) { + return new XDropRepeatsWith(pred, xf); + }); + }(); + + var _xdropWhile = function () { + function XDropWhile(f, xf) { + this.xf = xf; + this.f = f; + } + XDropWhile.prototype['@@transducer/init'] = _xfBase.init; + XDropWhile.prototype['@@transducer/result'] = _xfBase.result; + XDropWhile.prototype['@@transducer/step'] = function (result, input) { + if (this.f) { + if (this.f(input)) { + return result; + } + this.f = null; + } + return this.xf['@@transducer/step'](result, input); + }; + return _curry2(function _xdropWhile(f, xf) { + return new XDropWhile(f, xf); + }); + }(); + + var _xfilter = function () { + function XFilter(f, xf) { + this.xf = xf; + this.f = f; + } + XFilter.prototype['@@transducer/init'] = _xfBase.init; + XFilter.prototype['@@transducer/result'] = _xfBase.result; + XFilter.prototype['@@transducer/step'] = function (result, input) { + return this.f(input) ? this.xf['@@transducer/step'](result, input) : result; }; return _curry2(function _xfilter(f, xf) { return new XFilter(f, xf); @@ -8937,29 +7741,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); }(); - var _xwrap = function () { - function XWrap(fn) { - this.f = fn; - } - XWrap.prototype['@@transducer/init'] = function () { - throw new Error('init not implemented on XWrap'); - }; - XWrap.prototype['@@transducer/result'] = function (acc) { - return acc; - }; - XWrap.prototype['@@transducer/step'] = function (acc, x) { - return this.f(acc, x); - }; - return function _xwrap(fn) { - return new XWrap(fn); - }; - }(); - /** * Adds two numbers. Equivalent to `a + b` but curried. * * @func * @memberOf R + * @since v0.1.0 * @category Math * @sig Number -> Number -> Number * @param {Number} a @@ -8976,13 +7763,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Applies a function to the value at the given index of an array, - * returning a new copy of the array with the element at the given - * index replaced with the result of the function application. - * @see R.update + * Applies a function to the value at the given index of an array, returning a + * new copy of the array with the element at the given index replaced with the + * result of the function application. * * @func * @memberOf R + * @since v0.14.0 * @category List * @sig (a -> a) -> Number -> [a] -> [a] * @param {Function} fn The function to apply. @@ -8992,6 +7779,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {Array} A copy of the supplied array-like object with * the element at index `idx` replaced with the value * returned by applying `fn` to the existing element. + * @see R.update * @example * * R.adjust(R.add(10), 1, [0, 1, 2]); //=> [0, 11, 2] @@ -9008,15 +7796,52 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return _list; }); + /** + * Returns `true` if all elements of the list match the predicate, `false` if + * there are any that don't. + * + * Dispatches to the `all` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is satisfied by every element, `false` + * otherwise. + * @see R.any, R.none, R.transduce + * @example + * + * var lessThan2 = R.flip(R.lt)(2); + * var lessThan3 = R.flip(R.lt)(3); + * R.all(lessThan2)([1, 2]); //=> false + * R.all(lessThan3)([1, 2]); //=> true + */ + var all = _curry2(_dispatchable('all', _xall, function all(fn, list) { + var idx = 0; + while (idx < list.length) { + if (!fn(list[idx])) { + return false; + } + idx += 1; + } + return true; + })); + /** * Returns a function that always returns the given value. Note that for * non-primitives the value returned is a reference to the original value. * - * This function is known as `const`, `constant`, or `K` (for K combinator) - * in other languages and libraries. + * This function is known as `const`, `constant`, or `K` (for K combinator) in + * other languages and libraries. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig a -> (* -> a) * @param {*} val The value to wrap in a function @@ -9033,39 +7858,96 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list, composed of n-tuples of consecutive elements - * If `n` is greater than the length of the list, an empty list is returned. + * Returns `true` if both arguments are `true`; `false` otherwise. * * @func * @memberOf R - * @category List - * @sig Number -> [a] -> [[a]] - * @param {Number} n The size of the tuples to create - * @param {Array} list The list to split into `n`-tuples - * @return {Array} The new list. + * @since v0.1.0 + * @category Logic + * @sig * -> * -> * + * @param {Boolean} a A boolean value + * @param {Boolean} b A boolean value + * @return {Boolean} `true` if both arguments are `true`, `false` otherwise + * @see R.both * @example * - * R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]] - * R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]] - * R.aperture(7, [1, 2, 3, 4, 5]); //=> [] + * R.and(true, true); //=> true + * R.and(true, false); //=> false + * R.and(false, true); //=> false + * R.and(false, false); //=> false */ - var aperture = _curry2(function aperture(n, list) { - var idx = 0; - var limit = list.length - (n - 1); - var acc = new Array(limit >= 0 ? limit : 0); - while (idx < limit) { - acc[idx] = _slice(list, idx, idx + n); - idx += 1; - } - return acc; + var and = _curry2(function and(a, b) { + return a && b; }); /** - * Returns a new list containing the contents of the given list, followed by the given - * element. + * Returns `true` if at least one of elements of the list match the predicate, + * `false` otherwise. + * + * Dispatches to the `any` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R + * @since v0.1.0 + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false` + * otherwise. + * @see R.all, R.none, R.transduce + * @example + * + * var lessThan0 = R.flip(R.lt)(0); + * var lessThan2 = R.flip(R.lt)(2); + * R.any(lessThan0)([1, 2]); //=> false + * R.any(lessThan2)([1, 2]); //=> true + */ + var any = _curry2(_dispatchable('any', _xany, function any(fn, list) { + var idx = 0; + while (idx < list.length) { + if (fn(list[idx])) { + return true; + } + idx += 1; + } + return false; + })); + + /** + * Returns a new list, composed of n-tuples of consecutive elements If `n` is + * greater than the length of the list, an empty list is returned. + * + * Dispatches to the `aperture` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since v0.12.0 + * @category List + * @sig Number -> [a] -> [[a]] + * @param {Number} n The size of the tuples to create + * @param {Array} list The list to split into `n`-tuples + * @return {Array} The new list. + * @see R.transduce + * @example + * + * R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]] + * R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]] + * R.aperture(7, [1, 2, 3, 4, 5]); //=> [] + */ + var aperture = _curry2(_dispatchable('aperture', _xaperture, _aperture)); + + /** + * Returns a new list containing the contents of the given list, followed by + * the given element. + * + * @func + * @memberOf R + * @since v0.1.0 * @category List * @sig a -> [a] -> [a] * @param {*} el The element to add to the end of the new list. @@ -9085,11 +7967,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /** * Applies function `fn` to the argument list `args`. This is useful for - * creating a fixed-arity function from a variadic function. `fn` should - * be a bound function if context is significant. + * creating a fixed-arity function from a variadic function. `fn` should be a + * bound function if context is significant. * * @func * @memberOf R + * @since v0.7.0 * @category Function * @sig (*... -> a) -> [*] -> a * @param {Function} fn @@ -9107,12 +7990,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /** * Makes a shallow clone of an object, setting or overriding the specified - * property with the given value. Note that this copies and flattens - * prototype properties onto the new object as well. All non-primitive - * properties are copied by reference. + * property with the given value. Note that this copies and flattens prototype + * properties onto the new object as well. All non-primitive properties are + * copied by reference. * * @func * @memberOf R + * @since v0.8.0 * @category Object * @sig String -> a -> {k: v} -> {k: v} * @param {String} prop the property name to set @@ -9134,14 +8018,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Makes a shallow clone of an object, setting or overriding the nodes - * required to create the given path, and placing the specific value at the - * tail end of that path. Note that this copies and flattens prototype - * properties onto the new object as well. All non-primitive properties - * are copied by reference. + * Makes a shallow clone of an object, setting or overriding the nodes required + * to create the given path, and placing the specific value at the tail end of + * that path. Note that this copies and flattens prototype properties onto the + * new object as well. All non-primitive properties are copied by reference. * * @func * @memberOf R + * @since v0.8.0 * @category Object * @sig [String] -> a -> {k: v} -> {k: v} * @param {Array} path the path to set @@ -9156,7 +8040,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var assocPath = _curry3(function assocPath(path, val, obj) { switch (path.length) { case 0: - return obj; + return val; case 1: return assoc(path[0], val, obj); default: @@ -9171,13 +8055,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.6.0 * @category Function * @category Object - * @see R.partial * @sig (* -> *) -> {*} -> (* -> *) * @param {Function} fn The function to bind to context * @param {Object} thisObj The context to bind `fn` to * @return {Function} A function that will execute in the context of `thisObj`. + * @see R.partial */ var bind = _curry2(function bind(fn, thisObj) { return _arity(fn.length, function () { @@ -9186,13 +8071,15 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * A function wrapping calls to the two functions in an `&&` operation, returning the result of the first - * function if it is false-y and the result of the second function otherwise. Note that this is - * short-circuited, meaning that the second function will not be invoked if the first returns a false-y - * value. + * A function wrapping calls to the two functions in an `&&` operation, + * returning the result of the first function if it is false-y and the result + * of the second function otherwise. Note that this is short-circuited, + * meaning that the second function will not be invoked if the first returns a + * false-y value. * * @func * @memberOf R + * @since v0.12.0 * @category Logic * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) * @param {Function} f a predicate @@ -9201,8 +8088,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.and * @example * - * var gt10 = function(x) { return x > 10; }; - * var even = function(x) { return x % 2 === 0 }; + * var gt10 = x => x > 10; + * var even = x => x % 2 === 0; * var f = R.both(gt10, even); * f(100); //=> true * f(101); //=> false @@ -9214,19 +8101,19 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Makes a comparator function out of a function that reports whether the first element is less than the second. + * Makes a comparator function out of a function that reports whether the first + * element is less than the second. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (a, b -> Boolean) -> (a, b -> Number) * @param {Function} pred A predicate function of arity two. * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`. * @example * - * var cmp = R.comparator(function(a, b) { - * return a.age < b.age; - * }); + * var cmp = R.comparator((a, b) => a.age < b.age); * var people = [ * // ... * ]; @@ -9238,41 +8125,17 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; }); - /** - * Takes a function `f` and returns a function `g` such that: - * - * - applying `g` to zero or more arguments will give __true__ if applying - * the same arguments to `f` gives a logical __false__ value; and - * - * - applying `g` to zero or more arguments will give __false__ if applying - * the same arguments to `f` gives a logical __true__ value. - * - * @func - * @memberOf R - * @category Logic - * @sig (*... -> *) -> (*... -> Boolean) - * @param {Function} f - * @return {Function} - * @see R.not - * @example - * - * var isEven = function(n) { return n % 2 === 0; }; - * var isOdd = R.complement(isEven); - * isOdd(21); //=> true - * isOdd(42); //=> false - */ - var complement = _curry1(_complement); - /** * Returns a function, `fn`, which encapsulates if/else-if/else logic. - * `R.cond` takes a list of [predicate, transform] pairs. All of the - * arguments to `fn` are applied to each of the predicates in turn - * until one returns a "truthy" value, at which point `fn` returns the - * result of applying its arguments to the corresponding transformer. - * If none of the predicates matches, `fn` returns undefined. + * `R.cond` takes a list of [predicate, transform] pairs. All of the arguments + * to `fn` are applied to each of the predicates in turn until one returns a + * "truthy" value, at which point `fn` returns the result of applying its + * arguments to the corresponding transformer. If none of the predicates + * matches, `fn` returns undefined. * * @func * @memberOf R + * @since v0.6.0 * @category Logic * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *) * @param {Array} pairs @@ -9282,7 +8145,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * var fn = R.cond([ * [R.equals(0), R.always('water freezes at 0°C')], * [R.equals(100), R.always('water boils at 100°C')], - * [R.T, function(temp) { return 'nothing special happens at ' + temp + '°C'; }] + * [R.T, temp => 'nothing special happens at ' + temp + '°C'] * ]); * fn(0); //=> 'water freezes at 0°C' * fn(50); //=> 'nothing special happens at 50°C' @@ -9301,34 +8164,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns `true` if the `x` is found in the `list`, using `pred` as an - * equality predicate for `x`. - * - * @func - * @memberOf R - * @category List - * @sig (a, a -> Boolean) -> a -> [a] -> Boolean - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {*} x The item to find - * @param {Array} list The list to iterate over - * @return {Boolean} `true` if `x` is in `list`, else `false`. - * @example - * - * var xs = [{x: 12}, {x: 11}, {x: 10}]; - * R.containsWith(function(a, b) { return a.x === b.x; }, {x: 10}, xs); //=> true - * R.containsWith(function(a, b) { return a.x === b.x; }, {x: 1}, xs); //=> false - */ - var containsWith = _curry3(_containsWith); - - /** - * Counts the elements of a list according to how many match each value - * of a key generated by the supplied function. Returns an object - * mapping the keys produced by `fn` to the number of occurrences in - * the list. Note that all keys are coerced to strings because of how - * JavaScript objects work. + * Counts the elements of a list according to how many match each value of a + * key generated by the supplied function. Returns an object mapping the keys + * produced by `fn` to the number of occurrences in the list. Note that all + * keys are coerced to strings because of how JavaScript objects work. * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig (a -> String) -> [a] -> {*} * @param {Function} fn The function used to map values to keys. @@ -9354,34 +8197,10 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Creates an object containing a single key:value pair. - * - * @func - * @memberOf R - * @category Object - * @sig String -> a -> {String:a} - * @param {String} key - * @param {*} val - * @return {Object} - * @example - * - * var matchPhrases = R.compose( - * R.createMapEntry('must'), - * R.map(R.createMapEntry('match_phrase')) - * ); - * matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]} - */ - var createMapEntry = _curry2(function createMapEntry(key, val) { - var obj = {}; - obj[key] = val; - return obj; - }); - - /** - * Returns a curried equivalent of the provided function, with the - * specified arity. The curried function has two unusual capabilities. - * First, its arguments needn't be provided one at a time. If `g` is - * `R.curryN(3, f)`, the following are equivalent: + * Returns a curried equivalent of the provided function, with the specified + * arity. The curried function has two unusual capabilities. First, its + * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the + * following are equivalent: * * - `g(1)(2)(3)` * - `g(1)(2, 3)` @@ -9390,8 +8209,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * Secondly, the special placeholder value `R.__` may be used to specify * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is `R.__`, - * the following are equivalent: + * regardless of their positions. If `g` is as above and `_` is `R.__`, the + * following are equivalent: * * - `g(1, 2, 3)` * - `g(_, 2, 3)(1)` @@ -9403,6 +8222,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.5.0 * @category Function * @sig Number -> (* -> a) -> (* -> a) * @param {Number} length The arity for the returned function. @@ -9411,11 +8231,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.curry * @example * - * var addFourNumbers = function() { - * return R.sum([].slice.call(arguments, 0, 4)); - * }; + * var sumArgs = (...args) => R.sum(args); * - * var curriedAddFourNumbers = R.curryN(4, addFourNumbers); + * var curriedAddFourNumbers = R.curryN(4, sumArgs); * var f = curriedAddFourNumbers(1, 2); * var g = f(3); * g(4); //=> 10 @@ -9432,6 +8250,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.9.0 * @category Math * @sig Number -> Number * @param {Number} n @@ -9444,11 +8263,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var dec = add(-1); /** - * Returns the second argument if it is not null or undefined. If it is null - * or undefined, the first (default) argument is returned. + * Returns the second argument if it is not `null`, `undefined` or `NaN` + * otherwise the first argument is returned. * * @func * @memberOf R + * @since v0.10.0 * @category Logic * @sig a -> b -> a | b * @param {a} val The default value. @@ -9456,33 +8276,35 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {*} The the second value or the default value * @example * - * var defaultTo42 = defaultTo(42); + * var defaultTo42 = R.defaultTo(42); * * defaultTo42(null); //=> 42 * defaultTo42(undefined); //=> 42 * defaultTo42('Ramda'); //=> 'Ramda' + * defaultTo42(parseInt('string')); //=> 42 */ var defaultTo = _curry2(function defaultTo(d, v) { - return v == null ? d : v; + return v == null || v !== v ? d : v; }); /** - * Finds the set (i.e. no duplicates) of all elements in the first list not contained in the second list. - * Duplication is determined according to the value returned by applying the supplied predicate to two list - * elements. + * Finds the set (i.e. no duplicates) of all elements in the first list not + * contained in the second list. Duplication is determined according to the + * value returned by applying the supplied predicate to two list elements. * * @func * @memberOf R + * @since v0.1.0 * @category Relation - * @sig (a,a -> Boolean) -> [a] -> [a] -> [a] + * @sig (a -> a -> Boolean) -> [*] -> [*] -> [*] * @param {Function} pred A predicate used to test whether two items are equal. * @param {Array} list1 The first list. * @param {Array} list2 The second list. - * @see R.difference * @return {Array} The elements in `list1` that are not in `list2`. + * @see R.difference * @example * - * function cmp(x, y) { return x.a === y.a; } + * function cmp(x, y) => x.a === y.a; * var l1 = [{a: 1}, {a: 2}, {a: 3}]; * var l2 = [{a: 3}, {a: 4}]; * R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}] @@ -9491,10 +8313,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var out = []; var idx = 0; var firstLen = first.length; - var containsPred = containsWith(pred); while (idx < firstLen) { - if (!containsPred(first[idx], second) && !containsPred(first[idx], out)) { - out[out.length] = first[idx]; + if (!_containsWith(pred, first[idx], second) && !_containsWith(pred, first[idx], out)) { + out.push(first[idx]); } idx += 1; } @@ -9506,6 +8327,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.10.0 * @category Object * @sig String -> {k: v} -> {k: v} * @param {String} prop the name of the property to dissociate @@ -9527,13 +8349,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Makes a shallow clone of an object, omitting the property at the - * given path. Note that this copies and flattens prototype properties - * onto the new object as well. All non-primitive properties are copied - * by reference. + * Makes a shallow clone of an object, omitting the property at the given path. + * Note that this copies and flattens prototype properties onto the new object + * as well. All non-primitive properties are copied by reference. * * @func * @memberOf R + * @since v0.11.0 * @category Object * @sig [String] -> {k: v} -> {k: v} * @param {Array} path the path to set @@ -9562,6 +8384,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Math * @sig Number -> Number -> Number * @param {Number} a The first value. @@ -9583,43 +8406,49 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list containing all but last the`n` elements of a given list, - * passing each value from the right to the supplied predicate function, skipping - * elements while the predicate function returns `true`. The predicate function - * is passed one argument: (value)*. + * Returns a new list containing the last `n` elements of a given list, passing + * each value to the supplied predicate function, skipping elements while the + * predicate function returns `true`. The predicate function is passed one + * argument: *(value)*. + * + * Dispatches to the `dropWhile` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. * * @func * @memberOf R + * @since v0.9.0 * @category List * @sig (a -> Boolean) -> [a] -> [a] * @param {Function} fn The function called per iteration. * @param {Array} list The collection to iterate over. * @return {Array} A new array. - * @see R.takeLastWhile + * @see R.takeWhile, R.transduce, R.addIndex * @example * - * var lteThree = function(x) { - * return x <= 3; - * }; + * var lteTwo = x => x <= 2; * - * R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2] + * R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1] */ - var dropLastWhile = _curry2(function dropLastWhile(pred, list) { - var idx = list.length - 1; - while (idx >= 0 && pred(list[idx])) { - idx -= 1; + var dropWhile = _curry2(_dispatchable('dropWhile', _xdropWhile, function dropWhile(pred, list) { + var idx = 0; + var len = list.length; + while (idx < len && pred(list[idx])) { + idx += 1; } - return _slice(list, 0, idx + 1); - }); + return _slice(list, idx); + })); /** - * A function wrapping calls to the two functions in an `||` operation, returning the result of the first - * function if it is truth-y and the result of the second function otherwise. Note that this is - * short-circuited, meaning that the second function will not be invoked if the first returns a truth-y - * value. + * A function wrapping calls to the two functions in an `||` operation, + * returning the result of the first function if it is truth-y and the result + * of the second function otherwise. Note that this is short-circuited, + * meaning that the second function will not be invoked if the first returns a + * truth-y value. * * @func * @memberOf R + * @since v0.12.0 * @category Logic * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) * @param {Function} f a predicate @@ -9628,8 +8457,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.or * @example * - * var gt10 = function(x) { return x > 10; }; - * var even = function(x) { return x % 2 === 0 }; + * var gt10 = x => x > 10; + * var even = x => x % 2 === 0; * var f = R.either(gt10, even); * f(101); //=> true * f(8); //=> true @@ -9642,11 +8471,15 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /** * Returns the empty value of its argument's type. Ramda defines the empty - * value of Array (`[]`), Object (`{}`), and String (`''`). Other types are - * supported if they define `.empty` and/or `.prototype.empty`. + * value of Array (`[]`), Object (`{}`), String (`''`), and Arguments. Other + * types are supported if they define `.empty` and/or + * `.prototype.empty`. + * + * Dispatches to the `empty` method of the first argument, if present. * * @func * @memberOf R + * @since v0.3.0 * @category Function * @sig a -> a * @param {*} x @@ -9658,32 +8491,25 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.empty('unicorns'); //=> '' * R.empty({x: 1, y: 2}); //=> {} */ + // else var empty = _curry1(function empty(x) { - if (x != null && typeof x.empty === 'function') { - return x.empty(); - } else if (x != null && typeof x.constructor != null && typeof x.constructor.empty === 'function') { - return x.constructor.empty(); - } else { - switch (Object.prototype.toString.call(x)) { - case '[object Array]': - return []; - case '[object Object]': - return {}; - case '[object String]': - return ''; - } - } + return x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : _isArray(x) ? [] : _isString(x) ? '' : _isObject(x) ? {} : _isArguments(x) ? function () { + return arguments; + }() : // else + void 0; }); /** - * Creates a new object by recursively evolving a shallow copy of `object`, according to the - * `transformation` functions. All non-primitive properties are copied by reference. + * Creates a new object by recursively evolving a shallow copy of `object`, + * according to the `transformation` functions. All non-primitive properties + * are copied by reference. * - * A `tranformation` function will not be invoked if its corresponding key does not exist in - * the evolved object. + * A `transformation` function will not be invoked if its corresponding key + * does not exist in the evolved object. * * @func * @memberOf R + * @since v0.9.0 * @category Object * @sig {k: (v -> v)} -> {k: v} -> {k: v} * @param {Object} transformations The object specifying transformation functions to apply @@ -9701,7 +8527,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123} */ var evolve = _curry2(function evolve(transformations, object) { - var transformation, key, type, result = {}; + var result = {}; + var transformation, key, type; for (key in object) { transformation = transformations[key]; type = typeof transformation; @@ -9710,22 +8537,208 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return result; }); + /** + * Returns the first element of the list which matches the predicate, or + * `undefined` if no element matches. + * + * Dispatches to the `find` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category List + * @sig (a -> Boolean) -> [a] -> a | undefined + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Object} The element found, or `undefined`. + * @see R.transduce + * @example + * + * var xs = [{a: 1}, {a: 2}, {a: 3}]; + * R.find(R.propEq('a', 2))(xs); //=> {a: 2} + * R.find(R.propEq('a', 4))(xs); //=> undefined + */ + var find = _curry2(_dispatchable('find', _xfind, function find(fn, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + if (fn(list[idx])) { + return list[idx]; + } + idx += 1; + } + })); + + /** + * Returns the index of the first element of the list which matches the + * predicate, or `-1` if no element matches. + * + * Dispatches to the `findIndex` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since v0.1.1 + * @category List + * @sig (a -> Boolean) -> [a] -> Number + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Number} The index of the element found, or `-1`. + * @see R.transduce + * @example + * + * var xs = [{a: 1}, {a: 2}, {a: 3}]; + * R.findIndex(R.propEq('a', 2))(xs); //=> 1 + * R.findIndex(R.propEq('a', 4))(xs); //=> -1 + */ + var findIndex = _curry2(_dispatchable('findIndex', _xfindIndex, function findIndex(fn, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + if (fn(list[idx])) { + return idx; + } + idx += 1; + } + return -1; + })); + + /** + * Returns the last element of the list which matches the predicate, or + * `undefined` if no element matches. + * + * Dispatches to the `findLast` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since v0.1.1 + * @category List + * @sig (a -> Boolean) -> [a] -> a | undefined + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Object} The element found, or `undefined`. + * @see R.transduce + * @example + * + * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; + * R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1} + * R.findLast(R.propEq('a', 4))(xs); //=> undefined + */ + var findLast = _curry2(_dispatchable('findLast', _xfindLast, function findLast(fn, list) { + var idx = list.length - 1; + while (idx >= 0) { + if (fn(list[idx])) { + return list[idx]; + } + idx -= 1; + } + })); + + /** + * Returns the index of the last element of the list which matches the + * predicate, or `-1` if no element matches. + * + * Dispatches to the `findLastIndex` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since v0.1.1 + * @category List + * @sig (a -> Boolean) -> [a] -> Number + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Number} The index of the element found, or `-1`. + * @see R.transduce + * @example + * + * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; + * R.findLastIndex(R.propEq('a', 1))(xs); //=> 1 + * R.findLastIndex(R.propEq('a', 4))(xs); //=> -1 + */ + var findLastIndex = _curry2(_dispatchable('findLastIndex', _xfindLastIndex, function findLastIndex(fn, list) { + var idx = list.length - 1; + while (idx >= 0) { + if (fn(list[idx])) { + return idx; + } + idx -= 1; + } + return -1; + })); + + /** + * Iterate over an input `list`, calling a provided function `fn` for each + * element in the list. + * + * `fn` receives one argument: *(value)*. + * + * Note: `R.forEach` does not skip deleted or unassigned indices (sparse + * arrays), unlike the native `Array.prototype.forEach` method. For more + * details on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description + * + * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns + * the original array. In some libraries this function is named `each`. + * + * Dispatches to the `forEach` method of the second argument, if present. + * + * @func + * @memberOf R + * @since v0.1.1 + * @category List + * @sig (a -> *) -> [a] -> [a] + * @param {Function} fn The function to invoke. Receives one argument, `value`. + * @param {Array} list The list to iterate over. + * @return {Array} The original list. + * @see R.addIndex + * @example + * + * var printXPlusFive = x => console.log(x + 5); + * R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3] + * //-> 6 + * //-> 7 + * //-> 8 + */ + var forEach = _curry2(_checkForMethod('forEach', function forEach(fn, list) { + var len = list.length; + var idx = 0; + while (idx < len) { + fn(list[idx]); + idx += 1; + } + return list; + })); + /** * Creates a new object out of a list key-value pairs. * * @func * @memberOf R + * @since v0.3.0 * @category List * @sig [[k,v]] -> {k: v} * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object. * @return {Object} The object made by pairing up `keys` and `values`. - * @see R.toPairs + * @see R.toPairs, R.pair * @example * * R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3} */ var fromPairs = _curry1(function fromPairs(pairs) { - var idx = 0, len = pairs.length, out = {}; + var idx = 0; + var len = pairs.length; + var out = {}; while (idx < len) { if (_isArray(pairs[idx]) && pairs[idx].length) { out[pairs[idx][0]] = pairs[idx][1]; @@ -9736,11 +8749,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns `true` if the first argument is greater than the second; - * `false` otherwise. + * Returns `true` if the first argument is greater than the second; `false` + * otherwise. * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig Ord a => a -> a -> Boolean * @param {*} a @@ -9765,6 +8779,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig Ord a => a -> a -> Boolean * @param {Number} a @@ -9784,11 +8799,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns whether or not an object has an own property with - * the specified name + * Returns whether or not an object has an own property with the specified name * * @func * @memberOf R + * @since v0.7.0 * @category Object * @sig s -> {s: x} -> Boolean * @param {String} prop The name of the property to check for. @@ -9810,11 +8825,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var has = _curry2(_has); /** - * Returns whether or not an object or its prototype chain has - * a property with the specified name + * Returns whether or not an object or its prototype chain has a property with + * the specified name * * @func * @memberOf R + * @since v0.7.0 * @category Object * @sig s -> {s: x} -> Boolean * @param {String} prop The name of the property to check for. @@ -9845,6 +8861,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.15.0 * @category Relation * @sig a -> a -> Boolean * @param {*} a @@ -9877,11 +8894,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * A function that does nothing but return the parameter supplied to it. Good as a default - * or placeholder function. + * A function that does nothing but return the parameter supplied to it. Good + * as a default or placeholder function. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig a -> a * @param {*} x The value to return. @@ -9896,11 +8914,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var identity = _curry1(_identity); /** - * Creates a function that will process either the `onTrue` or the `onFalse` function depending - * upon the result of the `condition` predicate. + * Creates a function that will process either the `onTrue` or the `onFalse` + * function depending upon the result of the `condition` predicate. * * @func * @memberOf R + * @since v0.8.0 * @category Logic * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *) * @param {Function} condition A predicate function @@ -9908,13 +8927,16 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value. * @return {Function} A new unary function that will process either the `onTrue` or the `onFalse` * function depending upon the result of the `condition` predicate. + * @see R.unless, R.when * @example * - * // Flatten all arrays in the list but leave other values alone. - * var flattenArrays = R.map(R.ifElse(Array.isArray, R.flatten, R.identity)); - * - * flattenArrays([[0], [[10], [8]], 1234, {}]); //=> [[0], [10, 8], 1234, {}] - * flattenArrays([[[10], 123], [8, [10]], "hello"]); //=> [[10, 123], [8, 10], "hello"] + * var incCount = R.ifElse( + * R.has('count'), + * R.over(R.lensProp('count'), R.inc), + * R.assoc('count', 1) + * ); + * incCount({}); //=> { count: 1 } + * incCount({ count: 1 }); //=> { count: 2 } */ var ifElse = _curry3(function ifElse(condition, onTrue, onFalse) { return curryN(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() { @@ -9927,6 +8949,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.9.0 * @category Math * @sig Number -> Number * @param {Number} n @@ -9939,12 +8962,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var inc = add(1); /** - * Inserts the supplied element into the list, at index `index`. _Note - * that this is not destructive_: it returns a copy of the list with the changes. + * Inserts the supplied element into the list, at index `index`. _Note that + * this is not destructive_: it returns a copy of the list with the changes. * No lists have been harmed in the application of this function. * * @func * @memberOf R + * @since v0.2.2 * @category List * @sig Number -> a -> [a] -> [a] * @param {Number} index The position to insert the element @@ -9963,12 +8987,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Inserts the sub-list into the list, at index `index`. _Note that this - * is not destructive_: it returns a copy of the list with the changes. + * Inserts the sub-list into the list, at index `index`. _Note that this is not + * destructive_: it returns a copy of the list with the changes. * No lists have been harmed in the application of this function. * * @func * @memberOf R + * @since v0.9.0 * @category List * @sig Number -> [a] -> [a] -> [a] * @param {Number} index The position to insert the sub-list @@ -9985,11 +9010,44 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * See if an object (`val`) is an instance of the supplied constructor. - * This function will check up the inheritance chain, if any. + * Creates a new list with the separator interposed between elements. + * + * Dispatches to the `intersperse` method of the second argument, if present. + * + * @func + * @memberOf R + * @since v0.14.0 + * @category List + * @sig a -> [a] -> [a] + * @param {*} separator The element to add to the list. + * @param {Array} list The list to be interposed. + * @return {Array} The new list. + * @example + * + * R.intersperse('n', ['ba', 'a', 'a']); //=> ['ba', 'n', 'a', 'n', 'a'] + */ + var intersperse = _curry2(_checkForMethod('intersperse', function intersperse(separator, list) { + var out = []; + var idx = 0; + var length = list.length; + while (idx < length) { + if (idx === length - 1) { + out.push(list[idx]); + } else { + out.push(list[idx], separator); + } + idx += 1; + } + return out; + })); + + /** + * See if an object (`val`) is an instance of the supplied constructor. This + * function will check up the inheritance chain, if any. * * @func * @memberOf R + * @since v0.3.0 * @category Type * @sig (* -> {*}) -> a -> Boolean * @param {Object} ctor A constructor @@ -10015,6 +9073,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.5.0 * @category Type * @category List * @sig * -> Boolean @@ -10053,34 +9112,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return false; }); - /** - * Reports whether the list has zero elements. - * - * @func - * @memberOf R - * @category Logic - * @sig [a] -> Boolean - * @param {Array} list - * @return {Boolean} - * @example - * - * R.isEmpty([1, 2, 3]); //=> false - * R.isEmpty([]); //=> true - * R.isEmpty(''); //=> true - * R.isEmpty(null); //=> false - * R.isEmpty(R.keys({})); //=> true - * R.isEmpty({}); //=> false ({} does not have a length property) - * R.isEmpty({length: 0}); //=> true - */ - var isEmpty = _curry1(function isEmpty(list) { - return Object(list).length === 0; - }); - /** * Checks if the input value is `null` or `undefined`. * * @func * @memberOf R + * @since v0.9.0 * @category Type * @sig * -> Boolean * @param {*} x The value to test. @@ -10097,13 +9134,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a list containing the names of all the enumerable own - * properties of the supplied object. - * Note that the order of the output array is not guaranteed to be - * consistent across different JS platforms. + * Returns a list containing the names of all the enumerable own properties of + * the supplied object. + * Note that the order of the output array is not guaranteed to be consistent + * across different JS platforms. * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig {k: v} -> [k] * @param {Object} obj The object to extract properties from @@ -10113,6 +9151,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c'] */ // cover IE < 9 keys issues + // Safari bug var keys = function () { // cover IE < 9 keys issues var hasEnumBug = !{ toString: null }.propertyIsEnumerable('toString'); @@ -10125,6 +9164,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack 'hasOwnProperty', 'toLocaleString' ]; + // Safari bug + var hasArgsEnumBug = function () { + 'use strict'; + return arguments.propertyIsEnumerable('length'); + }(); var contains = function contains(list, item) { var idx = 0; while (idx < list.length) { @@ -10135,15 +9179,17 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack } return false; }; - return typeof Object.keys === 'function' ? _curry1(function keys(obj) { + return typeof Object.keys === 'function' && !hasArgsEnumBug ? _curry1(function keys(obj) { return Object(obj) !== obj ? [] : Object.keys(obj); }) : _curry1(function keys(obj) { if (Object(obj) !== obj) { return []; } - var prop, ks = [], nIdx; + var prop, nIdx; + var ks = []; + var checkArgsLength = hasArgsEnumBug && _isArguments(obj); for (prop in obj) { - if (_has(prop, obj)) { + if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) { ks[ks.length] = prop; } } @@ -10162,13 +9208,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }(); /** - * Returns a list containing the names of all the - * properties of the supplied object, including prototype properties. - * Note that the order of the output array is not guaranteed to be - * consistent across different JS platforms. + * Returns a list containing the names of all the properties of the supplied + * object, including prototype properties. + * Note that the order of the output array is not guaranteed to be consistent + * across different JS platforms. * * @func * @memberOf R + * @since v0.2.0 * @category Object * @sig {k: v} -> [k] * @param {Object} obj The object to extract properties from @@ -10181,7 +9228,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.keysIn(f); //=> ['x', 'y'] */ var keysIn = _curry1(function keysIn(obj) { - var prop, ks = []; + var prop; + var ks = []; for (prop in obj) { ks[ks.length] = prop; } @@ -10193,6 +9241,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.3.0 * @category List * @sig [a] -> Number * @param {Array} list The array to inspect. @@ -10207,11 +9256,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns `true` if the first argument is less than the second; - * `false` otherwise. + * Returns `true` if the first argument is less than the second; `false` + * otherwise. * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig Ord a => a -> a -> Boolean * @param {*} a @@ -10236,6 +9286,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig Ord a => a -> a -> Boolean * @param {Number} a @@ -10255,32 +9306,36 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * The mapAccum function behaves like a combination of map and reduce; it applies a - * function to each element of a list, passing an accumulating parameter from left to - * right, and returning a final value of this accumulator together with the new list. + * The mapAccum function behaves like a combination of map and reduce; it + * applies a function to each element of a list, passing an accumulating + * parameter from left to right, and returning a final value of this + * accumulator together with the new list. * - * The iterator function receives two arguments, *acc* and *value*, and should return - * a tuple *[acc, value]*. + * The iterator function receives two arguments, *acc* and *value*, and should + * return a tuple *[acc, value]*. * * @func * @memberOf R + * @since v0.10.0 * @category List * @sig (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]) * @param {Function} fn The function to be called on every element of the input `list`. * @param {*} acc The accumulator value. * @param {Array} list The list to iterate over. * @return {*} The final, accumulated value. + * @see R.addIndex * @example * * var digits = ['1', '2', '3', '4']; - * var append = function(a, b) { - * return [a + b, a + b]; - * } + * var append = (a, b) => [a + b, a + b]; * * R.mapAccum(append, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']] */ var mapAccum = _curry3(function mapAccum(fn, acc, list) { - var idx = 0, len = list.length, result = [], tuple = [acc]; + var idx = 0; + var len = list.length; + var result = []; + var tuple = [acc]; while (idx < len) { tuple = fn(tuple[0], list[idx]); result[idx] = tuple[1]; @@ -10293,35 +9348,38 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * The mapAccumRight function behaves like a combination of map and reduce; it applies a - * function to each element of a list, passing an accumulating parameter from right - * to left, and returning a final value of this accumulator together with the new list. + * The mapAccumRight function behaves like a combination of map and reduce; it + * applies a function to each element of a list, passing an accumulating + * parameter from right to left, and returning a final value of this + * accumulator together with the new list. * - * Similar to `mapAccum`, except moves through the input list from the right to the - * left. + * Similar to `mapAccum`, except moves through the input list from the right to + * the left. * - * The iterator function receives two arguments, *acc* and *value*, and should return - * a tuple *[acc, value]*. + * The iterator function receives two arguments, *acc* and *value*, and should + * return a tuple *[acc, value]*. * * @func * @memberOf R + * @since v0.10.0 * @category List * @sig (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]) * @param {Function} fn The function to be called on every element of the input `list`. * @param {*} acc The accumulator value. * @param {Array} list The list to iterate over. * @return {*} The final, accumulated value. + * @see R.addIndex * @example * * var digits = ['1', '2', '3', '4']; - * var append = function(a, b) { - * return [a + b, a + b]; - * } + * var append = (a, b) => [a + b, a + b]; * * R.mapAccumRight(append, 0, digits); //=> ['04321', ['04321', '0432', '043', '04']] */ var mapAccumRight = _curry3(function mapAccumRight(fn, acc, list) { - var idx = list.length - 1, result = [], tuple = [acc]; + var idx = list.length - 1; + var result = []; + var tuple = [acc]; while (idx >= 0) { tuple = fn(tuple[0], list[idx]); result[idx] = tuple[1]; @@ -10334,19 +9392,20 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Tests a regular expression against a String. Note that this function - * will return an empty array when there are no matches. This differs - * from [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match) + * Tests a regular expression against a String. Note that this function will + * return an empty array when there are no matches. This differs from + * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match) * which returns `null` when there are no matches. * * @func * @memberOf R - * @see R.test + * @since v0.1.0 * @category String * @sig RegExp -> String -> [String | Undefined] * @param {RegExp} rx A regular expression. * @param {String} str The string to match against * @return {Array} The list of matches or empty array. + * @see R.test * @example * * R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na'] @@ -10358,13 +9417,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * mathMod behaves like the modulo operator should mathematically, unlike the `%` - * operator (and by extension, R.modulo). So while "-17 % 5" is -2, + * mathMod behaves like the modulo operator should mathematically, unlike the + * `%` operator (and by extension, R.modulo). So while "-17 % 5" is -2, * mathMod(-17, 5) is 3. mathMod requires Integer arguments, and returns NaN * when the modulus is zero or negative. * * @func * @memberOf R + * @since v0.3.0 * @category Math * @sig Number -> Number -> Number * @param {Number} m The dividend. @@ -10403,6 +9463,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig Ord a => a -> a -> a * @param {*} a @@ -10419,11 +9480,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Takes a function and two values, and returns whichever value produces - * the larger result when passed to the provided function. + * Takes a function and two values, and returns whichever value produces the + * larger result when passed to the provided function. * * @func * @memberOf R + * @since v0.8.0 * @category Relation * @sig Ord b => (a -> b) -> a -> a -> a * @param {Function} f @@ -10433,44 +9495,57 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.max, R.minBy * @example * - * R.maxBy(function(n) { return n * n; }, -3, 2); //=> -3 + * // square :: Number -> Number + * var square = n => n * n; + * + * R.maxBy(square, -3, 2); //=> -3 + * + * R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5 + * R.reduce(R.maxBy(square), 0, []); //=> 0 */ var maxBy = _curry3(function maxBy(f, a, b) { return f(b) > f(a) ? b : a; }); /** - * Create a new object with the own properties of `a` - * merged with the own properties of object `b`. - * - * @func - * @memberOf R + * Creates a new object with the own properties of the two provided objects. If + * a key exists in both objects, the provided function is applied to the key + * and the values associated with the key in each object, with the result being + * used as the value associated with the key in the returned object. The key + * will be excluded from the returned object if the resulting value is + * `undefined`. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 * @category Object - * @sig {k: v} -> {k: v} -> {k: v} - * @param {Object} a - * @param {Object} b + * @sig (String -> a -> a -> a) -> {a} -> {a} -> {a} + * @param {Function} fn + * @param {Object} l + * @param {Object} r * @return {Object} + * @see R.merge, R.mergeWith * @example * - * R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); - * //=> { 'name': 'fred', 'age': 40 } - * - * var resetToDefault = R.merge(R.__, {x: 0}); - * resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2} + * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r + * R.mergeWithKey(concatValues, + * { a: true, thing: 'foo', values: [10, 20] }, + * { b: true, thing: 'bar', values: [15, 35] }); + * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] } */ - var merge = _curry2(function merge(a, b) { + var mergeWithKey = _curry3(function mergeWithKey(fn, l, r) { var result = {}; - var ks = keys(a); - var idx = 0; - while (idx < ks.length) { - result[ks[idx]] = a[ks[idx]]; - idx += 1; + var k; + for (k in l) { + if (_has(k, l)) { + result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k]; + } } - ks = keys(b); - idx = 0; - while (idx < ks.length) { - result[ks[idx]] = b[ks[idx]]; - idx += 1; + for (k in r) { + if (_has(k, r) && !_has(k, result)) { + result[k] = r[k]; + } } return result; }); @@ -10480,6 +9555,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig Ord a => a -> a -> a * @param {*} a @@ -10496,11 +9572,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Takes a function and two values, and returns whichever value produces - * the smaller result when passed to the provided function. + * Takes a function and two values, and returns whichever value produces the + * smaller result when passed to the provided function. * * @func * @memberOf R + * @since v0.8.0 * @category Relation * @sig Ord b => (a -> b) -> a -> a -> a * @param {Function} f @@ -10510,19 +9587,26 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.min, R.maxBy * @example * - * R.minBy(function(n) { return n * n; }, -3, 2); //=> 2 + * // square :: Number -> Number + * var square = n => n * n; + * + * R.minBy(square, -3, 2); //=> 2 + * + * R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1 + * R.reduce(R.minBy(square), Infinity, []); //=> Infinity */ var minBy = _curry3(function minBy(f, a, b) { return f(b) < f(a) ? b : a; }); /** - * Divides the second parameter by the first and returns the remainder. - * Note that this functions preserves the JavaScript-style behavior for - * modulo. For mathematical modulo see `mathMod` + * Divides the second parameter by the first and returns the remainder. Note + * that this function preserves the JavaScript-style behavior for modulo. For + * mathematical modulo see `mathMod`. * * @func * @memberOf R + * @since v0.1.1 * @category Math * @sig Number -> Number -> Number * @param {Number} a The value to the divide. @@ -10549,6 +9633,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Math * @sig Number -> Number -> Number * @param {Number} a The first value. @@ -10568,11 +9653,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Wraps a function of any arity (including nullary) in a function that accepts exactly `n` - * parameters. Any extraneous parameters will not be passed to the supplied function. + * Wraps a function of any arity (including nullary) in a function that accepts + * exactly `n` parameters. Any extraneous parameters will not be passed to the + * supplied function. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig Number -> (* -> a) -> (* -> a) * @param {Number} n The desired arity of the new function. @@ -10581,9 +9668,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * arity `n`. * @example * - * var takesTwoArgs = function(a, b) { - * return [a, b]; - * }; + * var takesTwoArgs = (a, b) => [a, b]; + * * takesTwoArgs.length; //=> 2 * takesTwoArgs(1, 2); //=> [1, 2] * @@ -10648,6 +9734,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.9.0 * @category Math * @sig Number -> Number * @param {Number} n @@ -10660,12 +9747,37 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return -n; }); + /** + * Returns `true` if no elements of the list match the predicate, `false` + * otherwise. + * + * Dispatches to the `any` method of the second argument, if present. + * + * @func + * @memberOf R + * @since v0.12.0 + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise. + * @see R.all, R.any + * @example + * + * var isEven = n => n % 2 === 0; + * + * R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true + * R.none(isEven, [1, 3, 5, 7, 8, 11]); //=> false + */ + var none = _curry2(_complement(_dispatchable('any', _xany, any))); + /** * A function that returns the `!` of its argument. It will return `true` when * passed false-y value, and `false` when passed a truth-y one. * * @func * @memberOf R + * @since v0.1.0 * @category Logic * @sig * -> Boolean * @param {*} a any value @@ -10683,11 +9795,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns the nth element of the given list or string. - * If n is negative the element at index length + n is returned. + * Returns the nth element of the given list or string. If n is negative the + * element at index length + n is returned. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig Number -> [a] -> a | Undefined * @sig Number -> String -> String @@ -10714,6 +9827,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.9.0 * @category Function * @sig Number -> *... -> * * @param {Number} n @@ -10730,43 +9844,29 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns the nth character of the given string. - * - * @func - * @memberOf R - * @category String - * @sig Number -> String -> String - * @param {Number} n - * @param {String} str - * @return {String} - * @deprecated since v0.16.0 - * @example - * - * R.nthChar(2, 'Ramda'); //=> 'm' - * R.nthChar(-2, 'Ramda'); //=> 'd' - */ - var nthChar = _curry2(function nthChar(n, str) { - return str.charAt(n < 0 ? str.length + n : n); - }); - - /** - * Returns the character code of the nth character of the given string. + * Creates an object containing a single key:value pair. * * @func * @memberOf R - * @category String - * @sig Number -> String -> Number - * @param {Number} n - * @param {String} str - * @return {Number} - * @deprecated since v0.16.0 + * @since v0.18.0 + * @category Object + * @sig String -> a -> {String:a} + * @param {String} key + * @param {*} val + * @return {Object} + * @see R.pair * @example * - * R.nthCharCode(2, 'Ramda'); //=> 'm'.charCodeAt(0) - * R.nthCharCode(-2, 'Ramda'); //=> 'd'.charCodeAt(0) + * var matchPhrases = R.compose( + * R.objOf('must'), + * R.map(R.objOf('match_phrase')) + * ); + * matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]} */ - var nthCharCode = _curry2(function nthCharCode(n, str) { - return str.charCodeAt(n < 0 ? str.length + n : n); + var objOf = _curry2(function objOf(key, val) { + var obj = {}; + obj[key] = val; + return obj; }); /** @@ -10777,6 +9877,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.3.0 * @category Function * @sig a -> [a] * @param {*} x any value @@ -10786,47 +9887,74 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.of(null); //=> [null] * R.of([42]); //=> [[42]] */ - var of = _curry1(function of(x) { - return [x]; - }); + var of = _curry1(_of); /** - * Accepts a function `fn` and returns a function that guards invocation of `fn` such that - * `fn` can only ever be called once, no matter how many times the returned function is - * invoked. + * Accepts a function `fn` and returns a function that guards invocation of + * `fn` such that `fn` can only ever be called once, no matter how many times + * the returned function is invoked. The first value calculated is returned in + * subsequent invocations. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (a... -> b) -> (a... -> b) * @param {Function} fn The function to wrap in a call-only-once wrapper. * @return {Function} The wrapped function. * @example * - * var addOneOnce = R.once(function(x){ return x + 1; }); + * var addOneOnce = R.once(x => x + 1); * addOneOnce(10); //=> 11 * addOneOnce(addOneOnce(50)); //=> 11 */ var once = _curry1(function once(fn) { - var called = false, result; - return function () { + var called = false; + var result; + return _arity(fn.length, function () { if (called) { return result; } called = true; result = fn.apply(this, arguments); return result; - }; + }); + }); + + /** + * Returns `true` if one or both of its arguments are `true`. Returns `false` + * if both arguments are `false`. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category Logic + * @sig * -> * -> * + * @param {Boolean} a A boolean value + * @param {Boolean} b A boolean value + * @return {Boolean} `true` if one or both arguments are `true`, `false` otherwise + * @see R.either + * @example + * + * R.or(true, true); //=> true + * R.or(true, false); //=> true + * R.or(false, true); //=> true + * R.or(false, false); //=> false + */ + var or = _curry2(function or(a, b) { + return a || b; }); /** * Returns the result of "setting" the portion of the given data structure - * focused by the given lens to the given value. + * focused by the given lens to the result of applying the given function to + * the focused value. * * @func * @memberOf R + * @since v0.16.0 * @category Object - * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s * @sig Lens s a -> (a -> a) -> s -> s * @param {Lens} lens * @param {*} v @@ -10855,14 +9983,39 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); }(); + /** + * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`. + * + * @func + * @memberOf R + * @since v0.18.0 + * @category List + * @sig a -> b -> (a,b) + * @param {*} fst + * @param {*} snd + * @return {Array} + * @see R.createMapEntry, R.of + * @example + * + * R.pair('foo', 'bar'); //=> ['foo', 'bar'] + */ + var pair = _curry2(function pair(fst, snd) { + return [ + fst, + snd + ]; + }); + /** * Retrieve the value at a given path. * * @func * @memberOf R + * @since v0.2.0 * @category Object * @sig [String] -> {k: v} -> v | Undefined * @param {Array} path The path to use. + * @param {Object} obj The object to retrieve the nested property from. * @return {*} The data at `path`. * @example * @@ -10870,29 +10023,76 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined */ var path = _curry2(function path(paths, obj) { - if (obj == null) { - return; - } else { - var val = obj; - for (var idx = 0, len = paths.length; idx < len && val != null; idx += 1) { - val = val[paths[idx]]; + var val = obj; + var idx = 0; + while (idx < paths.length) { + if (val == null) { + return; } - return val; + val = val[paths[idx]]; + idx += 1; } + return val; }); /** - * Returns a partial copy of an object containing only the keys specified. If the key does not exist, the - * property is ignored. + * If the given, non-null object has a value at the given path, returns the + * value at that path. Otherwise returns the provided default value. + * + * @func + * @memberOf R + * @since v0.18.0 + * @category Object + * @sig a -> [String] -> Object -> a + * @param {*} d The default value. + * @param {Array} p The path to use. + * @param {Object} obj The object to retrieve the nested property from. + * @return {*} The data at `path` of the supplied object or the default value. + * @example + * + * R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2 + * R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A" + */ + var pathOr = _curry3(function pathOr(d, p, obj) { + return defaultTo(d, path(p, obj)); + }); + + /** + * Returns `true` if the specified object property at given path satisfies the + * given predicate; `false` otherwise. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category Logic + * @sig (a -> Boolean) -> [String] -> Object -> Boolean + * @param {Function} pred + * @param {Array} propPath + * @param {*} obj + * @return {Boolean} + * @see R.propSatisfies, R.path + * @example + * + * R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true + */ + var pathSatisfies = _curry3(function pathSatisfies(pred, propPath, obj) { + return propPath.length > 0 && pred(path(propPath, obj)); + }); + + /** + * Returns a partial copy of an object containing only the keys specified. If + * the key does not exist, the property is ignored. * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig [k] -> {k: v} -> {k: v} * @param {Array} names an array of String property names to copy onto a new object * @param {Object} obj The object to copy from * @return {Object} A new object with only properties from `names` on it. - * @see R.omit + * @see R.omit, R.props * @example * * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} @@ -10911,10 +10111,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Similar to `pick` except that this one includes a `key: undefined` pair for properties that don't exist. + * Similar to `pick` except that this one includes a `key: undefined` pair for + * properties that don't exist. * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig [k] -> {k: v} -> {k: v} * @param {Array} names an array of String property names to copy onto a new object @@ -10939,11 +10141,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a partial copy of an object containing only the keys that - * satisfy the supplied predicate. + * Returns a partial copy of an object containing only the keys that satisfy + * the supplied predicate. * * @func * @memberOf R + * @since v0.8.0 * @category Object * @sig (v, k -> Boolean) -> {k: v} -> {k: v} * @param {Function} pred A predicate to determine whether or not a key @@ -10951,10 +10154,10 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @param {Object} obj The object to copy from * @return {Object} A new object with only properties that satisfy `pred` * on it. - * @see R.pick + * @see R.pick, R.filter * @example * - * var isUpperCase = function(val, key) { return key.toUpperCase() === key; } + * var isUpperCase = (val, key) => key.toUpperCase() === key; * R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4} */ var pickBy = _curry2(function pickBy(test, obj) { @@ -10968,11 +10171,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list with the given element at the front, followed by the contents of the - * list. + * Returns a new list with the given element at the front, followed by the + * contents of the list. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig a -> [a] -> [a] * @param {*} el The item to add to the head of the output list. @@ -10988,10 +10192,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a function that when supplied an object returns the indicated property of that object, if it exists. + * Returns a function that when supplied an object returns the indicated + * property of that object, if it exists. * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig s -> {s: a} -> a | Undefined * @param {String} p The property name @@ -11008,11 +10214,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /** * If the given, non-null object has an own property with the specified name, - * returns the value of that property. - * Otherwise returns the provided default value. + * returns the value of that property. Otherwise returns the provided default + * value. * * @func * @memberOf R + * @since v0.6.0 * @category Object * @sig a -> String -> Object -> a * @param {*} val The default value. @@ -11041,14 +10248,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.16.0 * @category Logic * @sig (a -> Boolean) -> String -> {String: a} -> Boolean * @param {Function} pred * @param {String} name * @param {*} obj * @return {Boolean} - * @see R.propEq - * @see R.propIs + * @see R.propEq, R.propIs * @example * * R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true @@ -11058,10 +10265,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Acts as multiple `prop`: array of keys in, array of values out. Preserves order. + * Acts as multiple `prop`: array of keys in, array of values out. Preserves + * order. * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig [k] -> {k: v} -> [v] * @param {Array} ps The property names to fetch @@ -11087,11 +10296,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a list of numbers from `from` (inclusive) to `to` - * (exclusive). + * Returns a list of numbers from `from` (inclusive) to `to` (exclusive). * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig Number -> Number -> [Number] * @param {Number} from The first number in the list. @@ -11116,20 +10325,23 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a single item by iterating through the list, successively calling the iterator - * function and passing it an accumulator value and the current value from the array, and - * then passing the result to the next call. + * Returns a single item by iterating through the list, successively calling + * the iterator function and passing it an accumulator value and the current + * value from the array, and then passing the result to the next call. * - * Similar to `reduce`, except moves through the input list from the right to the left. + * Similar to `reduce`, except moves through the input list from the right to + * the left. * * The iterator function receives two values: *(acc, value)* * - * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse arrays), unlike - * the native `Array.prototype.reduce` method. For more details on this behavior, see: + * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse + * arrays), unlike the native `Array.prototype.reduce` method. For more details + * on this behavior, see: * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig (a,b -> a) -> a -> [b] -> a * @param {Function} fn The iterator function. Receives two values, the accumulator and the @@ -11137,12 +10349,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @param {*} acc The accumulator value. * @param {Array} list The list to iterate over. * @return {*} The final, accumulated value. + * @see R.addIndex * @example * * var pairs = [ ['a', 1], ['b', 2], ['c', 3] ]; - * var flattenPairs = function(acc, pair) { - * return acc.concat(pair); - * }; + * var flattenPairs = (acc, pair) => acc.concat(pair); * * R.reduceRight(flattenPairs, [], pairs); //=> [ 'c', 3, 'b', 2, 'a', 1 ] */ @@ -11156,26 +10367,25 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a value wrapped to indicate that it is the final value of the - * reduce and transduce functions. The returned value - * should be considered a black box: the internal structure is not - * guaranteed to be stable. + * Returns a value wrapped to indicate that it is the final value of the reduce + * and transduce functions. The returned value should be considered a black + * box: the internal structure is not guaranteed to be stable. * * Note: this optimization is unavailable to functions not explicitly listed - * above. For instance, it is not currently supported by reduceIndexed, - * reduceRight, or reduceRightIndexed. + * above. For instance, it is not currently supported by reduceRight. * * @func * @memberOf R + * @since v0.15.0 * @category List - * @see R.reduce, R.transduce * @sig a -> * * @param {*} x The final value of the reduce. * @return {*} The wrapped value. + * @see R.reduce, R.transduce * @example * * R.reduce( - * R.pipe(R.add, R.ifElse(R.lte(10), R.reduced, R.identity)), + * R.pipe(R.add, R.when(R.gte(R.__, 10), R.reduced)), * 0, * [1, 2, 3, 4, 5]) // 10 */ @@ -11183,12 +10393,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /** * Removes the sub-list of `list` starting at index `start` and containing - * `count` elements. _Note that this is not destructive_: it returns a - * copy of the list with the changes. + * `count` elements. _Note that this is not destructive_: it returns a copy of + * the list with the changes. * No lists have been harmed in the application of this function. * * @func * @memberOf R + * @since v0.2.2 * @category List * @sig Number -> Number -> [a] -> [a] * @param {Number} start The position to start removing elements @@ -11208,6 +10419,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.7.0 * @category String * @sig RegExp|String -> String -> String -> String * @param {RegExp|String} pattern A regular expression or a substring to match. @@ -11227,31 +10439,40 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list with the same elements as the original list, just - * in the reverse order. + * Returns a new list or string with the elements or characters in reverse + * order. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig [a] -> [a] - * @param {Array} list The list to reverse. - * @return {Array} A copy of the list in reverse order. + * @sig String -> String + * @param {Array|String} list + * @return {Array|String} * @example * * R.reverse([1, 2, 3]); //=> [3, 2, 1] * R.reverse([1, 2]); //=> [2, 1] * R.reverse([1]); //=> [1] * R.reverse([]); //=> [] + * + * R.reverse('abc'); //=> 'cba' + * R.reverse('ab'); //=> 'ba' + * R.reverse('a'); //=> 'a' + * R.reverse(''); //=> '' */ var reverse = _curry1(function reverse(list) { - return _slice(list).reverse(); + return _isString(list) ? list.split('').reverse().join('') : _slice(list).reverse(); }); /** - * Scan is similar to reduce, but returns a list of successively reduced values from the left + * Scan is similar to reduce, but returns a list of successively reduced values + * from the left * * @func * @memberOf R + * @since v0.10.0 * @category List * @sig (a,b -> a) -> a -> [b] -> [a] * @param {Function} fn The iterator function. Receives two values, the accumulator and the @@ -11265,7 +10486,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * var factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24] */ var scan = _curry3(function scan(fn, acc, list) { - var idx = 0, len = list.length, result = [acc]; + var idx = 0; + var len = list.length; + var result = [acc]; while (idx < len) { acc = fn(acc, list[idx]); result[idx + 1] = acc; @@ -11280,8 +10503,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.16.0 * @category Object - * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s * @sig Lens s a -> a -> s -> s * @param {Lens} lens * @param {*} v @@ -11300,12 +10524,43 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a copy of the list, sorted according to the comparator function, which should accept two values at a - * time and return a negative number if the first value is smaller, a positive number if it's larger, and zero - * if they are equal. Please note that this is a **copy** of the list. It does not modify the original. + * Returns the elements of the given list or string (or object with a `slice` + * method) from `fromIndex` (inclusive) to `toIndex` (exclusive). + * + * Dispatches to the `slice` method of the third argument, if present. + * + * @func + * @memberOf R + * @since v0.1.4 + * @category List + * @sig Number -> Number -> [a] -> [a] + * @sig Number -> Number -> String -> String + * @param {Number} fromIndex The start index (inclusive). + * @param {Number} toIndex The end index (exclusive). + * @param {*} list + * @return {*} + * @example + * + * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] + * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd'] + * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c'] + * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] + * R.slice(0, 3, 'ramda'); //=> 'ram' + */ + var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) { + return Array.prototype.slice.call(list, fromIndex, toIndex); + })); + + /** + * Returns a copy of the list, sorted according to the comparator function, + * which should accept two values at a time and return a negative number if the + * first value is smaller, a positive number if it's larger, and zero if they + * are equal. Please note that this is a **copy** of the list. It does not + * modify the original. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig (a,a -> Number) -> [a] -> [a] * @param {Function} comparator A sorting function :: a -> b -> Int @@ -11325,6 +10580,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig Ord b => (a -> b) -> [a] -> [a] * @param {Function} fn @@ -11332,7 +10588,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {Array} A new list sorted by the keys generated by `fn`. * @example * - * var sortByFirstItem = R.sortBy(prop(0)); + * var sortByFirstItem = R.sortBy(R.prop(0)); * var sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name'))); * var pairs = [[-1, 1], [-2, 2], [-3, 3]]; * sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]] @@ -11359,11 +10615,101 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); }); + /** + * Splits a given list or string at a given index. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category List + * @sig Number -> [a] -> [[a], [a]] + * @sig Number -> String -> [String, String] + * @param {Number} index The index where the array/string is split. + * @param {Array|String} array The array/string to be split. + * @return {Array} + * @example + * + * R.splitAt(1, [1, 2, 3]); //=> [[1], [2, 3]] + * R.splitAt(5, 'hello world'); //=> ['hello', ' world'] + * R.splitAt(-1, 'foobar'); //=> ['fooba', 'r'] + */ + var splitAt = _curry2(function splitAt(index, array) { + return [ + slice(0, index, array), + slice(index, length(array), array) + ]; + }); + + /** + * Splits a collection into slices of the specified length. + * + * @func + * @memberOf R + * @since v0.16.0 + * @category List + * @sig Number -> [a] -> [[a]] + * @sig Number -> String -> [String] + * @param {Number} n + * @param {Array} list + * @return {Array} + * @example + * + * R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]] + * R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz'] + */ + var splitEvery = _curry2(function splitEvery(n, list) { + if (n <= 0) { + throw new Error('First argument to splitEvery must be a positive integer'); + } + var result = []; + var idx = 0; + while (idx < list.length) { + result.push(slice(idx, idx += n, list)); + } + return result; + }); + + /** + * Takes a list and a predicate and returns a pair of lists with the following properties: + * + * - the result of concatenating the two output lists is equivalent to the input list; + * - none of the elements of the first output list satisfies the predicate; and + * - if the second output list is non-empty, its first element satisfies the predicate. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category List + * @sig (a -> Boolean) -> [a] -> [[a], [a]] + * @param {Function} pred The predicate that determines where the array is split. + * @param {Array} list The array to be split. + * @return {Array} + * @example + * + * R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]); //=> [[1], [2, 3, 1, 2, 3]] + */ + var splitWhen = _curry2(function splitWhen(pred, list) { + var idx = 0; + var len = list.length; + var prefix = []; + while (idx < len && !pred(list[idx])) { + prefix.push(list[idx]); + idx += 1; + } + return [ + prefix, + _slice(list, idx) + ]; + }); + /** * Subtracts two numbers. Equivalent to `a - b` but curried. * * @func * @memberOf R + * @since v0.1.0 * @category Math * @sig Number -> Number -> Number * @param {Number} a The first value. @@ -11386,24 +10732,96 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list containing the last `n` elements of a given list, passing each value - * to the supplied predicate function, and terminating when the predicate function returns - * `false`. Excludes the element that caused the predicate function to fail. The predicate - * function is passed one argument: *(value)*. + * Returns all but the first element of the given list or string (or object + * with a `tail` method). + * + * Dispatches to the `slice` method of the first argument, if present. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category List + * @sig [a] -> [a] + * @sig String -> String + * @param {*} list + * @return {*} + * @see R.head, R.init, R.last + * @example + * + * R.tail([1, 2, 3]); //=> [2, 3] + * R.tail([1, 2]); //=> [2] + * R.tail([1]); //=> [] + * R.tail([]); //=> [] + * + * R.tail('abc'); //=> 'bc' + * R.tail('ab'); //=> 'b' + * R.tail('a'); //=> '' + * R.tail(''); //=> '' + */ + var tail = _checkForMethod('tail', slice(1, Infinity)); + + /** + * Returns the first `n` elements of the given list, string, or + * transducer/transformer (or object with a `take` method). + * + * Dispatches to the `take` method of the second argument, if present. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category List + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n + * @param {*} list + * @return {*} + * @see R.drop + * @example + * + * R.take(1, ['foo', 'bar', 'baz']); //=> ['foo'] + * R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] + * R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.take(3, 'ramda'); //=> 'ram' + * + * var personnel = [ + * 'Dave Brubeck', + * 'Paul Desmond', + * 'Eugene Wright', + * 'Joe Morello', + * 'Gerry Mulligan', + * 'Bob Bates', + * 'Joe Dodge', + * 'Ron Crotty' + * ]; + * + * var takeFive = R.take(5); + * takeFive(personnel); + * //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan'] + */ + var take = _curry2(_dispatchable('take', _xtake, function take(n, xs) { + return slice(0, n < 0 ? Infinity : n, xs); + })); + + /** + * Returns a new list containing the last `n` elements of a given list, passing + * each value to the supplied predicate function, and terminating when the + * predicate function returns `false`. Excludes the element that caused the + * predicate function to fail. The predicate function is passed one argument: + * *(value)*. * * @func * @memberOf R + * @since v0.16.0 * @category List * @sig (a -> Boolean) -> [a] -> [a] * @param {Function} fn The function called per iteration. * @param {Array} list The collection to iterate over. * @return {Array} A new array. - * @see R.dropLastWhile + * @see R.dropLastWhile, R.addIndex * @example * - * var isNotOne = function(x) { - * return !(x === 1); - * }; + * var isNotOne = x => x !== 1; * * R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4] */ @@ -11415,11 +10833,47 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return _slice(list, idx + 1, Infinity); }); + /** + * Returns a new list containing the first `n` elements of a given list, + * passing each value to the supplied predicate function, and terminating when + * the predicate function returns `false`. Excludes the element that caused the + * predicate function to fail. The predicate function is passed one argument: + * *(value)*. + * + * Dispatches to the `takeWhile` method of the second argument, if present. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category List + * @sig (a -> Boolean) -> [a] -> [a] + * @param {Function} fn The function called per iteration. + * @param {Array} list The collection to iterate over. + * @return {Array} A new array. + * @see R.dropWhile, R.transduce, R.addIndex + * @example + * + * var isNotFour = x => x !== 4; + * + * R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3] + */ + var takeWhile = _curry2(_dispatchable('takeWhile', _xtakeWhile, function takeWhile(fn, list) { + var idx = 0; + var len = list.length; + while (idx < len && fn(list[idx])) { + idx += 1; + } + return _slice(list, 0, idx); + })); + /** * Runs the given function with the supplied object, then returns the object. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (a -> *) -> a -> a * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away. @@ -11427,7 +10881,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {*} `x`. * @example * - * var sayX = function(x) { console.log('x is ' + x); }; + * var sayX = x => console.log('x is ' + x); * R.tap(sayX, 100); //=> 100 * //-> 'x is 100' */ @@ -11437,36 +10891,17 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Determines whether a given string matches a given regular expression. - * - * @func - * @memberOf R - * @see R.match - * @category String - * @sig RegExp -> String -> Boolean - * @param {RegExp} pattern - * @param {String} str - * @return {Boolean} - * @example - * - * R.test(/^x/, 'xyz'); //=> true - * R.test(/^y/, 'xyz'); //=> false - */ - var test = _curry2(function test(pattern, str) { - return _cloneRegExp(pattern).test(str); - }); - - /** - * Calls an input function `n` times, returning an array containing the results of those - * function calls. + * Calls an input function `n` times, returning an array containing the results + * of those function calls. * - * `fn` is passed one argument: The current value of `n`, which begins at `0` and is - * gradually incremented to `n - 1`. + * `fn` is passed one argument: The current value of `n`, which begins at `0` + * and is gradually incremented to `n - 1`. * * @func * @memberOf R + * @since v0.2.3 * @category List - * @sig (i -> a) -> i -> [a] + * @sig (Number -> a) -> Number -> [a] * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`. * @param {Number} n A value between `0` and `n - 1`. Increments after each function call. * @return {Array} An array containing the return values of all calls to `fn`. @@ -11476,8 +10911,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack */ var times = _curry2(function times(fn, n) { var len = Number(n); - var list = new Array(len); var idx = 0; + var list; + if (len < 0 || isNaN(len)) { + throw new RangeError('n must be a non-negative number'); + } + list = new Array(len); while (idx < len) { list[idx] = fn(idx); idx += 1; @@ -11486,13 +10925,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Converts an object into an array of key, value arrays. - * Only the object's own properties are used. - * Note that the order of the output array is not guaranteed to be - * consistent across different JS platforms. + * Converts an object into an array of key, value arrays. Only the object's + * own properties are used. + * Note that the order of the output array is not guaranteed to be consistent + * across different JS platforms. * * @func * @memberOf R + * @since v0.4.0 * @category Object * @sig {String: *} -> [[String,*]] * @param {Object} obj The object to extract from @@ -11516,13 +10956,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Converts an object into an array of key, value arrays. - * The object's own properties and prototype properties are used. - * Note that the order of the output array is not guaranteed to be - * consistent across different JS platforms. + * Converts an object into an array of key, value arrays. The object's own + * properties and prototype properties are used. Note that the order of the + * output array is not guaranteed to be consistent across different JS + * platforms. * * @func * @memberOf R + * @since v0.4.0 * @category Object * @sig {String: *} -> [[String,*]] * @param {Object} obj The object to extract from @@ -11546,11 +10987,53 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return pairs; }); + /** + * Transposes the rows and columns of a 2D list. + * When passed a list of `n` lists of length `x`, + * returns a list of `x` lists of length `n`. + * + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category List + * @sig [[a]] -> [[a]] + * @param {Array} list A 2D list + * @return {Array} A 2D list + * @example + * + * R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']] + * R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']] + * + * If some of the rows are shorter than the following rows, their elements are skipped: + * + * R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]] + */ + var transpose = _curry1(function transpose(outerlist) { + var i = 0; + var result = []; + while (i < outerlist.length) { + var innerlist = outerlist[i]; + var j = 0; + while (j < innerlist.length) { + if (typeof result[j] === 'undefined') { + result[j] = []; + } + result[j].push(innerlist[j]); + j += 1; + } + i += 1; + } + return result; + }); + /** * Removes (strips) whitespace from both ends of the string. * * @func * @memberOf R + * @since v0.6.0 * @category String * @sig String -> String * @param {String} str The string to trim. @@ -11578,12 +11061,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }(); /** - * Gives a single-word string description of the (native) type of a value, returning such - * answers as 'Object', 'Number', 'Array', or 'Null'. Does not attempt to distinguish user - * Object types any further, reporting them all as 'Object'. + * Gives a single-word string description of the (native) type of a value, + * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not + * attempt to distinguish user Object types any further, reporting them all as + * 'Object'. * * @func * @memberOf R + * @since v0.8.0 * @category Type * @sig (* -> {*}) -> String * @param {*} val The value to test @@ -11603,18 +11088,19 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Takes a function `fn`, which takes a single array argument, and returns - * a function which: + * Takes a function `fn`, which takes a single array argument, and returns a + * function which: * * - takes any number of positional arguments; * - passes these arguments to `fn` as an array; and * - returns the result. * - * In other words, R.unapply derives a variadic function from a function - * which takes an array. R.unapply is the inverse of R.apply. + * In other words, R.unapply derives a variadic function from a function which + * takes an array. R.unapply is the inverse of R.apply. * * @func * @memberOf R + * @since v0.8.0 * @category Function * @sig ([*...] -> a) -> (*... -> a) * @param {Function} fn @@ -11631,11 +11117,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Wraps a function of any arity (including nullary) in a function that accepts exactly 1 - * parameter. Any extraneous parameters will not be passed to the supplied function. + * Wraps a function of any arity (including nullary) in a function that accepts + * exactly 1 parameter. Any extraneous parameters will not be passed to the + * supplied function. * * @func * @memberOf R + * @since v0.2.0 * @category Function * @sig (* -> b) -> (a -> b) * @param {Function} fn The function to wrap. @@ -11663,6 +11151,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.14.0 * @category Function * @sig Number -> (a -> b) -> (a -> c) * @param {Number} length The arity for the returned function. @@ -11671,18 +11160,10 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.curry * @example * - * var addFour = function(a) { - * return function(b) { - * return function(c) { - * return function(d) { - * return a + b + c + d; - * }; - * }; - * }; - * }; + * var addFour = a => b => c => d => a + b + c + d; * * var uncurriedAddFour = R.uncurryN(4, addFour); - * curriedAddFour(1, 2, 3, 4); //=> 10 + * uncurriedAddFour(1, 2, 3, 4); //=> 10 */ var uncurryN = _curry2(function uncurryN(depth, fn) { return curryN(depth, function () { @@ -11701,14 +11182,16 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Builds a list from a seed value. Accepts an iterator function, which returns either false - * to stop iteration or an array of length 2 containing the value to add to the resulting - * list and the seed to be used in the next call to the iterator function. + * Builds a list from a seed value. Accepts an iterator function, which returns + * either false to stop iteration or an array of length 2 containing the value + * to add to the resulting list and the seed to be used in the next call to the + * iterator function. * * The iterator function receives one argument: *(seed)*. * * @func * @memberOf R + * @since v0.10.0 * @category List * @sig (a -> [b]) -> * -> [b] * @param {Function} fn The iterator function. receives one argument, `seed`, and returns @@ -11719,7 +11202,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {Array} The final list. * @example * - * var f = function(n) { return n > 50 ? false : [-n, n + 10] }; + * var f = n => n > 50 ? false : [-n, n + 10]; * R.unfold(f, 10); //=> [-10, -20, -30, -40, -50] */ var unfold = _curry2(function unfold(fn, seed) { @@ -11733,12 +11216,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list containing only one copy of each element in the original list, based - * upon the value returned by applying the supplied predicate to two list elements. Prefers - * the first item if two items compare equal based on the predicate. + * Returns a new list containing only one copy of each element in the original + * list, based upon the value returned by applying the supplied predicate to + * two list elements. Prefers the first item if two items compare equal based + * on the predicate. * * @func * @memberOf R + * @since v0.2.0 * @category List * @sig (a, a -> Boolean) -> [a] -> [a] * @param {Function} pred A predicate used to test whether two items are equal. @@ -11746,15 +11231,17 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {Array} The list of unique items. * @example * - * var strEq = function(a, b) { return String(a) === String(b); }; + * var strEq = R.eqBy(String); * R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2] * R.uniqWith(strEq)([{}, {}]); //=> [{}] * R.uniqWith(strEq)([1, '1', 1]); //=> [1] * R.uniqWith(strEq)(['1', 1, 1]); //=> ['1'] */ var uniqWith = _curry2(function uniqWith(pred, list) { - var idx = 0, len = list.length; - var result = [], item; + var idx = 0; + var len = list.length; + var result = []; + var item; while (idx < len) { item = list[idx]; if (!_containsWith(pred, item, result)) { @@ -11766,18 +11253,48 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new copy of the array with the element at the - * provided index replaced with the given value. - * @see R.adjust + * Tests the final argument by passing it to the given predicate function. If + * the predicate is not satisfied, the function will return the result of + * calling the `whenFalseFn` function with the same argument. If the predicate + * is satisfied, the argument is returned as is. + * + * @func + * @memberOf R + * @since v0.18.0 + * @category Logic + * @sig (a -> Boolean) -> (a -> a) -> a -> a + * @param {Function} pred A predicate function + * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates + * to a falsy value. + * @param {*} x An object to test with the `pred` function and + * pass to `whenFalseFn` if necessary. + * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`. + * @see R.ifElse, R.when + * @example + * + * // coerceArray :: (a|[a]) -> [a] + * var coerceArray = R.unless(R.isArrayLike, R.of); + * coerceArray([1, 2, 3]); //=> [1, 2, 3] + * coerceArray(1); //=> [1] + */ + var unless = _curry3(function unless(pred, whenFalseFn, x) { + return pred(x) ? x : whenFalseFn(x); + }); + + /** + * Returns a new copy of the array with the element at the provided index + * replaced with the given value. * * @func * @memberOf R + * @since v0.14.0 * @category List * @sig Number -> a -> [a] -> [a] * @param {Number} idx The index to update. * @param {*} x The value to exist at the given index of the returned array. * @param {Array|Arguments} list The source array-like object to be updated. * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`. + * @see R.adjust * @example * * R.update(1, 11, [0, 1, 2]); //=> [0, 11, 2] @@ -11787,13 +11304,53 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return adjust(always(x), idx, list); }); + /** + * Accepts a function `fn` and a list of transformer functions and returns a + * new curried function. When the new function is invoked, it calls the + * function `fn` with parameters consisting of the result of calling each + * supplied handler on successive arguments to the new function. + * + * If more arguments are passed to the returned function than transformer + * functions, those arguments are passed directly to `fn` as additional + * parameters. If you expect additional arguments that don't need to be + * transformed, although you can ignore them, it's best to pass an identity + * function so that the new function reports the correct arity. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category Function + * @sig (x1 -> x2 -> ... -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z) + * @param {Function} fn The function to wrap. + * @param {Array} transformers A list of transformer functions + * @return {Function} The wrapped function. + * @example + * + * R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81 + * R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81 + * R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32 + * R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32 + */ + var useWith = _curry2(function useWith(fn, transformers) { + return curryN(transformers.length, function () { + var args = []; + var idx = 0; + while (idx < transformers.length) { + args.push(transformers[idx].call(this, arguments[idx])); + idx += 1; + } + return fn.apply(this, args.concat(_slice(arguments, transformers.length))); + }); + }); + /** * Returns a list of all the enumerable own properties of the supplied object. - * Note that the order of the output array is not guaranteed across - * different JS platforms. + * Note that the order of the output array is not guaranteed across different + * JS platforms. * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig {k: v} -> [v] * @param {Object} obj The object to extract values from @@ -11815,13 +11372,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a list of all the properties, including prototype properties, - * of the supplied object. - * Note that the order of the output array is not guaranteed to be - * consistent across different JS platforms. + * Returns a list of all the properties, including prototype properties, of the + * supplied object. + * Note that the order of the output array is not guaranteed to be consistent + * across different JS platforms. * * @func * @memberOf R + * @since v0.2.0 * @category Object * @sig {k: v} -> [v] * @param {Object} obj The object to extract values from @@ -11834,7 +11392,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.valuesIn(f); //=> ['X', 'Y'] */ var valuesIn = _curry1(function valuesIn(obj) { - var prop, vs = []; + var prop; + var vs = []; for (prop in obj) { vs[vs.length] = obj[prop]; } @@ -11847,8 +11406,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.16.0 * @category Object - * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s * @sig Lens s a -> s -> a * @param {Lens} lens * @param {*} x @@ -11875,18 +11435,51 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); }(); + /** + * Tests the final argument by passing it to the given predicate function. If + * the predicate is satisfied, the function will return the result of calling + * the `whenTrueFn` function with the same argument. If the predicate is not + * satisfied, the argument is returned as is. + * + * @func + * @memberOf R + * @since v0.18.0 + * @category Logic + * @sig (a -> Boolean) -> (a -> a) -> a -> a + * @param {Function} pred A predicate function + * @param {Function} whenTrueFn A function to invoke when the `condition` + * evaluates to a truthy value. + * @param {*} x An object to test with the `pred` function and + * pass to `whenTrueFn` if necessary. + * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`. + * @see R.ifElse, R.unless + * @example + * + * // truncate :: String -> String + * var truncate = R.when( + * R.propSatisfies(R.gt(R.__, 10), 'length'), + * R.pipe(R.take(10), R.append('…'), R.join('')) + * ); + * truncate('12345'); //=> '12345' + * truncate('0123456789ABC'); //=> '0123456789…' + */ + var when = _curry3(function when(pred, whenTrueFn, x) { + return pred(x) ? whenTrueFn(x) : x; + }); + /** * Takes a spec object and a test object; returns true if the test satisfies * the spec. Each of the spec's own properties must be a predicate function. - * Each predicate is applied to the value of the corresponding property of - * the test object. `where` returns true if all the predicates return true, - * false otherwise. + * Each predicate is applied to the value of the corresponding property of the + * test object. `where` returns true if all the predicates return true, false + * otherwise. * * `where` is well suited to declaratively expressing constraints for other * functions such as `filter` and `find`. * * @func * @memberOf R + * @since v0.1.1 * @category Object * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean * @param {Object} spec @@ -11918,11 +11511,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Wrap a function inside another to allow you to make adjustments to the parameters, or do - * other processing either before the internal function is called or with its results. - * + * Wrap a function inside another to allow you to make adjustments to the + * parameters, or do other processing either before the internal function is + * called or with its results. + * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (a... -> b) -> ((a... -> b) -> a... -> c) -> (a... -> c) * @param {Function} fn The function to wrap. @@ -11930,11 +11525,10 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {Function} The wrapped function. * @example * - * var greet = function(name) {return 'Hello ' + name;}; + * var greet = name => 'Hello ' + name; + * + * var shoutedGreet = R.wrap(greet, (gr, name) => gr(name).toUpperCase()); * - * var shoutedGreet = R.wrap(greet, function(gr, name) { - * return gr(name).toUpperCase(); - * }); * shoutedGreet("Kathy"); //=> "HELLO KATHY" * * var shortenedGreet = R.wrap(greet, function(gr, name) { @@ -11949,11 +11543,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Creates a new list out of the two supplied by creating each possible - * pair from the lists. + * Creates a new list out of the two supplied by creating each possible pair + * from the lists. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig [a] -> [b] -> [[a,b]] * @param {Array} as The first list. @@ -11987,13 +11582,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Creates a new list out of the two supplied by pairing up - * equally-positioned items from both lists. The returned list is - * truncated to the length of the shorter of the two input lists. + * Creates a new list out of the two supplied by pairing up equally-positioned + * items from both lists. The returned list is truncated to the length of the + * shorter of the two input lists. * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig [a] -> [b] -> [[a,b]] * @param {Array} list1 The first array to consider. @@ -12022,6 +11618,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.3.0 * @category List * @sig [String] -> [*] -> {String: *} * @param {Array} keys The array that will be properties on the output object. @@ -12032,7 +11629,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3} */ var zipObj = _curry2(function zipObj(keys, values) { - var idx = 0, len = keys.length, out = {}; + var idx = 0; + var len = keys.length; + var out = {}; while (idx < len) { out[keys[idx]] = values[idx]; idx += 1; @@ -12041,12 +11640,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Creates a new list out of the two supplied by applying the function to - * each equally-positioned pair in the lists. The returned list is - * truncated to the length of the shorter of the two input lists. + * Creates a new list out of the two supplied by applying the function to each + * equally-positioned pair in the lists. The returned list is truncated to the + * length of the shorter of the two input lists. * * @function * @memberOf R + * @since v0.1.0 * @category List * @sig (a,b -> c) -> [a] -> [b] -> [c] * @param {Function} fn The function used to combine the two elements into one value. @@ -12056,14 +11656,16 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * using `fn`. * @example * - * var f = function(x, y) { + * var f = (x, y) => { * // ... * }; * R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']); * //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')] */ var zipWith = _curry3(function zipWith(fn, a, b) { - var rv = [], idx = 0, len = Math.min(a.length, b.length); + var rv = []; + var idx = 0; + var len = Math.min(a.length, b.length); while (idx < len) { rv[idx] = fn(a[idx], b[idx]); idx += 1; @@ -12076,9 +11678,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.9.0 * @category Function - * @sig * -> false - * @return {Boolean} false + * @sig * -> Boolean + * @param {*} + * @return {Boolean} * @see R.always, R.T * @example * @@ -12091,9 +11695,11 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.9.0 * @category Function - * @sig * -> true - * @return {Boolean} `true`. + * @sig * -> Boolean + * @param {*} + * @return {Boolean} * @see R.always, R.F * @example * @@ -12101,27 +11707,6 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack */ var T = always(true); - /** - * Similar to hasMethod, this checks whether a function has a [methodname] - * function. If it isn't an array it will execute that function otherwise it will - * default to the ramda implementation. - * - * @private - * @param {Function} fn ramda implemtation - * @param {String} methodname property to check for a custom implementation - * @return {Object} Whatever the return value of the method is. - */ - var _checkForMethod = function _checkForMethod(methodname, fn) { - return function () { - var length = arguments.length; - if (length === 0) { - return fn(); - } - var obj = arguments[length - 1]; - return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, _slice(arguments, 0, length - 1)); - }; - }; - /** * Copies an object. * @@ -12154,7 +11739,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack case 'Array': return copy([]); case 'Date': - return new Date(value); + return new Date(value.valueOf()); case 'RegExp': return _cloneRegExp(value); default: @@ -12163,129 +11748,115 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; var _createPartialApplicator = function _createPartialApplicator(concat) { - return function (fn) { - var args = _slice(arguments, 1); + return _curry2(function (fn, args) { return _arity(Math.max(0, fn.length - args.length), function () { return fn.apply(this, concat(args, arguments)); }); - }; + }); }; - /** - * Returns a function that dispatches with different strategies based on the - * object in list position (last argument). If it is an array, executes [fn]. - * Otherwise, if it has a function with [methodname], it will execute that - * function (functor case). Otherwise, if it is a transformer, uses transducer - * [xf] to return a new transformer (transducer case). Otherwise, it will - * default to executing [fn]. - * - * @private - * @param {String} methodname property to check for a custom implementation - * @param {Function} xf transducer to initialize if object is transformer - * @param {Function} fn default ramda implementation - * @return {Function} A function that dispatches on object in list position - */ - var _dispatchable = function _dispatchable(methodname, xf, fn) { - return function () { - var length = arguments.length; - if (length === 0) { - return fn(); - } - var obj = arguments[length - 1]; - if (!_isArray(obj)) { - var args = _slice(arguments, 0, length - 1); - if (typeof obj[methodname] === 'function') { - return obj[methodname].apply(obj, args); - } - if (_isTransformer(obj)) { - var transducer = xf.apply(null, args); - return transducer(obj); - } - } - return fn.apply(this, arguments); - }; + var _dropLast = function dropLast(n, xs) { + return take(n < xs.length ? xs.length - n : 0, xs); }; - // The algorithm used to handle cyclic structures is - // inspired by underscore's isEqual - // RegExp equality algorithm: http://stackoverflow.com/a/10776635 + // Values of other types are only equal if identical. var _equals = function _equals(a, b, stackA, stackB) { - var typeA = type(a); - if (typeA !== type(b)) { - return false; - } - if (typeA === 'Boolean' || typeA === 'Number' || typeA === 'String') { - return typeof a === 'object' ? typeof b === 'object' && identical(a.valueOf(), b.valueOf()) : identical(a, b); - } if (identical(a, b)) { return true; } - if (typeA === 'RegExp') { - // RegExp equality algorithm: http://stackoverflow.com/a/10776635 - return a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode; + if (type(a) !== type(b)) { + return false; } - if (Object(a) === a) { - if (typeA === 'Date' && a.getTime() !== b.getTime()) { + if (a == null || b == null) { + return false; + } + if (typeof a.equals === 'function' || typeof b.equals === 'function') { + return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a); + } + switch (type(a)) { + case 'Arguments': + case 'Array': + case 'Object': + break; + case 'Boolean': + case 'Number': + case 'String': + if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) { return false; } - var keysA = keys(a); - if (keysA.length !== keys(b).length) { + break; + case 'Date': + if (!identical(a.valueOf(), b.valueOf())) { return false; } - var idx = stackA.length - 1; - while (idx >= 0) { - if (stackA[idx] === a) { - return stackB[idx] === b; - } - idx -= 1; + break; + case 'Error': + return a.name === b.name && a.message === b.message; + case 'RegExp': + if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) { + return false; } - stackA[stackA.length] = a; - stackB[stackB.length] = b; - idx = keysA.length - 1; - while (idx >= 0) { - var key = keysA[idx]; - if (!_has(key, b) || !_equals(b[key], a[key], stackA, stackB)) { - return false; - } - idx -= 1; + break; + case 'Map': + case 'Set': + if (!_equals(_arrayFromIterator(a.entries()), _arrayFromIterator(b.entries()), stackA, stackB)) { + return false; } - stackA.pop(); - stackB.pop(); - return true; + break; + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + break; + case 'ArrayBuffer': + break; + default: + // Values of other types are only equal if identical. + return false; } - return false; - }; - - /** - * Private function that determines whether or not a provided object has a given method. - * Does not ignore methods stored on the object's prototype chain. Used for dynamically - * dispatching Ramda methods to non-Array objects. - * - * @private - * @param {String} methodName The name of the method to check for. - * @param {Object} obj The object to test. - * @return {Boolean} `true` has a given method, `false` otherwise. - * @example - * - * var person = { name: 'John' }; - * person.shout = function() { alert(this.name); }; - * - * _hasMethod('shout', person); //=> true - * _hasMethod('foo', person); //=> false - */ - var _hasMethod = function _hasMethod(methodName, obj) { - return obj != null && !_isArray(obj) && typeof obj[methodName] === 'function'; + var keysA = keys(a); + if (keysA.length !== keys(b).length) { + return false; + } + var idx = stackA.length - 1; + while (idx >= 0) { + if (stackA[idx] === a) { + return stackB[idx] === b; + } + idx -= 1; + } + stackA.push(a); + stackB.push(b); + idx = keysA.length - 1; + while (idx >= 0) { + var key = keysA[idx]; + if (!(_has(key, b) && _equals(b[key], a[key], stackA, stackB))) { + return false; + } + idx -= 1; + } + stackA.pop(); + stackB.pop(); + return true; }; /** - * `_makeFlat` is a helper function that returns a one-level or fully recursive function - * based on the flag passed in. + * `_makeFlat` is a helper function that returns a one-level or fully recursive + * function based on the flag passed in. * * @private */ var _makeFlat = function _makeFlat(recursive) { return function flatt(list) { - var value, result = [], idx = 0, j, ilen = list.length, jlen; + var value, jlen, j; + var result = []; + var idx = 0; + var ilen = list.length; while (idx < ilen) { if (isArrayLike(list[idx])) { value = recursive ? flatt(list[idx]) : list[idx]; @@ -12306,7 +11877,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var _reduce = function () { function _arrayReduce(xf, acc, list) { - var idx = 0, len = list.length; + var idx = 0; + var len = list.length; while (idx < len) { acc = xf['@@transducer/step'](acc, list[idx]); if (acc && acc['@@transducer/reduced']) { @@ -12353,132 +11925,31 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; }(); - var _stepCat = function () { - var _stepCatArray = { - '@@transducer/init': Array, - '@@transducer/step': function (xs, x) { - return _concat(xs, [x]); - }, - '@@transducer/result': _identity - }; - var _stepCatString = { - '@@transducer/init': String, - '@@transducer/step': function (a, b) { - return a + b; - }, - '@@transducer/result': _identity - }; - var _stepCatObject = { - '@@transducer/init': Object, - '@@transducer/step': function (result, input) { - return merge(result, isArrayLike(input) ? createMapEntry(input[0], input[1]) : input); - }, - '@@transducer/result': _identity - }; - return function _stepCat(obj) { - if (_isTransformer(obj)) { - return obj; - } - if (isArrayLike(obj)) { - return _stepCatArray; - } - if (typeof obj === 'string') { - return _stepCatString; - } - if (typeof obj === 'object') { - return _stepCatObject; - } - throw new Error('Cannot create transformer for ' + obj); - }; - }(); - - var _xall = function () { - function XAll(f, xf) { - this.xf = xf; - this.f = f; - this.all = true; - } - XAll.prototype['@@transducer/init'] = _xfBase.init; - XAll.prototype['@@transducer/result'] = function (result) { - if (this.all) { - result = this.xf['@@transducer/step'](result, true); - } - return this.xf['@@transducer/result'](result); - }; - XAll.prototype['@@transducer/step'] = function (result, input) { - if (!this.f(input)) { - this.all = false; - result = _reduced(this.xf['@@transducer/step'](result, false)); - } - return result; - }; - return _curry2(function _xall(f, xf) { - return new XAll(f, xf); - }); - }(); - - var _xany = function () { - function XAny(f, xf) { + var _xdropLastWhile = function () { + function XDropLastWhile(fn, xf) { + this.f = fn; + this.retained = []; this.xf = xf; - this.f = f; - this.any = false; } - XAny.prototype['@@transducer/init'] = _xfBase.init; - XAny.prototype['@@transducer/result'] = function (result) { - if (!this.any) { - result = this.xf['@@transducer/step'](result, false); - } + XDropLastWhile.prototype['@@transducer/init'] = _xfBase.init; + XDropLastWhile.prototype['@@transducer/result'] = function (result) { + this.retained = null; return this.xf['@@transducer/result'](result); }; - XAny.prototype['@@transducer/step'] = function (result, input) { - if (this.f(input)) { - this.any = true; - result = _reduced(this.xf['@@transducer/step'](result, true)); - } - return result; + XDropLastWhile.prototype['@@transducer/step'] = function (result, input) { + return this.f(input) ? this.retain(result, input) : this.flush(result, input); }; - return _curry2(function _xany(f, xf) { - return new XAny(f, xf); - }); - }(); - - var _xdrop = function () { - function XDrop(n, xf) { - this.xf = xf; - this.n = n; - } - XDrop.prototype['@@transducer/init'] = _xfBase.init; - XDrop.prototype['@@transducer/result'] = _xfBase.result; - XDrop.prototype['@@transducer/step'] = function (result, input) { - if (this.n > 0) { - this.n -= 1; - return result; - } + XDropLastWhile.prototype.flush = function (result, input) { + result = _reduce(this.xf['@@transducer/step'], result, this.retained); + this.retained = []; return this.xf['@@transducer/step'](result, input); }; - return _curry2(function _xdrop(n, xf) { - return new XDrop(n, xf); - }); - }(); - - var _xdropWhile = function () { - function XDropWhile(f, xf) { - this.xf = xf; - this.f = f; - } - XDropWhile.prototype['@@transducer/init'] = _xfBase.init; - XDropWhile.prototype['@@transducer/result'] = _xfBase.result; - XDropWhile.prototype['@@transducer/step'] = function (result, input) { - if (this.f) { - if (this.f(input)) { - return result; - } - this.f = null; - } - return this.xf['@@transducer/step'](result, input); + XDropLastWhile.prototype.retain = function (result, input) { + this.retained.push(input); + return result; }; - return _curry2(function _xdropWhile(f, xf) { - return new XDropWhile(f, xf); + return _curry2(function _xdropLastWhile(fn, xf) { + return new XDropLastWhile(fn, xf); }); }(); @@ -12500,6 +11971,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack } } } + this.inputs = null; return this.xf['@@transducer/result'](result); }; XGroupBy.prototype['@@transducer/step'] = function (result, input) { @@ -12517,16 +11989,18 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }(); /** - * Creates a new list iteration function from an existing one by adding two new parameters - * to its callback function: the current index, and the entire list. + * Creates a new list iteration function from an existing one by adding two new + * parameters to its callback function: the current index, and the entire list. * - * This would turn, for instance, Ramda's simple `map` function into one that more closely - * resembles `Array.prototype.map`. Note that this will only work for functions in which - * the iteration callback function is the first parameter, and where the list is the last - * parameter. (This latter might be unimportant if the list parameter is not used.) + * This would turn, for instance, Ramda's simple `map` function into one that + * more closely resembles `Array.prototype.map`. Note that this will only work + * for functions in which the iteration callback function is the first + * parameter, and where the list is the last parameter. (This latter might be + * unimportant if the list parameter is not used.) * * @func * @memberOf R + * @since v0.15.0 * @category Function * @category List * @sig ((a ... -> b) ... -> [a] -> *) -> (a ..., Int, [a] -> b) ... -> [a] -> *) @@ -12535,7 +12009,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @example * * var mapIndexed = R.addIndex(R.map); - * mapIndexed(function(val, idx) {return idx + '-' + val;}, ['f', 'o', 'o', 'b', 'a', 'r']); + * mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']); * //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r'] */ var addIndex = _curry1(function addIndex(fn) { @@ -12557,104 +12031,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns `true` if all elements of the list match the predicate, `false` if there are any - * that don't. - * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce - * - * @func - * @memberOf R - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is satisfied by every element, `false` - * otherwise. - * @see R.any, R.none - * @example - * - * var lessThan2 = R.flip(R.lt)(2); - * var lessThan3 = R.flip(R.lt)(3); - * R.all(lessThan2)([1, 2]); //=> false - * R.all(lessThan3)([1, 2]); //=> true - */ - var all = _curry2(_dispatchable('all', _xall, function all(fn, list) { - var idx = 0; - while (idx < list.length) { - if (!fn(list[idx])) { - return false; - } - idx += 1; - } - return true; - })); - - /** - * A function that returns the first argument if it's falsy otherwise the second - * argument. Note that this is NOT short-circuited, meaning that if expressions - * are passed they are both evaluated. - * - * Dispatches to the `and` method of the first argument if applicable. - * - * @func - * @memberOf R - * @category Logic - * @sig * -> * -> * - * @param {*} a any value - * @param {*} b any other value - * @return {*} the first argument if falsy otherwise the second argument. - * @see R.both - * @example - * - * R.and(false, true); //=> false - * R.and(0, []); //=> 0 - * R.and(null, ''); => null - */ - var and = _curry2(function and(a, b) { - return _hasMethod('and', a) ? a.and(b) : a && b; - }); - - /** - * Returns `true` if at least one of elements of the list match the predicate, `false` - * otherwise. - * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce - * - * @func - * @memberOf R - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false` - * otherwise. - * @see R.all, R.none - * @example - * - * var lessThan0 = R.flip(R.lt)(0); - * var lessThan2 = R.flip(R.lt)(2); - * R.any(lessThan0)([1, 2]); //=> false - * R.any(lessThan2)([1, 2]); //=> true - */ - var any = _curry2(_dispatchable('any', _xany, function any(fn, list) { - var idx = 0; - while (idx < list.length) { - if (fn(list[idx])) { - return true; - } - idx += 1; - } - return false; - })); - - /** - * Wraps a function of any arity (including nullary) in a function that accepts exactly 2 - * parameters. Any extraneous parameters will not be passed to the supplied function. + * Wraps a function of any arity (including nullary) in a function that accepts + * exactly 2 parameters. Any extraneous parameters will not be passed to the + * supplied function. * * @func * @memberOf R + * @since v0.2.0 * @category Function * @sig (* -> c) -> (a, b -> c) * @param {Function} fn The function to wrap. @@ -12679,11 +12062,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /** * Creates a deep copy of the value which may contain (nested) `Array`s and - * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are - * not copied, but assigned by their reference. - * + * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are not + * copied, but assigned by their reference. + * + * Dispatches to a `clone` method if present. + * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig {*} -> {*} * @param {*} value The object or array to clone @@ -12695,45 +12081,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * objects[0] === objectsClone[0]; //=> false */ var clone = _curry1(function clone(value) { - return _clone(value, [], []); - }); - - /** - * Returns a new list consisting of the elements of the first list followed by the elements - * of the second. - * - * @func - * @memberOf R - * @category List - * @sig [a] -> [a] -> [a] - * @param {Array} list1 The first list to merge. - * @param {Array} list2 The second set to merge. - * @return {Array} A new array consisting of the contents of `list1` followed by the - * contents of `list2`. If, instead of an Array for `list1`, you pass an - * object with a `concat` method on it, `concat` will call `list1.concat` - * and pass it the value of `list2`. - * - * @example - * - * R.concat([], []); //=> [] - * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] - * R.concat('ABC', 'DEF'); // 'ABCDEF' - */ - var concat = _curry2(function concat(set1, set2) { - if (_isArray(set2)) { - return _concat(set1, set2); - } else if (_hasMethod('concat', set1)) { - return set1.concat(set2); - } else { - throw new TypeError('can\'t concat ' + typeof set1); - } + return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], []); }); /** - * Returns a curried equivalent of the provided function. The curried - * function has two unusual capabilities. First, its arguments needn't - * be provided one at a time. If `f` is a ternary function and `g` is - * `R.curry(f)`, the following are equivalent: + * Returns a curried equivalent of the provided function. The curried function + * has two unusual capabilities. First, its arguments needn't be provided one + * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the + * following are equivalent: * * - `g(1)(2)(3)` * - `g(1)(2, 3)` @@ -12742,8 +12097,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * Secondly, the special placeholder value `R.__` may be used to specify * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is `R.__`, - * the following are equivalent: + * regardless of their positions. If `g` is as above and `_` is `R.__`, the + * following are equivalent: * * - `g(1, 2, 3)` * - `g(_, 2, 3)(1)` @@ -12755,6 +12110,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (* -> a) -> (* -> a) * @param {Function} fn The function to curry. @@ -12762,9 +12118,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.curryN * @example * - * var addFourNumbers = function(a, b, c, d) { - * return a + b + c + d; - * }; + * var addFourNumbers = (a, b, c, d) => a + b + c + d; * * var curriedAddFourNumbers = R.curry(addFourNumbers); * var f = curriedAddFourNumbers(1, 2); @@ -12776,225 +12130,152 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list containing the last `n` elements of a given list, passing each value - * to the supplied predicate function, skipping elements while the predicate function returns - * `true`. The predicate function is passed one argument: *(value)*. + * Returns all but the first `n` elements of the given list, string, or + * transducer/transformer (or object with a `drop` method). * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce + * Dispatches to the `drop` method of the second argument, if present. * * @func * @memberOf R + * @since v0.1.0 * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @param {Function} fn The function called per iteration. - * @param {Array} list The collection to iterate over. - * @return {Array} A new array. - * @see R.takeWhile + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n + * @param {*} list + * @return {*} + * @see R.take, R.transduce * @example * - * var lteTwo = function(x) { - * return x <= 2; - * }; - * - * R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1] + * R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] + * R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz'] + * R.drop(3, ['foo', 'bar', 'baz']); //=> [] + * R.drop(4, ['foo', 'bar', 'baz']); //=> [] + * R.drop(3, 'ramda'); //=> 'da' */ - var dropWhile = _curry2(_dispatchable('dropWhile', _xdropWhile, function dropWhile(pred, list) { - var idx = 0, len = list.length; - while (idx < len && pred(list[idx])) { - idx += 1; - } - return _slice(list, idx); + var drop = _curry2(_dispatchable('drop', _xdrop, function drop(n, xs) { + return slice(Math.max(0, n), Infinity, xs); })); /** - * Returns `true` if its arguments are equivalent, `false` otherwise. - * Dispatches to an `equals` method if present. Handles cyclical data - * structures. + * Returns a list containing all but the last `n` elements of the given `list`. * * @func * @memberOf R - * @category Relation - * @sig a -> b -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} + * @since v0.16.0 + * @category List + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n The number of elements of `xs` to skip. + * @param {Array} xs The collection to consider. + * @return {Array} + * @see R.takeLast * @example * - * R.equals(1, 1); //=> true - * R.equals(1, '1'); //=> false - * R.equals([1, 2, 3], [1, 2, 3]); //=> true - * - * var a = {}; a.v = a; - * var b = {}; b.v = b; - * R.equals(a, b); //=> true + * R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] + * R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo'] + * R.dropLast(3, ['foo', 'bar', 'baz']); //=> [] + * R.dropLast(4, ['foo', 'bar', 'baz']); //=> [] + * R.dropLast(3, 'ramda'); //=> 'ra' */ - var equals = _curry2(function equals(a, b) { - return _hasMethod('equals', a) ? a.equals(b) : _hasMethod('equals', b) ? b.equals(a) : _equals(a, b, [], []); - }); + var dropLast = _curry2(_dispatchable('dropLast', _xdropLast, _dropLast)); /** - * Returns a new list containing only those items that match a given predicate function. - * The predicate function is passed one argument: *(value)*. - * - * Note that `R.filter` does not skip deleted or unassigned indices, unlike the native - * `Array.prototype.filter` method. For more details on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Description - * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce + * Returns a new list containing all but last the`n` elements of a given list, + * passing each value from the right to the supplied predicate function, + * skipping elements while the predicate function returns `true`. The predicate + * function is passed one argument: (value)*. * * @func * @memberOf R + * @since v0.16.0 * @category List * @sig (a -> Boolean) -> [a] -> [a] * @param {Function} fn The function called per iteration. * @param {Array} list The collection to iterate over. - * @return {Array} The new filtered array. - * @see R.reject + * @return {Array} A new array. + * @see R.takeLastWhile, R.addIndex * @example * - * var isEven = function(n) { - * return n % 2 === 0; - * }; - * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4] - */ - var filter = _curry2(_dispatchable('filter', _xfilter, _filter)); - - /** - * Returns the first element of the list which matches the predicate, or `undefined` if no - * element matches. - * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce - * - * @func - * @memberOf R - * @category List - * @sig (a -> Boolean) -> [a] -> a | undefined - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Object} The element found, or `undefined`. - * @example + * var lteThree = x => x <= 3; * - * var xs = [{a: 1}, {a: 2}, {a: 3}]; - * R.find(R.propEq('a', 2))(xs); //=> {a: 2} - * R.find(R.propEq('a', 4))(xs); //=> undefined + * R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4] */ - var find = _curry2(_dispatchable('find', _xfind, function find(fn, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (fn(list[idx])) { - return list[idx]; - } - idx += 1; - } - })); + var dropLastWhile = _curry2(_dispatchable('dropLastWhile', _xdropLastWhile, _dropLastWhile)); /** - * Returns the index of the first element of the list which matches the predicate, or `-1` - * if no element matches. + * Returns `true` if its arguments are equivalent, `false` otherwise. Handles + * cyclical data structures. * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce + * Dispatches symmetrically to the `equals` methods of both arguments, if + * present. * * @func * @memberOf R - * @category List - * @sig (a -> Boolean) -> [a] -> Number - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Number} The index of the element found, or `-1`. + * @since v0.15.0 + * @category Relation + * @sig a -> b -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} * @example * - * var xs = [{a: 1}, {a: 2}, {a: 3}]; - * R.findIndex(R.propEq('a', 2))(xs); //=> 1 - * R.findIndex(R.propEq('a', 4))(xs); //=> -1 + * R.equals(1, 1); //=> true + * R.equals(1, '1'); //=> false + * R.equals([1, 2, 3], [1, 2, 3]); //=> true + * + * var a = {}; a.v = a; + * var b = {}; b.v = b; + * R.equals(a, b); //=> true */ - var findIndex = _curry2(_dispatchable('findIndex', _xfindIndex, function findIndex(fn, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (fn(list[idx])) { - return idx; - } - idx += 1; - } - return -1; - })); + var equals = _curry2(function equals(a, b) { + return _equals(a, b, [], []); + }); /** - * Returns the last element of the list which matches the predicate, or `undefined` if no - * element matches. + * Takes a predicate and a "filterable", and returns a new filterable of the + * same type containing the members of the given filterable which satisfy the + * given predicate. + * + * Dispatches to the `filter` method of the second argument, if present. * * Acts as a transducer if a transformer is given in list position. - * @see R.transduce * * @func * @memberOf R + * @since v0.1.0 * @category List - * @sig (a -> Boolean) -> [a] -> a | undefined - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Object} The element found, or `undefined`. + * @sig Filterable f => (a -> Boolean) -> f a -> f a + * @param {Function} pred + * @param {Array} filterable + * @return {Array} + * @see R.reject, R.transduce, R.addIndex * @example * - * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; - * R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1} - * R.findLast(R.propEq('a', 4))(xs); //=> undefined - */ - var findLast = _curry2(_dispatchable('findLast', _xfindLast, function findLast(fn, list) { - var idx = list.length - 1; - while (idx >= 0) { - if (fn(list[idx])) { - return list[idx]; - } - idx -= 1; - } - })); - - /** - * Returns the index of the last element of the list which matches the predicate, or - * `-1` if no element matches. - * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce + * var isEven = n => n % 2 === 0; * - * @func - * @memberOf R - * @category List - * @sig (a -> Boolean) -> [a] -> Number - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Number} The index of the element found, or `-1`. - * @example + * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4] * - * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; - * R.findLastIndex(R.propEq('a', 1))(xs); //=> 1 - * R.findLastIndex(R.propEq('a', 4))(xs); //=> -1 + * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} */ - var findLastIndex = _curry2(_dispatchable('findLastIndex', _xfindLastIndex, function findLastIndex(fn, list) { - var idx = list.length - 1; - while (idx >= 0) { - if (fn(list[idx])) { - return idx; + // else + var filter = _curry2(_dispatchable('filter', _xfilter, function (pred, filterable) { + return _isObject(filterable) ? _reduce(function (acc, key) { + if (pred(filterable[key])) { + acc[key] = filterable[key]; } - idx -= 1; - } - return -1; + return acc; + }, {}, keys(filterable)) : // else + _filter(pred, filterable); })); /** - * Returns a new list by pulling every item out of it (and all its sub-arrays) and putting - * them in a new array, depth-first. + * Returns a new list by pulling every item out of it (and all its sub-arrays) + * and putting them in a new array, depth-first. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig [a] -> [b] * @param {Array} list The array to consider. @@ -13008,20 +12289,19 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var flatten = _curry1(_makeFlat(true)); /** - * Returns a new function much like the supplied one, except that the first two arguments' - * order is reversed. + * Returns a new function much like the supplied one, except that the first two + * arguments' order is reversed. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (a -> b -> c -> ... -> z) -> (b -> a -> c -> ... -> z) * @param {Function} fn The function to invoke with its first two parameters reversed. * @return {*} The result of invoking `fn` with its first two parameters' order reversed. * @example * - * var mergeThree = function(a, b, c) { - * return ([]).concat(a, b, c); - * }; + * var mergeThree = (a, b, c) => [].concat(a, b, c); * * mergeThree(1, 2, 3); //=> [1, 2, 3] * @@ -13037,99 +12317,24 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Iterate over an input `list`, calling a provided function `fn` for each element in the - * list. - * - * `fn` receives one argument: *(value)*. - * - * Note: `R.forEach` does not skip deleted or unassigned indices (sparse arrays), unlike - * the native `Array.prototype.forEach` method. For more details on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description - * - * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns the original - * array. In some libraries this function is named `each`. - * - * @func - * @memberOf R - * @category List - * @sig (a -> *) -> [a] -> [a] - * @param {Function} fn The function to invoke. Receives one argument, `value`. - * @param {Array} list The list to iterate over. - * @return {Array} The original list. - * @example - * - * var printXPlusFive = function(x) { console.log(x + 5); }; - * R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3] - * //-> 6 - * //-> 7 - * //-> 8 - */ - var forEach = _curry2(_checkForMethod('forEach', function forEach(fn, list) { - var len = list.length; - var idx = 0; - while (idx < len) { - fn(list[idx]); - idx += 1; - } - return list; - })); - - /** - * Returns a list of function names of object's own functions - * - * @func - * @memberOf R - * @category Object - * @sig {*} -> [String] - * @param {Object} obj The objects with functions in it - * @return {Array} A list of the object's own properties that map to functions. - * @example - * - * R.functions(R); // returns list of ramda's own function names - * - * var F = function() { this.x = function(){}; this.y = 1; } - * F.prototype.z = function() {}; - * F.prototype.a = 100; - * R.functions(new F()); //=> ["x"] - */ - var functions = _curry1(_functionsWith(keys)); - - /** - * Returns a list of function names of object's own and prototype functions - * - * @func - * @memberOf R - * @category Object - * @sig {*} -> [String] - * @param {Object} obj The objects with functions in it - * @return {Array} A list of the object's own properties and prototype - * properties that map to functions. - * @example - * - * R.functionsIn(R); // returns list of ramda's own and prototype function names + * Splits a list into sub-lists stored in an object, based on the result of + * calling a String-returning function on each element, and grouping the + * results according to values returned. * - * var F = function() { this.x = function(){}; this.y = 1; } - * F.prototype.z = function() {}; - * F.prototype.a = 100; - * R.functionsIn(new F()); //=> ["x", "z"] - */ - var functionsIn = _curry1(_functionsWith(keysIn)); - - /** - * Splits a list into sub-lists stored in an object, based on the result of calling a String-returning function - * on each element, and grouping the results according to values returned. + * Dispatches to the `groupBy` method of the second argument, if present. * * Acts as a transducer if a transformer is given in list position. - * @see R.transduce * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig (a -> String) -> [a] -> {String: [a]} * @param {Function} fn Function :: a -> String * @param {Array} list The array to group * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements * that produced that key when passed to `fn`. + * @see R.transduce * @example * * var byGrade = R.groupBy(function(student) { @@ -13165,12 +12370,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category List - * @see R.tail, R.init, R.last * @sig [a] -> a | Undefined * @sig String -> String - * @param {*} list + * @param {Array|String} list * @return {*} + * @see R.tail, R.init, R.last * @example * * R.head(['fi', 'fo', 'fum']); //=> 'fi' @@ -13181,22 +12387,77 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack */ var head = nth(0); + /** + * Given a function that generates a key, turns a list of objects into an + * object indexing the objects by the given key. Note that if multiple + * objects generate the same value for the indexing key only the last value + * will be included in the generated object. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category List + * @sig (a -> String) -> [{k: v}] -> {k: {k: v}} + * @param {Function} fn Function :: a -> String + * @param {Array} array The array of objects to index + * @return {Object} An object indexing each array element by the given property. + * @example + * + * var list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}]; + * R.indexBy(R.prop('id'), list); + * //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}} + */ + var indexBy = _curry2(function indexBy(fn, list) { + return _reduce(function (acc, elem) { + var key = fn(elem); + acc[key] = elem; + return acc; + }, {}, list); + }); + + /** + * Returns all but the last element of the given list or string. + * + * @func + * @memberOf R + * @since v0.9.0 + * @category List + * @sig [a] -> [a] + * @sig String -> String + * @param {*} list + * @return {*} + * @see R.last, R.head, R.tail + * @example + * + * R.init([1, 2, 3]); //=> [1, 2] + * R.init([1, 2]); //=> [1] + * R.init([1]); //=> [] + * R.init([]); //=> [] + * + * R.init('abc'); //=> 'ab' + * R.init('ab'); //=> 'a' + * R.init('a'); //=> '' + * R.init(''); //=> '' + */ + var init = slice(0, -1); + /** * Combines two lists into a set (i.e. no duplicates) composed of those - * elements common to both lists. Duplication is determined according - * to the value returned by applying the supplied predicate to two list - * elements. + * elements common to both lists. Duplication is determined according to the + * value returned by applying the supplied predicate to two list elements. * * @func * @memberOf R + * @since v0.1.0 * @category Relation - * @sig (a,a -> Boolean) -> [a] -> [a] -> [a] + * @sig (a -> a -> Boolean) -> [*] -> [*] -> [*] * @param {Function} pred A predicate function that determines whether * the two supplied elements are equal. * @param {Array} list1 One list of items to compare * @param {Array} list2 A second list of items to compare - * @see R.intersection * @return {Array} A new list containing those elements common to both lists. + * @see R.intersection * @example * * var buffaloSpringfield = [ @@ -13213,13 +12474,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * {id: 177, name: 'Neil Young'} * ]; * - * var sameId = function(o1, o2) {return o1.id === o2.id;}; - * - * R.intersectionWith(sameId, buffaloSpringfield, csny); + * R.intersectionWith(R.eqBy(R.prop('id')), buffaloSpringfield, csny); * //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}] */ var intersectionWith = _curry3(function intersectionWith(pred, list1, list2) { - var results = [], idx = 0; + var results = []; + var idx = 0; while (idx < list1.length) { if (_containsWith(pred, list1[idx], list2)) { results[results.length] = list1[idx]; @@ -13230,97 +12490,30 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Creates a new list with the separator interposed between elements. + * Same as R.invertObj, however this accounts for objects with duplicate values + * by putting the values into an array. * * @func * @memberOf R - * @category List - * @sig a -> [a] -> [a] - * @param {*} separator The element to add to the list. - * @param {Array} list The list to be interposed. - * @return {Array} The new list. + * @since v0.9.0 + * @category Object + * @sig {s: x} -> {x: [ s, ... ]} + * @param {Object} obj The object or array to invert + * @return {Object} out A new object with keys + * in an array. * @example * - * R.intersperse('n', ['ba', 'a', 'a']); //=> ['ba', 'n', 'a', 'n', 'a'] + * var raceResultsByFirstName = { + * first: 'alice', + * second: 'jake', + * third: 'alice', + * }; + * R.invert(raceResultsByFirstName); + * //=> { 'alice': ['first', 'third'], 'jake':['second'] } */ - var intersperse = _curry2(_checkForMethod('intersperse', function intersperse(separator, list) { - var out = []; - var idx = 0; - var length = list.length; - while (idx < length) { - if (idx === length - 1) { - out.push(list[idx]); - } else { - out.push(list[idx], separator); - } - idx += 1; - } - return out; - })); - - /** - * Transforms the items of the list with the transducer and appends the transformed items to - * the accumulator using an appropriate iterator function based on the accumulator type. - * - * The accumulator can be an array, string, object or a transformer. Iterated items will - * be appended to arrays and concatenated to strings. Objects will be merged directly or 2-item - * arrays will be merged as key, value pairs. - * - * The accumulator can also be a transformer object that provides a 2-arity reducing iterator - * function, step, 0-arity initial value function, init, and 1-arity result extraction function - * result. The step function is used as the iterator function in reduce. The result function is - * used to convert the final accumulator into the return type and in most cases is R.identity. - * The init function is used to provide the initial accumulator. - * - * The iteration is performed with R.reduce after initializing the transducer. - * - * @func - * @memberOf R - * @category List - * @sig a -> (b -> b) -> [c] -> a - * @param {*} acc The initial accumulator value. - * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @example - * - * var numbers = [1, 2, 3, 4]; - * var transducer = R.compose(R.map(R.add(1)), R.take(2)); - * - * R.into([], transducer, numbers); //=> [2, 3] - * - * var intoArray = R.into([]); - * intoArray(transducer, numbers); //=> [2, 3] - */ - var into = _curry3(function into(acc, xf, list) { - return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), acc, list); - }); - - /** - * Same as R.invertObj, however this accounts for objects - * with duplicate values by putting the values into an - * array. - * - * @func - * @memberOf R - * @category Object - * @sig {s: x} -> {x: [ s, ... ]} - * @param {Object} obj The object or array to invert - * @return {Object} out A new object with keys - * in an array. - * @example - * - * var raceResultsByFirstName = { - * first: 'alice', - * second: 'jake', - * third: 'alice', - * }; - * R.invert(raceResultsByFirstName); - * //=> { 'alice': ['first', 'third'], 'jake':['second'] } - */ - var invert = _curry1(function invert(obj) { - var props = keys(obj); - var len = props.length; + var invert = _curry1(function invert(obj) { + var props = keys(obj); + var len = props.length; var idx = 0; var out = {}; while (idx < len) { @@ -13334,11 +12527,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new object with the keys of the given object - * as values, and the values of the given object as keys. + * Returns a new object with the keys of the given object as values, and the + * values of the given object, which are coerced to strings, as keys. Note + * that the last key found is preferred when handling the same value. * * @func * @memberOf R + * @since v0.9.0 * @category Object * @sig {s: x} -> {x: s} * @param {Object} obj The object or array to invert @@ -13370,17 +12565,43 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return out; }); + /** + * Returns `true` if the given value is its type's empty value; `false` + * otherwise. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category Logic + * @sig a -> Boolean + * @param {*} x + * @return {Boolean} + * @see R.empty + * @example + * + * R.isEmpty([1, 2, 3]); //=> false + * R.isEmpty([]); //=> true + * R.isEmpty(''); //=> true + * R.isEmpty(null); //=> false + * R.isEmpty({}); //=> true + * R.isEmpty({length: 0}); //=> false + */ + var isEmpty = _curry1(function isEmpty(x) { + return x != null && equals(x, empty(x)); + }); + /** * Returns the last element of the given list or string. * * @func * @memberOf R + * @since v0.1.4 * @category List - * @see R.init, R.head, R.tail * @sig [a] -> a | Undefined * @sig String -> String * @param {*} list * @return {*} + * @see R.init, R.head, R.tail * @example * * R.last(['fi', 'fo', 'fum']); //=> 'fum' @@ -13392,12 +12613,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var last = nth(-1); /** - * Returns the position of the last occurrence of an item in - * an array, or -1 if the item is not included in the array. - * `R.equals` is used to determine equality. + * Returns the position of the last occurrence of an item in an array, or -1 if + * the item is not included in the array. `R.equals` is used to determine + * equality. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig a -> [a] -> Number * @param {*} target The item to find. @@ -13410,7 +12632,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.lastIndexOf(10, [1,2,3,4]); //=> -1 */ var lastIndexOf = _curry2(function lastIndexOf(target, xs) { - if (_hasMethod('lastIndexOf', xs)) { + if (typeof xs.lastIndexOf === 'function' && !_isArray(xs)) { return xs.lastIndexOf(target); } else { var idx = xs.length - 1; @@ -13425,82 +12647,71 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list, constructed by applying the supplied function to every element of the - * supplied list. + * Takes a function and + * a [functor](https://github.com/fantasyland/fantasy-land#functor), + * applies the function to each of the functor's values, and returns + * a functor of the same shape. * - * Note: `R.map` does not skip deleted or unassigned indices (sparse arrays), unlike the - * native `Array.prototype.map` method. For more details on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Description + * Ramda provides suitable `map` implementations for `Array` and `Object`, + * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`. + * + * Dispatches to the `map` method of the second argument, if present. * * Acts as a transducer if a transformer is given in list position. - * @see R.transduce + * + * Also treats functions as functors and will compose them together. * * @func * @memberOf R + * @since v0.1.0 * @category List - * @sig (a -> b) -> [a] -> [b] + * @sig Functor f => (a -> b) -> f a -> f b * @param {Function} fn The function to be called on every element of the input `list`. * @param {Array} list The list to be iterated over. * @return {Array} The new list. + * @see R.transduce, R.addIndex * @example * - * var double = function(x) { - * return x * 2; - * }; + * var double = x => x * 2; * * R.map(double, [1, 2, 3]); //=> [2, 4, 6] - */ - var map = _curry2(_dispatchable('map', _xmap, _map)); - - /** - * Map, but for objects. Creates an object with the same keys as `obj` and values - * generated by running each property of `obj` through `fn`. `fn` is passed one argument: - * *(value)*. - * - * @func - * @memberOf R - * @category Object - * @sig (v -> v) -> {k: v} -> {k: v} - * @param {Function} fn A function called for each property in `obj`. Its return value will - * become a new property on the return object. - * @param {Object} obj The object to iterate over. - * @return {Object} A new object with the same keys as `obj` and values that are the result - * of running each property through `fn`. - * @example * - * var values = { x: 1, y: 2, z: 3 }; - * var double = function(num) { - * return num * 2; - * }; - * - * R.mapObj(double, values); //=> { x: 2, y: 4, z: 6 } + * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6} */ - var mapObj = _curry2(function mapObj(fn, obj) { - return _reduce(function (acc, key) { - acc[key] = fn(obj[key]); - return acc; - }, {}, keys(obj)); - }); + var map = _curry2(_dispatchable('map', _xmap, function map(fn, functor) { + switch (Object.prototype.toString.call(functor)) { + case '[object Function]': + return curryN(functor.length, function () { + return fn.call(this, functor.apply(this, arguments)); + }); + case '[object Object]': + return _reduce(function (acc, key) { + acc[key] = fn(functor[key]); + return acc; + }, {}, keys(functor)); + default: + return _map(fn, functor); + } + })); /** - * Like `mapObj`, but but passes additional arguments to the predicate function. The - * predicate function is passed three arguments: *(value, key, obj)*. + * An Object-specific version of `map`. The function is applied to three + * arguments: *(value, key, obj)*. If only the value is significant, use + * `map` instead. * * @func * @memberOf R + * @since v0.9.0 * @category Object - * @sig (v, k, {k: v} -> v) -> {k: v} -> {k: v} - * @param {Function} fn A function called for each property in `obj`. Its return value will - * become a new property on the return object. - * @param {Object} obj The object to iterate over. - * @return {Object} A new object with the same keys as `obj` and values that are the result - * of running each property through `fn`. + * @sig ((*, String, Object) -> *) -> Object -> Object + * @param {Function} fn + * @param {Object} obj + * @return {Object} + * @see R.map * @example * * var values = { x: 1, y: 2, z: 3 }; - * var prependKeyAndDouble = function(num, key, obj) { - * return key + (num * 2); - * }; + * var prependKeyAndDouble = (num, key, obj) => key + (num * 2); * * R.mapObjIndexed(prependKeyAndDouble, values); //=> { x: 'x2', y: 'y4', z: 'z6' } */ @@ -13512,116 +12723,104 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns `true` if no elements of the list match the predicate, - * `false` otherwise. - * - * @func - * @memberOf R - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise. - * @see R.all, R.any - * @example - * - * R.none(R.isNaN, [1, 2, 3]); //=> true - * R.none(R.isNaN, [1, 2, 3, NaN]); //=> false - */ - var none = _curry2(_complement(_dispatchable('any', _xany, any))); - - /** - * A function that returns the first truthy of two arguments otherwise the - * last argument. Note that this is NOT short-circuited, meaning that if - * expressions are passed they are both evaluated. - * - * Dispatches to the `or` method of the first argument if applicable. + * Creates a new object with the own properties of the two provided objects. If + * a key exists in both objects, the provided function is applied to the values + * associated with the key in each object, with the result being used as the + * value associated with the key in the returned object. The key will be + * excluded from the returned object if the resulting value is `undefined`. * * @func * @memberOf R - * @category Logic - * @sig * -> * -> * - * @param {*} a any value - * @param {*} b any other value - * @return {*} the first truthy argument, otherwise the last argument. - * @see R.either + * @since 0.19.1 + * @since 0.19.0 + * @category Object + * @sig (a -> a -> a) -> {a} -> {a} -> {a} + * @param {Function} fn + * @param {Object} l + * @param {Object} r + * @return {Object} + * @see R.merge, R.mergeWithKey * @example * - * R.or(false, true); //=> true - * R.or(0, []); //=> [] - * R.or(null, ''); => '' + * R.mergeWith(R.concat, + * { a: true, values: [10, 20] }, + * { b: true, values: [15, 35] }); + * //=> { a: true, b: true, values: [10, 20, 15, 35] } */ - var or = _curry2(function or(a, b) { - return _hasMethod('or', a) ? a.or(b) : a || b; + var mergeWith = _curry3(function mergeWith(fn, l, r) { + return mergeWithKey(function (_, _l, _r) { + return fn(_l, _r); + }, l, r); }); /** - * Accepts as its arguments a function and any number of values and returns a function that, - * when invoked, calls the original function with all of the values prepended to the - * original function's arguments list. In some libraries this function is named `applyLeft`. + * Takes a function `f` and a list of arguments, and returns a function `g`. + * When applied, `g` returns the result of applying `f` to the arguments + * provided initially followed by the arguments provided to `g`. * * @func * @memberOf R + * @since v0.10.0 * @category Function - * @sig (a -> b -> ... -> i -> j -> ... -> m -> n) -> a -> b-> ... -> i -> (j -> ... -> m -> n) - * @param {Function} fn The function to invoke. - * @param {...*} [args] Arguments to prepend to `fn` when the returned function is invoked. - * @return {Function} A new function wrapping `fn`. When invoked, it will call `fn` - * with `args` prepended to `fn`'s arguments list. + * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x) + * @param {Function} f + * @param {Array} args + * @return {Function} + * @see R.partialRight * @example * - * var multiply = function(a, b) { return a * b; }; - * var double = R.partial(multiply, 2); + * var multiply = (a, b) => a * b; + * var double = R.partial(multiply, [2]); * double(2); //=> 4 * - * var greet = function(salutation, title, firstName, lastName) { - * return salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; - * }; - * var sayHello = R.partial(greet, 'Hello'); - * var sayHelloToMs = R.partial(sayHello, 'Ms.'); + * var greet = (salutation, title, firstName, lastName) => + * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; + * + * var sayHello = R.partial(greet, ['Hello']); + * var sayHelloToMs = R.partial(sayHello, ['Ms.']); * sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!' */ - var partial = curry(_createPartialApplicator(_concat)); + var partial = _createPartialApplicator(_concat); /** - * Accepts as its arguments a function and any number of values and returns a function that, - * when invoked, calls the original function with all of the values appended to the original - * function's arguments list. - * - * Note that `partialRight` is the opposite of `partial`: `partialRight` fills `fn`'s arguments - * from the right to the left. In some libraries this function is named `applyRight`. + * Takes a function `f` and a list of arguments, and returns a function `g`. + * When applied, `g` returns the result of applying `f` to the arguments + * provided to `g` followed by the arguments provided initially. * * @func * @memberOf R + * @since v0.10.0 * @category Function - * @sig (a -> b-> ... -> i -> j -> ... -> m -> n) -> j -> ... -> m -> n -> (a -> b-> ... -> i) - * @param {Function} fn The function to invoke. - * @param {...*} [args] Arguments to append to `fn` when the returned function is invoked. - * @return {Function} A new function wrapping `fn`. When invoked, it will call `fn` with - * `args` appended to `fn`'s arguments list. + * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x) + * @param {Function} f + * @param {Array} args + * @return {Function} + * @see R.partial * @example * - * var greet = function(salutation, title, firstName, lastName) { - * return salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; - * }; - * var greetMsJaneJones = R.partialRight(greet, 'Ms.', 'Jane', 'Jones'); + * var greet = (salutation, title, firstName, lastName) => + * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; + * + * var greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']); * * greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!' */ - var partialRight = curry(_createPartialApplicator(flip(_concat))); + var partialRight = _createPartialApplicator(flip(_concat)); /** - * Takes a predicate and a list and returns the pair of lists of - * elements which do and do not satisfy the predicate, respectively. + * Takes a predicate and a list and returns the pair of lists of elements which + * do and do not satisfy the predicate, respectively. * * @func * @memberOf R + * @since v0.1.4 * @category List * @sig (a -> Boolean) -> [a] -> [[a],[a]] * @param {Function} pred A predicate to determine which array the element belongs to. * @param {Array} list The array to partition. * @return {Array} A nested array, containing first an array of elements that satisfied the predicate, * and second an array of elements that did not satisfy. + * @see R.filter, R.reject * @example * * R.partition(R.contains('s'), ['sss', 'ttt', 'foo', 'bars']); @@ -13639,11 +12838,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Determines whether a nested path on an object has a specific value, - * in `R.equals` terms. Most likely used to filter a list. + * Determines whether a nested path on an object has a specific value, in + * `R.equals` terms. Most likely used to filter a list. * * @func * @memberOf R + * @since v0.7.0 * @category Relation * @sig [String] -> * -> {String: *} -> Boolean * @param {Array} path The path of the nested property to use @@ -13665,15 +12865,18 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list by plucking the same named property off all objects in the list supplied. + * Returns a new list by plucking the same named property off all objects in + * the list supplied. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig k -> [{k: v}] -> [v] * @param {Number|String} key The key name to pluck off of each object. * @param {Array} list The array to consider. * @return {Array} The list of values for the given key. + * @see R.props * @example * * R.pluck('a')([{a: 1}, {a: 2}]); //=> [1, 2] @@ -13683,12 +12886,38 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return map(prop(p), list); }); + /** + * Reasonable analog to SQL `select` statement. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category Object + * @category Relation + * @sig [k] -> [{k: v}] -> [{k: v}] + * @param {Array} props The property names to project + * @param {Array} objs The objects to query + * @return {Array} An array of objects with just the `props` properties. + * @example + * + * var abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2}; + * var fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7}; + * var kids = [abby, fred]; + * R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}] + */ + // passing `identity` gives correct arity + var project = useWith(_map, [ + pickAll, + identity + ]); + /** * Returns `true` if the specified object property is equal, in `R.equals` * terms, to the given value; `false` otherwise. * * @func * @memberOf R + * @since v0.1.0 * @category Relation * @sig String -> a -> Object -> Boolean * @param {String} name @@ -13716,14 +12945,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.16.0 * @category Type * @sig Type -> String -> Object -> Boolean * @param {Function} type * @param {String} name * @param {*} obj * @return {Boolean} - * @see R.is - * @see R.propSatisfies + * @see R.is, R.propSatisfies * @example * * R.propIs(Number, 'x', {x: 1, y: 2}); //=> true @@ -13735,62 +12964,64 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a single item by iterating through the list, successively calling the iterator - * function and passing it an accumulator value and the current value from the array, and - * then passing the result to the next call. + * Returns a single item by iterating through the list, successively calling + * the iterator function and passing it an accumulator value and the current + * value from the array, and then passing the result to the next call. * - * The iterator function receives two values: *(acc, value)*. It may use `R.reduced` to - * shortcut the iteration. + * The iterator function receives two values: *(acc, value)*. It may use + * `R.reduced` to shortcut the iteration. * - * Note: `R.reduce` does not skip deleted or unassigned indices (sparse arrays), unlike - * the native `Array.prototype.reduce` method. For more details on this behavior, see: + * Note: `R.reduce` does not skip deleted or unassigned indices (sparse + * arrays), unlike the native `Array.prototype.reduce` method. For more details + * on this behavior, see: * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description - * @see R.reduced + * + * Dispatches to the `reduce` method of the third argument, if present. * * @func * @memberOf R + * @since v0.1.0 * @category List - * @sig (a,b -> a) -> a -> [b] -> a + * @sig ((a, b) -> a) -> a -> [b] -> a * @param {Function} fn The iterator function. Receives two values, the accumulator and the * current element from the array. * @param {*} acc The accumulator value. * @param {Array} list The list to iterate over. * @return {*} The final, accumulated value. + * @see R.reduced, R.addIndex * @example * * var numbers = [1, 2, 3]; - * var add = function(a, b) { - * return a + b; - * }; + * var add = (a, b) => a + b; * * R.reduce(add, 10, numbers); //=> 16 */ var reduce = _curry3(_reduce); /** - * Similar to `filter`, except that it keeps only values for which the given predicate - * function returns falsy. The predicate function is passed one argument: *(value)*. + * The complement of `filter`. * * Acts as a transducer if a transformer is given in list position. - * @see R.transduce * * @func * @memberOf R + * @since v0.1.0 * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @param {Function} fn The function called per iteration. - * @param {Array} list The collection to iterate over. - * @return {Array} The new filtered array. - * @see R.filter + * @sig Filterable f => (a -> Boolean) -> f a -> f a + * @param {Function} pred + * @param {Array} filterable + * @return {Array} + * @see R.filter, R.transduce, R.addIndex * @example * - * var isOdd = function(n) { - * return n % 2 === 1; - * }; + * var isOdd = (n) => n % 2 === 1; + * * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4] + * + * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} */ - var reject = _curry2(function reject(fn, list) { - return filter(_complement(fn), list); + var reject = _curry2(function reject(pred, filterable) { + return filter(_complement(pred), filterable); }); /** @@ -13798,6 +13029,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.1 * @category List * @sig a -> n -> [a] * @param {*} value The value to repeat. @@ -13815,64 +13047,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return times(always(value), n); }); - /** - * Returns the elements of the given list or string (or object with a `slice` - * method) from `fromIndex` (inclusive) to `toIndex` (exclusive). - * - * @func - * @memberOf R - * @category List - * @sig Number -> Number -> [a] -> [a] - * @sig Number -> Number -> String -> String - * @param {Number} fromIndex The start index (inclusive). - * @param {Number} toIndex The end index (exclusive). - * @param {*} list - * @return {*} - * @example - * - * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] - * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd'] - * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c'] - * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] - * R.slice(0, 3, 'ramda'); //=> 'ram' - */ - var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) { - return Array.prototype.slice.call(list, fromIndex, toIndex); - })); - - /** - * Splits a collection into slices of the specified length. - * - * @func - * @memberOf R - * @category List - * @sig Number -> [a] -> [[a]] - * @sig Number -> String -> [String] - * @param {Number} n - * @param {Array} list - * @return {Array} - * @example - * - * R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]] - * R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz'] - */ - var splitEvery = _curry2(function splitEvery(n, list) { - if (n <= 0) { - throw new Error('First argument to splitEvery must be a positive integer'); - } - var result = []; - var idx = 0; - while (idx < list.length) { - result.push(slice(idx, idx += n, list)); - } - return result; - }); - /** * Adds together all the elements of a list. * * @func * @memberOf R + * @since v0.1.0 * @category Math * @sig [Number] -> Number * @param {Array} list An array of numbers @@ -13885,130 +13065,59 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var sum = reduce(add, 0); /** - * Returns all but the first element of the given list or string (or object - * with a `tail` method). + * Returns a new list containing the last `n` elements of the given list. + * If `n > list.length`, returns a list of `list.length` elements. * * @func * @memberOf R + * @since v0.16.0 * @category List - * @see R.head, R.init, R.last - * @sig [a] -> [a] - * @sig String -> String - * @param {*} list - * @return {*} + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n The number of elements to return. + * @param {Array} xs The collection to consider. + * @return {Array} + * @see R.dropLast * @example * - * R.tail([1, 2, 3]); //=> [2, 3] - * R.tail([1, 2]); //=> [2] - * R.tail([1]); //=> [] - * R.tail([]); //=> [] - * - * R.tail('abc'); //=> 'bc' - * R.tail('ab'); //=> 'b' - * R.tail('a'); //=> '' - * R.tail(''); //=> '' + * R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz'] + * R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] + * R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.takeLast(3, 'ramda'); //=> 'mda' */ - var tail = _checkForMethod('tail', slice(1, Infinity)); + var takeLast = _curry2(function takeLast(n, xs) { + return drop(n >= 0 ? xs.length - n : 0, xs); + }); /** - * Returns the first `n` elements of the given list, string, or - * transducer/transformer (or object with a `take` method). - * - * @func - * @memberOf R - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n - * @param {*} list - * @return {*} - * @see R.drop - * @example - * - * R.take(1, ['foo', 'bar', 'baz']); //=> ['foo'] - * R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] - * R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.take(3, 'ramda'); //=> 'ram' - * - * var personnel = [ - * 'Dave Brubeck', - * 'Paul Desmond', - * 'Eugene Wright', - * 'Joe Morello', - * 'Gerry Mulligan', - * 'Bob Bates', - * 'Joe Dodge', - * 'Ron Crotty' - * ]; - * - * var takeFive = R.take(5); - * takeFive(personnel); - * //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan'] - */ - var take = _curry2(_dispatchable('take', _xtake, function take(n, xs) { - return slice(0, n < 0 ? Infinity : n, xs); - })); - - /** - * Returns a new list containing the first `n` elements of a given list, passing each value - * to the supplied predicate function, and terminating when the predicate function returns - * `false`. Excludes the element that caused the predicate function to fail. The predicate - * function is passed one argument: *(value)*. - * - * Acts as a transducer if a transformer is given in list position. - * @see R.transduce - * - * @func - * @memberOf R - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @param {Function} fn The function called per iteration. - * @param {Array} list The collection to iterate over. - * @return {Array} A new array. - * @see R.dropWhile - * @example - * - * var isNotFour = function(x) { - * return !(x === 4); - * }; - * - * R.takeWhile(isNotFour, [1, 2, 3, 4]); //=> [1, 2, 3] - */ - var takeWhile = _curry2(_dispatchable('takeWhile', _xtakeWhile, function takeWhile(fn, list) { - var idx = 0, len = list.length; - while (idx < len && fn(list[idx])) { - idx += 1; - } - return _slice(list, 0, idx); - })); - - /** - * Initializes a transducer using supplied iterator function. Returns a single item by - * iterating through the list, successively calling the transformed iterator function and - * passing it an accumulator value and the current value from the array, and then passing - * the result to the next call. + * Initializes a transducer using supplied iterator function. Returns a single + * item by iterating through the list, successively calling the transformed + * iterator function and passing it an accumulator value and the current value + * from the array, and then passing the result to the next call. * - * The iterator function receives two values: *(acc, value)*. It will be wrapped as a - * transformer to initialize the transducer. A transformer can be passed directly in place - * of an iterator function. In both cases, iteration may be stopped early with the - * `R.reduced` function. + * The iterator function receives two values: *(acc, value)*. It will be + * wrapped as a transformer to initialize the transducer. A transformer can be + * passed directly in place of an iterator function. In both cases, iteration + * may be stopped early with the `R.reduced` function. * - * A transducer is a function that accepts a transformer and returns a transformer and can - * be composed directly. + * A transducer is a function that accepts a transformer and returns a + * transformer and can be composed directly. * - * A transformer is an an object that provides a 2-arity reducing iterator function, step, - * 0-arity initial value function, init, and 1-arity result extraction function, result. - * The step function is used as the iterator function in reduce. The result function is used - * to convert the final accumulator into the return type and in most cases is R.identity. - * The init function can be used to provide an initial accumulator, but is ignored by transduce. + * A transformer is an an object that provides a 2-arity reducing iterator + * function, step, 0-arity initial value function, init, and 1-arity result + * extraction function, result. The step function is used as the iterator + * function in reduce. The result function is used to convert the final + * accumulator into the return type and in most cases is R.identity. The init + * function can be used to provide an initial accumulator, but is ignored by + * transduce. * * The iteration is performed with R.reduce after initializing the transducer. * * @func * @memberOf R + * @since v0.12.0 * @category List - * @see R.reduce, R.reduced, R.into * @sig (c -> c) -> (a,b -> a) -> a -> [b] -> a * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. * @param {Function} fn The iterator function. Receives two values, the accumulator and the @@ -14017,6 +13126,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @param {*} acc The initial accumulator value. * @param {Array} list The list to iterate over. * @return {*} The final, accumulated value. + * @see R.reduce, R.reduced, R.into * @example * * var numbers = [1, 2, 3, 4]; @@ -14029,13 +13139,15 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Combines two lists into a set (i.e. no duplicates) composed of the elements of each list. Duplication is - * determined according to the value returned by applying the supplied predicate to two list elements. + * Combines two lists into a set (i.e. no duplicates) composed of the elements + * of each list. Duplication is determined according to the value returned by + * applying the supplied predicate to two list elements. * * @func * @memberOf R + * @since v0.1.0 * @category Relation - * @sig (a,a -> Boolean) -> [a] -> [a] -> [a] + * @sig (a -> a -> Boolean) -> [*] -> [*] -> [*] * @param {Function} pred A predicate used to test whether two items are equal. * @param {Array} list1 The first list. * @param {Array} list2 The second list. @@ -14044,111 +13156,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @see R.union * @example * - * function cmp(x, y) { return x.a === y.a; } * var l1 = [{a: 1}, {a: 2}]; * var l2 = [{a: 1}, {a: 4}]; - * R.unionWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}] + * R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}] */ var unionWith = _curry3(function unionWith(pred, list1, list2) { return uniqWith(pred, _concat(list1, list2)); }); - /** - * Returns a new list containing only one copy of each element in the original list. - * `R.equals` is used to determine equality. - * - * @func - * @memberOf R - * @category List - * @sig [a] -> [a] - * @param {Array} list The array to consider. - * @return {Array} The list of unique items. - * @example - * - * R.uniq([1, 1, 2, 1]); //=> [1, 2] - * R.uniq([1, '1']); //=> [1, '1'] - * R.uniq([[42], [42]]); //=> [[42]] - */ - var uniq = uniqWith(equals); - - /** - * Returns a new list by pulling every item at the first level of nesting out, and putting - * them in a new array. - * - * @func - * @memberOf R - * @category List - * @sig [a] -> [b] - * @param {Array} list The array to consider. - * @return {Array} The flattened list. - * @see R.flatten - * @example - * - * R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]] - * R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6] - */ - var unnest = _curry1(_makeFlat(false)); - - /** - * Accepts a function `fn` and any number of transformer functions and returns a new - * function. When the new function is invoked, it calls the function `fn` with parameters - * consisting of the result of calling each supplied handler on successive arguments to the - * new function. - * - * If more arguments are passed to the returned function than transformer functions, those - * arguments are passed directly to `fn` as additional parameters. If you expect additional - * arguments that don't need to be transformed, although you can ignore them, it's best to - * pass an identity function so that the new function reports the correct arity. - * - * @func - * @memberOf R - * @category Function - * @sig (x1 -> x2 -> ... -> z) -> ((a -> x1), (b -> x2), ...) -> (a -> b -> ... -> z) - * @param {Function} fn The function to wrap. - * @param {...Function} transformers A variable number of transformer functions - * @return {Function} The wrapped function. - * @example - * - * var double = function(y) { return y * 2; }; - * var square = function(x) { return x * x; }; - * var add = function(a, b) { return a + b; }; - * // Adds any number of arguments together - * var addAll = function() { - * return R.reduce(add, 0, arguments); - * }; - * - * // Basic example - * var addDoubleAndSquare = R.useWith(addAll, double, square); - * - * //≅ addAll(double(10), square(5)); - * addDoubleAndSquare(10, 5); //=> 45 - * - * // Example of passing more arguments than transformers - * //≅ addAll(double(10), square(5), 100); - * addDoubleAndSquare(10, 5, 100); //=> 145 - * - * // If there are extra _expected_ arguments that don't need to be transformed, although - * // you can ignore them, it might be best to pass in the identity function so that the new - * // function correctly reports arity. - * var addDoubleAndSquareWithExtraParams = R.useWith(addAll, double, square, R.identity); - * // addDoubleAndSquareWithExtraParams.length //=> 3 - * //≅ addAll(double(10), square(5), R.identity(100)); - * addDoubleAndSquare(10, 5, 100); //=> 145 - */ - /*, transformers */ - var useWith = curry(function useWith(fn) { - var transformers = _slice(arguments, 1); - var tlen = transformers.length; - return curry(_arity(tlen, function () { - var args = [], idx = 0; - while (idx < tlen) { - args[idx] = transformers[idx](arguments[idx]); - idx += 1; - } - return fn.apply(this, args.concat(_slice(arguments, tlen))); - })); - }); - /** * Takes a spec object and a test object; returns true if the test satisfies * the spec, false otherwise. An object satisfies the spec if, for each of the @@ -14159,6 +13174,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.14.0 * @category Object * @sig {String: *} -> {String: *} -> Boolean * @param {Object} spec @@ -14176,7 +13192,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * pred({a: 1, b: 1}); //=> false */ var whereEq = _curry2(function whereEq(spec, testObj) { - return where(mapObj(equals, spec), testObj); + return where(map(equals, spec), testObj); }); var _flatCat = function () { @@ -14206,10 +13222,59 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; }(); - var _indexOf = function _indexOf(list, item, from) { - var idx = from; + // Array.prototype.indexOf doesn't exist below IE9 + // manually crawl the list to distinguish between +0 and -0 + // NaN + // non-zero numbers can utilise Set + // all these types can utilise Set + // null can utilise Set + // anything else not covered above, defer to R.equals + var _indexOf = function _indexOf(list, a, idx) { + var inf, item; + // Array.prototype.indexOf doesn't exist below IE9 + if (typeof list.indexOf === 'function') { + switch (typeof a) { + case 'number': + if (a === 0) { + // manually crawl the list to distinguish between +0 and -0 + inf = 1 / a; + while (idx < list.length) { + item = list[idx]; + if (item === 0 && 1 / item === inf) { + return idx; + } + idx += 1; + } + return -1; + } else if (a !== a) { + // NaN + while (idx < list.length) { + item = list[idx]; + if (typeof item === 'number' && item !== item) { + return idx; + } + idx += 1; + } + return -1; + } + // non-zero numbers can utilise Set + return list.indexOf(a, idx); + // all these types can utilise Set + case 'string': + case 'boolean': + case 'function': + case 'undefined': + return list.indexOf(a, idx); + case 'object': + if (a === null) { + // null can utilise Set + return list.indexOf(a, idx); + } + } + } + // anything else not covered above, defer to R.equals while (idx < list.length) { - if (equals(list[idx], item)) { + if (equals(list[idx], a)) { return idx; } idx += 1; @@ -14217,83 +13282,125 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return -1; }; - /** - * Create a predicate wrapper which will call a pick function (all/any) for each predicate - * - * @private - * @see R.all - * @see R.any - */ - // Call function immediately if given arguments - // Return a function which will call the predicates with the provided arguments - var _predicateWrap = function _predicateWrap(predPicker) { - return function (preds) { - var predIterator = function () { - var args = arguments; - return predPicker(function (predicate) { - return predicate.apply(null, args); - }, preds); - }; - return arguments.length > 1 ? // Call function immediately if given arguments - predIterator.apply(null, _slice(arguments, 1)) : // Return a function which will call the predicates with the provided arguments - _arity(Math.max.apply(Math, pluck('length', preds)), predIterator); - }; - }; - var _xchain = _curry2(function _xchain(f, xf) { return map(f, _flatCat(xf)); }); /** - * Given a list of predicates, returns a new predicate that will be true exactly when all of them are. + * Takes a list of predicates and returns a predicate that returns true for a + * given list of arguments if every one of the provided predicates is satisfied + * by those arguments. + * + * The function returned is a curried function whose arity matches that of the + * highest-arity predicate. * * @func * @memberOf R + * @since v0.9.0 * @category Logic * @sig [(*... -> Boolean)] -> (*... -> Boolean) - * @param {Array} list An array of predicate functions - * @param {*} optional Any arguments to pass into the predicates - * @return {Function} a function that applies its arguments to each of - * the predicates, returning `true` if all are satisfied. + * @param {Array} preds + * @return {Function} * @see R.anyPass * @example * - * var gt10 = function(x) { return x > 10; }; - * var even = function(x) { return x % 2 === 0}; - * var f = R.allPass([gt10, even]); - * f(11); //=> false - * f(12); //=> true + * var isQueen = R.propEq('rank', 'Q'); + * var isSpade = R.propEq('suit', '♠︎'); + * var isQueenOfSpades = R.allPass([isQueen, isSpade]); + * + * isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false + * isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true */ - var allPass = _curry1(_predicateWrap(all)); + var allPass = _curry1(function allPass(preds) { + return curryN(reduce(max, 0, pluck('length', preds)), function () { + var idx = 0; + var len = preds.length; + while (idx < len) { + if (!preds[idx].apply(this, arguments)) { + return false; + } + idx += 1; + } + return true; + }); + }); /** - * Given a list of predicates returns a new predicate that will be true exactly when any one of them is. + * Returns `true` if all elements are unique, in `R.equals` terms, otherwise + * `false`. + * + * @func + * @memberOf R + * @since v0.18.0 + * @category List + * @sig [a] -> Boolean + * @param {Array} list The array to consider. + * @return {Boolean} `true` if all elements are unique, else `false`. + * @example + * + * R.allUniq(['1', 1]); //=> true + * R.allUniq([1, 1]); //=> false + * R.allUniq([[42], [42]]); //=> false + */ + var allUniq = _curry1(function allUniq(list) { + var len = list.length; + var idx = 0; + while (idx < len) { + if (_indexOf(list, list[idx], idx + 1) >= 0) { + return false; + } + idx += 1; + } + return true; + }); + + /** + * Takes a list of predicates and returns a predicate that returns true for a + * given list of arguments if at least one of the provided predicates is + * satisfied by those arguments. + * + * The function returned is a curried function whose arity matches that of the + * highest-arity predicate. * * @func * @memberOf R + * @since v0.9.0 * @category Logic * @sig [(*... -> Boolean)] -> (*... -> Boolean) - * @param {Array} list An array of predicate functions - * @param {*} optional Any arguments to pass into the predicates - * @return {Function} A function that applies its arguments to each of the predicates, returning - * `true` if all are satisfied. + * @param {Array} preds + * @return {Function} * @see R.allPass * @example * - * var gt10 = function(x) { return x > 10; }; - * var even = function(x) { return x % 2 === 0}; - * var f = R.anyPass([gt10, even]); - * f(11); //=> true - * f(8); //=> true - * f(9); //=> false + * var gte = R.anyPass([R.gt, R.equals]); + * + * gte(3, 2); //=> true + * gte(2, 2); //=> true + * gte(2, 3); //=> false */ - var anyPass = _curry1(_predicateWrap(any)); + var anyPass = _curry1(function anyPass(preds) { + return curryN(reduce(max, 0, pluck('length', preds)), function () { + var idx = 0; + var len = preds.length; + while (idx < len) { + if (preds[idx].apply(this, arguments)) { + return true; + } + idx += 1; + } + return false; + }); + }); /** * ap applies a list of functions to a list of values. * + * Dispatches to the `ap` method of the second argument, if present. Also + * treats functions as applicatives. + * * @func * @memberOf R + * @since v0.3.0 * @category Function * @sig [f] -> [a] -> [f a] * @param {Array} fns An array of functions @@ -14303,20 +13410,25 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6] */ - var ap = _curry2(function ap(fns, vs) { - return _hasMethod('ap', fns) ? fns.ap(vs) : _reduce(function (acc, fn) { - return _concat(acc, map(fn, vs)); - }, [], fns); + // else + var ap = _curry2(function ap(applicative, fn) { + return typeof applicative.ap === 'function' ? applicative.ap(fn) : typeof applicative === 'function' ? curryN(Math.max(applicative.length, fn.length), function () { + return applicative.apply(this, arguments)(fn.apply(this, arguments)); + }) : // else + _reduce(function (acc, f) { + return _concat(acc, map(f, fn)); + }, [], applicative); }); /** * Returns the result of calling its first argument with the remaining * arguments. This is occasionally useful as a converging function for - * `R.converge`: the left branch can produce a function while the right - * branch produces a value to be passed to that function as an argument. + * `R.converge`: the left branch can produce a function while the right branch + * produces a value to be passed to that function as an argument. * * @func * @memberOf R + * @since v0.9.0 * @category Function * @sig (*... -> a),*... -> a * @param {Function} fn The function to apply to the remaining arguments. @@ -14329,9 +13441,10 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.join(''), * R.replace(/^(?!$)/gm)); * - * var format = R.converge(R.call, - * R.pipe(R.prop('indent'), indentN), - * R.prop('value')); + * var format = R.converge(R.call, [ + * R.pipe(R.prop('indent'), indentN), + * R.prop('value') + * ]); * * format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> ' foo\n bar\n baz\n' */ @@ -14340,13 +13453,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * `chain` maps a function over a list and concatenates the results. - * This implementation is compatible with the - * Fantasy-land Chain spec, and will work with types that implement that spec. - * `chain` is also known as `flatMap` in some libraries + * `chain` maps a function over a list and concatenates the results. `chain` + * is also known as `flatMap` in some libraries + * + * Dispatches to the `chain` method of the second argument, if present. * * @func * @memberOf R + * @since v0.3.0 * @category List * @sig (a -> [b]) -> [a] -> [b] * @param {Function} fn @@ -14354,50 +13468,63 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @return {Array} * @example * - * var duplicate = function(n) { - * return [n, n]; - * }; + * var duplicate = n => [n, n]; * R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3] */ - var chain = _curry2(_dispatchable('chain', _xchain, function chain(fn, list) { - return unnest(map(fn, list)); + var chain = _curry2(_dispatchable('chain', _xchain, function chain(fn, monad) { + if (typeof monad === 'function') { + return function () { + return monad.call(this, fn.apply(this, arguments)).apply(this, arguments); + }; + } + return _makeFlat(false)(map(fn, monad)); })); /** - * Turns a list of Functors into a Functor of a list, applying - * a mapping function to the elements of the list along the way. + * Turns a list of Functors into a Functor of a list, applying a mapping + * function to the elements of the list along the way. * * @func * @memberOf R + * @since v0.8.0 * @category List - * @see R.commute - * @sig Functor f => (f a -> f b) -> (x -> f x) -> [f a] -> f [b] + * @sig Functor f => (a -> f b) -> (x -> f x) -> [a] -> f [b] * @param {Function} fn The transformation function * @param {Function} of A function that returns the data type to return * @param {Array} list An array of functors of the same type * @return {*} + * @see R.traverse + * @deprecated since v0.19.0 * @example * - * R.commuteMap(R.map(R.add(10)), R.of, [[1], [2, 3]]); //=> [[11, 12], [11, 13]] - * R.commuteMap(R.map(R.add(10)), R.of, [[1, 2], [3]]); //=> [[11, 13], [12, 13]] - * R.commuteMap(R.map(R.add(10)), R.of, [[1], [2], [3]]); //=> [[11, 12, 13]] - * R.commuteMap(R.map(R.add(10)), Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([11, 12, 13]) - * R.commuteMap(R.map(R.add(10)), Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() + * var add10 = R.map(R.add(10)); + * R.commuteMap(add10, R.of, [[1], [2, 3]]); //=> [[11, 12], [11, 13]] + * R.commuteMap(add10, R.of, [[1, 2], [3]]); //=> [[11, 13], [12, 13]] + * R.commuteMap(add10, R.of, [[1], [2], [3]]); //=> [[11, 12, 13]] + * R.commuteMap(add10, Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([11, 12, 13]) + * R.commuteMap(add10, Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() + * + * var fetch = url => Future((rej, res) => http.get(url, res).on('error', rej)); + * R.commuteMap(fetch, Future.of, [ + * 'http://ramdajs.com', + * 'http://github.com/ramda' + * ]); //=> Future([IncomingMessage, IncomingMessage]) */ var commuteMap = _curry3(function commuteMap(fn, of, list) { - function consF(acc, ftor) { - return ap(map(append, fn(ftor)), acc); + function consF(acc, x) { + return ap(map(prepend, fn(x)), acc); } - return _reduce(consF, of([]), list); + return reduceRight(consF, of([]), list); }); /** - * Wraps a constructor function inside a curried function that can be called with the same - * arguments and returns the same type. The arity of the function returned is specified - * to allow using variadic constructor functions. + * Wraps a constructor function inside a curried function that can be called + * with the same arguments and returns the same type. The arity of the function + * returned is specified to allow using variadic constructor functions. * * @func * @memberOf R + * @since v0.4.0 * @category Function * @sig Number -> (* -> {*}) -> (* -> {*}) * @param {Number} n The arity of the constructor function. @@ -14406,7 +13533,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @example * * // Variadic constructor function - * var Widget = function() { + * var Widget = () => { * this.children = Array.prototype.slice.call(arguments); * // ... * }; @@ -14454,33 +13581,34 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Accepts at least three functions and returns a new function. When invoked, this new - * function will invoke the first function, `after`, passing as its arguments the - * results of invoking the subsequent functions with whatever arguments are passed to - * the new function. + * Accepts a converging function and a list of branching functions and returns + * a new function. When invoked, this new function is applied to some + * arguments, each branching function is applied to those same arguments. The + * results of each branching function are passed as arguments to the converging + * function to produce the return value. * * @func * @memberOf R + * @since v0.4.2 * @category Function - * @sig (x1 -> x2 -> ... -> z) -> ((a -> b -> ... -> x1), (a -> b -> ... -> x2), ...) -> (a -> b -> ... -> z) + * @sig (x1 -> x2 -> ... -> z) -> [(a -> b -> ... -> x1), (a -> b -> ... -> x2), ...] -> (a -> b -> ... -> z) * @param {Function} after A function. `after` will be invoked with the return values of * `fn1` and `fn2` as its arguments. - * @param {...Function} functions A variable number of functions. + * @param {Array} functions A list of functions. * @return {Function} A new function. * @example * - * var add = function(a, b) { return a + b; }; - * var multiply = function(a, b) { return a * b; }; - * var subtract = function(a, b) { return a - b; }; + * var add = (a, b) => a + b; + * var multiply = (a, b) => a * b; + * var subtract = (a, b) => a - b; * * //≅ multiply( add(1, 2), subtract(1, 2) ); - * R.converge(multiply, add, subtract)(1, 2); //=> -3 + * R.converge(multiply, [add, subtract])(1, 2); //=> -3 * - * var add3 = function(a, b, c) { return a + b + c; }; - * R.converge(add3, multiply, add, subtract)(1, 2); //=> 4 + * var add3 = (a, b, c) => a + b + c; + * R.converge(add3, [multiply, add, subtract])(1, 2); //=> 4 */ - var converge = curryN(3, function converge(after) { - var fns = _slice(arguments, 1); + var converge = _curry2(function converge(after, fns) { return curryN(Math.max.apply(Math, pluck('length', fns)), function () { var args = arguments; var context = this; @@ -14490,76 +13618,29 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); }); - /** - * Returns all but the first `n` elements of the given list, string, or - * transducer/transformer (or object with a `drop` method). - * - * @func - * @memberOf R - * @category List - * @see R.transduce - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n - * @param {*} list - * @return {*} - * @see R.take - * @example - * - * R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] - * R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz'] - * R.drop(3, ['foo', 'bar', 'baz']); //=> [] - * R.drop(4, ['foo', 'bar', 'baz']); //=> [] - * R.drop(3, 'ramda'); //=> 'da' - */ - var drop = _curry2(_dispatchable('drop', _xdrop, function drop(n, xs) { - return slice(Math.max(0, n), Infinity, xs); - })); - - /** - * Returns a list containing all but the last `n` elements of the given `list`. - * - * @func - * @memberOf R - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n The number of elements of `xs` to skip. - * @param {Array} xs The collection to consider. - * @return {Array} - * @see R.takeLast - * @example - * - * R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] - * R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo'] - * R.dropLast(3, ['foo', 'bar', 'baz']); //=> [] - * R.dropLast(4, ['foo', 'bar', 'baz']); //=> [] - * R.dropLast(3, 'ramda'); //=> 'ra' - */ - var dropLast = _curry2(function dropLast(n, xs) { - return take(n < xs.length ? xs.length - n : 0, xs); - }); - /** * Returns a new list without any consecutively repeating elements. Equality is - * determined by applying the supplied predicate two consecutive elements. - * The first element in a series of equal element is the one being preserved. + * determined by applying the supplied predicate two consecutive elements. The + * first element in a series of equal element is the one being preserved. + * + * Dispatches to the `dropRepeatsWith` method of the second argument, if present. * * Acts as a transducer if a transformer is given in list position. - * @see R.transduce * * @func * @memberOf R + * @since v0.14.0 * @category List * @sig (a, a -> Boolean) -> [a] -> [a] * @param {Function} pred A predicate used to test whether two items are equal. * @param {Array} list The array to consider. * @return {Array} `list` without repeating elements. + * @see R.transduce * @example * - * function lengthEq(x, y) { return Math.abs(x) === Math.abs(y); }; + * var lengthEq = (x, y) => Math.abs(x) === Math.abs(y); * var l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3]; - * R.dropRepeatsWith(lengthEq, l); //=> [1, 3, 4, -5, 3] + * R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3] */ var dropRepeatsWith = _curry2(_dispatchable('dropRepeatsWith', _xdropRepeatsWith, function dropRepeatsWith(pred, list) { var result = []; @@ -14578,11 +13659,33 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack })); /** - * Reports whether two objects have the same value, in `R.equals` terms, - * for the specified property. Useful as a curried predicate. + * Takes a function and two values in its domain and returns `true` if the + * values map to the same value in the codomain; `false` otherwise. + * + * @func + * @memberOf R + * @since v0.18.0 + * @category Relation + * @sig (a -> b) -> a -> a -> Boolean + * @param {Function} f + * @param {*} x + * @param {*} y + * @return {Boolean} + * @example + * + * R.eqBy(Math.abs, 5, -5); //=> true + */ + var eqBy = _curry3(function eqBy(f, x, y) { + return equals(f(x), f(y)); + }); + + /** + * Reports whether two objects have the same value, in `R.equals` terms, for + * the specified property. Useful as a curried predicate. * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig k -> {k: v} -> {k: v} -> Boolean * @param {String} prop The name of the property to compare @@ -14602,12 +13705,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns the position of the first occurrence of an item in an array, - * or -1 if the item is not included in the array. `R.equals` is used to - * determine equality. + * Returns the position of the first occurrence of an item in an array, or -1 + * if the item is not included in the array. `R.equals` is used to determine + * equality. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig a -> [a] -> Number * @param {*} target The item to find. @@ -14620,60 +13724,29 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * R.indexOf(10, [1,2,3,4]); //=> -1 */ var indexOf = _curry2(function indexOf(target, xs) { - return _hasMethod('indexOf', xs) ? xs.indexOf(target) : _indexOf(xs, target, 0); + return typeof xs.indexOf === 'function' && !_isArray(xs) ? xs.indexOf(target) : _indexOf(xs, target, 0); }); /** - * Returns all but the last element of the given list or string. - * - * @func - * @memberOf R - * @category List - * @see R.last, R.head, R.tail - * @sig [a] -> [a] - * @sig String -> String - * @param {*} list - * @return {*} - * @example - * - * R.init([1, 2, 3]); //=> [1, 2] - * R.init([1, 2]); //=> [1] - * R.init([1]); //=> [] - * R.init([]); //=> [] - * - * R.init('abc'); //=> 'ab' - * R.init('ab'); //=> 'a' - * R.init('a'); //=> '' - * R.init(''); //=> '' - */ - var init = slice(0, -1); - - /** - * Returns `true` if all elements are unique, in `R.equals` terms, - * otherwise `false`. + * juxt applies a list of functions to a list of values. * * @func * @memberOf R - * @category List - * @sig [a] -> Boolean - * @param {Array} list The array to consider. - * @return {Boolean} `true` if all elements are unique, else `false`. + * @since 0.19.1 + * @since 0.19.0 + * @category Function + * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n]) + * @param {Array} fns An array of functions + * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters. * @example * - * R.isSet(['1', 1]); //=> true - * R.isSet([1, 1]); //=> false - * R.isSet([[42], [42]]); //=> false + * var range = R.juxt([Math.min, Math.max]); + * range(3, 4, 9, -3); //=> [-3, 9] */ - var isSet = _curry1(function isSet(list) { - var len = list.length; - var idx = 0; - while (idx < len) { - if (_indexOf(list, list[idx], idx + 1) >= 0) { - return false; - } - idx += 1; - } - return true; + var juxt = _curry1(function juxt(fns) { + return function () { + return map(apply(__, arguments), fns); + }; }); /** @@ -14683,8 +13756,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.8.0 * @category Object - * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s * @sig (s -> a) -> ((a, s) -> s) -> Lens s a * @param {Function} getter * @param {Function} setter @@ -14713,8 +13787,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.14.0 * @category Object - * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s * @sig Number -> Lens s a * @param {Number} n * @return {Lens} @@ -14731,13 +13806,39 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack return lens(nth(n), update(n)); }); + /** + * Returns a lens whose focus is the specified path. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category Object + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig [String] -> Lens s a + * @param {Array} path The path to use. + * @return {Lens} + * @see R.view, R.set, R.over + * @example + * + * var xyLens = R.lensPath(['x', 'y']); + * + * R.view(xyLens, {x: {y: 2, z: 3}}); //=> 2 + * R.set(xyLens, 4, {x: {y: 2, z: 3}}); //=> {x: {y: 4, z: 3}} + * R.over(xyLens, R.negate, {x: {y: 2, z: 3}}); //=> {x: {y: -2, z: 3}} + */ + var lensPath = _curry1(function lensPath(p) { + return lens(path(p), assocPath(p)); + }); + /** * Returns a lens whose focus is the specified property. * * @func * @memberOf R + * @since v0.14.0 * @category Object - * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s * @sig String -> Lens s a * @param {String} k * @return {Lens} @@ -14755,21 +13856,20 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * "lifts" a function to be the specified arity, so that it may "map over" that many - * lists (or other Functors). + * "lifts" a function to be the specified arity, so that it may "map over" that + * many lists (or other objects that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply)). * * @func * @memberOf R - * @see R.lift + * @since v0.7.0 * @category Function * @sig Number -> (*... -> *) -> ([*]... -> [*]) * @param {Function} fn The function to lift into higher context - * @return {Function} The function `fn` applicable to mappable objects. + * @return {Function} The lifted function. + * @see R.lift * @example * - * var madd3 = R.liftN(3, R.curryN(3, function() { - * return R.reduce(R.add, 0, arguments); - * })); + * var madd3 = R.liftN(3, R.curryN(3, (...args) => R.sum(args))); * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7] */ var liftN = _curry2(function liftN(arity, fn) { @@ -14784,6 +13884,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.14.0 * @category Math * @sig [Number] -> Number * @param {Array} list @@ -14802,6 +13903,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.14.0 * @category Math * @sig [Number] -> Number * @param {Array} list @@ -14824,11 +13926,38 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }).slice(idx, idx + width)); }); + /** + * Create a new object with the own properties of the first object merged with + * the own properties of the second object. If a key exists in both objects, + * the value from the second object will be used. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category Object + * @sig {k: v} -> {k: v} -> {k: v} + * @param {Object} l + * @param {Object} r + * @return {Object} + * @see R.mergeWith, R.mergeWithKey + * @example + * + * R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); + * //=> { 'name': 'fred', 'age': 40 } + * + * var resetToDefault = R.merge(R.__, {x: 0}); + * resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2} + */ + var merge = mergeWith(function (l, r) { + return r; + }); + /** * Merges a list of objects together into one object. * * @func * @memberOf R + * @since v0.10.0 * @category List * @sig [{k: v}] -> {k: v} * @param {Array} list An array of objects @@ -14851,8 +13980,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Function - * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> (a -> b -> ... -> n -> z) + * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z) * @param {...Function} functions * @return {Function} * @see R.compose @@ -14866,16 +13996,17 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack if (arguments.length === 0) { throw new Error('pipe requires at least one argument'); } - return curryN(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments))); + return _arity(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments))); }; /** * Performs left-to-right composition of one or more Promise-returning - * functions. The leftmost function may have any arity; the remaining - * functions must be unary. + * functions. The leftmost function may have any arity; the remaining functions + * must be unary. * * @func * @memberOf R + * @since v0.10.0 * @category Function * @sig ((a -> Promise b), (b -> Promise c), ..., (y -> Promise z)) -> (a -> Promise z) * @param {...Function} functions @@ -14890,7 +14021,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack if (arguments.length === 0) { throw new Error('pipeP requires at least one argument'); } - return curryN(arguments[0].length, reduce(_pipeP, arguments[0], tail(arguments))); + return _arity(arguments[0].length, reduce(_pipeP, arguments[0], tail(arguments))); }; /** @@ -14898,6 +14029,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Math * @sig [Number] -> Number * @param {Array} list An array of numbers @@ -14910,57 +14042,130 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var product = reduce(multiply, 1); /** - * Reasonable analog to SQL `select` statement. + * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable) + * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an + * Applicative of Traversable. + * + * Dispatches to the `sequence` method of the second argument, if present. * * @func * @memberOf R - * @category Object - * @category Relation - * @sig [k] -> [{k: v}] -> [{k: v}] - * @param {Array} props The property names to project - * @param {Array} objs The objects to query - * @return {Array} An array of objects with just the `props` properties. + * @since 0.19.1 + * @since 0.19.0 + * @category List + * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a) + * @param {Function} of + * @param {*} traversable + * @return {*} + * @see R.traverse * @example * - * var abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2}; - * var fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7}; - * var kids = [abby, fred]; - * R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}] + * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3]) + * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() + * + * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)] + * R.sequence(R.of, Nothing()); //=> [Nothing()] */ - // passing `identity` gives correct arity - var project = useWith(_map, pickAll, identity); + var sequence = _curry2(function sequence(of, traversable) { + return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight(function (acc, x) { + return ap(map(prepend, x), acc); + }, of([]), traversable); + }); /** - * Returns a new list containing the last `n` elements of the given list. - * If `n > list.length`, returns a list of `list.length` elements. + * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning + * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable), + * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative + * into an Applicative of Traversable. + * + * Dispatches to the `sequence` method of the third argument, if present. * * @func * @memberOf R + * @since 0.19.1 + * @since 0.19.0 * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n The number of elements to return. - * @param {Array} xs The collection to consider. - * @return {Array} - * @see R.dropLast + * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b) + * @param {Function} of + * @param {Function} f + * @param {*} traversable + * @return {*} + * @see R.sequence * @example * - * R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz'] - * R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['for', 'baz'] - * R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.takeLast(3, 'ramda'); //=> 'mda' + * R.traverse(Maybe.of, R.negate, [Just(1), Just(2), Just(3)]); //=> Just([-1, -2, -3]) + * R.traverse(Maybe.of, R.negate, [Just(1), Just(2), Nothing()]); //=> Nothing() + * + * R.traverse(R.of, R.negate, Just([1, 2, 3])); //=> [Just(-1), Just(-2), Just(-3)] + * R.traverse(R.of, R.negate, Nothing()); //=> [Nothing()] */ - var takeLast = _curry2(function takeLast(n, xs) { - return drop(n >= 0 ? xs.length - n : 0, xs); + var traverse = _curry3(function traverse(of, f, traversable) { + return sequence(of, map(f, traversable)); }); + /** + * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from + * any [Chain](https://github.com/fantasyland/fantasy-land#chain). + * + * @func + * @memberOf R + * @since v0.3.0 + * @category List + * @sig Chain c => c (c a) -> c a + * @param {*} list + * @return {*} + * @see R.flatten, R.chain + * @example + * + * R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]] + * R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6] + */ + var unnest = chain(_identity); + var _contains = function _contains(a, list) { return _indexOf(list, a, 0) >= 0; }; + var _stepCat = function () { + var _stepCatArray = { + '@@transducer/init': Array, + '@@transducer/step': function (xs, x) { + return _concat(xs, [x]); + }, + '@@transducer/result': _identity + }; + var _stepCatString = { + '@@transducer/init': String, + '@@transducer/step': function (a, b) { + return a + b; + }, + '@@transducer/result': _identity + }; + var _stepCatObject = { + '@@transducer/init': Object, + '@@transducer/step': function (result, input) { + return merge(result, isArrayLike(input) ? objOf(input[0], input[1]) : input); + }, + '@@transducer/result': _identity + }; + return function _stepCat(obj) { + if (_isTransformer(obj)) { + return obj; + } + if (isArrayLike(obj)) { + return _stepCatArray; + } + if (typeof obj === 'string') { + return _stepCatString; + } + if (typeof obj === 'object') { + return _stepCatObject; + } + throw new Error('Cannot create transformer for ' + obj); + }; + }(); + // mapPairs :: (Object, [String]) -> [String] - // Function, RegExp, user-defined types var _toString = function _toString(x, seen) { var recur = function recur(y) { var xs = seen.concat([x]); @@ -14976,11 +14181,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack case '[object Arguments]': return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))'; case '[object Array]': - return '[' + _map(recur, x).concat(mapPairs(x, reject(test(/^\d+$/), keys(x)))).join(', ') + ']'; + return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) { + return /^\d+$/.test(k); + }, keys(x)))).join(', ') + ']'; case '[object Boolean]': return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString(); case '[object Date]': - return 'new Date(' + _quote(_toISOString(x)) + ')'; + return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')'; case '[object Null]': return 'null'; case '[object Number]': @@ -14990,8 +14197,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack case '[object Undefined]': return 'undefined'; default: - return typeof x.constructor === 'function' && x.constructor.name !== 'Object' && typeof x.toString === 'function' && x.toString() !== '[object Object]' ? x.toString() : // Function, RegExp, user-defined types - '{' + mapPairs(x, keys(x)).join(', ') + '}'; + if (typeof x.toString === 'function') { + var repr = x.toString(); + if (repr !== '[object Object]') { + return repr; + } + } + return '{' + mapPairs(x, keys(x)).join(', ') + '}'; } }; @@ -15000,12 +14212,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.8.0 * @category List - * @see R.commuteMap * @sig Functor f => (x -> f x) -> [f a] -> f [a] * @param {Function} of A function that returns the data type to return * @param {Array} list An array of functors of the same type * @return {*} + * @see R.sequence + * @deprecated since v0.19.0 * @example * * R.commute(R.of, [[1], [2, 3]]); //=> [[1, 2], [1, 3]] @@ -15022,8 +14236,9 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Function - * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> (a -> b -> ... -> n -> z) + * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z) * @param {...Function} functions * @return {Function} * @see R.pipe @@ -15048,11 +14263,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.16.0 * @category Function - * @see R.pipeK * @sig Chain m => ((y -> m z), (x -> m y), ..., (a -> m b)) -> (m a -> m z) * @param {...Function} * @return {Function} + * @see R.pipeK * @example * * // parseJson :: String -> Maybe * @@ -15073,7 +14289,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * //=> Nothing() */ var composeK = function composeK() { - return arguments.length === 0 ? identity : compose.apply(this, map(chain, arguments)); + return compose.apply(this, prepend(identity, map(chain, arguments))); }; /** @@ -15083,6 +14299,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.10.0 * @category Function * @sig ((y -> Promise z), (x -> Promise y), ..., (a -> Promise b)) -> (a -> Promise z) * @param {...Function} functions @@ -15101,11 +14318,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }; /** - * Wraps a constructor function inside a curried function that can be called with the same - * arguments and returns the same type. + * Wraps a constructor function inside a curried function that can be called + * with the same arguments and returns the same type. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (* -> {*}) -> (* -> {*}) * @param {Function} Fn The constructor function to wrap. @@ -15113,7 +14331,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @example * * // Constructor function - * var Widget = function(config) { + * var Widget = config => { * // ... * }; * Widget.prototype = { @@ -15129,17 +14347,18 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns `true` if the specified value is equal, in `R.equals` terms, - * to at least one element of the given list; `false` otherwise. + * Returns `true` if the specified value is equal, in `R.equals` terms, to at + * least one element of the given list; `false` otherwise. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig a -> [a] -> Boolean * @param {Object} a The item to compare against. * @param {Array} list The array to consider. * @return {Boolean} `true` if the item is in the list, `false` otherwise. - * + * @see R.any * @example * * R.contains(3, [1, 2, 3]); //=> true @@ -15149,12 +14368,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var contains = _curry2(_contains); /** - * Finds the set (i.e. no duplicates) of all elements in the first list not contained in the second list. + * Finds the set (i.e. no duplicates) of all elements in the first list not + * contained in the second list. * * @func * @memberOf R + * @since v0.1.0 * @category Relation - * @sig [a] -> [a] -> [a] + * @sig [*] -> [*] -> [*] * @param {Array} list1 The first list. * @param {Array} list2 The second list. * @return {Array} The elements in `list1` that are not in `list2`. @@ -15178,18 +14399,21 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a new list without any consecutively repeating elements. - * `R.equals` is used to determine equality. + * Returns a new list without any consecutively repeating elements. `R.equals` + * is used to determine equality. + * + * Dispatches to the `dropRepeats` method of the first argument, if present. * * Acts as a transducer if a transformer is given in list position. - * @see R.transduce * * @func * @memberOf R + * @since v0.14.0 * @category List * @sig [a] -> [a] * @param {Array} list The array to consider. * @return {Array} `list` without repeating elements. + * @see R.transduce * @example * * R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2] @@ -15197,45 +14421,66 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var dropRepeats = _curry1(_dispatchable('dropRepeats', _xdropRepeatsWith(equals), dropRepeatsWith(equals))); /** - * Combines two lists into a set (i.e. no duplicates) composed of those elements common to both lists. + * Transforms the items of the list with the transducer and appends the + * transformed items to the accumulator using an appropriate iterator function + * based on the accumulator type. + * + * The accumulator can be an array, string, object or a transformer. Iterated + * items will be appended to arrays and concatenated to strings. Objects will + * be merged directly or 2-item arrays will be merged as key, value pairs. + * + * The accumulator can also be a transformer object that provides a 2-arity + * reducing iterator function, step, 0-arity initial value function, init, and + * 1-arity result extraction function result. The step function is used as the + * iterator function in reduce. The result function is used to convert the + * final accumulator into the return type and in most cases is R.identity. The + * init function is used to provide the initial accumulator. + * + * The iteration is performed with R.reduce after initializing the transducer. * * @func * @memberOf R - * @category Relation - * @sig [a] -> [a] -> [a] - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @see R.intersectionWith - * @return {Array} The list of elements found in both `list1` and `list2`. + * @since v0.12.0 + * @category List + * @sig a -> (b -> b) -> [c] -> a + * @param {*} acc The initial accumulator value. + * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. * @example * - * R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3] + * var numbers = [1, 2, 3, 4]; + * var transducer = R.compose(R.map(R.add(1)), R.take(2)); + * + * R.into([], transducer, numbers); //=> [2, 3] + * + * var intoArray = R.into([]); + * intoArray(transducer, numbers); //=> [2, 3] */ - var intersection = _curry2(function intersection(list1, list2) { - return uniq(_filter(flip(_contains)(list1), list2)); + var into = _curry3(function into(acc, xf, list) { + return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), acc, list); }); /** - * "lifts" a function of arity > 1 so that it may "map over" an Array or - * other Functor. + * "lifts" a function of arity > 1 so that it may "map over" an Array or other + * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply). * * @func * @memberOf R - * @see R.liftN + * @since v0.7.0 * @category Function * @sig (*... -> *) -> ([*]... -> [*]) * @param {Function} fn The function to lift into higher context - * @return {Function} The function `fn` applicable to mappable objects. + * @return {Function} The lifted function. + * @see R.liftN * @example * - * var madd3 = R.lift(R.curry(function(a, b, c) { - * return a + b + c; - * })); + * var madd3 = R.lift(R.curry((a, b, c) => a + b + c)); + * * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7] * - * var madd5 = R.lift(R.curry(function(a, b, c, d, e) { - * return a + b + c + d + e; - * })); + * var madd5 = R.lift(R.curry((a, b, c, d, e) => a + b + c + d + e)); + * * madd5([1,2], [3], [4, 5], [6], [7, 8]); //=> [21, 22, 22, 23, 22, 23, 23, 24] */ var lift = _curry1(function lift(fn) { @@ -15247,6 +14492,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category Object * @sig [String] -> {String: *} -> {String: *} * @param {Array} names an array of String property names to omit from the new object @@ -15275,11 +14521,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.16.0 * @category Function - * @see R.composeK * @sig Chain m => ((a -> m b), (b -> m c), ..., (y -> m z)) -> (m a -> m z) * @param {...Function} * @return {Function} + * @see R.composeK * @example * * // parseJson :: String -> Maybe * @@ -15326,6 +14573,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.14.0 * @category String * @sig * -> String * @param {*} val @@ -15343,32 +14591,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Combines two lists into a set (i.e. no duplicates) composed of the - * elements of each list. - * - * @func - * @memberOf R - * @category Relation - * @sig [a] -> [a] -> [a] - * @param {Array} as The first list. - * @param {Array} bs The second list. - * @return {Array} The first and second lists concatenated, with - * duplicates removed. - * @example - * - * R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4] - */ - var union = _curry2(compose(uniq, _concat)); - - /** - * Returns a new list containing only one copy of each element in the - * original list, based upon the value returned by applying the supplied - * function to each list element. Prefers the first item if the supplied - * function produces the same value on two items. `R.equals` is used for - * comparison. + * Returns a new list containing only one copy of each element in the original + * list, based upon the value returned by applying the supplied function to + * each list element. Prefers the first item if the supplied function produces + * the same value on two items. `R.equals` is used for comparison. * * @func * @memberOf R + * @since v0.16.0 * @category List * @sig (a -> b) -> [a] -> [a] * @param {Function} fn A function used to produce a value to use during comparisons. @@ -15378,8 +14608,19 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10] */ - var uniqBy = _curry2(function uniqBy(fn, list) { - var idx = 0, applied = [], result = [], appliedItem, item; + /* globals Set */ + // distinguishing between +0 and -0 is not supported by Set + /* falls through */ + // these types can all utilise Set + // prevent scan for null by tracking as a boolean + /* falls through */ + // scan through all previously applied items + var uniqBy = _curry2(/* globals Set */ + typeof Set === 'undefined' ? function uniqBy(fn, list) { + var idx = 0; + var applied = []; + var result = []; + var appliedItem, item; while (idx < list.length) { item = list[idx]; appliedItem = fn(item); @@ -15390,22 +14631,128 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack idx += 1; } return result; + } : function uniqBySet(fn, list) { + var set = new Set(); + var applied = []; + var prevSetSize = 0; + var result = []; + var nullExists = false; + var negZeroExists = false; + var idx = 0; + var appliedItem, item, newSetSize; + while (idx < list.length) { + item = list[idx]; + appliedItem = fn(item); + switch (typeof appliedItem) { + case 'number': + // distinguishing between +0 and -0 is not supported by Set + if (appliedItem === 0 && !negZeroExists && 1 / appliedItem === -Infinity) { + negZeroExists = true; + result.push(item); + break; + } + /* falls through */ + case 'string': + case 'boolean': + case 'function': + case 'undefined': + // these types can all utilise Set + set.add(appliedItem); + newSetSize = set.size; + if (newSetSize > prevSetSize) { + result.push(item); + prevSetSize = newSetSize; + } + break; + case 'object': + if (appliedItem === null) { + if (!nullExists) { + // prevent scan for null by tracking as a boolean + nullExists = true; + result.push(null); + } + break; + } + /* falls through */ + default: + // scan through all previously applied items + if (!_contains(appliedItem, applied)) { + applied.push(appliedItem); + result.push(item); + } + } + idx += 1; + } + return result; }); /** - * Turns a named method with a specified arity into a function - * that can be called directly supplied with arguments and a target object. + * Returns a new list without values in the first argument. + * `R.equals` is used to determine equality. + * + * Acts as a transducer if a transformer is given in list position. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category List + * @sig [a] -> [a] -> [a] + * @param {Array} list1 The values to be removed from `list2`. + * @param {Array} list2 The array to remove values from. + * @return {Array} The new array without values in `list1`. + * @see R.transduce + * @example + * + * R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4] + */ + var without = _curry2(function (xs, list) { + return reject(flip(_contains)(xs), list); + }); + + /** + * Takes a function `f` and returns a function `g` such that: + * + * - applying `g` to zero or more arguments will give __true__ if applying + * the same arguments to `f` gives a logical __false__ value; and + * + * - applying `g` to zero or more arguments will give __false__ if applying + * the same arguments to `f` gives a logical __true__ value. + * + * `R.complement` will work on all other functors as well. + * + * @func + * @memberOf R + * @since v0.12.0 + * @category Logic + * @sig (*... -> *) -> (*... -> Boolean) + * @param {Function} f + * @return {Function} + * @see R.not + * @example + * + * var isEven = n => n % 2 === 0; + * var isOdd = R.complement(isEven); + * isOdd(21); //=> true + * isOdd(42); //=> false + */ + var complement = lift(not); + + /** + * Turns a named method with a specified arity into a function that can be + * called directly supplied with arguments and a target object. * * The returned function is curried and accepts `arity + 1` parameters where * the final parameter is the target object. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *) * @param {Number} arity Number of arguments the returned function should take * before the target object. - * @param {Function} method Name of the method to call. + * @param {String} method Name of the method to call. * @return {Function} A new curried function. * @example * @@ -15425,11 +14772,12 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); /** - * Returns a string made by inserting the `separator` between each - * element and concatenating all the elements into a single string. + * Returns a string made by inserting the `separator` between each element and + * concatenating all the elements into a single string. * * @func * @memberOf R + * @since v0.1.0 * @category List * @sig String -> [a] -> String * @param {Number|String} separator The string used to separate the elements. @@ -15445,13 +14793,15 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack var join = invoker(1, 'join'); /** - * Creates a new function that, when invoked, caches the result of calling `fn` for a given - * argument set and returns the result. Subsequent calls to the memoized `fn` with the same - * argument set will not result in an additional call to `fn`; instead, the cached result - * for that set of arguments will be returned. + * Creates a new function that, when invoked, caches the result of calling `fn` + * for a given argument set and returns the result. Subsequent calls to the + * memoized `fn` with the same argument set will not result in an additional + * call to `fn`; instead, the cached result for that set of arguments will be + * returned. * * @func * @memberOf R + * @since v0.1.0 * @category Function * @sig (*... -> a) -> (*... -> a) * @param {Function} fn The function to memoize. @@ -15459,7 +14809,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * @example * * var count = 0; - * var factorial = R.memoize(function(n) { + * var factorial = R.memoize(n => { * count += 1; * return R.product(R.range(1, n + 1)); * }); @@ -15470,13 +14820,13 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack */ var memoize = _curry1(function memoize(fn) { var cache = {}; - return function () { + return _arity(fn.length, function () { var key = toString(arguments); if (!_has(key, cache)) { cache[key] = fn.apply(this, arguments); } return cache[key]; - }; + }); }); /** @@ -15485,9 +14835,10 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.1.0 * @category String - * @sig String -> String -> [String] - * @param {String} sep The separator string. + * @sig (String | RegExp) -> String -> [String] + * @param {String|RegExp} sep The pattern. * @param {String} str The string to separate into an array. * @return {Array} The array of strings from `str` separated by `str`. * @see R.join @@ -15500,11 +14851,36 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack */ var split = invoker(1, 'split'); + /** + * Determines whether a given string matches a given regular expression. + * + * @func + * @memberOf R + * @since v0.12.0 + * @category String + * @sig RegExp -> String -> Boolean + * @param {RegExp} pattern + * @param {String} str + * @return {Boolean} + * @see R.match + * @example + * + * R.test(/^x/, 'xyz'); //=> true + * R.test(/^y/, 'xyz'); //=> false + */ + var test = _curry2(function test(pattern, str) { + if (!_isRegExp(pattern)) { + throw new TypeError('\u2018test\u2019 requires a value of type RegExp as its first argument; received ' + toString(pattern)); + } + return _cloneRegExp(pattern).test(str); + }); + /** * The lower case version of a string. * * @func * @memberOf R + * @since v0.9.0 * @category String * @sig String -> String * @param {String} str The string to lower case. @@ -15521,6 +14897,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack * * @func * @memberOf R + * @since v0.9.0 * @category String * @sig String -> String * @param {String} str The string to upper case. @@ -15532,6 +14909,138 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack */ var toUpper = invoker(0, 'toUpperCase'); + /** + * Returns a new list containing only one copy of each element in the original + * list. `R.equals` is used to determine equality. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category List + * @sig [a] -> [a] + * @param {Array} list The array to consider. + * @return {Array} The list of unique items. + * @example + * + * R.uniq([1, 1, 2, 1]); //=> [1, 2] + * R.uniq([1, '1']); //=> [1, '1'] + * R.uniq([[42], [42]]); //=> [[42]] + */ + var uniq = uniqBy(identity); + + /** + * Returns the result of concatenating the given lists or strings. + * + * Dispatches to the `concat` method of the second argument, if present. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category List + * @sig [a] -> [a] -> [a] + * @sig String -> String -> String + * @param {Array|String} a + * @param {Array|String} b + * @return {Array|String} + * + * @example + * + * R.concat([], []); //=> [] + * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] + * R.concat('ABC', 'DEF'); // 'ABCDEF' + */ + var concat = flip(invoker(1, 'concat')); + + /** + * Combines two lists into a set (i.e. no duplicates) composed of those + * elements common to both lists. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category Relation + * @sig [*] -> [*] -> [*] + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @return {Array} The list of elements found in both `list1` and `list2`. + * @see R.intersectionWith + * @example + * + * R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3] + */ + var intersection = _curry2(function intersection(list1, list2) { + return uniq(_filter(flip(_contains)(list1), list2)); + }); + + /** + * Finds the set (i.e. no duplicates) of all elements contained in the first or + * second list, but not both. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category Relation + * @sig [*] -> [*] -> [*] + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @return {Array} The elements in `list1` or `list2`, but not both. + * @see R.symmetricDifferenceWith + * @example + * + * R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5] + * R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2] + */ + var symmetricDifference = _curry2(function symmetricDifference(list1, list2) { + return concat(difference(list1, list2), difference(list2, list1)); + }); + + /** + * Finds the set (i.e. no duplicates) of all elements contained in the first or + * second list, but not both. Duplication is determined according to the value + * returned by applying the supplied predicate to two list elements. + * + * @func + * @memberOf R + * @since 0.19.1 + * @since 0.19.0 + * @category Relation + * @sig (a -> a -> Boolean) -> [a] -> [a] -> [a] + * @param {Function} pred A predicate used to test whether two items are equal. + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @return {Array} The elements in `list1` or `list2`, but not both. + * @see R.symmetricDifference + * @example + * + * var eqA = R.eqBy(R.prop('a')); + * var l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}]; + * var l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}]; + * R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}] + */ + var symmetricDifferenceWith = _curry3(function symmetricDifferenceWith(pred, list1, list2) { + return concat(differenceWith(pred, list1, list2), differenceWith(pred, list2, list1)); + }); + + /** + * Combines two lists into a set (i.e. no duplicates) composed of the elements + * of each list. + * + * @func + * @memberOf R + * @since v0.1.0 + * @category Relation + * @sig [*] -> [*] -> [*] + * @param {Array} as The first list. + * @param {Array} bs The second list. + * @return {Array} The first and second lists concatenated, with + * duplicates removed. + * @example + * + * R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4] + */ + var union = _curry2(compose(uniq, _concat)); + var R = { F: F, T: T, @@ -15541,6 +15050,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack adjust: adjust, all: all, allPass: allPass, + allUniq: allUniq, always: always, and: and, any: any, @@ -15569,10 +15079,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack construct: construct, constructN: constructN, contains: contains, - containsWith: containsWith, converge: converge, countBy: countBy, - createMapEntry: createMapEntry, curry: curry, curryN: curryN, dec: dec, @@ -15590,6 +15098,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack dropWhile: dropWhile, either: either, empty: empty, + eqBy: eqBy, eqProps: eqProps, equals: equals, evolve: evolve, @@ -15602,8 +15111,6 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack flip: flip, forEach: forEach, fromPairs: fromPairs, - functions: functions, - functionsIn: functionsIn, groupBy: groupBy, gt: gt, gte: gte, @@ -15614,6 +15121,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack identity: identity, ifElse: ifElse, inc: inc, + indexBy: indexBy, indexOf: indexOf, init: init, insert: insert, @@ -15629,8 +15137,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack isArrayLike: isArrayLike, isEmpty: isEmpty, isNil: isNil, - isSet: isSet, join: join, + juxt: juxt, keys: keys, keysIn: keysIn, last: last, @@ -15638,6 +15146,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack length: length, lens: lens, lensIndex: lensIndex, + lensPath: lensPath, lensProp: lensProp, lift: lift, liftN: liftN, @@ -15646,7 +15155,6 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack map: map, mapAccum: mapAccum, mapAccumRight: mapAccumRight, - mapObj: mapObj, mapObjIndexed: mapObjIndexed, match: match, mathMod: mathMod, @@ -15657,6 +15165,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack memoize: memoize, merge: merge, mergeAll: mergeAll, + mergeWith: mergeWith, + mergeWithKey: mergeWithKey, min: min, minBy: minBy, modulo: modulo, @@ -15667,18 +15177,20 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack not: not, nth: nth, nthArg: nthArg, - nthChar: nthChar, - nthCharCode: nthCharCode, + objOf: objOf, of: of, omit: omit, once: once, or: or, over: over, + pair: pair, partial: partial, partialRight: partialRight, partition: partition, path: path, pathEq: pathEq, + pathOr: pathOr, + pathSatisfies: pathSatisfies, pick: pick, pickAll: pickAll, pickBy: pickBy, @@ -15705,14 +15217,19 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack replace: replace, reverse: reverse, scan: scan, + sequence: sequence, set: set, slice: slice, sort: sort, sortBy: sortBy, split: split, + splitAt: splitAt, splitEvery: splitEvery, + splitWhen: splitWhen, subtract: subtract, sum: sum, + symmetricDifference: symmetricDifference, + symmetricDifferenceWith: symmetricDifferenceWith, tail: tail, take: take, takeLast: takeLast, @@ -15727,6 +15244,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack toString: toString, toUpper: toUpper, transduce: transduce, + transpose: transpose, + traverse: traverse, trim: trim, type: type, unapply: unapply, @@ -15738,20 +15257,24 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack uniq: uniq, uniqBy: uniqBy, uniqWith: uniqWith, + unless: unless, unnest: unnest, update: update, useWith: useWith, values: values, valuesIn: valuesIn, view: view, + when: when, where: where, whereEq: whereEq, + without: without, wrap: wrap, xprod: xprod, zip: zip, zipObj: zipObj, zipWith: zipWith }; + /* eslint-env amd */ /* TEST_ENTRY_POINT */ @@ -15767,14258 +15290,13299 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /***/ }, -/* 18 */ -/***/ function(module, exports, __webpack_require__) { - - var _equals = __webpack_require__(17).equals; - - - module.exports = { - - baseMap: function(f) { - return f(this.value); - }, - - getEquals: function(constructor) { - return function equals(that) { - return that instanceof constructor && _equals(this.value, that.value); - }; - }, - - extend: function(Child, Parent) { - function Ctor() { - this.constructor = Child; - } - Ctor.prototype = Parent.prototype; - Child.prototype = new Ctor(); - Child.super_ = Parent.prototype; - }, - - identity: function(x) { return x; }, - - notImplemented: function(str) { - return function() { - throw new Error(str + ' is not implemented'); - }; - }, - - notCallable: function(fn) { - return function() { - throw new Error(fn + ' cannot be called directly'); - }; - }, - - returnThis: function() { return this; } +/* 11 */ +/***/ function(module, exports) { - }; + "use strict"; + Object.defineProperty(exports, "__esModule", { + value: true + }); + const Term_16 = Object.create(Object.prototype, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, _descendants: { value: new Map(), writable: false, configurable: false, enumerable: false }, hasDescendant: { value: function (name_110) { + return this._descendants.has(name_110); + }, writable: false, configurable: false, enumerable: true }, getDescendant: { value: function (name_111) { + return this._descendants.get(name_111); + }, writable: false, configurable: false, enumerable: true }, getAttributes: { value: function () { + return this._attributes; + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_112) { + return this._attributes.some(a_113 => a_113.attrName === attr_112); + }, writable: false, configurable: false, enumerable: true } }); + const BindingWithDefault_17 = Object.create(Term_16, { _attributes: { value: [{ attrName: "binding", attrType: { name: "any" } }, { attrName: "init", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_114) { + return this.getAttributes().some(a_115 => a_115.attrName === attr_114); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(BindingWithDefault_17); + Term_16._descendants.set("BindingWithDefault", BindingWithDefault_17); + const BindingIdentifier_18 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_116) { + return this.getAttributes().some(a_117 => a_117.attrName === attr_116); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(BindingIdentifier_18); + Term_16._descendants.set("BindingIdentifier", BindingIdentifier_18); + const ArrayBinding_19 = Object.create(Term_16, { _attributes: { value: [{ attrName: "elements", attrType: { name: "any" } }, { attrName: "restElement", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_118) { + return this.getAttributes().some(a_119 => a_119.attrName === attr_118); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ArrayBinding_19); + Term_16._descendants.set("ArrayBinding", ArrayBinding_19); + const ObjectBinding_20 = Object.create(Term_16, { _attributes: { value: [{ attrName: "properties", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_120) { + return this.getAttributes().some(a_121 => a_121.attrName === attr_120); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ObjectBinding_20); + Term_16._descendants.set("ObjectBinding", ObjectBinding_20); + const BindingPropertyIdentifier_21 = Object.create(Term_16, { _attributes: { value: [{ attrName: "binding", attrType: { name: "any" } }, { attrName: "init", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_122) { + return this.getAttributes().some(a_123 => a_123.attrName === attr_122); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(BindingPropertyIdentifier_21); + Term_16._descendants.set("BindingPropertyIdentifier", BindingPropertyIdentifier_21); + const BindingPropertyProperty_22 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "binding", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_124) { + return this.getAttributes().some(a_125 => a_125.attrName === attr_124); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(BindingPropertyProperty_22); + Term_16._descendants.set("BindingPropertyProperty", BindingPropertyProperty_22); + const Statement_23 = Object.create(Term_16, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_126) { + return this.getAttributes().some(a_127 => a_127.attrName === attr_126); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Statement_23); + Term_16._descendants.set("Statement", Statement_23); + const Expression_24 = Object.create(Term_16, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_128) { + return this.getAttributes().some(a_129 => a_129.attrName === attr_128); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Expression_24); + Term_16._descendants.set("Expression", Expression_24); + const ClassExpression_25 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "super", attrType: { name: "any" } }, { attrName: "elements", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_130) { + return this.getAttributes().some(a_131 => a_131.attrName === attr_130); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ClassExpression_25); + Expression_24._descendants.set("ClassExpression", ClassExpression_25); + const ClassDeclaration_26 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "super", attrType: { name: "any" } }, { attrName: "elements", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_132) { + return this.getAttributes().some(a_133 => a_133.attrName === attr_132); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ClassDeclaration_26); + Statement_23._descendants.set("ClassDeclaration", ClassDeclaration_26); + const ClassElement_27 = Object.create(Term_16, { _attributes: { value: [{ attrName: "isStatic", attrType: { name: "any" } }, { attrName: "method", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_134) { + return this.getAttributes().some(a_135 => a_135.attrName === attr_134); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ClassElement_27); + Term_16._descendants.set("ClassElement", ClassElement_27); + const Module_28 = Object.create(Term_16, { _attributes: { value: [{ attrName: "directives", attrType: { name: "any" } }, { attrName: "items", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_136) { + return this.getAttributes().some(a_137 => a_137.attrName === attr_136); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Module_28); + Term_16._descendants.set("Module", Module_28); + const Import_29 = Object.create(Term_16, { _attributes: { value: [{ attrName: "moduleSpecifier", attrType: { name: "any" } }, { attrName: "defaultBinding", attrType: { name: "any" } }, { attrName: "namedImports", attrType: { name: "any" } }, { attrName: "forSyntax", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_138) { + return this.getAttributes().some(a_139 => a_139.attrName === attr_138); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Import_29); + Term_16._descendants.set("Import", Import_29); + const ImportNamespace_30 = Object.create(Term_16, { _attributes: { value: [{ attrName: "moduleSpecifier", attrType: { name: "any" } }, { attrName: "defaultBinding", attrType: { name: "any" } }, { attrName: "namespaceBinding", attrType: { name: "any" } }, { attrName: "forSyntax", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_140) { + return this.getAttributes().some(a_141 => a_141.attrName === attr_140); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ImportNamespace_30); + Term_16._descendants.set("ImportNamespace", ImportNamespace_30); + const ImportSpecifier_31 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "binding", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_142) { + return this.getAttributes().some(a_143 => a_143.attrName === attr_142); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ImportSpecifier_31); + Term_16._descendants.set("ImportSpecifier", ImportSpecifier_31); + const ExportAllFrom_32 = Object.create(Term_16, { _attributes: { value: [{ attrName: "moduleSpecifier", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_144) { + return this.getAttributes().some(a_145 => a_145.attrName === attr_144); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ExportAllFrom_32); + Term_16._descendants.set("ExportAllFrom", ExportAllFrom_32); + const ExportFrom_33 = Object.create(Term_16, { _attributes: { value: [{ attrName: "namedExports", attrType: { name: "any" } }, { attrName: "moduleSpecifier", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_146) { + return this.getAttributes().some(a_147 => a_147.attrName === attr_146); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ExportFrom_33); + Term_16._descendants.set("ExportFrom", ExportFrom_33); + const Export_34 = Object.create(Term_16, { _attributes: { value: [{ attrName: "declaration", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_148) { + return this.getAttributes().some(a_149 => a_149.attrName === attr_148); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Export_34); + Term_16._descendants.set("Export", Export_34); + const ExportDefault_35 = Object.create(Term_16, { _attributes: { value: [{ attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_150) { + return this.getAttributes().some(a_151 => a_151.attrName === attr_150); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ExportDefault_35); + Term_16._descendants.set("ExportDefault", ExportDefault_35); + const ExportSpecifier_36 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "exportedName", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_152) { + return this.getAttributes().some(a_153 => a_153.attrName === attr_152); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ExportSpecifier_36); + Term_16._descendants.set("ExportSpecifier", ExportSpecifier_36); + const Method_37 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }, { attrName: "isGenerator", attrType: { name: "any" } }, { attrName: "params", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_154) { + return this.getAttributes().some(a_155 => a_155.attrName === attr_154); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Method_37); + Term_16._descendants.set("Method", Method_37); + const Getter_38 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_156) { + return this.getAttributes().some(a_157 => a_157.attrName === attr_156); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Getter_38); + Term_16._descendants.set("Getter", Getter_38); + const Setter_39 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }, { attrName: "param", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_158) { + return this.getAttributes().some(a_159 => a_159.attrName === attr_158); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Setter_39); + Term_16._descendants.set("Setter", Setter_39); + const DataProperty_40 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_160) { + return this.getAttributes().some(a_161 => a_161.attrName === attr_160); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(DataProperty_40); + Term_16._descendants.set("DataProperty", DataProperty_40); + const ShorthandProperty_41 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_162) { + return this.getAttributes().some(a_163 => a_163.attrName === attr_162); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ShorthandProperty_41); + Term_16._descendants.set("ShorthandProperty", ShorthandProperty_41); + const StaticPropertyName_42 = Object.create(Term_16, { _attributes: { value: [{ attrName: "value", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_164) { + return this.getAttributes().some(a_165 => a_165.attrName === attr_164); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(StaticPropertyName_42); + Term_16._descendants.set("StaticPropertyName", StaticPropertyName_42); + const ComputedPropertyName_43 = Object.create(Term_16, { _attributes: { value: [{ attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_166) { + return this.getAttributes().some(a_167 => a_167.attrName === attr_166); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(ComputedPropertyName_43); + Term_16._descendants.set("ComputedPropertyName", ComputedPropertyName_43); + const LiteralBooleanExpression_44 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "value", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_168) { + return this.getAttributes().some(a_169 => a_169.attrName === attr_168); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(LiteralBooleanExpression_44); + Expression_24._descendants.set("LiteralBooleanExpression", LiteralBooleanExpression_44); + const LiteralInfinityExpression_45 = Object.create(Expression_24, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_170) { + return this.getAttributes().some(a_171 => a_171.attrName === attr_170); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(LiteralInfinityExpression_45); + Expression_24._descendants.set("LiteralInfinityExpression", LiteralInfinityExpression_45); + const LiteralNullExpression_46 = Object.create(Expression_24, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_172) { + return this.getAttributes().some(a_173 => a_173.attrName === attr_172); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(LiteralNullExpression_46); + Expression_24._descendants.set("LiteralNullExpression", LiteralNullExpression_46); + const LiteralNumericExpression_47 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "value", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_174) { + return this.getAttributes().some(a_175 => a_175.attrName === attr_174); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(LiteralNumericExpression_47); + Expression_24._descendants.set("LiteralNumericExpression", LiteralNumericExpression_47); + const LiteralRegExpExpression_48 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "pattern", attrType: { name: "any" } }, { attrName: "flags", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_176) { + return this.getAttributes().some(a_177 => a_177.attrName === attr_176); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(LiteralRegExpExpression_48); + Expression_24._descendants.set("LiteralRegExpExpression", LiteralRegExpExpression_48); + const LiteralStringExpression_49 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "value", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_178) { + return this.getAttributes().some(a_179 => a_179.attrName === attr_178); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(LiteralStringExpression_49); + Expression_24._descendants.set("LiteralStringExpression", LiteralStringExpression_49); + const ArrayExpression_50 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "elements", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_180) { + return this.getAttributes().some(a_181 => a_181.attrName === attr_180); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ArrayExpression_50); + Expression_24._descendants.set("ArrayExpression", ArrayExpression_50); + const ArrowExpression_51 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "params", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_182) { + return this.getAttributes().some(a_183 => a_183.attrName === attr_182); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ArrowExpression_51); + Expression_24._descendants.set("ArrowExpression", ArrowExpression_51); + const AssignmentExpression_52 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "binding", attrType: { name: "any" } }, { attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_184) { + return this.getAttributes().some(a_185 => a_185.attrName === attr_184); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(AssignmentExpression_52); + Expression_24._descendants.set("AssignmentExpression", AssignmentExpression_52); + const BinaryExpression_53 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "operator", attrType: { name: "any" } }, { attrName: "left", attrType: { name: "any" } }, { attrName: "right", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_186) { + return this.getAttributes().some(a_187 => a_187.attrName === attr_186); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(BinaryExpression_53); + Expression_24._descendants.set("BinaryExpression", BinaryExpression_53); + const CallExpression_54 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "callee", attrType: { name: "any" } }, { attrName: "arguments", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_188) { + return this.getAttributes().some(a_189 => a_189.attrName === attr_188); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(CallExpression_54); + Expression_24._descendants.set("CallExpression", CallExpression_54); + const ComputedAssignmentExpression_55 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "operator", attrType: { name: "any" } }, { attrName: "binding", attrType: { name: "any" } }, { attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_190) { + return this.getAttributes().some(a_191 => a_191.attrName === attr_190); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ComputedAssignmentExpression_55); + Expression_24._descendants.set("ComputedAssignmentExpression", ComputedAssignmentExpression_55); + const ComputedMemberExpression_56 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "object", attrType: { name: "any" } }, { attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_192) { + return this.getAttributes().some(a_193 => a_193.attrName === attr_192); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ComputedMemberExpression_56); + Expression_24._descendants.set("ComputedMemberExpression", ComputedMemberExpression_56); + const ConditionalExpression_57 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "test", attrType: { name: "any" } }, { attrName: "consequent", attrType: { name: "any" } }, { attrName: "alternate", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_194) { + return this.getAttributes().some(a_195 => a_195.attrName === attr_194); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ConditionalExpression_57); + Expression_24._descendants.set("ConditionalExpression", ConditionalExpression_57); + const FunctionExpression_58 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "isGenerator", attrType: { name: "any" } }, { attrName: "params", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_196) { + return this.getAttributes().some(a_197 => a_197.attrName === attr_196); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(FunctionExpression_58); + Expression_24._descendants.set("FunctionExpression", FunctionExpression_58); + const IdentifierExpression_59 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_198) { + return this.getAttributes().some(a_199 => a_199.attrName === attr_198); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(IdentifierExpression_59); + Expression_24._descendants.set("IdentifierExpression", IdentifierExpression_59); + const NewExpression_60 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "callee", attrType: { name: "any" } }, { attrName: "arguments", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_200) { + return this.getAttributes().some(a_201 => a_201.attrName === attr_200); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(NewExpression_60); + Expression_24._descendants.set("NewExpression", NewExpression_60); + const NewTargetExpression_61 = Object.create(Expression_24, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_202) { + return this.getAttributes().some(a_203 => a_203.attrName === attr_202); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(NewTargetExpression_61); + Expression_24._descendants.set("NewTargetExpression", NewTargetExpression_61); + const ObjectExpression_62 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "properties", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_204) { + return this.getAttributes().some(a_205 => a_205.attrName === attr_204); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ObjectExpression_62); + Expression_24._descendants.set("ObjectExpression", ObjectExpression_62); + const UnaryExpression_63 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "operator", attrType: { name: "any" } }, { attrName: "operand", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_206) { + return this.getAttributes().some(a_207 => a_207.attrName === attr_206); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(UnaryExpression_63); + Expression_24._descendants.set("UnaryExpression", UnaryExpression_63); + const StaticMemberExpression_64 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "object", attrType: { name: "any" } }, { attrName: "property", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_208) { + return this.getAttributes().some(a_209 => a_209.attrName === attr_208); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(StaticMemberExpression_64); + Expression_24._descendants.set("StaticMemberExpression", StaticMemberExpression_64); + const TemplateExpression_65 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "tag", attrType: { name: "any" } }, { attrName: "elements", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_210) { + return this.getAttributes().some(a_211 => a_211.attrName === attr_210); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(TemplateExpression_65); + Expression_24._descendants.set("TemplateExpression", TemplateExpression_65); + const ThisExpression_66 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "stx", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_212) { + return this.getAttributes().some(a_213 => a_213.attrName === attr_212); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ThisExpression_66); + Expression_24._descendants.set("ThisExpression", ThisExpression_66); + const UpdateExpression_67 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "isPrefix", attrType: { name: "any" } }, { attrName: "operator", attrType: { name: "any" } }, { attrName: "operand", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_214) { + return this.getAttributes().some(a_215 => a_215.attrName === attr_214); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(UpdateExpression_67); + Expression_24._descendants.set("UpdateExpression", UpdateExpression_67); + const YieldExpression_68 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_216) { + return this.getAttributes().some(a_217 => a_217.attrName === attr_216); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(YieldExpression_68); + Expression_24._descendants.set("YieldExpression", YieldExpression_68); + const YieldGeneratorExpression_69 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_218) { + return this.getAttributes().some(a_219 => a_219.attrName === attr_218); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(YieldGeneratorExpression_69); + Expression_24._descendants.set("YieldGeneratorExpression", YieldGeneratorExpression_69); + const ParenthesizedExpression_70 = Object.create(Expression_24, { _attributes: { value: [{ attrName: "inner", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Expression_24.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_220) { + return this.getAttributes().some(a_221 => a_221.attrName === attr_220); + }, writable: false, configurable: false, enumerable: true } }); + Expression_24._children.push(ParenthesizedExpression_70); + Expression_24._descendants.set("ParenthesizedExpression", ParenthesizedExpression_70); + const BlockStatement_71 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "block", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_222) { + return this.getAttributes().some(a_223 => a_223.attrName === attr_222); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(BlockStatement_71); + Statement_23._descendants.set("BlockStatement", BlockStatement_71); + const BreakStatement_72 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "label", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_224) { + return this.getAttributes().some(a_225 => a_225.attrName === attr_224); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(BreakStatement_72); + Statement_23._descendants.set("BreakStatement", BreakStatement_72); + const ContinueStatement_73 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "label", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_226) { + return this.getAttributes().some(a_227 => a_227.attrName === attr_226); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ContinueStatement_73); + Statement_23._descendants.set("ContinueStatement", ContinueStatement_73); + const CompoundAssignmentExpression_74 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "binding", attrType: { name: "any" } }, { attrName: "operator", attrType: { name: "any" } }, { attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_228) { + return this.getAttributes().some(a_229 => a_229.attrName === attr_228); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(CompoundAssignmentExpression_74); + Statement_23._descendants.set("CompoundAssignmentExpression", CompoundAssignmentExpression_74); + const DebuggerStatement_75 = Object.create(Statement_23, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_230) { + return this.getAttributes().some(a_231 => a_231.attrName === attr_230); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(DebuggerStatement_75); + Statement_23._descendants.set("DebuggerStatement", DebuggerStatement_75); + const DoWhileStatement_76 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "test", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_232) { + return this.getAttributes().some(a_233 => a_233.attrName === attr_232); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(DoWhileStatement_76); + Statement_23._descendants.set("DoWhileStatement", DoWhileStatement_76); + const EmptyStatement_77 = Object.create(Statement_23, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_234) { + return this.getAttributes().some(a_235 => a_235.attrName === attr_234); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(EmptyStatement_77); + Statement_23._descendants.set("EmptyStatement", EmptyStatement_77); + const ExpressionStatement_78 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_236) { + return this.getAttributes().some(a_237 => a_237.attrName === attr_236); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ExpressionStatement_78); + Statement_23._descendants.set("ExpressionStatement", ExpressionStatement_78); + const ForInStatement_79 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "left", attrType: { name: "any" } }, { attrName: "right", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_238) { + return this.getAttributes().some(a_239 => a_239.attrName === attr_238); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ForInStatement_79); + Statement_23._descendants.set("ForInStatement", ForInStatement_79); + const ForOfStatement_80 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "left", attrType: { name: "any" } }, { attrName: "right", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_240) { + return this.getAttributes().some(a_241 => a_241.attrName === attr_240); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ForOfStatement_80); + Statement_23._descendants.set("ForOfStatement", ForOfStatement_80); + const ForStatement_81 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "init", attrType: { name: "any" } }, { attrName: "test", attrType: { name: "any" } }, { attrName: "update", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_242) { + return this.getAttributes().some(a_243 => a_243.attrName === attr_242); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ForStatement_81); + Statement_23._descendants.set("ForStatement", ForStatement_81); + const IfStatement_82 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "test", attrType: { name: "any" } }, { attrName: "consequent", attrType: { name: "any" } }, { attrName: "alternate", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_244) { + return this.getAttributes().some(a_245 => a_245.attrName === attr_244); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(IfStatement_82); + Statement_23._descendants.set("IfStatement", IfStatement_82); + const LabeledStatement_83 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "label", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_246) { + return this.getAttributes().some(a_247 => a_247.attrName === attr_246); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(LabeledStatement_83); + Statement_23._descendants.set("LabeledStatement", LabeledStatement_83); + const ReturnStatement_84 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_248) { + return this.getAttributes().some(a_249 => a_249.attrName === attr_248); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ReturnStatement_84); + Statement_23._descendants.set("ReturnStatement", ReturnStatement_84); + const SwitchStatement_85 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "discriminant", attrType: { name: "any" } }, { attrName: "cases", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_250) { + return this.getAttributes().some(a_251 => a_251.attrName === attr_250); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(SwitchStatement_85); + Statement_23._descendants.set("SwitchStatement", SwitchStatement_85); + const SwitchStatementWithDefault_86 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "discriminant", attrType: { name: "any" } }, { attrName: "preDefaultCases", attrType: { name: "any" } }, { attrName: "defaultCase", attrType: { name: "any" } }, { attrName: "postDefaultCases", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_252) { + return this.getAttributes().some(a_253 => a_253.attrName === attr_252); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(SwitchStatementWithDefault_86); + Statement_23._descendants.set("SwitchStatementWithDefault", SwitchStatementWithDefault_86); + const ThrowStatement_87 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_254) { + return this.getAttributes().some(a_255 => a_255.attrName === attr_254); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(ThrowStatement_87); + Statement_23._descendants.set("ThrowStatement", ThrowStatement_87); + const TryCatchStatement_88 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "body", attrType: { name: "any" } }, { attrName: "catchClause", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_256) { + return this.getAttributes().some(a_257 => a_257.attrName === attr_256); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(TryCatchStatement_88); + Statement_23._descendants.set("TryCatchStatement", TryCatchStatement_88); + const TryFinallyStatement_89 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "body", attrType: { name: "any" } }, { attrName: "catchClause", attrType: { name: "any" } }, { attrName: "finalizer", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_258) { + return this.getAttributes().some(a_259 => a_259.attrName === attr_258); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(TryFinallyStatement_89); + Statement_23._descendants.set("TryFinallyStatement", TryFinallyStatement_89); + const VariableDeclarationStatement_90 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "declaration", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_260) { + return this.getAttributes().some(a_261 => a_261.attrName === attr_260); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(VariableDeclarationStatement_90); + Statement_23._descendants.set("VariableDeclarationStatement", VariableDeclarationStatement_90); + const WithStatement_91 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "object", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_262) { + return this.getAttributes().some(a_263 => a_263.attrName === attr_262); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(WithStatement_91); + Statement_23._descendants.set("WithStatement", WithStatement_91); + const WhileStatement_92 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "test", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_264) { + return this.getAttributes().some(a_265 => a_265.attrName === attr_264); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(WhileStatement_92); + Statement_23._descendants.set("WhileStatement", WhileStatement_92); + const Pragma_93 = Object.create(Term_16, { _attributes: { value: [{ attrName: "kind", attrType: { name: "any" } }, { attrName: "items", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_266) { + return this.getAttributes().some(a_267 => a_267.attrName === attr_266); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Pragma_93); + Term_16._descendants.set("Pragma", Pragma_93); + const Block_94 = Object.create(Term_16, { _attributes: { value: [{ attrName: "statements", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_268) { + return this.getAttributes().some(a_269 => a_269.attrName === attr_268); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Block_94); + Term_16._descendants.set("Block", Block_94); + const CatchClause_95 = Object.create(Term_16, { _attributes: { value: [{ attrName: "binding", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_270) { + return this.getAttributes().some(a_271 => a_271.attrName === attr_270); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(CatchClause_95); + Term_16._descendants.set("CatchClause", CatchClause_95); + const Directive_96 = Object.create(Term_16, { _attributes: { value: [{ attrName: "rawValue", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_272) { + return this.getAttributes().some(a_273 => a_273.attrName === attr_272); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Directive_96); + Term_16._descendants.set("Directive", Directive_96); + const FormalParameters_97 = Object.create(Term_16, { _attributes: { value: [{ attrName: "items", attrType: { name: "any" } }, { attrName: "rest", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_274) { + return this.getAttributes().some(a_275 => a_275.attrName === attr_274); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(FormalParameters_97); + Term_16._descendants.set("FormalParameters", FormalParameters_97); + const FunctionBody_98 = Object.create(Term_16, { _attributes: { value: [{ attrName: "directives", attrType: { name: "any" } }, { attrName: "statements", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_276) { + return this.getAttributes().some(a_277 => a_277.attrName === attr_276); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(FunctionBody_98); + Term_16._descendants.set("FunctionBody", FunctionBody_98); + const FunctionDeclaration_99 = Object.create(Statement_23, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "isGenerator", attrType: { name: "any" } }, { attrName: "params", attrType: { name: "any" } }, { attrName: "body", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Statement_23.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_278) { + return this.getAttributes().some(a_279 => a_279.attrName === attr_278); + }, writable: false, configurable: false, enumerable: true } }); + Statement_23._children.push(FunctionDeclaration_99); + Statement_23._descendants.set("FunctionDeclaration", FunctionDeclaration_99); + const Script_100 = Object.create(Term_16, { _attributes: { value: [{ attrName: "directives", attrType: { name: "any" } }, { attrName: "statements", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_280) { + return this.getAttributes().some(a_281 => a_281.attrName === attr_280); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Script_100); + Term_16._descendants.set("Script", Script_100); + const SpreadElement_101 = Object.create(Term_16, { _attributes: { value: [{ attrName: "expression", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_282) { + return this.getAttributes().some(a_283 => a_283.attrName === attr_282); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(SpreadElement_101); + Term_16._descendants.set("SpreadElement", SpreadElement_101); + const Super_102 = Object.create(Term_16, { _attributes: { value: [], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_284) { + return this.getAttributes().some(a_285 => a_285.attrName === attr_284); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(Super_102); + Term_16._descendants.set("Super", Super_102); + const SwitchCase_103 = Object.create(Term_16, { _attributes: { value: [{ attrName: "test", attrType: { name: "any" } }, { attrName: "consequent", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_286) { + return this.getAttributes().some(a_287 => a_287.attrName === attr_286); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(SwitchCase_103); + Term_16._descendants.set("SwitchCase", SwitchCase_103); + const SwitchDefault_104 = Object.create(Term_16, { _attributes: { value: [{ attrName: "consequent", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_288) { + return this.getAttributes().some(a_289 => a_289.attrName === attr_288); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(SwitchDefault_104); + Term_16._descendants.set("SwitchDefault", SwitchDefault_104); + const TemplateElement_105 = Object.create(Term_16, { _attributes: { value: [{ attrName: "rawValue", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_290) { + return this.getAttributes().some(a_291 => a_291.attrName === attr_290); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(TemplateElement_105); + Term_16._descendants.set("TemplateElement", TemplateElement_105); + const SyntaxTemplate_106 = Object.create(Term_16, { _attributes: { value: [{ attrName: "template", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_292) { + return this.getAttributes().some(a_293 => a_293.attrName === attr_292); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(SyntaxTemplate_106); + Term_16._descendants.set("SyntaxTemplate", SyntaxTemplate_106); + const SyntaxQuote_107 = Object.create(Term_16, { _attributes: { value: [{ attrName: "name", attrType: { name: "any" } }, { attrName: "template", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_294) { + return this.getAttributes().some(a_295 => a_295.attrName === attr_294); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(SyntaxQuote_107); + Term_16._descendants.set("SyntaxQuote", SyntaxQuote_107); + const VariableDeclaration_108 = Object.create(Term_16, { _attributes: { value: [{ attrName: "kind", attrType: { name: "any" } }, { attrName: "declarators", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_296) { + return this.getAttributes().some(a_297 => a_297.attrName === attr_296); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(VariableDeclaration_108); + Term_16._descendants.set("VariableDeclaration", VariableDeclaration_108); + const VariableDeclarator_109 = Object.create(Term_16, { _attributes: { value: [{ attrName: "binding", attrType: { name: "any" } }, { attrName: "init", attrType: { name: "any" } }], writable: false, configurable: false, enumerable: false }, _children: { value: [], writable: false, configurable: false, enumerable: false }, getAttributes: { value: function () { + return Term_16.getAttributes().concat(this._attributes); + }, writable: false, configurable: false, enumerable: true }, hasAttribute: { value: function (attr_298) { + return this.getAttributes().some(a_299 => a_299.attrName === attr_298); + }, writable: false, configurable: false, enumerable: true } }); + Term_16._children.push(VariableDeclarator_109); + Term_16._descendants.set("VariableDeclarator", VariableDeclarator_109); + exports.default = Term_16; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2J1aWxkL3Rlcm0tc3BlYy5qcyJdLCJuYW1lcyI6WyJUZXJtXzE2IiwiT2JqZWN0IiwiY3JlYXRlIiwicHJvdG90eXBlIiwiX2F0dHJpYnV0ZXMiLCJ2YWx1ZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIl9jaGlsZHJlbiIsIl9kZXNjZW5kYW50cyIsIk1hcCIsImhhc0Rlc2NlbmRhbnQiLCJuYW1lXzExMCIsImhhcyIsImdldERlc2NlbmRhbnQiLCJuYW1lXzExMSIsImdldCIsImdldEF0dHJpYnV0ZXMiLCJoYXNBdHRyaWJ1dGUiLCJhdHRyXzExMiIsInNvbWUiLCJhXzExMyIsImF0dHJOYW1lIiwiQmluZGluZ1dpdGhEZWZhdWx0XzE3IiwiYXR0clR5cGUiLCJuYW1lIiwiY29uY2F0IiwiYXR0cl8xMTQiLCJhXzExNSIsInB1c2giLCJzZXQiLCJCaW5kaW5nSWRlbnRpZmllcl8xOCIsImF0dHJfMTE2IiwiYV8xMTciLCJBcnJheUJpbmRpbmdfMTkiLCJhdHRyXzExOCIsImFfMTE5IiwiT2JqZWN0QmluZGluZ18yMCIsImF0dHJfMTIwIiwiYV8xMjEiLCJCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXzIxIiwiYXR0cl8xMjIiLCJhXzEyMyIsIkJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzIyIiwiYXR0cl8xMjQiLCJhXzEyNSIsIlN0YXRlbWVudF8yMyIsImF0dHJfMTI2IiwiYV8xMjciLCJFeHByZXNzaW9uXzI0IiwiYXR0cl8xMjgiLCJhXzEyOSIsIkNsYXNzRXhwcmVzc2lvbl8yNSIsImF0dHJfMTMwIiwiYV8xMzEiLCJDbGFzc0RlY2xhcmF0aW9uXzI2IiwiYXR0cl8xMzIiLCJhXzEzMyIsIkNsYXNzRWxlbWVudF8yNyIsImF0dHJfMTM0IiwiYV8xMzUiLCJNb2R1bGVfMjgiLCJhdHRyXzEzNiIsImFfMTM3IiwiSW1wb3J0XzI5IiwiYXR0cl8xMzgiLCJhXzEzOSIsIkltcG9ydE5hbWVzcGFjZV8zMCIsImF0dHJfMTQwIiwiYV8xNDEiLCJJbXBvcnRTcGVjaWZpZXJfMzEiLCJhdHRyXzE0MiIsImFfMTQzIiwiRXhwb3J0QWxsRnJvbV8zMiIsImF0dHJfMTQ0IiwiYV8xNDUiLCJFeHBvcnRGcm9tXzMzIiwiYXR0cl8xNDYiLCJhXzE0NyIsIkV4cG9ydF8zNCIsImF0dHJfMTQ4IiwiYV8xNDkiLCJFeHBvcnREZWZhdWx0XzM1IiwiYXR0cl8xNTAiLCJhXzE1MSIsIkV4cG9ydFNwZWNpZmllcl8zNiIsImF0dHJfMTUyIiwiYV8xNTMiLCJNZXRob2RfMzciLCJhdHRyXzE1NCIsImFfMTU1IiwiR2V0dGVyXzM4IiwiYXR0cl8xNTYiLCJhXzE1NyIsIlNldHRlcl8zOSIsImF0dHJfMTU4IiwiYV8xNTkiLCJEYXRhUHJvcGVydHlfNDAiLCJhdHRyXzE2MCIsImFfMTYxIiwiU2hvcnRoYW5kUHJvcGVydHlfNDEiLCJhdHRyXzE2MiIsImFfMTYzIiwiU3RhdGljUHJvcGVydHlOYW1lXzQyIiwiYXR0cl8xNjQiLCJhXzE2NSIsIkNvbXB1dGVkUHJvcGVydHlOYW1lXzQzIiwiYXR0cl8xNjYiLCJhXzE2NyIsIkxpdGVyYWxCb29sZWFuRXhwcmVzc2lvbl80NCIsImF0dHJfMTY4IiwiYV8xNjkiLCJMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uXzQ1IiwiYXR0cl8xNzAiLCJhXzE3MSIsIkxpdGVyYWxOdWxsRXhwcmVzc2lvbl80NiIsImF0dHJfMTcyIiwiYV8xNzMiLCJMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb25fNDciLCJhdHRyXzE3NCIsImFfMTc1IiwiTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb25fNDgiLCJhdHRyXzE3NiIsImFfMTc3IiwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25fNDkiLCJhdHRyXzE3OCIsImFfMTc5IiwiQXJyYXlFeHByZXNzaW9uXzUwIiwiYXR0cl8xODAiLCJhXzE4MSIsIkFycm93RXhwcmVzc2lvbl81MSIsImF0dHJfMTgyIiwiYV8xODMiLCJBc3NpZ25tZW50RXhwcmVzc2lvbl81MiIsImF0dHJfMTg0IiwiYV8xODUiLCJCaW5hcnlFeHByZXNzaW9uXzUzIiwiYXR0cl8xODYiLCJhXzE4NyIsIkNhbGxFeHByZXNzaW9uXzU0IiwiYXR0cl8xODgiLCJhXzE4OSIsIkNvbXB1dGVkQXNzaWdubWVudEV4cHJlc3Npb25fNTUiLCJhdHRyXzE5MCIsImFfMTkxIiwiQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXzU2IiwiYXR0cl8xOTIiLCJhXzE5MyIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbl81NyIsImF0dHJfMTk0IiwiYV8xOTUiLCJGdW5jdGlvbkV4cHJlc3Npb25fNTgiLCJhdHRyXzE5NiIsImFfMTk3IiwiSWRlbnRpZmllckV4cHJlc3Npb25fNTkiLCJhdHRyXzE5OCIsImFfMTk5IiwiTmV3RXhwcmVzc2lvbl82MCIsImF0dHJfMjAwIiwiYV8yMDEiLCJOZXdUYXJnZXRFeHByZXNzaW9uXzYxIiwiYXR0cl8yMDIiLCJhXzIwMyIsIk9iamVjdEV4cHJlc3Npb25fNjIiLCJhdHRyXzIwNCIsImFfMjA1IiwiVW5hcnlFeHByZXNzaW9uXzYzIiwiYXR0cl8yMDYiLCJhXzIwNyIsIlN0YXRpY01lbWJlckV4cHJlc3Npb25fNjQiLCJhdHRyXzIwOCIsImFfMjA5IiwiVGVtcGxhdGVFeHByZXNzaW9uXzY1IiwiYXR0cl8yMTAiLCJhXzIxMSIsIlRoaXNFeHByZXNzaW9uXzY2IiwiYXR0cl8yMTIiLCJhXzIxMyIsIlVwZGF0ZUV4cHJlc3Npb25fNjciLCJhdHRyXzIxNCIsImFfMjE1IiwiWWllbGRFeHByZXNzaW9uXzY4IiwiYXR0cl8yMTYiLCJhXzIxNyIsIllpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbl82OSIsImF0dHJfMjE4IiwiYV8yMTkiLCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl83MCIsImF0dHJfMjIwIiwiYV8yMjEiLCJCbG9ja1N0YXRlbWVudF83MSIsImF0dHJfMjIyIiwiYV8yMjMiLCJCcmVha1N0YXRlbWVudF83MiIsImF0dHJfMjI0IiwiYV8yMjUiLCJDb250aW51ZVN0YXRlbWVudF83MyIsImF0dHJfMjI2IiwiYV8yMjciLCJDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzc0IiwiYXR0cl8yMjgiLCJhXzIyOSIsIkRlYnVnZ2VyU3RhdGVtZW50Xzc1IiwiYXR0cl8yMzAiLCJhXzIzMSIsIkRvV2hpbGVTdGF0ZW1lbnRfNzYiLCJhdHRyXzIzMiIsImFfMjMzIiwiRW1wdHlTdGF0ZW1lbnRfNzciLCJhdHRyXzIzNCIsImFfMjM1IiwiRXhwcmVzc2lvblN0YXRlbWVudF83OCIsImF0dHJfMjM2IiwiYV8yMzciLCJGb3JJblN0YXRlbWVudF83OSIsImF0dHJfMjM4IiwiYV8yMzkiLCJGb3JPZlN0YXRlbWVudF84MCIsImF0dHJfMjQwIiwiYV8yNDEiLCJGb3JTdGF0ZW1lbnRfODEiLCJhdHRyXzI0MiIsImFfMjQzIiwiSWZTdGF0ZW1lbnRfODIiLCJhdHRyXzI0NCIsImFfMjQ1IiwiTGFiZWxlZFN0YXRlbWVudF84MyIsImF0dHJfMjQ2IiwiYV8yNDciLCJSZXR1cm5TdGF0ZW1lbnRfODQiLCJhdHRyXzI0OCIsImFfMjQ5IiwiU3dpdGNoU3RhdGVtZW50Xzg1IiwiYXR0cl8yNTAiLCJhXzI1MSIsIlN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0Xzg2IiwiYXR0cl8yNTIiLCJhXzI1MyIsIlRocm93U3RhdGVtZW50Xzg3IiwiYXR0cl8yNTQiLCJhXzI1NSIsIlRyeUNhdGNoU3RhdGVtZW50Xzg4IiwiYXR0cl8yNTYiLCJhXzI1NyIsIlRyeUZpbmFsbHlTdGF0ZW1lbnRfODkiLCJhdHRyXzI1OCIsImFfMjU5IiwiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudF85MCIsImF0dHJfMjYwIiwiYV8yNjEiLCJXaXRoU3RhdGVtZW50XzkxIiwiYXR0cl8yNjIiLCJhXzI2MyIsIldoaWxlU3RhdGVtZW50XzkyIiwiYXR0cl8yNjQiLCJhXzI2NSIsIlByYWdtYV85MyIsImF0dHJfMjY2IiwiYV8yNjciLCJCbG9ja185NCIsImF0dHJfMjY4IiwiYV8yNjkiLCJDYXRjaENsYXVzZV85NSIsImF0dHJfMjcwIiwiYV8yNzEiLCJEaXJlY3RpdmVfOTYiLCJhdHRyXzI3MiIsImFfMjczIiwiRm9ybWFsUGFyYW1ldGVyc185NyIsImF0dHJfMjc0IiwiYV8yNzUiLCJGdW5jdGlvbkJvZHlfOTgiLCJhdHRyXzI3NiIsImFfMjc3IiwiRnVuY3Rpb25EZWNsYXJhdGlvbl85OSIsImF0dHJfMjc4IiwiYV8yNzkiLCJTY3JpcHRfMTAwIiwiYXR0cl8yODAiLCJhXzI4MSIsIlNwcmVhZEVsZW1lbnRfMTAxIiwiYXR0cl8yODIiLCJhXzI4MyIsIlN1cGVyXzEwMiIsImF0dHJfMjg0IiwiYV8yODUiLCJTd2l0Y2hDYXNlXzEwMyIsImF0dHJfMjg2IiwiYV8yODciLCJTd2l0Y2hEZWZhdWx0XzEwNCIsImF0dHJfMjg4IiwiYV8yODkiLCJUZW1wbGF0ZUVsZW1lbnRfMTA1IiwiYXR0cl8yOTAiLCJhXzI5MSIsIlN5bnRheFRlbXBsYXRlXzEwNiIsImF0dHJfMjkyIiwiYV8yOTMiLCJTeW50YXhRdW90ZV8xMDciLCJhdHRyXzI5NCIsImFfMjk1IiwiVmFyaWFibGVEZWNsYXJhdGlvbl8xMDgiLCJhdHRyXzI5NiIsImFfMjk3IiwiVmFyaWFibGVEZWNsYXJhdG9yXzEwOSIsImF0dHJfMjk4IiwiYV8yOTkiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsTUFBTUEsVUFBVUMsT0FBT0MsTUFBUCxDQUFjRCxPQUFPRSxTQUFyQixFQUFnQyxFQUFDQyxhQUFhLEVBQUNDLE9BQU8sRUFBUixFQUFZQyxVQUFVLEtBQXRCLEVBQTZCQyxjQUFjLEtBQTNDLEVBQWtEQyxZQUFZLEtBQTlELEVBQWQsRUFBb0ZDLFdBQVcsRUFBQ0osT0FBTyxFQUFSLEVBQVlDLFVBQVUsS0FBdEIsRUFBNkJDLGNBQWMsS0FBM0MsRUFBa0RDLFlBQVksS0FBOUQsRUFBL0YsRUFBcUtFLGNBQWMsRUFBQ0wsT0FBTyxJQUFJTSxHQUFKLEVBQVIsRUFBaUJMLFVBQVUsS0FBM0IsRUFBa0NDLGNBQWMsS0FBaEQsRUFBdURDLFlBQVksS0FBbkUsRUFBbkwsRUFBOFBJLGVB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TSxLQUFQLEVBQWhDLEVBQUQsRUFBaUQsRUFBQ0gsVUFBVSxNQUFYLEVBQW1CRSxVQUFVLEVBQUNDLE1BQU0sS0FBUCxFQUE3QixFQUFqRCxDQUFSLEVBQXVHcEIsVUFBVSxLQUFqSCxFQUF3SEMsY0FBYyxLQUF0SSxFQUE2SUMsWUFBWSxLQUF6SixFQUFkLEVBQStLQyxXQUFXLEVBQUNKLE9BQU8sRUFBUixFQUFZQyxVQUFVLEtBQXRCLEVBQTZCQyxjQUFjLEtBQTNDLEVBQWtEQyxZQUFZLEtBQTlELEVBQTFMLEVBQWdRVSxlQUFlLEVBQUNiLE9BQU8sWUFBWTtBQUN2VixhQUFPTCxRQUFRa0IsYUFBUixHQUF3QlMsTUFBeEIsQ0FBK0IsS0FBS3ZCLFdBQXBDLENBQVA7QUFDRCxLQUZvVSxFQUVsVUUsVUFBVSxLQUZ3VCxFQUVqVEMsY0FBYyxLQUZtUyxFQUU1UkMsWUFBWSxJQUZnUixFQUEvUSxFQUVNVyxjQUFjLEVBQUNkLE9BQU8sVUFBVTZTLFFBQVYsRUFBb0I7QUFDcEcsYUFBTyxLQUFLaFMsYUFBTCxHQUFxQkcsSUFBckIsQ0FBMEI4UixTQUFTQSxNQUFNNVIsUUFBTixLQUFtQjJSLFFBQXRELENBQVA7QUFDRCxLQUZ5RSxFQUV2RTVTLFVBQVUsS0FGNkQsRUFFdERDLGNBQWMsS0FGd0MsRUFFakNDLFlBQVksSUFGcUIsRUFGcEIsRUFBdkIsQ0FBL0I7QUFLQVIsUUFBUVMsU0FBUixDQUFrQnFCLElBQWxCLENBQXVCbVIsc0JBQXZCO0FBQ0FqVCxRQUFRVSxZQUFSLENBQXFCcUIsR0FBckIsQ0FBeUIsb0JBQXpCLEVBQStDa1Isc0JBQS9DO2tCQUNlalQsTyIsImZpbGUiOiJ0ZXJtLXNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBUZXJtXzE2ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QucHJvdG90eXBlLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfZGVzY2VuZGFudHM6IHt2YWx1ZTogbmV3IE1hcCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGhhc0Rlc2NlbmRhbnQ6IHt2YWx1ZTogZnVuY3Rpb24gKG5hbWVfMTEwKSB7XG4gIHJldHVybiB0aGlzLl9kZXNjZW5kYW50cy5oYXMobmFtZV8xMTApO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgZ2V0RGVzY2VuZGFudDoge3ZhbHVlOiBmdW5jdGlvbiAobmFtZV8xMTEpIHtcbiAgcmV0dXJuIHRoaXMuX2Rlc2NlbmRhbnRzLmdldChuYW1lXzExMSk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXM7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTEyKSB7XG4gIHJldHVybiB0aGlzLl9hdHRyaWJ1dGVzLnNvbWUoYV8xMTMgPT4gYV8xMTMuYXR0ck5hbWUgPT09IGF0dHJfMTEyKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbmNvbnN0IEJpbmRpbmdXaXRoRGVmYXVsdF8xNyA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiYmluZGluZ1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImluaXRcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTE0KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTE1ID0+IGFfMTE1LmF0dHJOYW1lID09PSBhdHRyXzExNCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKEJpbmRpbmdXaXRoRGVmYXVsdF8xNyk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJCaW5kaW5nV2l0aERlZmF1bHRcIiwgQmluZGluZ1dpdGhEZWZhdWx0XzE3KTtcbmNvbnN0IEJpbmRpbmdJZGVudGlmaWVyXzE4ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJuYW1lXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzExNikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzExNyA9PiBhXzExNy5hdHRyTmFtZSA9PT0gYXR0cl8xMTYpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChCaW5kaW5nSWRlbnRpZmllcl8xOCk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJCaW5kaW5nSWRlbnRpZmllclwiLCBCaW5kaW5nSWRlbnRpZmllcl8xOCk7XG5jb25zdCBBcnJheUJpbmRpbmdfMTkgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImVsZW1lbnRzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwicmVzdEVsZW1lbnRcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTE4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTE5ID0+IGFfMTE5LmF0dHJOYW1lID09PSBhdHRyXzExOCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKEFycmF5QmluZGluZ18xOSk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJBcnJheUJpbmRpbmdcIiwgQXJyYXlCaW5kaW5nXzE5KTtcbmNvbnN0IE9iamVjdEJpbmRpbmdfMjAgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcInByb3BlcnRpZXNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTIwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTIxID0+IGFfMTIxLmF0dHJOYW1lID09PSBhdHRyXzEyMCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKE9iamVjdEJpbmRpbmdfMjApO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiT2JqZWN0QmluZGluZ1wiLCBPYmplY3RCaW5kaW5nXzIwKTtcbmNvbnN0IEJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJfMjEgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImJpbmRpbmdcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJpbml0XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzEyMikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzEyMyA9PiBhXzEyMy5hdHRyTmFtZSA9PT0gYXR0cl8xMjIpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXzIxKTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJcIiwgQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcl8yMSk7XG5jb25zdCBCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eV8yMiA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwibmFtZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImJpbmRpbmdcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTI0KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTI1ID0+IGFfMTI1LmF0dHJOYW1lID09PSBhdHRyXzEyNCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKEJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzIyKTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XCIsIEJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzIyKTtcbmNvbnN0IFN0YXRlbWVudF8yMyA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTI2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTI3ID0+IGFfMTI3LmF0dHJOYW1lID09PSBhdHRyXzEyNik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKFN0YXRlbWVudF8yMyk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJTdGF0ZW1lbnRcIiwgU3RhdGVtZW50XzIzKTtcbmNvbnN0IEV4cHJlc3Npb25fMjQgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzEyOCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzEyOSA9PiBhXzEyOS5hdHRyTmFtZSA9PT0gYXR0cl8xMjgpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChFeHByZXNzaW9uXzI0KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkV4cHJlc3Npb25cIiwgRXhwcmVzc2lvbl8yNCk7XG5jb25zdCBDbGFzc0V4cHJlc3Npb25fMjUgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIm5hbWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJzdXBlclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImVsZW1lbnRzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzEzMCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzEzMSA9PiBhXzEzMS5hdHRyTmFtZSA9PT0gYXR0cl8xMzApO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChDbGFzc0V4cHJlc3Npb25fMjUpO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiQ2xhc3NFeHByZXNzaW9uXCIsIENsYXNzRXhwcmVzc2lvbl8yNSk7XG5jb25zdCBDbGFzc0RlY2xhcmF0aW9uXzI2ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMjMsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIm5hbWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJzdXBlclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImVsZW1lbnRzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTMyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTMzID0+IGFfMTMzLmF0dHJOYW1lID09PSBhdHRyXzEzMik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goQ2xhc3NEZWNsYXJhdGlvbl8yNik7XG5TdGF0ZW1lbnRfMjMuX2Rlc2NlbmRhbnRzLnNldChcIkNsYXNzRGVjbGFyYXRpb25cIiwgQ2xhc3NEZWNsYXJhdGlvbl8yNik7XG5jb25zdCBDbGFzc0VsZW1lbnRfMjcgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImlzU3RhdGljXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwibWV0aG9kXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzEzNCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzEzNSA9PiBhXzEzNS5hdHRyTmFtZSA9PT0gYXR0cl8xMzQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChDbGFzc0VsZW1lbnRfMjcpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiQ2xhc3NFbGVtZW50XCIsIENsYXNzRWxlbWVudF8yNyk7XG5jb25zdCBNb2R1bGVfMjggPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImRpcmVjdGl2ZXNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJpdGVtc1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xMzYpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xMzcgPT4gYV8xMzcuYXR0ck5hbWUgPT09IGF0dHJfMTM2KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goTW9kdWxlXzI4KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIk1vZHVsZVwiLCBNb2R1bGVfMjgpO1xuY29uc3QgSW1wb3J0XzI5ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJtb2R1bGVTcGVjaWZpZXJcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJkZWZhdWx0QmluZGluZ1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcIm5hbWVkSW1wb3J0c1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImZvclN5bnRheFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xMzgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xMzkgPT4gYV8xMzkuYXR0ck5hbWUgPT09IGF0dHJfMTM4KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goSW1wb3J0XzI5KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkltcG9ydFwiLCBJbXBvcnRfMjkpO1xuY29uc3QgSW1wb3J0TmFtZXNwYWNlXzMwID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJtb2R1bGVTcGVjaWZpZXJcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJkZWZhdWx0QmluZGluZ1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcIm5hbWVzcGFjZUJpbmRpbmdcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJmb3JTeW50YXhcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTQwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTQxID0+IGFfMTQxLmF0dHJOYW1lID09PSBhdHRyXzE0MCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKEltcG9ydE5hbWVzcGFjZV8zMCk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJJbXBvcnROYW1lc3BhY2VcIiwgSW1wb3J0TmFtZXNwYWNlXzMwKTtcbmNvbnN0IEltcG9ydFNwZWNpZmllcl8zMSA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwibmFtZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImJpbmRpbmdcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTQyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTQzID0+IGFfMTQzLmF0dHJOYW1lID09PSBhdHRyXzE0Mik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKEltcG9ydFNwZWNpZmllcl8zMSk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJJbXBvcnRTcGVjaWZpZXJcIiwgSW1wb3J0U3BlY2lmaWVyXzMxKTtcbmNvbnN0IEV4cG9ydEFsbEZyb21fMzIgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIm1vZHVsZVNwZWNpZmllclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xNDQpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xNDUgPT4gYV8xNDUuYXR0ck5hbWUgPT09IGF0dHJfMTQ0KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goRXhwb3J0QWxsRnJvbV8zMik7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJFeHBvcnRBbGxGcm9tXCIsIEV4cG9ydEFsbEZyb21fMzIpO1xuY29uc3QgRXhwb3J0RnJvbV8zMyA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwibmFtZWRFeHBvcnRzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwibW9kdWxlU3BlY2lmaWVyXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE0Nikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE0NyA9PiBhXzE0Ny5hdHRyTmFtZSA9PT0gYXR0cl8xNDYpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChFeHBvcnRGcm9tXzMzKTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkV4cG9ydEZyb21cIiwgRXhwb3J0RnJvbV8zMyk7XG5jb25zdCBFeHBvcnRfMzQgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImRlY2xhcmF0aW9uXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE0OCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE0OSA9PiBhXzE0OS5hdHRyTmFtZSA9PT0gYXR0cl8xNDgpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChFeHBvcnRfMzQpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiRXhwb3J0XCIsIEV4cG9ydF8zNCk7XG5jb25zdCBFeHBvcnREZWZhdWx0XzM1ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJib2R5XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE1MCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE1MSA9PiBhXzE1MS5hdHRyTmFtZSA9PT0gYXR0cl8xNTApO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChFeHBvcnREZWZhdWx0XzM1KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkV4cG9ydERlZmF1bHRcIiwgRXhwb3J0RGVmYXVsdF8zNSk7XG5jb25zdCBFeHBvcnRTcGVjaWZpZXJfMzYgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIm5hbWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJleHBvcnRlZE5hbWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTUyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTUzID0+IGFfMTUzLmF0dHJOYW1lID09PSBhdHRyXzE1Mik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKEV4cG9ydFNwZWNpZmllcl8zNik7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJFeHBvcnRTcGVjaWZpZXJcIiwgRXhwb3J0U3BlY2lmaWVyXzM2KTtcbmNvbnN0IE1ldGhvZF8zNyA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwibmFtZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImJvZHlcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJpc0dlbmVyYXRvclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcInBhcmFtc1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xNTQpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xNTUgPT4gYV8xNTUuYXR0ck5hbWUgPT09IGF0dHJfMTU0KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goTWV0aG9kXzM3KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIk1ldGhvZFwiLCBNZXRob2RfMzcpO1xuY29uc3QgR2V0dGVyXzM4ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJuYW1lXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiYm9keVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xNTYpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xNTcgPT4gYV8xNTcuYXR0ck5hbWUgPT09IGF0dHJfMTU2KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goR2V0dGVyXzM4KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkdldHRlclwiLCBHZXR0ZXJfMzgpO1xuY29uc3QgU2V0dGVyXzM5ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJuYW1lXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiYm9keVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcInBhcmFtXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE1OCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE1OSA9PiBhXzE1OS5hdHRyTmFtZSA9PT0gYXR0cl8xNTgpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChTZXR0ZXJfMzkpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU2V0dGVyXCIsIFNldHRlcl8zOSk7XG5jb25zdCBEYXRhUHJvcGVydHlfNDAgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIm5hbWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJleHByZXNzaW9uXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE2MCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE2MSA9PiBhXzE2MS5hdHRyTmFtZSA9PT0gYXR0cl8xNjApO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChEYXRhUHJvcGVydHlfNDApO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiRGF0YVByb3BlcnR5XCIsIERhdGFQcm9wZXJ0eV80MCk7XG5jb25zdCBTaG9ydGhhbmRQcm9wZXJ0eV80MSA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwibmFtZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xNjIpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xNjMgPT4gYV8xNjMuYXR0ck5hbWUgPT09IGF0dHJfMTYyKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goU2hvcnRoYW5kUHJvcGVydHlfNDEpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU2hvcnRoYW5kUHJvcGVydHlcIiwgU2hvcnRoYW5kUHJvcGVydHlfNDEpO1xuY29uc3QgU3RhdGljUHJvcGVydHlOYW1lXzQyID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJ2YWx1ZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xNjQpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xNjUgPT4gYV8xNjUuYXR0ck5hbWUgPT09IGF0dHJfMTY0KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goU3RhdGljUHJvcGVydHlOYW1lXzQyKTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIlN0YXRpY1Byb3BlcnR5TmFtZVwiLCBTdGF0aWNQcm9wZXJ0eU5hbWVfNDIpO1xuY29uc3QgQ29tcHV0ZWRQcm9wZXJ0eU5hbWVfNDMgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImV4cHJlc3Npb25cIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTY2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTY3ID0+IGFfMTY3LmF0dHJOYW1lID09PSBhdHRyXzE2Nik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKENvbXB1dGVkUHJvcGVydHlOYW1lXzQzKTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkNvbXB1dGVkUHJvcGVydHlOYW1lXCIsIENvbXB1dGVkUHJvcGVydHlOYW1lXzQzKTtcbmNvbnN0IExpdGVyYWxCb29sZWFuRXhwcmVzc2lvbl80NCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwidmFsdWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTY4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTY5ID0+IGFfMTY5LmF0dHJOYW1lID09PSBhdHRyXzE2OCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKExpdGVyYWxCb29sZWFuRXhwcmVzc2lvbl80NCk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIiwgTGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uXzQ0KTtcbmNvbnN0IExpdGVyYWxJbmZpbml0eUV4cHJlc3Npb25fNDUgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE3MCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE3MSA9PiBhXzE3MS5hdHRyTmFtZSA9PT0gYXR0cl8xNzApO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uXzQ1KTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIkxpdGVyYWxJbmZpbml0eUV4cHJlc3Npb25cIiwgTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbl80NSk7XG5jb25zdCBMaXRlcmFsTnVsbEV4cHJlc3Npb25fNDYgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE3Mikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE3MyA9PiBhXzE3My5hdHRyTmFtZSA9PT0gYXR0cl8xNzIpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChMaXRlcmFsTnVsbEV4cHJlc3Npb25fNDYpO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiTGl0ZXJhbE51bGxFeHByZXNzaW9uXCIsIExpdGVyYWxOdWxsRXhwcmVzc2lvbl80Nik7XG5jb25zdCBMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb25fNDcgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcInZhbHVlXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE3NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE3NSA9PiBhXzE3NS5hdHRyTmFtZSA9PT0gYXR0cl8xNzQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb25fNDcpO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uXCIsIExpdGVyYWxOdW1lcmljRXhwcmVzc2lvbl80Nyk7XG5jb25zdCBMaXRlcmFsUmVnRXhwRXhwcmVzc2lvbl80OCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwicGF0dGVyblwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImZsYWdzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE3Nikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE3NyA9PiBhXzE3Ny5hdHRyTmFtZSA9PT0gYXR0cl8xNzYpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChMaXRlcmFsUmVnRXhwRXhwcmVzc2lvbl80OCk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJMaXRlcmFsUmVnRXhwRXhwcmVzc2lvblwiLCBMaXRlcmFsUmVnRXhwRXhwcmVzc2lvbl80OCk7XG5jb25zdCBMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbl80OSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwidmFsdWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTc4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTc5ID0+IGFfMTc5LmF0dHJOYW1lID09PSBhdHRyXzE3OCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKExpdGVyYWxTdHJpbmdFeHByZXNzaW9uXzQ5KTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCIsIExpdGVyYWxTdHJpbmdFeHByZXNzaW9uXzQ5KTtcbmNvbnN0IEFycmF5RXhwcmVzc2lvbl81MCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiZWxlbWVudHNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTgwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTgxID0+IGFfMTgxLmF0dHJOYW1lID09PSBhdHRyXzE4MCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKEFycmF5RXhwcmVzc2lvbl81MCk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJBcnJheUV4cHJlc3Npb25cIiwgQXJyYXlFeHByZXNzaW9uXzUwKTtcbmNvbnN0IEFycm93RXhwcmVzc2lvbl81MSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwicGFyYW1zXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiYm9keVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEV4cHJlc3Npb25fMjQuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xODIpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xODMgPT4gYV8xODMuYXR0ck5hbWUgPT09IGF0dHJfMTgyKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkV4cHJlc3Npb25fMjQuX2NoaWxkcmVuLnB1c2goQXJyb3dFeHByZXNzaW9uXzUxKTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIkFycm93RXhwcmVzc2lvblwiLCBBcnJvd0V4cHJlc3Npb25fNTEpO1xuY29uc3QgQXNzaWdubWVudEV4cHJlc3Npb25fNTIgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImJpbmRpbmdcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJleHByZXNzaW9uXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE4NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE4NSA9PiBhXzE4NS5hdHRyTmFtZSA9PT0gYXR0cl8xODQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChBc3NpZ25tZW50RXhwcmVzc2lvbl81Mik7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLCBBc3NpZ25tZW50RXhwcmVzc2lvbl81Mik7XG5jb25zdCBCaW5hcnlFeHByZXNzaW9uXzUzID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzI0LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJvcGVyYXRvclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImxlZnRcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJyaWdodFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEV4cHJlc3Npb25fMjQuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xODYpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xODcgPT4gYV8xODcuYXR0ck5hbWUgPT09IGF0dHJfMTg2KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkV4cHJlc3Npb25fMjQuX2NoaWxkcmVuLnB1c2goQmluYXJ5RXhwcmVzc2lvbl81Myk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJCaW5hcnlFeHByZXNzaW9uXCIsIEJpbmFyeUV4cHJlc3Npb25fNTMpO1xuY29uc3QgQ2FsbEV4cHJlc3Npb25fNTQgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImNhbGxlZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImFyZ3VtZW50c1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEV4cHJlc3Npb25fMjQuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xODgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xODkgPT4gYV8xODkuYXR0ck5hbWUgPT09IGF0dHJfMTg4KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkV4cHJlc3Npb25fMjQuX2NoaWxkcmVuLnB1c2goQ2FsbEV4cHJlc3Npb25fNTQpO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiQ2FsbEV4cHJlc3Npb25cIiwgQ2FsbEV4cHJlc3Npb25fNTQpO1xuY29uc3QgQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbl81NSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwib3BlcmF0b3JcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJiaW5kaW5nXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiZXhwcmVzc2lvblwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEV4cHJlc3Npb25fMjQuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8xOTApIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8xOTEgPT4gYV8xOTEuYXR0ck5hbWUgPT09IGF0dHJfMTkwKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkV4cHJlc3Npb25fMjQuX2NoaWxkcmVuLnB1c2goQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbl81NSk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJDb21wdXRlZEFzc2lnbm1lbnRFeHByZXNzaW9uXCIsIENvbXB1dGVkQXNzaWdubWVudEV4cHJlc3Npb25fNTUpO1xuY29uc3QgQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXzU2ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzI0LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJvYmplY3RcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJleHByZXNzaW9uXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE5Mikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE5MyA9PiBhXzE5My5hdHRyTmFtZSA9PT0gYXR0cl8xOTIpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChDb21wdXRlZE1lbWJlckV4cHJlc3Npb25fNTYpO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXCIsIENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbl81Nik7XG5jb25zdCBDb25kaXRpb25hbEV4cHJlc3Npb25fNTcgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcInRlc3RcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJjb25zZXF1ZW50XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiYWx0ZXJuYXRlXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE5NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE5NSA9PiBhXzE5NS5hdHRyTmFtZSA9PT0gYXR0cl8xOTQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChDb25kaXRpb25hbEV4cHJlc3Npb25fNTcpO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsIENvbmRpdGlvbmFsRXhwcmVzc2lvbl81Nyk7XG5jb25zdCBGdW5jdGlvbkV4cHJlc3Npb25fNTggPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIm5hbWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJpc0dlbmVyYXRvclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcInBhcmFtc1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImJvZHlcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMTk2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMTk3ID0+IGFfMTk3LmF0dHJOYW1lID09PSBhdHRyXzE5Nik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKEZ1bmN0aW9uRXhwcmVzc2lvbl81OCk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJGdW5jdGlvbkV4cHJlc3Npb25cIiwgRnVuY3Rpb25FeHByZXNzaW9uXzU4KTtcbmNvbnN0IElkZW50aWZpZXJFeHByZXNzaW9uXzU5ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzI0LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJuYW1lXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzE5OCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzE5OSA9PiBhXzE5OS5hdHRyTmFtZSA9PT0gYXR0cl8xOTgpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChJZGVudGlmaWVyRXhwcmVzc2lvbl81OSk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCBJZGVudGlmaWVyRXhwcmVzc2lvbl81OSk7XG5jb25zdCBOZXdFeHByZXNzaW9uXzYwID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzI0LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJjYWxsZWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJhcmd1bWVudHNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjAwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjAxID0+IGFfMjAxLmF0dHJOYW1lID09PSBhdHRyXzIwMCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKE5ld0V4cHJlc3Npb25fNjApO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiTmV3RXhwcmVzc2lvblwiLCBOZXdFeHByZXNzaW9uXzYwKTtcbmNvbnN0IE5ld1RhcmdldEV4cHJlc3Npb25fNjEgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzIwMikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzIwMyA9PiBhXzIwMy5hdHRyTmFtZSA9PT0gYXR0cl8yMDIpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChOZXdUYXJnZXRFeHByZXNzaW9uXzYxKTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIk5ld1RhcmdldEV4cHJlc3Npb25cIiwgTmV3VGFyZ2V0RXhwcmVzc2lvbl82MSk7XG5jb25zdCBPYmplY3RFeHByZXNzaW9uXzYyID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzI0LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJwcm9wZXJ0aWVzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzIwNCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzIwNSA9PiBhXzIwNS5hdHRyTmFtZSA9PT0gYXR0cl8yMDQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChPYmplY3RFeHByZXNzaW9uXzYyKTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIk9iamVjdEV4cHJlc3Npb25cIiwgT2JqZWN0RXhwcmVzc2lvbl82Mik7XG5jb25zdCBVbmFyeUV4cHJlc3Npb25fNjMgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIm9wZXJhdG9yXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwib3BlcmFuZFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEV4cHJlc3Npb25fMjQuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yMDYpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yMDcgPT4gYV8yMDcuYXR0ck5hbWUgPT09IGF0dHJfMjA2KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkV4cHJlc3Npb25fMjQuX2NoaWxkcmVuLnB1c2goVW5hcnlFeHByZXNzaW9uXzYzKTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIlVuYXJ5RXhwcmVzc2lvblwiLCBVbmFyeUV4cHJlc3Npb25fNjMpO1xuY29uc3QgU3RhdGljTWVtYmVyRXhwcmVzc2lvbl82NCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwib2JqZWN0XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwicHJvcGVydHlcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjA4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjA5ID0+IGFfMjA5LmF0dHJOYW1lID09PSBhdHRyXzIwOCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKFN0YXRpY01lbWJlckV4cHJlc3Npb25fNjQpO1xuRXhwcmVzc2lvbl8yNC5fZGVzY2VuZGFudHMuc2V0KFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCBTdGF0aWNNZW1iZXJFeHByZXNzaW9uXzY0KTtcbmNvbnN0IFRlbXBsYXRlRXhwcmVzc2lvbl82NSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwidGFnXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiZWxlbWVudHNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjEwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjExID0+IGFfMjExLmF0dHJOYW1lID09PSBhdHRyXzIxMCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKFRlbXBsYXRlRXhwcmVzc2lvbl82NSk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiwgVGVtcGxhdGVFeHByZXNzaW9uXzY1KTtcbmNvbnN0IFRoaXNFeHByZXNzaW9uXzY2ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzI0LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJzdHhcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjEyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjEzID0+IGFfMjEzLmF0dHJOYW1lID09PSBhdHRyXzIxMik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKFRoaXNFeHByZXNzaW9uXzY2KTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIlRoaXNFeHByZXNzaW9uXCIsIFRoaXNFeHByZXNzaW9uXzY2KTtcbmNvbnN0IFVwZGF0ZUV4cHJlc3Npb25fNjcgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImlzUHJlZml4XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwib3BlcmF0b3JcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJvcGVyYW5kXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzIxNCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzIxNSA9PiBhXzIxNS5hdHRyTmFtZSA9PT0gYXR0cl8yMTQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChVcGRhdGVFeHByZXNzaW9uXzY3KTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIlVwZGF0ZUV4cHJlc3Npb25cIiwgVXBkYXRlRXhwcmVzc2lvbl82Nyk7XG5jb25zdCBZaWVsZEV4cHJlc3Npb25fNjggPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImV4cHJlc3Npb25cIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBFeHByZXNzaW9uXzI0LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjE2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjE3ID0+IGFfMjE3LmF0dHJOYW1lID09PSBhdHRyXzIxNik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHByZXNzaW9uXzI0Ll9jaGlsZHJlbi5wdXNoKFlpZWxkRXhwcmVzc2lvbl82OCk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJZaWVsZEV4cHJlc3Npb25cIiwgWWllbGRFeHByZXNzaW9uXzY4KTtcbmNvbnN0IFlpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbl82OSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8yNCwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiZXhwcmVzc2lvblwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEV4cHJlc3Npb25fMjQuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yMTgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yMTkgPT4gYV8yMTkuYXR0ck5hbWUgPT09IGF0dHJfMjE4KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkV4cHJlc3Npb25fMjQuX2NoaWxkcmVuLnB1c2goWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXzY5KTtcbkV4cHJlc3Npb25fMjQuX2Rlc2NlbmRhbnRzLnNldChcIllpZWxkR2VuZXJhdG9yRXhwcmVzc2lvblwiLCBZaWVsZEdlbmVyYXRvckV4cHJlc3Npb25fNjkpO1xuY29uc3QgUGFyZW50aGVzaXplZEV4cHJlc3Npb25fNzAgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMjQsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImlubmVyXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXhwcmVzc2lvbl8yNC5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzIyMCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzIyMSA9PiBhXzIyMS5hdHRyTmFtZSA9PT0gYXR0cl8yMjApO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8yNC5fY2hpbGRyZW4ucHVzaChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl83MCk7XG5FeHByZXNzaW9uXzI0Ll9kZXNjZW5kYW50cy5zZXQoXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiLCBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl83MCk7XG5jb25zdCBCbG9ja1N0YXRlbWVudF83MSA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJibG9ja1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzIyMikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzIyMyA9PiBhXzIyMy5hdHRyTmFtZSA9PT0gYXR0cl8yMjIpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKEJsb2NrU3RhdGVtZW50XzcxKTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiQmxvY2tTdGF0ZW1lbnRcIiwgQmxvY2tTdGF0ZW1lbnRfNzEpO1xuY29uc3QgQnJlYWtTdGF0ZW1lbnRfNzIgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8yMywge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwibGFiZWxcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBTdGF0ZW1lbnRfMjMuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yMjQpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yMjUgPT4gYV8yMjUuYXR0ck5hbWUgPT09IGF0dHJfMjI0KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN0YXRlbWVudF8yMy5fY2hpbGRyZW4ucHVzaChCcmVha1N0YXRlbWVudF83Mik7XG5TdGF0ZW1lbnRfMjMuX2Rlc2NlbmRhbnRzLnNldChcIkJyZWFrU3RhdGVtZW50XCIsIEJyZWFrU3RhdGVtZW50XzcyKTtcbmNvbnN0IENvbnRpbnVlU3RhdGVtZW50XzczID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMjMsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImxhYmVsXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjI2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjI3ID0+IGFfMjI3LmF0dHJOYW1lID09PSBhdHRyXzIyNik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goQ29udGludWVTdGF0ZW1lbnRfNzMpO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJDb250aW51ZVN0YXRlbWVudFwiLCBDb250aW51ZVN0YXRlbWVudF83Myk7XG5jb25zdCBDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzc0ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMjMsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImJpbmRpbmdcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJvcGVyYXRvclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImV4cHJlc3Npb25cIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBTdGF0ZW1lbnRfMjMuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yMjgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yMjkgPT4gYV8yMjkuYXR0ck5hbWUgPT09IGF0dHJfMjI4KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN0YXRlbWVudF8yMy5fY2hpbGRyZW4ucHVzaChDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzc0KTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvblwiLCBDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzc0KTtcbmNvbnN0IERlYnVnZ2VyU3RhdGVtZW50Xzc1ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMjMsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjMwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjMxID0+IGFfMjMxLmF0dHJOYW1lID09PSBhdHRyXzIzMCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goRGVidWdnZXJTdGF0ZW1lbnRfNzUpO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJEZWJ1Z2dlclN0YXRlbWVudFwiLCBEZWJ1Z2dlclN0YXRlbWVudF83NSk7XG5jb25zdCBEb1doaWxlU3RhdGVtZW50Xzc2ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMjMsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcInRlc3RcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJib2R5XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjMyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjMzID0+IGFfMjMzLmF0dHJOYW1lID09PSBhdHRyXzIzMik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goRG9XaGlsZVN0YXRlbWVudF83Nik7XG5TdGF0ZW1lbnRfMjMuX2Rlc2NlbmRhbnRzLnNldChcIkRvV2hpbGVTdGF0ZW1lbnRcIiwgRG9XaGlsZVN0YXRlbWVudF83Nik7XG5jb25zdCBFbXB0eVN0YXRlbWVudF83NyA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzIzNCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzIzNSA9PiBhXzIzNS5hdHRyTmFtZSA9PT0gYXR0cl8yMzQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKEVtcHR5U3RhdGVtZW50Xzc3KTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiRW1wdHlTdGF0ZW1lbnRcIiwgRW1wdHlTdGF0ZW1lbnRfNzcpO1xuY29uc3QgRXhwcmVzc2lvblN0YXRlbWVudF83OCA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJleHByZXNzaW9uXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjM2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjM3ID0+IGFfMjM3LmF0dHJOYW1lID09PSBhdHRyXzIzNik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goRXhwcmVzc2lvblN0YXRlbWVudF83OCk7XG5TdGF0ZW1lbnRfMjMuX2Rlc2NlbmRhbnRzLnNldChcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwgRXhwcmVzc2lvblN0YXRlbWVudF83OCk7XG5jb25zdCBGb3JJblN0YXRlbWVudF83OSA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJsZWZ0XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwicmlnaHRcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJib2R5XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjM4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjM5ID0+IGFfMjM5LmF0dHJOYW1lID09PSBhdHRyXzIzOCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goRm9ySW5TdGF0ZW1lbnRfNzkpO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJGb3JJblN0YXRlbWVudFwiLCBGb3JJblN0YXRlbWVudF83OSk7XG5jb25zdCBGb3JPZlN0YXRlbWVudF84MCA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJsZWZ0XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwicmlnaHRcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJib2R5XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjQwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjQxID0+IGFfMjQxLmF0dHJOYW1lID09PSBhdHRyXzI0MCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goRm9yT2ZTdGF0ZW1lbnRfODApO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJGb3JPZlN0YXRlbWVudFwiLCBGb3JPZlN0YXRlbWVudF84MCk7XG5jb25zdCBGb3JTdGF0ZW1lbnRfODEgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8yMywge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiaW5pdFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcInRlc3RcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJ1cGRhdGVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJib2R5XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjQyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjQzID0+IGFfMjQzLmF0dHJOYW1lID09PSBhdHRyXzI0Mik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goRm9yU3RhdGVtZW50XzgxKTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiRm9yU3RhdGVtZW50XCIsIEZvclN0YXRlbWVudF84MSk7XG5jb25zdCBJZlN0YXRlbWVudF84MiA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJ0ZXN0XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiY29uc2VxdWVudFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImFsdGVybmF0ZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI0NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI0NSA9PiBhXzI0NS5hdHRyTmFtZSA9PT0gYXR0cl8yNDQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKElmU3RhdGVtZW50XzgyKTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiSWZTdGF0ZW1lbnRcIiwgSWZTdGF0ZW1lbnRfODIpO1xuY29uc3QgTGFiZWxlZFN0YXRlbWVudF84MyA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJsYWJlbFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImJvZHlcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBTdGF0ZW1lbnRfMjMuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yNDYpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yNDcgPT4gYV8yNDcuYXR0ck5hbWUgPT09IGF0dHJfMjQ2KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN0YXRlbWVudF8yMy5fY2hpbGRyZW4ucHVzaChMYWJlbGVkU3RhdGVtZW50XzgzKTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiTGFiZWxlZFN0YXRlbWVudFwiLCBMYWJlbGVkU3RhdGVtZW50XzgzKTtcbmNvbnN0IFJldHVyblN0YXRlbWVudF84NCA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJleHByZXNzaW9uXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjQ4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjQ5ID0+IGFfMjQ5LmF0dHJOYW1lID09PSBhdHRyXzI0OCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goUmV0dXJuU3RhdGVtZW50Xzg0KTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiUmV0dXJuU3RhdGVtZW50XCIsIFJldHVyblN0YXRlbWVudF84NCk7XG5jb25zdCBTd2l0Y2hTdGF0ZW1lbnRfODUgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8yMywge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiZGlzY3JpbWluYW50XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiY2FzZXNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBTdGF0ZW1lbnRfMjMuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yNTApIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yNTEgPT4gYV8yNTEuYXR0ck5hbWUgPT09IGF0dHJfMjUwKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN0YXRlbWVudF8yMy5fY2hpbGRyZW4ucHVzaChTd2l0Y2hTdGF0ZW1lbnRfODUpO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJTd2l0Y2hTdGF0ZW1lbnRcIiwgU3dpdGNoU3RhdGVtZW50Xzg1KTtcbmNvbnN0IFN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0Xzg2ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMjMsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImRpc2NyaW1pbmFudFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcInByZURlZmF1bHRDYXNlc1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImRlZmF1bHRDYXNlXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwicG9zdERlZmF1bHRDYXNlc1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI1Mikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI1MyA9PiBhXzI1My5hdHRyTmFtZSA9PT0gYXR0cl8yNTIpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKFN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0Xzg2KTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRcIiwgU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRfODYpO1xuY29uc3QgVGhyb3dTdGF0ZW1lbnRfODcgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8yMywge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiZXhwcmVzc2lvblwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI1NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI1NSA9PiBhXzI1NS5hdHRyTmFtZSA9PT0gYXR0cl8yNTQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKFRocm93U3RhdGVtZW50Xzg3KTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiVGhyb3dTdGF0ZW1lbnRcIiwgVGhyb3dTdGF0ZW1lbnRfODcpO1xuY29uc3QgVHJ5Q2F0Y2hTdGF0ZW1lbnRfODggPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8yMywge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiYm9keVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImNhdGNoQ2xhdXNlXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjU2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjU3ID0+IGFfMjU3LmF0dHJOYW1lID09PSBhdHRyXzI1Nik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goVHJ5Q2F0Y2hTdGF0ZW1lbnRfODgpO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJUcnlDYXRjaFN0YXRlbWVudFwiLCBUcnlDYXRjaFN0YXRlbWVudF84OCk7XG5jb25zdCBUcnlGaW5hbGx5U3RhdGVtZW50Xzg5ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMjMsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcImJvZHlcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJjYXRjaENsYXVzZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImZpbmFsaXplclwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI1OCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI1OSA9PiBhXzI1OS5hdHRyTmFtZSA9PT0gYXR0cl8yNTgpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKFRyeUZpbmFsbHlTdGF0ZW1lbnRfODkpO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJUcnlGaW5hbGx5U3RhdGVtZW50XCIsIFRyeUZpbmFsbHlTdGF0ZW1lbnRfODkpO1xuY29uc3QgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudF85MCA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJkZWNsYXJhdGlvblwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI2MCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI2MSA9PiBhXzI2MS5hdHRyTmFtZSA9PT0gYXR0cl8yNjApO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfOTApO1xuU3RhdGVtZW50XzIzLl9kZXNjZW5kYW50cy5zZXQoXCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XCIsIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfOTApO1xuY29uc3QgV2l0aFN0YXRlbWVudF85MSA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJvYmplY3RcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJib2R5XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjYyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjYzID0+IGFfMjYzLmF0dHJOYW1lID09PSBhdHRyXzI2Mik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goV2l0aFN0YXRlbWVudF85MSk7XG5TdGF0ZW1lbnRfMjMuX2Rlc2NlbmRhbnRzLnNldChcIldpdGhTdGF0ZW1lbnRcIiwgV2l0aFN0YXRlbWVudF85MSk7XG5jb25zdCBXaGlsZVN0YXRlbWVudF85MiA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJ0ZXN0XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiYm9keVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFN0YXRlbWVudF8yMy5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI2NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI2NSA9PiBhXzI2NS5hdHRyTmFtZSA9PT0gYXR0cl8yNjQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3RhdGVtZW50XzIzLl9jaGlsZHJlbi5wdXNoKFdoaWxlU3RhdGVtZW50XzkyKTtcblN0YXRlbWVudF8yMy5fZGVzY2VuZGFudHMuc2V0KFwiV2hpbGVTdGF0ZW1lbnRcIiwgV2hpbGVTdGF0ZW1lbnRfOTIpO1xuY29uc3QgUHJhZ21hXzkzID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJraW5kXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiaXRlbXNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjY2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjY3ID0+IGFfMjY3LmF0dHJOYW1lID09PSBhdHRyXzI2Nik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKFByYWdtYV85Myk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJQcmFnbWFcIiwgUHJhZ21hXzkzKTtcbmNvbnN0IEJsb2NrXzk0ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJzdGF0ZW1lbnRzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI2OCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI2OSA9PiBhXzI2OS5hdHRyTmFtZSA9PT0gYXR0cl8yNjgpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChCbG9ja185NCk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJCbG9ja1wiLCBCbG9ja185NCk7XG5jb25zdCBDYXRjaENsYXVzZV85NSA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiYmluZGluZ1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImJvZHlcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjcwKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjcxID0+IGFfMjcxLmF0dHJOYW1lID09PSBhdHRyXzI3MCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKENhdGNoQ2xhdXNlXzk1KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkNhdGNoQ2xhdXNlXCIsIENhdGNoQ2xhdXNlXzk1KTtcbmNvbnN0IERpcmVjdGl2ZV85NiA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwicmF3VmFsdWVcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjcyKSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjczID0+IGFfMjczLmF0dHJOYW1lID09PSBhdHRyXzI3Mik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKERpcmVjdGl2ZV85Nik7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJEaXJlY3RpdmVcIiwgRGlyZWN0aXZlXzk2KTtcbmNvbnN0IEZvcm1hbFBhcmFtZXRlcnNfOTcgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcIml0ZW1zXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwicmVzdFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yNzQpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yNzUgPT4gYV8yNzUuYXR0ck5hbWUgPT09IGF0dHJfMjc0KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goRm9ybWFsUGFyYW1ldGVyc185Nyk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJGb3JtYWxQYXJhbWV0ZXJzXCIsIEZvcm1hbFBhcmFtZXRlcnNfOTcpO1xuY29uc3QgRnVuY3Rpb25Cb2R5Xzk4ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJkaXJlY3RpdmVzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwic3RhdGVtZW50c1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yNzYpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yNzcgPT4gYV8yNzcuYXR0ck5hbWUgPT09IGF0dHJfMjc2KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goRnVuY3Rpb25Cb2R5Xzk4KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIkZ1bmN0aW9uQm9keVwiLCBGdW5jdGlvbkJvZHlfOTgpO1xuY29uc3QgRnVuY3Rpb25EZWNsYXJhdGlvbl85OSA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzIzLCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJuYW1lXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiaXNHZW5lcmF0b3JcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJwYXJhbXNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX0sIHthdHRyTmFtZTogXCJib2R5XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU3RhdGVtZW50XzIzLmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjc4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjc5ID0+IGFfMjc5LmF0dHJOYW1lID09PSBhdHRyXzI3OCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdGF0ZW1lbnRfMjMuX2NoaWxkcmVuLnB1c2goRnVuY3Rpb25EZWNsYXJhdGlvbl85OSk7XG5TdGF0ZW1lbnRfMjMuX2Rlc2NlbmRhbnRzLnNldChcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiwgRnVuY3Rpb25EZWNsYXJhdGlvbl85OSk7XG5jb25zdCBTY3JpcHRfMTAwID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJkaXJlY3RpdmVzXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwic3RhdGVtZW50c1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yODApIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yODEgPT4gYV8yODEuYXR0ck5hbWUgPT09IGF0dHJfMjgwKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goU2NyaXB0XzEwMCk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJTY3JpcHRcIiwgU2NyaXB0XzEwMCk7XG5jb25zdCBTcHJlYWRFbGVtZW50XzEwMSA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiZXhwcmVzc2lvblwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yODIpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yODMgPT4gYV8yODMuYXR0ck5hbWUgPT09IGF0dHJfMjgyKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goU3ByZWFkRWxlbWVudF8xMDEpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU3ByZWFkRWxlbWVudFwiLCBTcHJlYWRFbGVtZW50XzEwMSk7XG5jb25zdCBTdXBlcl8xMDIgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI4NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI4NSA9PiBhXzI4NS5hdHRyTmFtZSA9PT0gYXR0cl8yODQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChTdXBlcl8xMDIpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU3VwZXJcIiwgU3VwZXJfMTAyKTtcbmNvbnN0IFN3aXRjaENhc2VfMTAzID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJ0ZXN0XCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiY29uc2VxdWVudFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yODYpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yODcgPT4gYV8yODcuYXR0ck5hbWUgPT09IGF0dHJfMjg2KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goU3dpdGNoQ2FzZV8xMDMpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU3dpdGNoQ2FzZVwiLCBTd2l0Y2hDYXNlXzEwMyk7XG5jb25zdCBTd2l0Y2hEZWZhdWx0XzEwNCA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiY29uc2VxdWVudFwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yODgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yODkgPT4gYV8yODkuYXR0ck5hbWUgPT09IGF0dHJfMjg4KTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goU3dpdGNoRGVmYXVsdF8xMDQpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU3dpdGNoRGVmYXVsdFwiLCBTd2l0Y2hEZWZhdWx0XzEwNCk7XG5jb25zdCBUZW1wbGF0ZUVsZW1lbnRfMTA1ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJyYXdWYWx1ZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fV0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBfY2hpbGRyZW46IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogZmFsc2V9LCBnZXRBdHRyaWJ1dGVzOiB7dmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFRlcm1fMTYuZ2V0QXR0cmlidXRlcygpLmNvbmNhdCh0aGlzLl9hdHRyaWJ1dGVzKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sIGhhc0F0dHJpYnV0ZToge3ZhbHVlOiBmdW5jdGlvbiAoYXR0cl8yOTApIHtcbiAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpLnNvbWUoYV8yOTEgPT4gYV8yOTEuYXR0ck5hbWUgPT09IGF0dHJfMjkwKTtcbn0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRlcm1fMTYuX2NoaWxkcmVuLnB1c2goVGVtcGxhdGVFbGVtZW50XzEwNSk7XG5UZXJtXzE2Ll9kZXNjZW5kYW50cy5zZXQoXCJUZW1wbGF0ZUVsZW1lbnRcIiwgVGVtcGxhdGVFbGVtZW50XzEwNSk7XG5jb25zdCBTeW50YXhUZW1wbGF0ZV8xMDYgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTYsIHtfYXR0cmlidXRlczoge3ZhbHVlOiBbe2F0dHJOYW1lOiBcInRlbXBsYXRlXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI5Mikge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI5MyA9PiBhXzI5My5hdHRyTmFtZSA9PT0gYXR0cl8yOTIpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChTeW50YXhUZW1wbGF0ZV8xMDYpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU3ludGF4VGVtcGxhdGVcIiwgU3ludGF4VGVtcGxhdGVfMTA2KTtcbmNvbnN0IFN5bnRheFF1b3RlXzEwNyA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwibmFtZVwiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcInRlbXBsYXRlXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19XSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIF9jaGlsZHJlbjoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiBmYWxzZX0sIGdldEF0dHJpYnV0ZXM6IHt2YWx1ZTogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gVGVybV8xNi5nZXRBdHRyaWJ1dGVzKCkuY29uY2F0KHRoaXMuX2F0dHJpYnV0ZXMpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfSwgaGFzQXR0cmlidXRlOiB7dmFsdWU6IGZ1bmN0aW9uIChhdHRyXzI5NCkge1xuICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCkuc29tZShhXzI5NSA9PiBhXzI5NS5hdHRyTmFtZSA9PT0gYXR0cl8yOTQpO1xufSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVybV8xNi5fY2hpbGRyZW4ucHVzaChTeW50YXhRdW90ZV8xMDcpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiU3ludGF4UXVvdGVcIiwgU3ludGF4UXVvdGVfMTA3KTtcbmNvbnN0IFZhcmlhYmxlRGVjbGFyYXRpb25fMTA4ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzE2LCB7X2F0dHJpYnV0ZXM6IHt2YWx1ZTogW3thdHRyTmFtZTogXCJraW5kXCIsIGF0dHJUeXBlOiB7bmFtZTogXCJhbnlcIn19LCB7YXR0ck5hbWU6IFwiZGVjbGFyYXRvcnNcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjk2KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjk3ID0+IGFfMjk3LmF0dHJOYW1lID09PSBhdHRyXzI5Nik7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKFZhcmlhYmxlRGVjbGFyYXRpb25fMTA4KTtcblRlcm1fMTYuX2Rlc2NlbmRhbnRzLnNldChcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiwgVmFyaWFibGVEZWNsYXJhdGlvbl8xMDgpO1xuY29uc3QgVmFyaWFibGVEZWNsYXJhdG9yXzEwOSA9IE9iamVjdC5jcmVhdGUoVGVybV8xNiwge19hdHRyaWJ1dGVzOiB7dmFsdWU6IFt7YXR0ck5hbWU6IFwiYmluZGluZ1wiLCBhdHRyVHlwZToge25hbWU6IFwiYW55XCJ9fSwge2F0dHJOYW1lOiBcImluaXRcIiwgYXR0clR5cGU6IHtuYW1lOiBcImFueVwifX1dLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgX2NoaWxkcmVuOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IGZhbHNlfSwgZ2V0QXR0cmlidXRlczoge3ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBUZXJtXzE2LmdldEF0dHJpYnV0ZXMoKS5jb25jYXQodGhpcy5fYXR0cmlidXRlcyk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBoYXNBdHRyaWJ1dGU6IHt2YWx1ZTogZnVuY3Rpb24gKGF0dHJfMjk4KSB7XG4gIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKS5zb21lKGFfMjk5ID0+IGFfMjk5LmF0dHJOYW1lID09PSBhdHRyXzI5OCk7XG59LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZXJtXzE2Ll9jaGlsZHJlbi5wdXNoKFZhcmlhYmxlRGVjbGFyYXRvcl8xMDkpO1xuVGVybV8xNi5fZGVzY2VuZGFudHMuc2V0KFwiVmFyaWFibGVEZWNsYXJhdG9yXCIsIFZhcmlhYmxlRGVjbGFyYXRvcl8xMDkpO1xuZXhwb3J0IGRlZmF1bHQgVGVybV8xNjtcbiJdfQ== /***/ }, -/* 19 */ +/* 12 */ /***/ function(module, exports, __webpack_require__) { - var R = __webpack_require__(17); - - // `f` is a function that takes two function arguments: `reject` (failure) and `resolve` (success) - function Future(f) { - if (!(this instanceof Future)) { - return new Future(f); - } - this._fork = f; - } - - Future.prototype.fork = function(reject, resolve) { - try { - this._fork(reject, resolve); - } catch(e) { - reject(e); - } - }; - - // functor - Future.prototype.map = function(f) { - return this.chain(function(a) { return Future.of(f(a)); }); - }; - - // apply - Future.prototype.ap = function(m) { - var self = this; - - return new Future(function(rej, res) { - var applyFn, val; - var doReject = R.once(rej); - - function resolveIfDone() { - if (applyFn != null && val != null) { - return res(applyFn(val)); - } - } - - self.fork(doReject, function(fn) { - applyFn = fn; - resolveIfDone(); - }); + "use strict"; - m.fork(doReject, function(v) { - val = v; - resolveIfDone(); - }); + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.SemiOp = exports.CommaSep = exports.Semi = exports.Seq = exports.ContainsIn = exports.NoIn = exports.Brace = exports.Bracket = exports.Paren = exports.NumberCodeRep = exports.Token = exports.Empty = exports.CodeRep = exports.escapeStringLiteral = exports.getPrecedence = exports.Precedence = exports.Sep = exports.FormattedCodeGen = exports.ExtensibleCodeGen = exports.MinimalCodeGen = undefined; + exports.default = codeGen; - }); + var _minimalCodegen = __webpack_require__(13); - }; + Object.defineProperty(exports, "MinimalCodeGen", { + enumerable: true, + get: function get() { + return _minimalCodegen.default; + } + }); - // applicative - Future.of = function(x) { - // should include a default rejection? - return new Future(function(_, resolve) { return resolve(x); }); - }; + var _formattedCodegen = __webpack_require__(20); - Future.prototype.of = Future.of; + Object.defineProperty(exports, "ExtensibleCodeGen", { + enumerable: true, + get: function get() { + return _formattedCodegen.ExtensibleCodeGen; + } + }); + Object.defineProperty(exports, "FormattedCodeGen", { + enumerable: true, + get: function get() { + return _formattedCodegen.FormattedCodeGen; + } + }); + Object.defineProperty(exports, "Sep", { + enumerable: true, + get: function get() { + return _formattedCodegen.Sep; + } + }); - // chain - // f must be a function which returns a value - // f must return a value of the same Chain - // chain must return a value of the same Chain - //:: Future a, b => (b -> Future c) -> Future c - Future.prototype.chain = function(f) { // Sorella's: - return new Future(function(reject, resolve) { - return this.fork(function(a) { return reject(a); }, - function(b) { return f(b).fork(reject, resolve); }); - }.bind(this)); - }; + var _coderep = __webpack_require__(19); - // chainReject - // Like chain but operates on the reject instead of the resolve case. - //:: Future a, b => (a -> Future c) -> Future c - Future.prototype.chainReject = function(f) { - return new Future(function(reject, resolve) { - return this.fork(function(a) { return f(a).fork(reject, resolve); }, - function(b) { return resolve(b); - }); - }.bind(this)); - }; - - // monad - // A value that implements the Monad specification must also implement the Applicative and Chain specifications. - // see above. - - Future.prototype.bimap = function(errFn, successFn) { - var self = this; - return new Future(function(reject, resolve) { - self.fork(function(err) { - reject(errFn(err)); - }, function(val) { - resolve(successFn(val)); - }); - }); - }; - - Future.reject = function(val) { - return new Future(function(reject) { - reject(val); - }); - }; - - Future.prototype.toString = function() { - return 'Future(' + R.toString(this._fork) + ')'; - }; - - Future.cache = function(f) { - var status = 'IDLE'; - var listeners = []; - var cachedValue; - - var handleCompletion = R.curry(function(newStatus, cb, val) { - status = newStatus; - cachedValue = val; - cb(val); - R.forEach(function(listener) { - listener[status](cachedValue); - }, listeners); - }); - - function addListeners(reject, resolve) { - listeners.push({ REJECTED: reject, RESOLVED: resolve } ); + Object.defineProperty(exports, "Precedence", { + enumerable: true, + get: function get() { + return _coderep.Precedence; } - - function doResolve(reject, resolve) { - status = 'PENDING'; - return f.fork( - handleCompletion('REJECTED', reject), - handleCompletion('RESOLVED', resolve) - ); + }); + Object.defineProperty(exports, "getPrecedence", { + enumerable: true, + get: function get() { + return _coderep.getPrecedence; + } + }); + Object.defineProperty(exports, "escapeStringLiteral", { + enumerable: true, + get: function get() { + return _coderep.escapeStringLiteral; + } + }); + Object.defineProperty(exports, "CodeRep", { + enumerable: true, + get: function get() { + return _coderep.CodeRep; + } + }); + Object.defineProperty(exports, "Empty", { + enumerable: true, + get: function get() { + return _coderep.Empty; + } + }); + Object.defineProperty(exports, "Token", { + enumerable: true, + get: function get() { + return _coderep.Token; + } + }); + Object.defineProperty(exports, "NumberCodeRep", { + enumerable: true, + get: function get() { + return _coderep.NumberCodeRep; + } + }); + Object.defineProperty(exports, "Paren", { + enumerable: true, + get: function get() { + return _coderep.Paren; + } + }); + Object.defineProperty(exports, "Bracket", { + enumerable: true, + get: function get() { + return _coderep.Bracket; + } + }); + Object.defineProperty(exports, "Brace", { + enumerable: true, + get: function get() { + return _coderep.Brace; + } + }); + Object.defineProperty(exports, "NoIn", { + enumerable: true, + get: function get() { + return _coderep.NoIn; + } + }); + Object.defineProperty(exports, "ContainsIn", { + enumerable: true, + get: function get() { + return _coderep.ContainsIn; + } + }); + Object.defineProperty(exports, "Seq", { + enumerable: true, + get: function get() { + return _coderep.Seq; } + }); + Object.defineProperty(exports, "Semi", { + enumerable: true, + get: function get() { + return _coderep.Semi; + } + }); + Object.defineProperty(exports, "CommaSep", { + enumerable: true, + get: function get() { + return _coderep.CommaSep; + } + }); + Object.defineProperty(exports, "SemiOp", { + enumerable: true, + get: function get() { + return _coderep.SemiOp; + } + }); - return new Future(function(reject, resolve) { + var _shiftReducer = __webpack_require__(4); - switch(status) { - case 'IDLE': doResolve(reject, resolve); break; - case 'PENDING': addListeners(reject, resolve); break; - case 'REJECTED': reject(cachedValue); break; - case 'RESOLVED': resolve(cachedValue); break; - } + var _shiftReducer2 = _interopRequireDefault(_shiftReducer); - }); - }; + var _token_stream = __webpack_require__(21); - module.exports = Future; + var _minimalCodegen2 = _interopRequireDefault(_minimalCodegen); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function codeGen(script) { + var generator = arguments.length <= 1 || arguments[1] === undefined ? new _minimalCodegen2.default() : arguments[1]; + var ts = new _token_stream.TokenStream(); + var rep = (0, _shiftReducer2.default)(generator, script); + rep.emit(ts); + return ts.result; + } /***/ }, -/* 20 */ +/* 13 */ /***/ function(module, exports, __webpack_require__) { - var R = __webpack_require__(17); - - var util = __webpack_require__(18); + "use strict"; + 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; }; }(); - /** - * A data type that holds a value and exposes a monadic api. - */ + Object.defineProperty(exports, "__esModule", { + value: true + }); - /** - * Constructs a new `Identity[a]` data type that holds a single - * value `a`. - * @param {*} a Value of any type - * @sig a -> Identity[a] - */ - function Identity(x) { - if (!(this instanceof Identity)) { - return new Identity(x); - } - this.value = x; - } + var _objectAssign = __webpack_require__(14); - /** - * Applicative specification. Creates a new `Identity[a]` holding the value `a`. - * @param {*} a Value of any type - * @returns Identity[a] - * @sig a -> Identity[a] - */ - Identity.of = function(x) { - return new Identity(x); - }; - Identity.prototype.of = Identity.of; + var _objectAssign2 = _interopRequireDefault(_objectAssign); - /** - * Functor specification. Creates a new `Identity[a]` mapping function `f` onto - * `a` returning any value b. - * @param {Function} f Maps `a` to any value `b` - * @returns Identity[b] - * @sig @Identity[a] => (a -> b) -> Identity[b] - */ - Identity.prototype.map = function(f) { - return new Identity(f(this.value)); - }; + var _esutils = __webpack_require__(15); - /** - * Apply specification. Applies the function inside the `Identity[a]` - * type to another applicative type. - * @param {Applicative[a]} app Applicative that will apply its function - * @returns Applicative[b] - * @sig (Identity[a -> b], f: Applicative[_]) => f[a] -> f[b] - */ - Identity.prototype.ap = function(app) { - return app.map(this.value); - }; + var _coderep = __webpack_require__(19); - /** - * Chain specification. Transforms the value of the `Identity[a]` - * type using an unary function to monads. The `Identity[a]` type - * should contain a function, otherwise an error is thrown. - * - * @param {Function} fn Transforms `a` into a `Monad[b]` - * @returns Monad[b] - * @sig (Identity[a], m: Monad[_]) => (a -> m[b]) -> m[b] - */ - Identity.prototype.chain = function(fn) { - return fn(this.value); - }; + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - /** - * Returns the value of `Identity[a]` - * - * @returns a - * @sig (Identity[a]) => a - */ - Identity.prototype.get = function() { - return this.value; - }; + function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - // equality method to enable testing - Identity.prototype.equals = util.getEquals(Identity); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - Identity.prototype.toString = function() { - return 'Identity(' + R.toString(this.value) + ')'; - }; + function p(node, precedence, a) { + return (0, _coderep.getPrecedence)(node) < precedence ? paren(a) : a; + } - module.exports = Identity; + function t(token) { + return new _coderep.Token(token); + } + function paren(rep) { + return new _coderep.Paren(rep); + } -/***/ }, -/* 21 */ -/***/ function(module, exports, __webpack_require__) { + function brace(rep) { + return new _coderep.Brace(rep); + } - var R = __webpack_require__(17); + function bracket(rep) { + return new _coderep.Bracket(rep); + } - module.exports = IO; + function noIn(rep) { + return new _coderep.NoIn(rep); + } - var compose = R.compose; + function markContainsIn(state) { + return state.containsIn ? new _coderep.ContainsIn(state) : state; + } - function IO(fn) { - if (!(this instanceof IO)) { - return new IO(fn); + function seq() { + for (var _len = arguments.length, reps = Array(_len), _key = 0; _key < _len; _key++) { + reps[_key] = arguments[_key]; } - this.fn = fn; + + return new _coderep.Seq(reps); } - // `f` must return an IO - IO.prototype.chain = function(f) { - var io = this; - return new IO(function() { - var next = f(io.fn.apply(io, arguments)); - return next.fn.apply(next, arguments); - }); - }; + function semi() { + return new _coderep.Semi(); + } - IO.prototype.map = function(f) { - var io = this; - return new IO(compose(f, io.fn)); - }; + function semiOp() { + return new _coderep.SemiOp(); + } - // `this` IO must wrap a function `f` that takes an IO (`thatIo`) as input - // `f` must return an IO - IO.prototype.ap = function(thatIo) { - return this.chain(function(f) { - return thatIo.map(f); - }); - }; + function empty() { + return new _coderep.Empty(); + } - IO.runIO = function(io) { - return io.runIO.apply(io, [].slice.call(arguments, 1)); - }; + function commaSep(pieces) { + return new _coderep.CommaSep(pieces); + } - IO.prototype.runIO = function() { - return this.fn.apply(this, arguments); - }; + function getAssignmentExpr(state) { + return state ? state.containsGroup ? paren(state) : state : empty(); + } - IO.prototype.of = function(x) { - return new IO(function() { return x; }); - }; + var MinimalCodeGen = function () { + function MinimalCodeGen() { + _classCallCheck(this, MinimalCodeGen); + } - IO.of = IO.prototype.of; + _createClass(MinimalCodeGen, [{ + key: "parenToAvoidBeingDirective", + value: function parenToAvoidBeingDirective(element, original) { + if (element && element.type === "ExpressionStatement" && element.expression.type === "LiteralStringExpression") { + return seq(paren(original.children[0]), semiOp()); + } + return original; + } + }, { + key: "reduceArrayExpression", + value: function reduceArrayExpression(node, _ref) { + var elements = _ref.elements; - IO.prototype.toString = function() { - return 'IO(' + R.toString(this.fn) + ')'; - }; + if (elements.length === 0) { + return bracket(empty()); + } + var content = commaSep(elements.map(getAssignmentExpr)); + if (elements.length > 0 && elements[elements.length - 1] == null) { + content = seq(content, t(",")); + } + return bracket(content); + } + }, { + key: "reduceSpreadElement", + value: function reduceSpreadElement(node, _ref2) { + var expression = _ref2.expression; -/***/ }, -/* 22 */ -/***/ function(module, exports, __webpack_require__) { + return seq(t("..."), p(node.expression, _coderep.Precedence.Assignment, expression)); + } + }, { + key: "reduceAssignmentExpression", + value: function reduceAssignmentExpression(node, _ref3) { + var binding = _ref3.binding; + var expression = _ref3.expression; - var R = __webpack_require__(17); + var leftCode = binding; + var rightCode = expression; + var containsIn = expression.containsIn; + var startsWithCurly = binding.startsWithCurly; + var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; + var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; + if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { + rightCode = paren(rightCode); + containsIn = false; + } + return (0, _objectAssign2.default)(seq(leftCode, t("="), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); + } + }, { + key: "reduceCompoundAssignmentExpression", + value: function reduceCompoundAssignmentExpression(node, _ref4) { + var binding = _ref4.binding; + var expression = _ref4.expression; - module.exports = R.curryN(3, function lift2(f, a1, a2) { - return a1.map(f).ap(a2); - }); + var leftCode = binding; + var rightCode = expression; + var containsIn = expression.containsIn; + var startsWithCurly = binding.startsWithCurly; + var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; + var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; + if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { + rightCode = paren(rightCode); + containsIn = false; + } + return (0, _objectAssign2.default)(seq(leftCode, t(node.operator), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); + } + }, { + key: "reduceBinaryExpression", + value: function reduceBinaryExpression(node, _ref5) { + var left = _ref5.left; + var right = _ref5.right; + var leftCode = left; + var startsWithCurly = left.startsWithCurly; + var startsWithLetSquareBracket = left.startsWithLetSquareBracket; + var startsWithFunctionOrClass = left.startsWithFunctionOrClass; + var leftContainsIn = left.containsIn; + if ((0, _coderep.getPrecedence)(node.left) < (0, _coderep.getPrecedence)(node)) { + leftCode = paren(leftCode); + startsWithCurly = false; + startsWithLetSquareBracket = false; + startsWithFunctionOrClass = false; + leftContainsIn = false; + } + var rightCode = right; + var rightContainsIn = right.containsIn; + if ((0, _coderep.getPrecedence)(node.right) <= (0, _coderep.getPrecedence)(node)) { + rightCode = paren(rightCode); + rightContainsIn = false; + } + return (0, _objectAssign2.default)(seq(leftCode, t(node.operator), rightCode), { + containsIn: leftContainsIn || rightContainsIn || node.operator === "in", + containsGroup: node.operator == ",", + startsWithCurly: startsWithCurly, + startsWithLetSquareBracket: startsWithLetSquareBracket, + startsWithFunctionOrClass: startsWithFunctionOrClass + }); + } + }, { + key: "reduceBindingWithDefault", + value: function reduceBindingWithDefault(node, _ref6) { + var binding = _ref6.binding; + var init = _ref6.init; -/***/ }, -/* 23 */ -/***/ function(module, exports, __webpack_require__) { + return seq(binding, t("="), init); + } + }, { + key: "reduceBindingIdentifier", + value: function reduceBindingIdentifier(node) { + var a = t(node.name); + if (node.name === "let") { + a.startsWithLet = true; + } + return a; + } + }, { + key: "reduceArrayBinding", + value: function reduceArrayBinding(node, _ref7) { + var elements = _ref7.elements; + var restElement = _ref7.restElement; - var R = __webpack_require__(17); + var content = undefined; + if (elements.length === 0) { + content = restElement == null ? empty() : seq(t("..."), restElement); + } else { + elements = elements.concat(restElement == null ? [] : [seq(t("..."), restElement)]); + content = commaSep(elements.map(getAssignmentExpr)); + if (elements.length > 0 && elements[elements.length - 1] == null) { + content = seq(content, t(",")); + } + } + return bracket(content); + } + }, { + key: "reduceObjectBinding", + value: function reduceObjectBinding(node, _ref8) { + var properties = _ref8.properties; - module.exports = R.curryN(4, function lift3(f, a1, a2, a3) { - return a1.map(f).ap(a2).ap(a3); - }); + var state = brace(commaSep(properties)); + state.startsWithCurly = true; + return state; + } + }, { + key: "reduceBindingPropertyIdentifier", + value: function reduceBindingPropertyIdentifier(node, _ref9) { + var binding = _ref9.binding; + var init = _ref9.init; + if (node.init == null) return binding; + return seq(binding, t("="), init); + } + }, { + key: "reduceBindingPropertyProperty", + value: function reduceBindingPropertyProperty(node, _ref10) { + var name = _ref10.name; + var binding = _ref10.binding; -/***/ }, -/* 24 */ -/***/ function(module, exports, __webpack_require__) { + return seq(name, t(":"), binding); + } + }, { + key: "reduceBlock", + value: function reduceBlock(node, _ref11) { + var statements = _ref11.statements; - var R = __webpack_require__(17); + return brace(seq.apply(undefined, _toConsumableArray(statements))); + } + }, { + key: "reduceBlockStatement", + value: function reduceBlockStatement(node, _ref12) { + var block = _ref12.block; - var util = __webpack_require__(18); - - function Maybe(x) { - return x == null ? _nothing : Maybe.Just(x); - } - - function _Just(x) { - this.value = x; - } - util.extend(_Just, Maybe); - - function _Nothing() {} - util.extend(_Nothing, Maybe); + return block; + } + }, { + key: "reduceBreakStatement", + value: function reduceBreakStatement(node, _ref13) { + var label = _ref13.label; - var _nothing = new _Nothing(); + return seq(t("break"), label ? t(label) : empty(), semiOp()); + } + }, { + key: "reduceCallExpression", + value: function reduceCallExpression(node, _ref14) { + var callee = _ref14.callee; + var args = _ref14.arguments; - Maybe.Nothing = function() { - return _nothing; - }; + return (0, _objectAssign2.default)(seq(p(node.callee, (0, _coderep.getPrecedence)(node), callee), paren(commaSep(args))), { + startsWithCurly: callee.startsWithCurly, + startsWithLetSquareBracket: callee.startsWithLetSquareBracket, + startsWithFunctionOrClass: callee.startsWithFunctionOrClass + }); + } + }, { + key: "reduceCatchClause", + value: function reduceCatchClause(node, _ref15) { + var binding = _ref15.binding; + var body = _ref15.body; - Maybe.Just = function(x) { - return new _Just(x); - }; + return seq(t("catch"), paren(binding), body); + } + }, { + key: "reduceClassDeclaration", + value: function reduceClassDeclaration(node, _ref16) { + var name = _ref16.name; + var _super = _ref16.super; + var elements = _ref16.elements; - Maybe.of = Maybe.Just; + var state = seq(t("class"), name); + if (_super != null) { + state = seq(state, t("extends"), _super); + } + state = seq.apply(undefined, [state, t("{")].concat(_toConsumableArray(elements), [t("}")])); + return state; + } + }, { + key: "reduceClassExpression", + value: function reduceClassExpression(node, _ref17) { + var name = _ref17.name; + var _super = _ref17.super; + var elements = _ref17.elements; - Maybe.prototype.of = Maybe.Just; + var state = t("class"); + if (name != null) { + state = seq(state, name); + } + if (_super != null) { + state = seq(state, t("extends"), _super); + } + state = seq.apply(undefined, [state, t("{")].concat(_toConsumableArray(elements), [t("}")])); + state.startsWithFunctionOrClass = true; + return state; + } + }, { + key: "reduceClassElement", + value: function reduceClassElement(node, _ref18) { + var method = _ref18.method; - Maybe.isJust = function(x) { - return x instanceof _Just; - }; + if (!node.isStatic) return method; + return seq(t("static"), method); + } + }, { + key: "reduceComputedMemberExpression", + value: function reduceComputedMemberExpression(node, _ref19) { + var object = _ref19.object; + var expression = _ref19.expression; - Maybe.isNothing = function(x) { - return x === _nothing; - }; + var startsWithLetSquareBracket = object.startsWithLetSquareBracket || node.object.type === "IdentifierExpression" && node.object.name === "let"; + return (0, _objectAssign2.default)(seq(p(node.object, (0, _coderep.getPrecedence)(node), object), bracket(expression)), { + startsWithLet: object.startsWithLet, + startsWithLetSquareBracket: startsWithLetSquareBracket, + startsWithCurly: object.startsWithCurly, + startsWithFunctionOrClass: object.startsWithFunctionOrClass + }); + } + }, { + key: "reduceComputedPropertyName", + value: function reduceComputedPropertyName(node, _ref20) { + var expression = _ref20.expression; - Maybe.maybe = R.curry(function(nothingVal, justFn, m) { - return m.reduce(function(_, x) { - return justFn(x); - }, nothingVal); - }); + return bracket(expression); + } + }, { + key: "reduceConditionalExpression", + value: function reduceConditionalExpression(node, _ref21) { + var test = _ref21.test; + var consequent = _ref21.consequent; + var alternate = _ref21.alternate; - // functor - _Just.prototype.map = function(f) { - return this.of(f(this.value)); - }; + var containsIn = test.containsIn || alternate.containsIn; + var startsWithCurly = test.startsWithCurly; + var startsWithLetSquareBracket = test.startsWithLetSquareBracket; + var startsWithFunctionOrClass = test.startsWithFunctionOrClass; + return (0, _objectAssign2.default)(seq(p(node.test, _coderep.Precedence.LogicalOR, test), t("?"), p(node.consequent, _coderep.Precedence.Assignment, consequent), t(":"), p(node.alternate, _coderep.Precedence.Assignment, alternate)), { + containsIn: containsIn, + startsWithCurly: startsWithCurly, + startsWithLetSquareBracket: startsWithLetSquareBracket, + startsWithFunctionOrClass: startsWithFunctionOrClass + }); + } + }, { + key: "reduceContinueStatement", + value: function reduceContinueStatement(node, _ref22) { + var label = _ref22.label; - _Nothing.prototype.map = util.returnThis; + return seq(t("continue"), label ? t(label) : empty(), semiOp()); + } + }, { + key: "reduceDataProperty", + value: function reduceDataProperty(node, _ref23) { + var name = _ref23.name; + var expression = _ref23.expression; - // apply - // takes a Maybe that wraps a function (`app`) and applies its `map` - // method to this Maybe's value, which must be a function. - _Just.prototype.ap = function(m) { - return m.map(this.value); - }; + return seq(name, t(":"), getAssignmentExpr(expression)); + } + }, { + key: "reduceDebuggerStatement", + value: function reduceDebuggerStatement(node) { + return seq(t("debugger"), semiOp()); + } + }, { + key: "reduceDoWhileStatement", + value: function reduceDoWhileStatement(node, _ref24) { + var body = _ref24.body; + var test = _ref24.test; - _Nothing.prototype.ap = util.returnThis; + return seq(t("do"), body, t("while"), paren(test), semiOp()); + } + }, { + key: "reduceEmptyStatement", + value: function reduceEmptyStatement(node) { + return semi(); + } + }, { + key: "reduceExpressionStatement", + value: function reduceExpressionStatement(node, _ref25) { + var expression = _ref25.expression; - // applicative - // `of` inherited from `Maybe` + var needsParens = expression.startsWithCurly || expression.startsWithLetSquareBracket || expression.startsWithFunctionOrClass; + return seq(needsParens ? paren(expression) : expression, semiOp()); + } + }, { + key: "reduceForInStatement", + value: function reduceForInStatement(node, _ref26) { + var left = _ref26.left; + var right = _ref26.right; + var body = _ref26.body; + var leftP = left; + switch (node.left.type) { + case "VariableDeclaration": + leftP = noIn(markContainsIn(left)); + break; + case "BindingIdentifier": + if (node.left.name === "let") { + leftP = paren(left); + } + break; + } + return (0, _objectAssign2.default)(seq(t("for"), paren(seq(leftP, t("in"), right)), body), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceForOfStatement", + value: function reduceForOfStatement(node, _ref27) { + var left = _ref27.left; + var right = _ref27.right; + var body = _ref27.body; - // chain - // f must be a function which returns a value - // f must return a value of the same Chain - // chain must return a value of the same Chain - _Just.prototype.chain = util.baseMap; + left = node.left.type === "VariableDeclaration" ? noIn(markContainsIn(left)) : left; + return (0, _objectAssign2.default)(seq(t("for"), paren(seq(left.startsWithLet ? paren(left) : left, t("of"), right)), body), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceForStatement", + value: function reduceForStatement(node, _ref28) { + var init = _ref28.init; + var test = _ref28.test; + var update = _ref28.update; + var body = _ref28.body; - _Nothing.prototype.chain = util.returnThis; + return (0, _objectAssign2.default)(seq(t("for"), paren(seq(init ? noIn(markContainsIn(init)) : empty(), semi(), test || empty(), semi(), update || empty())), body), { + endsWithMissingElse: body.endsWithMissingElse + }); + } + }, { + key: "reduceFunctionBody", + value: function reduceFunctionBody(node, _ref29) { + var directives = _ref29.directives; + var statements = _ref29.statements; + if (statements.length) { + statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); + } + return seq.apply(undefined, _toConsumableArray(directives).concat(_toConsumableArray(statements))); + } + }, { + key: "reduceFunctionDeclaration", + value: function reduceFunctionDeclaration(node, _ref30) { + var name = _ref30.name; + var params = _ref30.params; + var body = _ref30.body; - // - _Just.prototype.datatype = _Just; + return seq(t("function"), node.isGenerator ? t("*") : empty(), node.name.name === "*default*" ? empty() : name, paren(params), brace(body)); + } + }, { + key: "reduceFunctionExpression", + value: function reduceFunctionExpression(node, _ref31) { + var name = _ref31.name; + var params = _ref31.params; + var body = _ref31.body; - _Nothing.prototype.datatype = _Nothing; + var state = seq(t("function"), node.isGenerator ? t("*") : empty(), name ? name : empty(), paren(params), brace(body)); + state.startsWithFunctionOrClass = true; + return state; + } + }, { + key: "reduceFormalParameters", + value: function reduceFormalParameters(node, _ref32) { + var items = _ref32.items; + var rest = _ref32.rest; - // monad - // A value that implements the Monad specification must also implement the Applicative and Chain specifications. - // see above. + return commaSep(items.concat(rest == null ? [] : [seq(t("..."), rest)])); + } + }, { + key: "reduceArrowExpression", + value: function reduceArrowExpression(node, _ref33) { + var params = _ref33.params; + var body = _ref33.body; - // equality method to enable testing - _Just.prototype.equals = util.getEquals(_Just); + if (node.params.rest != null || node.params.items.length !== 1 || node.params.items[0].type !== "BindingIdentifier") { + params = paren(params); + } + if (node.body.type === "FunctionBody") { + body = brace(body); + } else if (body.startsWithCurly) { + body = paren(body); + } + return seq(params, t("=>"), p(node.body, _coderep.Precedence.Assignment, body)); + } + }, { + key: "reduceGetter", + value: function reduceGetter(node, _ref34) { + var name = _ref34.name; + var body = _ref34.body; - _Nothing.prototype.equals = function(that) { - return that === _nothing; - }; + return seq(t("get"), name, paren(empty()), brace(body)); + } + }, { + key: "reduceIdentifierExpression", + value: function reduceIdentifierExpression(node) { + var a = t(node.name); + if (node.name === "let") { + a.startsWithLet = true; + } + return a; + } + }, { + key: "reduceIfStatement", + value: function reduceIfStatement(node, _ref35) { + var test = _ref35.test; + var consequent = _ref35.consequent; + var alternate = _ref35.alternate; - Maybe.prototype.isNothing = function() { - return this === _nothing; - }; + if (alternate && consequent.endsWithMissingElse) { + consequent = brace(consequent); + } + return (0, _objectAssign2.default)(seq(t("if"), paren(test), consequent, alternate ? seq(t("else"), alternate) : empty()), { endsWithMissingElse: alternate ? alternate.endsWithMissingElse : true }); + } + }, { + key: "reduceImport", + value: function reduceImport(node, _ref36) { + var defaultBinding = _ref36.defaultBinding; + var namedImports = _ref36.namedImports; - Maybe.prototype.isJust = function() { - return this instanceof _Just; - }; + var bindings = []; + if (defaultBinding != null) { + bindings.push(defaultBinding); + } + if (namedImports.length > 0) { + bindings.push(brace(commaSep(namedImports))); + } + if (bindings.length === 0) { + return seq(t("import"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); + } + return seq(t("import"), commaSep(bindings), t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); + } + }, { + key: "reduceImportNamespace", + value: function reduceImportNamespace(node, _ref37) { + var defaultBinding = _ref37.defaultBinding; + var namespaceBinding = _ref37.namespaceBinding; - _Just.prototype.getOrElse = function() { - return this.value; - }; + return seq(t("import"), defaultBinding == null ? empty() : seq(defaultBinding, t(",")), t("*"), t("as"), namespaceBinding, t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); + } + }, { + key: "reduceImportSpecifier", + value: function reduceImportSpecifier(node, _ref38) { + var binding = _ref38.binding; - _Nothing.prototype.getOrElse = function(a) { - return a; - }; + if (node.name == null) return binding; + return seq(t(node.name), t("as"), binding); + } + }, { + key: "reduceExportAllFrom", + value: function reduceExportAllFrom(node) { + return seq(t("export"), t("*"), t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); + } + }, { + key: "reduceExportFrom", + value: function reduceExportFrom(node, _ref39) { + var namedExports = _ref39.namedExports; - _Just.prototype.reduce = function(f, x) { - return f(x, this.value); - }; + return seq(t("export"), brace(commaSep(namedExports)), node.moduleSpecifier == null ? empty() : seq(t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp())); + } + }, { + key: "reduceExport", + value: function reduceExport(node, _ref40) { + var declaration = _ref40.declaration; - _Nothing.prototype.reduce = function(f, x) { - return x; - }; + switch (node.declaration.type) { + case "FunctionDeclaration": + case "ClassDeclaration": + break; + default: + declaration = seq(declaration, semiOp()); + } + return seq(t("export"), declaration); + } + }, { + key: "reduceExportDefault", + value: function reduceExportDefault(node, _ref41) { + var body = _ref41.body; - _Just.prototype.toString = function() { - return 'Maybe.Just(' + R.toString(this.value) + ')'; - }; + body = body.startsWithFunctionOrClass ? paren(body) : body; + switch (node.body.type) { + case "FunctionDeclaration": + case "ClassDeclaration": + break; + default: + body = seq(body, semiOp()); + } + return seq(t("export default"), body); + } + }, { + key: "reduceExportSpecifier", + value: function reduceExportSpecifier(node) { + if (node.name == null) return t(node.exportedName); + return seq(t(node.name), t("as"), t(node.exportedName)); + } + }, { + key: "reduceLabeledStatement", + value: function reduceLabeledStatement(node, _ref42) { + var label = _ref42.label; + var body = _ref42.body; - _Nothing.prototype.toString = function() { - return 'Maybe.Nothing()'; - }; + return (0, _objectAssign2.default)(seq(t(label + ":"), body), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceLiteralBooleanExpression", + value: function reduceLiteralBooleanExpression(node) { + return t(node.value.toString()); + } + }, { + key: "reduceLiteralNullExpression", + value: function reduceLiteralNullExpression(node) { + return t("null"); + } + }, { + key: "reduceLiteralInfinityExpression", + value: function reduceLiteralInfinityExpression(node) { + return t("2e308"); + } + }, { + key: "reduceLiteralNumericExpression", + value: function reduceLiteralNumericExpression(node) { + return new _coderep.NumberCodeRep(node.value); + } + }, { + key: "reduceLiteralRegExpExpression", + value: function reduceLiteralRegExpExpression(node) { + return t("/" + node.pattern + "/" + node.flags); + } + }, { + key: "reduceLiteralStringExpression", + value: function reduceLiteralStringExpression(node) { + return t((0, _coderep.escapeStringLiteral)(node.value)); + } + }, { + key: "reduceMethod", + value: function reduceMethod(node, _ref43) { + var name = _ref43.name; + var params = _ref43.params; + var body = _ref43.body; - module.exports = Maybe; + return seq(node.isGenerator ? t("*") : empty(), name, paren(params), brace(body)); + } + }, { + key: "reduceModule", + value: function reduceModule(node, _ref44) { + var directives = _ref44.directives; + var items = _ref44.items; + if (items.length) { + items[0] = this.parenToAvoidBeingDirective(node.items[0], items[0]); + } + return seq.apply(undefined, _toConsumableArray(directives).concat(_toConsumableArray(items))); + } + }, { + key: "reduceNewExpression", + value: function reduceNewExpression(node, _ref45) { + var callee = _ref45.callee; + var args = _ref45.arguments; -/***/ }, -/* 25 */ -/***/ function(module, exports, __webpack_require__) { + var calleeRep = (0, _coderep.getPrecedence)(node.callee) == _coderep.Precedence.Call ? paren(callee) : p(node.callee, (0, _coderep.getPrecedence)(node), callee); + return seq(t("new"), calleeRep, args.length === 0 ? empty() : paren(commaSep(args))); + } + }, { + key: "reduceNewTargetExpression", + value: function reduceNewTargetExpression() { + return t("new.target"); + } + }, { + key: "reduceObjectExpression", + value: function reduceObjectExpression(node, _ref46) { + var properties = _ref46.properties; - var R = __webpack_require__(17); + var state = brace(commaSep(properties)); + state.startsWithCurly = true; + return state; + } + }, { + key: "reduceUpdateExpression", + value: function reduceUpdateExpression(node, _ref47) { + var operand = _ref47.operand; + if (node.isPrefix) { + return this.reduceUnaryExpression.apply(this, arguments); + } else { + return (0, _objectAssign2.default)(seq(p(node.operand, _coderep.Precedence.New, operand), t(node.operator)), { + startsWithCurly: operand.startsWithCurly, + startsWithLetSquareBracket: operand.startsWithLetSquareBracket, + startsWithFunctionOrClass: operand.startsWithFunctionOrClass + }); + } + } + }, { + key: "reduceUnaryExpression", + value: function reduceUnaryExpression(node, _ref48) { + var operand = _ref48.operand; - function Tuple(x, y) { - switch (arguments.length) { - case 0: - throw new TypeError('no arguments to Tuple'); - case 1: - return function(y) { - return new _Tuple(x, y); - }; - default: - return new _Tuple(x, y); - } - } + return seq(t(node.operator), p(node.operand, (0, _coderep.getPrecedence)(node), operand)); + } + }, { + key: "reduceReturnStatement", + value: function reduceReturnStatement(node, _ref49) { + var expression = _ref49.expression; - function _Tuple(x, y) { - this[0] = x; - this[1] = y; - this.length = 2; - } + return seq(t("return"), expression || empty(), semiOp()); + } + }, { + key: "reduceScript", + value: function reduceScript(node, _ref50) { + var directives = _ref50.directives; + var statements = _ref50.statements; - function ensureConcat(xs) { - xs.forEach(function(x) { - if (typeof x.concat != 'function') { - throw new TypeError(R.toString(x) + ' must be a semigroup to perform this operation'); + if (statements.length) { + statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); + } + return seq.apply(undefined, _toConsumableArray(directives).concat(_toConsumableArray(statements))); } - }); - } + }, { + key: "reduceSetter", + value: function reduceSetter(node, _ref51) { + var name = _ref51.name; + var param = _ref51.param; + var body = _ref51.body; - Tuple.fst = function(x) { - return x[0]; - }; + return seq(t("set"), name, paren(param), brace(body)); + } + }, { + key: "reduceShorthandProperty", + value: function reduceShorthandProperty(node) { + return t(node.name); + } + }, { + key: "reduceStaticMemberExpression", + value: function reduceStaticMemberExpression(node, _ref52) { + var object = _ref52.object; + var property = _ref52.property; - Tuple.snd = function(x) { - return x[1]; - }; + var state = seq(p(node.object, (0, _coderep.getPrecedence)(node), object), t("."), t(property)); + state.startsWithLet = object.startsWithLet; + state.startsWithCurly = object.startsWithCurly; + state.startsWithLetSquareBracket = object.startsWithLetSquareBracket; + state.startsWithFunctionOrClass = object.startsWithFunctionOrClass; + return state; + } + }, { + key: "reduceStaticPropertyName", + value: function reduceStaticPropertyName(node) { + var n; + if (_esutils.keyword.isIdentifierNameES6(node.value)) { + return t(node.value); + } else if (n = parseFloat(node.value), n === n) { + return new _coderep.NumberCodeRep(n); + } + return t((0, _coderep.escapeStringLiteral)(node.value)); + } + }, { + key: "reduceSuper", + value: function reduceSuper() { + return t("super"); + } + }, { + key: "reduceSwitchCase", + value: function reduceSwitchCase(node, _ref53) { + var test = _ref53.test; + var consequent = _ref53.consequent; - // semigroup - _Tuple.prototype.concat = function(x) { - ensureConcat([this[0], this[1]]); - return Tuple(this[0].concat(x[0]), this[1].concat(x[1])); - }; + return seq(t("case"), test, t(":"), seq.apply(undefined, _toConsumableArray(consequent))); + } + }, { + key: "reduceSwitchDefault", + value: function reduceSwitchDefault(node, _ref54) { + var consequent = _ref54.consequent; - // functor - _Tuple.prototype.map = function(f) { - return Tuple(this[0], f(this[1])); - }; + return seq(t("default:"), seq.apply(undefined, _toConsumableArray(consequent))); + } + }, { + key: "reduceSwitchStatement", + value: function reduceSwitchStatement(node, _ref55) { + var discriminant = _ref55.discriminant; + var cases = _ref55.cases; - // apply - _Tuple.prototype.ap = function(m) { - ensureConcat([this[0]]); - return Tuple(this[0].concat(m[0]), this[1](m[1])); - }; + return seq(t("switch"), paren(discriminant), brace(seq.apply(undefined, _toConsumableArray(cases)))); + } + }, { + key: "reduceSwitchStatementWithDefault", + value: function reduceSwitchStatementWithDefault(node, _ref56) { + var discriminant = _ref56.discriminant; + var preDefaultCases = _ref56.preDefaultCases; + var defaultCase = _ref56.defaultCase; + var postDefaultCases = _ref56.postDefaultCases; - // setoid - _Tuple.prototype.equals = function(that) { - return that instanceof _Tuple && R.equals(this[0], that[0]) && R.equals(this[1], that[1]); - }; + return seq(t("switch"), paren(discriminant), brace(seq.apply(undefined, _toConsumableArray(preDefaultCases).concat([defaultCase], _toConsumableArray(postDefaultCases))))); + } + }, { + key: "reduceTemplateExpression", + value: function reduceTemplateExpression(node, _ref57) { + var tag = _ref57.tag; + var elements = _ref57.elements; - _Tuple.prototype.toString = function() { - return 'Tuple(' + R.toString(this[0]) + ', ' + R.toString(this[1]) + ')'; - }; + var state = node.tag == null ? empty() : p(node.tag, (0, _coderep.getPrecedence)(node), tag); + var templateData = ""; + state = seq(state, t("`")); + for (var i = 0, l = node.elements.length; i < l; ++i) { + if (node.elements[i].type === "TemplateElement") { + var d = ""; + if (i > 0) d += "}"; + d += node.elements[i].rawValue; + if (i < l - 1) d += "${"; + state = seq(state, t(d)); + } else { + state = seq(state, elements[i]); + } + } + state = seq(state, t("`")); + if (node.tag != null) { + state.startsWithCurly = tag.startsWithCurly; + state.startsWithLetSquareBracket = tag.startsWithLetSquareBracket; + state.startsWithFunctionOrClass = tag.startsWithFunctionOrClass; + } + return state; + } + }, { + key: "reduceTemplateElement", + value: function reduceTemplateElement(node) { + return t(node.rawValue); + } + }, { + key: "reduceThisExpression", + value: function reduceThisExpression(node) { + return t("this"); + } + }, { + key: "reduceThrowStatement", + value: function reduceThrowStatement(node, _ref58) { + var expression = _ref58.expression; - module.exports = Tuple; + return seq(t("throw"), expression, semiOp()); + } + }, { + key: "reduceTryCatchStatement", + value: function reduceTryCatchStatement(node, _ref59) { + var body = _ref59.body; + var catchClause = _ref59.catchClause; + return seq(t("try"), body, catchClause); + } + }, { + key: "reduceTryFinallyStatement", + value: function reduceTryFinallyStatement(node, _ref60) { + var body = _ref60.body; + var catchClause = _ref60.catchClause; + var finalizer = _ref60.finalizer; -/***/ }, -/* 26 */ -/***/ function(module, exports, __webpack_require__) { + return seq(t("try"), body, catchClause || empty(), t("finally"), finalizer); + } + }, { + key: "reduceYieldExpression", + value: function reduceYieldExpression(node, _ref61) { + var expression = _ref61.expression; - var R = __webpack_require__(17); + if (node.expression == null) return t("yield"); + return seq(t("yield"), p(node.expression, (0, _coderep.getPrecedence)(node), expression)); + } + }, { + key: "reduceYieldGeneratorExpression", + value: function reduceYieldGeneratorExpression(node, _ref62) { + var expression = _ref62.expression; + return seq(t("yield"), t("*"), p(node.expression, (0, _coderep.getPrecedence)(node), expression)); + } + }, { + key: "reduceDirective", + value: function reduceDirective(node) { + var delim = /^(?:[^"\\]|\\.)*$/.test(node.rawValue) ? "\"" : "'"; + return seq(t(delim + node.rawValue + delim), semiOp()); + } + }, { + key: "reduceVariableDeclaration", + value: function reduceVariableDeclaration(node, _ref63) { + var declarators = _ref63.declarators; - function Reader(run) { - if (!(this instanceof Reader)) { - return new Reader(run); - } - this.run = run; - } + return seq(t(node.kind), commaSep(declarators)); + } + }, { + key: "reduceVariableDeclarationStatement", + value: function reduceVariableDeclarationStatement(node, _ref64) { + var declaration = _ref64.declaration; - Reader.run = function(reader) { - return reader.run.apply(reader, [].slice.call(arguments, 1)); - }; + return seq(declaration, semiOp()); + } + }, { + key: "reduceVariableDeclarator", + value: function reduceVariableDeclarator(node, _ref65) { + var binding = _ref65.binding; + var init = _ref65.init; - Reader.prototype.chain = function(f) { - var reader = this; - return new Reader(function(r) { - return f(reader.run(r)).run(r); - }); - }; + var containsIn = init && init.containsIn && !init.containsGroup; + if (init) { + if (init.containsGroup) { + init = paren(init); + } else { + init = markContainsIn(init); + } + } + return (0, _objectAssign2.default)(init == null ? binding : seq(binding, t("="), init), { containsIn: containsIn }); + } + }, { + key: "reduceWhileStatement", + value: function reduceWhileStatement(node, _ref66) { + var test = _ref66.test; + var body = _ref66.body; - Reader.prototype.ap = function(a) { - return this.chain(function(f) { - return a.map(f); - }); - }; + return (0, _objectAssign2.default)(seq(t("while"), paren(test), body), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceWithStatement", + value: function reduceWithStatement(node, _ref67) { + var object = _ref67.object; + var body = _ref67.body; - Reader.prototype.map = function(f) { - return this.chain(function(a) { - return Reader.of(f(a)); - }); - }; + return (0, _objectAssign2.default)(seq(t("with"), paren(object), body), { endsWithMissingElse: body.endsWithMissingElse }); + } + }]); - Reader.prototype.of = function(a) { - return new Reader(function() { - return a; - }); - }; - Reader.of = Reader.prototype.of; + return MinimalCodeGen; + }(); - Reader.ask = Reader(R.identity); + exports.default = MinimalCodeGen; - Reader.prototype.toString = function() { - return 'Reader(' + R.toString(this.run) + ')'; - }; +/***/ }, +/* 14 */ +/***/ function(module, exports) { - Reader.T = function(M) { - var ReaderT = function ReaderT(run) { - if (!(this instanceof ReaderT)) { - return new ReaderT(run); - } - this.run = run; - }; + 'use strict'; + var propIsEnumerable = Object.prototype.propertyIsEnumerable; - ReaderT.lift = R.compose(ReaderT, R.always); + function ToObject(val) { + if (val == null) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } - ReaderT.ask = ReaderT(M.of); + return Object(val); + } - ReaderT.prototype.of = ReaderT.of = function(a) { - return ReaderT(function() { - return M.of(a); - }); - }; + function ownEnumerableKeys(obj) { + var keys = Object.getOwnPropertyNames(obj); - ReaderT.prototype.chain = function(f) { - var readerT = this; - return ReaderT(function(e) { - var m = readerT.run(e); - return m.chain(function(a) { - return f(a).run(e); - }); - }); - }; + if (Object.getOwnPropertySymbols) { + keys = keys.concat(Object.getOwnPropertySymbols(obj)); + } - ReaderT.prototype.map = function(f) { - return this.chain(function(a) { - return ReaderT.of(f(a)); - }); - }; + return keys.filter(function (key) { + return propIsEnumerable.call(obj, key); + }); + } - ReaderT.prototype.ap = function(a) { - var readerT = this; - return ReaderT(function(e) { - return readerT.run(e).ap(a.run(e)); - }); - }; + module.exports = Object.assign || function (target, source) { + var from; + var keys; + var to = ToObject(target); - ReaderT.prototype.equals = function(that) { - return this === that || - this.run === that.run || - R.equals(this.run().get(), that.run().get()); - }; + for (var s = 1; s < arguments.length; s++) { + from = arguments[s]; + keys = ownEnumerableKeys(Object(from)); - ReaderT.prototype.toString = function() { - return 'ReaderT[' + M.name + '](' + R.toString(this.run) + ')'; - }; + for (var i = 0; i < keys.length; i++) { + to[keys[i]] = from[keys[i]]; + } + } - return ReaderT; + return to; }; - module.exports = Reader; - /***/ }, -/* 27 */ +/* 15 */ /***/ function(module, exports, __webpack_require__) { - // Ramda v0.19.1 - // https://github.com/ramda/ramda - // (c) 2013-2016 Scott Sauyet, Michael Hurley, and David Chambers - // Ramda may be freely distributed under the MIT license. + /* + Copyright (C) 2013 Yusuke Suzuki - ;(function() { + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: - 'use strict'; + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. - /** - * A special placeholder value used to specify "gaps" within curried functions, - * allowing partial application of any combination of arguments, regardless of - * their positions. - * - * If `g` is a curried ternary function and `_` is `R.__`, the following are - * equivalent: - * - * - `g(1, 2, 3)` - * - `g(_, 2, 3)(1)` - * - `g(_, _, 3)(1)(2)` - * - `g(_, _, 3)(1, 2)` - * - `g(_, 2, _)(1, 3)` - * - `g(_, 2)(1)(3)` - * - `g(_, 2)(1, 3)` - * - `g(_, 2)(_, 3)(1)` - * - * @constant - * @memberOf R - * @since v0.6.0 - * @category Function - * @example - * - * var greet = R.replace('{name}', R.__, 'Hello, {name}!'); - * greet('Alice'); //=> 'Hello, Alice!' - */ - var __ = { '@@functional/placeholder': true }; + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ - /* eslint-disable no-unused-vars */ - var _arity = function _arity(n, fn) { - /* eslint-disable no-unused-vars */ - switch (n) { - case 0: - return function () { - return fn.apply(this, arguments); - }; - case 1: - return function (a0) { - return fn.apply(this, arguments); - }; - case 2: - return function (a0, a1) { - return fn.apply(this, arguments); - }; - case 3: - return function (a0, a1, a2) { - return fn.apply(this, arguments); - }; - case 4: - return function (a0, a1, a2, a3) { - return fn.apply(this, arguments); - }; - case 5: - return function (a0, a1, a2, a3, a4) { - return fn.apply(this, arguments); - }; - case 6: - return function (a0, a1, a2, a3, a4, a5) { - return fn.apply(this, arguments); - }; - case 7: - return function (a0, a1, a2, a3, a4, a5, a6) { - return fn.apply(this, arguments); - }; - case 8: - return function (a0, a1, a2, a3, a4, a5, a6, a7) { - return fn.apply(this, arguments); - }; - case 9: - return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) { - return fn.apply(this, arguments); - }; - case 10: - return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - return fn.apply(this, arguments); - }; - default: - throw new Error('First argument to _arity must be a non-negative integer no greater than ten'); - } - }; - var _arrayFromIterator = function _arrayFromIterator(iter) { - var list = []; - var next; - while (!(next = iter.next()).done) { - list.push(next.value); - } - return list; - }; + (function () { + 'use strict'; - var _cloneRegExp = function _cloneRegExp(pattern) { - return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : '')); - }; + exports.ast = __webpack_require__(16); + exports.code = __webpack_require__(17); + exports.keyword = __webpack_require__(18); + }()); + /* vim: set sw=4 ts=4 et tw=80 : */ - var _complement = function _complement(f) { - return function () { - return !f.apply(this, arguments); - }; - }; - /** - * Private `concat` function to merge two array-like objects. - * - * @private - * @param {Array|Arguments} [set1=[]] An array-like object. - * @param {Array|Arguments} [set2=[]] An array-like object. - * @return {Array} A new, merged array. - * @example - * - * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] - */ - var _concat = function _concat(set1, set2) { - set1 = set1 || []; - set2 = set2 || []; - var idx; - var len1 = set1.length; - var len2 = set2.length; - var result = []; - idx = 0; - while (idx < len1) { - result[result.length] = set1[idx]; - idx += 1; +/***/ }, +/* 16 */ +/***/ function(module, exports) { + + /* + Copyright (C) 2013 Yusuke Suzuki + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function () { + 'use strict'; + + function isExpression(node) { + if (node == null) { return false; } + switch (node.type) { + case 'ArrayExpression': + case 'AssignmentExpression': + case 'BinaryExpression': + case 'CallExpression': + case 'ConditionalExpression': + case 'FunctionExpression': + case 'Identifier': + case 'Literal': + case 'LogicalExpression': + case 'MemberExpression': + case 'NewExpression': + case 'ObjectExpression': + case 'SequenceExpression': + case 'ThisExpression': + case 'UnaryExpression': + case 'UpdateExpression': + return true; } - idx = 0; - while (idx < len2) { - result[result.length] = set2[idx]; - idx += 1; + return false; + } + + function isIterationStatement(node) { + if (node == null) { return false; } + switch (node.type) { + case 'DoWhileStatement': + case 'ForInStatement': + case 'ForStatement': + case 'WhileStatement': + return true; } - return result; - }; + return false; + } - var _containsWith = function _containsWith(pred, x, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (pred(x, list[idx])) { + function isStatement(node) { + if (node == null) { return false; } + switch (node.type) { + case 'BlockStatement': + case 'BreakStatement': + case 'ContinueStatement': + case 'DebuggerStatement': + case 'DoWhileStatement': + case 'EmptyStatement': + case 'ExpressionStatement': + case 'ForInStatement': + case 'ForStatement': + case 'IfStatement': + case 'LabeledStatement': + case 'ReturnStatement': + case 'SwitchStatement': + case 'ThrowStatement': + case 'TryStatement': + case 'VariableDeclaration': + case 'WhileStatement': + case 'WithStatement': return true; - } - idx += 1; } return false; - }; + } - var _filter = function _filter(fn, list) { - var idx = 0; - var len = list.length; - var result = []; - while (idx < len) { - if (fn(list[idx])) { - result[result.length] = list[idx]; + function isSourceElement(node) { + return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; + } + + function trailingStatement(node) { + switch (node.type) { + case 'IfStatement': + if (node.alternate != null) { + return node.alternate; } - idx += 1; + return node.consequent; + + case 'LabeledStatement': + case 'ForStatement': + case 'ForInStatement': + case 'WhileStatement': + case 'WithStatement': + return node.body; } - return result; - }; + return null; + } - var _forceReduced = function _forceReduced(x) { - return { - '@@transducer/value': x, - '@@transducer/reduced': true - }; - }; + function isProblematicIfStatement(node) { + var current; - var _has = function _has(prop, obj) { - return Object.prototype.hasOwnProperty.call(obj, prop); - }; + if (node.type !== 'IfStatement') { + return false; + } + if (node.alternate == null) { + return false; + } + current = node.consequent; + do { + if (current.type === 'IfStatement') { + if (current.alternate == null) { + return true; + } + } + current = trailingStatement(current); + } while (current); - var _identity = function _identity(x) { - return x; - }; + return false; + } - var _isArguments = function () { - var toString = Object.prototype.toString; - return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) { - return toString.call(x) === '[object Arguments]'; - } : function _isArguments(x) { - return _has('callee', x); - }; - }(); + module.exports = { + isExpression: isExpression, + isStatement: isStatement, + isIterationStatement: isIterationStatement, + isSourceElement: isSourceElement, + isProblematicIfStatement: isProblematicIfStatement, - /** - * Tests whether or not an object is an array. - * - * @private - * @param {*} val The object to test. - * @return {Boolean} `true` if `val` is an array, `false` otherwise. - * @example - * - * _isArray([]); //=> true - * _isArray(null); //=> false - * _isArray({}); //=> false - */ - var _isArray = Array.isArray || function _isArray(val) { - return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]'; + trailingStatement: trailingStatement }; + }()); + /* vim: set sw=4 ts=4 et tw=80 : */ - /** - * Determine if the passed argument is an integer. - * - * @private - * @param {*} n - * @category Type - * @return {Boolean} - */ - var _isInteger = Number.isInteger || function _isInteger(n) { - return n << 0 === n; - }; - var _isNumber = function _isNumber(x) { - return Object.prototype.toString.call(x) === '[object Number]'; - }; +/***/ }, +/* 17 */ +/***/ function(module, exports) { - var _isObject = function _isObject(x) { - return Object.prototype.toString.call(x) === '[object Object]'; - }; + /* + Copyright (C) 2013-2014 Yusuke Suzuki + Copyright (C) 2014 Ivan Nikulin - var _isPlaceholder = function _isPlaceholder(a) { - return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true; - }; + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: - var _isRegExp = function _isRegExp(x) { - return Object.prototype.toString.call(x) === '[object RegExp]'; - }; + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. - var _isString = function _isString(x) { - return Object.prototype.toString.call(x) === '[object String]'; - }; + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ - var _isTransformer = function _isTransformer(obj) { - return typeof obj['@@transducer/step'] === 'function'; - }; + (function () { + 'use strict'; - var _map = function _map(fn, functor) { - var idx = 0; - var len = functor.length; - var result = Array(len); - while (idx < len) { - result[idx] = fn(functor[idx]); - idx += 1; - } - return result; - }; + var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; - var _of = function _of(x) { - return [x]; + // See `tools/generate-identifier-regex.js`. + ES5Regex = { + // ECMAScript 5.1/Unicode v7.0.0 NonAsciiIdentifierStart: + NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, + // ECMAScript 5.1/Unicode v7.0.0 NonAsciiIdentifierPart: + NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ }; - var _pipe = function _pipe(f, g) { - return function () { - return g.call(this, f.apply(this, arguments)); - }; + ES6Regex = { + // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierStart: + NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]/, + // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierPart: + NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDD0-\uDDDA\uDE00-\uDE11\uDE13-\uDE37\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF01-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ }; - var _pipeP = function _pipeP(f, g) { - return function () { - var ctx = this; - return f.apply(ctx, arguments).then(function (x) { - return g.call(ctx, x); - }); - }; - }; + function isDecimalDigit(ch) { + return 0x30 <= ch && ch <= 0x39; // 0..9 + } - // \b matches word boundary; [\b] matches backspace - var _quote = function _quote(s) { - var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace - .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0'); - return '"' + escaped.replace(/"/g, '\\"') + '"'; - }; + function isHexDigit(ch) { + return 0x30 <= ch && ch <= 0x39 || // 0..9 + 0x61 <= ch && ch <= 0x66 || // a..f + 0x41 <= ch && ch <= 0x46; // A..F + } - var _reduced = function _reduced(x) { - return x && x['@@transducer/reduced'] ? x : { - '@@transducer/value': x, - '@@transducer/reduced': true - }; - }; + function isOctalDigit(ch) { + return ch >= 0x30 && ch <= 0x37; // 0..7 + } - /** - * An optimized, private array `slice` implementation. - * - * @private - * @param {Arguments|Array} args The array or arguments object to consider. - * @param {Number} [from=0] The array index to slice from, inclusive. - * @param {Number} [to=args.length] The array index to slice to, exclusive. - * @return {Array} A new, sliced array. - * @example - * - * _slice([1, 2, 3, 4, 5], 1, 3); //=> [2, 3] - * - * var firstThreeArgs = function(a, b, c, d) { - * return _slice(arguments, 0, 3); - * }; - * firstThreeArgs(1, 2, 3, 4); //=> [1, 2, 3] - */ - var _slice = function _slice(args, from, to) { - switch (arguments.length) { - case 1: - return _slice(args, 0, args.length); - case 2: - return _slice(args, from, args.length); - default: - var list = []; - var idx = 0; - var len = Math.max(0, Math.min(args.length, to) - from); - while (idx < len) { - list[idx] = args[from + idx]; - idx += 1; - } - return list; - } - }; + // 7.2 White Space - /** - * Polyfill from . - */ - var _toISOString = function () { - var pad = function pad(n) { - return (n < 10 ? '0' : '') + n; - }; - return typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) { - return d.toISOString(); - } : function _toISOString(d) { - return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'; - }; - }(); + NON_ASCII_WHITESPACES = [ + 0x1680, 0x180E, + 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, + 0x202F, 0x205F, + 0x3000, + 0xFEFF + ]; - var _xfBase = { - init: function () { - return this.xf['@@transducer/init'](); - }, - result: function (result) { - return this.xf['@@transducer/result'](result); - } - }; + function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || + ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; + } - var _xwrap = function () { - function XWrap(fn) { - this.f = fn; - } - XWrap.prototype['@@transducer/init'] = function () { - throw new Error('init not implemented on XWrap'); - }; - XWrap.prototype['@@transducer/result'] = function (acc) { - return acc; - }; - XWrap.prototype['@@transducer/step'] = function (acc, x) { - return this.f(acc, x); - }; - return function _xwrap(fn) { - return new XWrap(fn); - }; - }(); + // 7.3 Line Terminators - var _aperture = function _aperture(n, list) { - var idx = 0; - var limit = list.length - (n - 1); - var acc = new Array(limit >= 0 ? limit : 0); - while (idx < limit) { - acc[idx] = _slice(list, idx, idx + n); - idx += 1; - } - return acc; - }; + function isLineTerminator(ch) { + return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029; + } - /** - * Similar to hasMethod, this checks whether a function has a [methodname] - * function. If it isn't an array it will execute that function otherwise it - * will default to the ramda implementation. - * - * @private - * @param {Function} fn ramda implemtation - * @param {String} methodname property to check for a custom implementation - * @return {Object} Whatever the return value of the method is. - */ - var _checkForMethod = function _checkForMethod(methodname, fn) { - return function () { - var length = arguments.length; - if (length === 0) { - return fn(); - } - var obj = arguments[length - 1]; - return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, _slice(arguments, 0, length - 1)); - }; - }; + // 7.6 Identifier Names and Identifiers - /** - * Optimized internal one-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ - var _curry1 = function _curry1(fn) { - return function f1(a) { - if (arguments.length === 0 || _isPlaceholder(a)) { - return f1; - } else { - return fn.apply(this, arguments); - } - }; - }; + function fromCodePoint(cp) { + if (cp <= 0xFFFF) { return String.fromCharCode(cp); } + var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); + var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00); + return cu1 + cu2; + } - /** - * Optimized internal two-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ - var _curry2 = function _curry2(fn) { - return function f2(a, b) { - switch (arguments.length) { - case 0: - return f2; - case 1: - return _isPlaceholder(a) ? f2 : _curry1(function (_b) { - return fn(a, _b); - }); - default: - return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) { - return fn(_a, b); - }) : _isPlaceholder(b) ? _curry1(function (_b) { - return fn(a, _b); - }) : fn(a, b); - } - }; - }; + IDENTIFIER_START = new Array(0x80); + for(ch = 0; ch < 0x80; ++ch) { + IDENTIFIER_START[ch] = + ch >= 0x61 && ch <= 0x7A || // a..z + ch >= 0x41 && ch <= 0x5A || // A..Z + ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) + } - /** - * Optimized internal three-arity curry function. - * - * @private - * @category Function - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ - var _curry3 = function _curry3(fn) { - return function f3(a, b, c) { - switch (arguments.length) { - case 0: - return f3; - case 1: - return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) { - return fn(a, _b, _c); - }); - case 2: - return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) { - return fn(_a, b, _c); - }) : _isPlaceholder(b) ? _curry2(function (_b, _c) { - return fn(a, _b, _c); - }) : _curry1(function (_c) { - return fn(a, b, _c); - }); - default: - return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) { - return fn(_a, _b, c); - }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) { - return fn(_a, b, _c); - }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) { - return fn(a, _b, _c); - }) : _isPlaceholder(a) ? _curry1(function (_a) { - return fn(_a, b, c); - }) : _isPlaceholder(b) ? _curry1(function (_b) { - return fn(a, _b, c); - }) : _isPlaceholder(c) ? _curry1(function (_c) { - return fn(a, b, _c); - }) : fn(a, b, c); - } - }; - }; + IDENTIFIER_PART = new Array(0x80); + for(ch = 0; ch < 0x80; ++ch) { + IDENTIFIER_PART[ch] = + ch >= 0x61 && ch <= 0x7A || // a..z + ch >= 0x41 && ch <= 0x5A || // A..Z + ch >= 0x30 && ch <= 0x39 || // 0..9 + ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) + } - /** - * Internal curryN function. - * - * @private - * @category Function - * @param {Number} length The arity of the curried function. - * @param {Array} received An array of arguments received thus far. - * @param {Function} fn The function to curry. - * @return {Function} The curried function. - */ - var _curryN = function _curryN(length, received, fn) { - return function () { - var combined = []; - var argsIdx = 0; - var left = length; - var combinedIdx = 0; - while (combinedIdx < received.length || argsIdx < arguments.length) { - var result; - if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) { - result = received[combinedIdx]; - } else { - result = arguments[argsIdx]; - argsIdx += 1; - } - combined[combinedIdx] = result; - if (!_isPlaceholder(result)) { - left -= 1; - } - combinedIdx += 1; - } - return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn)); - }; - }; + function isIdentifierStartES5(ch) { + return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); + } - /** - * Returns a function that dispatches with different strategies based on the - * object in list position (last argument). If it is an array, executes [fn]. - * Otherwise, if it has a function with [methodname], it will execute that - * function (functor case). Otherwise, if it is a transformer, uses transducer - * [xf] to return a new transformer (transducer case). Otherwise, it will - * default to executing [fn]. - * - * @private - * @param {String} methodname property to check for a custom implementation - * @param {Function} xf transducer to initialize if object is transformer - * @param {Function} fn default ramda implementation - * @return {Function} A function that dispatches on object in list position - */ - var _dispatchable = function _dispatchable(methodname, xf, fn) { - return function () { - var length = arguments.length; - if (length === 0) { - return fn(); - } - var obj = arguments[length - 1]; - if (!_isArray(obj)) { - var args = _slice(arguments, 0, length - 1); - if (typeof obj[methodname] === 'function') { - return obj[methodname].apply(obj, args); - } - if (_isTransformer(obj)) { - var transducer = xf.apply(null, args); - return transducer(obj); - } - } - return fn.apply(this, arguments); - }; - }; + function isIdentifierPartES5(ch) { + return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); + } - var _dropLastWhile = function dropLastWhile(pred, list) { - var idx = list.length - 1; - while (idx >= 0 && pred(list[idx])) { - idx -= 1; - } - return _slice(list, 0, idx + 1); + function isIdentifierStartES6(ch) { + return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); + } + + function isIdentifierPartES6(ch) { + return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); + } + + module.exports = { + isDecimalDigit: isDecimalDigit, + isHexDigit: isHexDigit, + isOctalDigit: isOctalDigit, + isWhiteSpace: isWhiteSpace, + isLineTerminator: isLineTerminator, + isIdentifierStartES5: isIdentifierStartES5, + isIdentifierPartES5: isIdentifierPartES5, + isIdentifierStartES6: isIdentifierStartES6, + isIdentifierPartES6: isIdentifierPartES6 }; + }()); + /* vim: set sw=4 ts=4 et tw=80 : */ - var _xall = function () { - function XAll(f, xf) { - this.xf = xf; - this.f = f; - this.all = true; - } - XAll.prototype['@@transducer/init'] = _xfBase.init; - XAll.prototype['@@transducer/result'] = function (result) { - if (this.all) { - result = this.xf['@@transducer/step'](result, true); - } - return this.xf['@@transducer/result'](result); - }; - XAll.prototype['@@transducer/step'] = function (result, input) { - if (!this.f(input)) { - this.all = false; - result = _reduced(this.xf['@@transducer/step'](result, false)); - } - return result; - }; - return _curry2(function _xall(f, xf) { - return new XAll(f, xf); - }); - }(); - var _xany = function () { - function XAny(f, xf) { - this.xf = xf; - this.f = f; - this.any = false; - } - XAny.prototype['@@transducer/init'] = _xfBase.init; - XAny.prototype['@@transducer/result'] = function (result) { - if (!this.any) { - result = this.xf['@@transducer/step'](result, false); - } - return this.xf['@@transducer/result'](result); - }; - XAny.prototype['@@transducer/step'] = function (result, input) { - if (this.f(input)) { - this.any = true; - result = _reduced(this.xf['@@transducer/step'](result, true)); - } - return result; - }; - return _curry2(function _xany(f, xf) { - return new XAny(f, xf); - }); - }(); +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { - var _xaperture = function () { - function XAperture(n, xf) { - this.xf = xf; - this.pos = 0; - this.full = false; - this.acc = new Array(n); - } - XAperture.prototype['@@transducer/init'] = _xfBase.init; - XAperture.prototype['@@transducer/result'] = function (result) { - this.acc = null; - return this.xf['@@transducer/result'](result); - }; - XAperture.prototype['@@transducer/step'] = function (result, input) { - this.store(input); - return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result; - }; - XAperture.prototype.store = function (input) { - this.acc[this.pos] = input; - this.pos += 1; - if (this.pos === this.acc.length) { - this.pos = 0; - this.full = true; - } - }; - XAperture.prototype.getCopy = function () { - return _concat(_slice(this.acc, this.pos), _slice(this.acc, 0, this.pos)); - }; - return _curry2(function _xaperture(n, xf) { - return new XAperture(n, xf); - }); - }(); + /* + Copyright (C) 2013 Yusuke Suzuki - var _xdrop = function () { - function XDrop(n, xf) { - this.xf = xf; - this.n = n; - } - XDrop.prototype['@@transducer/init'] = _xfBase.init; - XDrop.prototype['@@transducer/result'] = _xfBase.result; - XDrop.prototype['@@transducer/step'] = function (result, input) { - if (this.n > 0) { - this.n -= 1; - return result; - } - return this.xf['@@transducer/step'](result, input); - }; - return _curry2(function _xdrop(n, xf) { - return new XDrop(n, xf); - }); - }(); + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: - var _xdropLast = function () { - function XDropLast(n, xf) { - this.xf = xf; - this.pos = 0; - this.full = false; - this.acc = new Array(n); + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function () { + 'use strict'; + + var code = __webpack_require__(17); + + function isStrictModeReservedWordES6(id) { + switch (id) { + case 'implements': + case 'interface': + case 'package': + case 'private': + case 'protected': + case 'public': + case 'static': + case 'let': + return true; + default: + return false; } - XDropLast.prototype['@@transducer/init'] = _xfBase.init; - XDropLast.prototype['@@transducer/result'] = function (result) { - this.acc = null; - return this.xf['@@transducer/result'](result); - }; - XDropLast.prototype['@@transducer/step'] = function (result, input) { - if (this.full) { - result = this.xf['@@transducer/step'](result, this.acc[this.pos]); - } - this.store(input); - return result; - }; - XDropLast.prototype.store = function (input) { - this.acc[this.pos] = input; - this.pos += 1; - if (this.pos === this.acc.length) { - this.pos = 0; - this.full = true; - } - }; - return _curry2(function _xdropLast(n, xf) { - return new XDropLast(n, xf); - }); - }(); + } - var _xdropRepeatsWith = function () { - function XDropRepeatsWith(pred, xf) { - this.xf = xf; - this.pred = pred; - this.lastValue = undefined; - this.seenFirstValue = false; + function isKeywordES5(id, strict) { + // yield should not be treated as keyword under non-strict mode. + if (!strict && id === 'yield') { + return false; } - XDropRepeatsWith.prototype['@@transducer/init'] = function () { - return this.xf['@@transducer/init'](); - }; - XDropRepeatsWith.prototype['@@transducer/result'] = function (result) { - return this.xf['@@transducer/result'](result); - }; - XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) { - var sameAsLast = false; - if (!this.seenFirstValue) { - this.seenFirstValue = true; - } else if (this.pred(this.lastValue, input)) { - sameAsLast = true; - } - this.lastValue = input; - return sameAsLast ? result : this.xf['@@transducer/step'](result, input); - }; - return _curry2(function _xdropRepeatsWith(pred, xf) { - return new XDropRepeatsWith(pred, xf); - }); - }(); + return isKeywordES6(id, strict); + } - var _xdropWhile = function () { - function XDropWhile(f, xf) { - this.xf = xf; - this.f = f; + function isKeywordES6(id, strict) { + if (strict && isStrictModeReservedWordES6(id)) { + return true; } - XDropWhile.prototype['@@transducer/init'] = _xfBase.init; - XDropWhile.prototype['@@transducer/result'] = _xfBase.result; - XDropWhile.prototype['@@transducer/step'] = function (result, input) { - if (this.f) { - if (this.f(input)) { - return result; - } - this.f = null; - } - return this.xf['@@transducer/step'](result, input); - }; - return _curry2(function _xdropWhile(f, xf) { - return new XDropWhile(f, xf); - }); - }(); - var _xfilter = function () { - function XFilter(f, xf) { - this.xf = xf; - this.f = f; + switch (id.length) { + case 2: + return (id === 'if') || (id === 'in') || (id === 'do'); + case 3: + return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try'); + case 4: + return (id === 'this') || (id === 'else') || (id === 'case') || + (id === 'void') || (id === 'with') || (id === 'enum'); + case 5: + return (id === 'while') || (id === 'break') || (id === 'catch') || + (id === 'throw') || (id === 'const') || (id === 'yield') || + (id === 'class') || (id === 'super'); + case 6: + return (id === 'return') || (id === 'typeof') || (id === 'delete') || + (id === 'switch') || (id === 'export') || (id === 'import'); + case 7: + return (id === 'default') || (id === 'finally') || (id === 'extends'); + case 8: + return (id === 'function') || (id === 'continue') || (id === 'debugger'); + case 10: + return (id === 'instanceof'); + default: + return false; } - XFilter.prototype['@@transducer/init'] = _xfBase.init; - XFilter.prototype['@@transducer/result'] = _xfBase.result; - XFilter.prototype['@@transducer/step'] = function (result, input) { - return this.f(input) ? this.xf['@@transducer/step'](result, input) : result; - }; - return _curry2(function _xfilter(f, xf) { - return new XFilter(f, xf); - }); - }(); + } - var _xfind = function () { - function XFind(f, xf) { - this.xf = xf; - this.f = f; - this.found = false; + function isReservedWordES5(id, strict) { + return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); + } + + function isReservedWordES6(id, strict) { + return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); + } + + function isRestrictedWord(id) { + return id === 'eval' || id === 'arguments'; + } + + function isIdentifierNameES5(id) { + var i, iz, ch; + + if (id.length === 0) { return false; } + + ch = id.charCodeAt(0); + if (!code.isIdentifierStartES5(ch)) { + return false; } - XFind.prototype['@@transducer/init'] = _xfBase.init; - XFind.prototype['@@transducer/result'] = function (result) { - if (!this.found) { - result = this.xf['@@transducer/step'](result, void 0); - } - return this.xf['@@transducer/result'](result); - }; - XFind.prototype['@@transducer/step'] = function (result, input) { - if (this.f(input)) { - this.found = true; - result = _reduced(this.xf['@@transducer/step'](result, input)); - } - return result; - }; - return _curry2(function _xfind(f, xf) { - return new XFind(f, xf); - }); - }(); - var _xfindIndex = function () { - function XFindIndex(f, xf) { - this.xf = xf; - this.f = f; - this.idx = -1; - this.found = false; + for (i = 1, iz = id.length; i < iz; ++i) { + ch = id.charCodeAt(i); + if (!code.isIdentifierPartES5(ch)) { + return false; + } } - XFindIndex.prototype['@@transducer/init'] = _xfBase.init; - XFindIndex.prototype['@@transducer/result'] = function (result) { - if (!this.found) { - result = this.xf['@@transducer/step'](result, -1); + return true; + } + + function decodeUtf16(lead, trail) { + return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; + } + + function isIdentifierNameES6(id) { + var i, iz, ch, lowCh, check; + + if (id.length === 0) { return false; } + + check = code.isIdentifierStartES6; + for (i = 0, iz = id.length; i < iz; ++i) { + ch = id.charCodeAt(i); + if (0xD800 <= ch && ch <= 0xDBFF) { + ++i; + if (i >= iz) { return false; } + lowCh = id.charCodeAt(i); + if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) { + return false; + } + ch = decodeUtf16(ch, lowCh); } - return this.xf['@@transducer/result'](result); - }; - XFindIndex.prototype['@@transducer/step'] = function (result, input) { - this.idx += 1; - if (this.f(input)) { - this.found = true; - result = _reduced(this.xf['@@transducer/step'](result, this.idx)); + if (!check(ch)) { + return false; } - return result; - }; - return _curry2(function _xfindIndex(f, xf) { - return new XFindIndex(f, xf); - }); - }(); - - var _xfindLast = function () { - function XFindLast(f, xf) { - this.xf = xf; - this.f = f; + check = code.isIdentifierPartES6; } - XFindLast.prototype['@@transducer/init'] = _xfBase.init; - XFindLast.prototype['@@transducer/result'] = function (result) { - return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last)); - }; - XFindLast.prototype['@@transducer/step'] = function (result, input) { - if (this.f(input)) { - this.last = input; - } - return result; - }; - return _curry2(function _xfindLast(f, xf) { - return new XFindLast(f, xf); - }); - }(); + return true; + } - var _xfindLastIndex = function () { - function XFindLastIndex(f, xf) { - this.xf = xf; - this.f = f; - this.idx = -1; - this.lastIdx = -1; - } - XFindLastIndex.prototype['@@transducer/init'] = _xfBase.init; - XFindLastIndex.prototype['@@transducer/result'] = function (result) { - return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx)); - }; - XFindLastIndex.prototype['@@transducer/step'] = function (result, input) { - this.idx += 1; - if (this.f(input)) { - this.lastIdx = this.idx; - } - return result; - }; - return _curry2(function _xfindLastIndex(f, xf) { - return new XFindLastIndex(f, xf); - }); - }(); + function isIdentifierES5(id, strict) { + return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); + } - var _xmap = function () { - function XMap(f, xf) { - this.xf = xf; - this.f = f; - } - XMap.prototype['@@transducer/init'] = _xfBase.init; - XMap.prototype['@@transducer/result'] = _xfBase.result; - XMap.prototype['@@transducer/step'] = function (result, input) { - return this.xf['@@transducer/step'](result, this.f(input)); - }; - return _curry2(function _xmap(f, xf) { - return new XMap(f, xf); - }); - }(); + function isIdentifierES6(id, strict) { + return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); + } - var _xtake = function () { - function XTake(n, xf) { - this.xf = xf; - this.n = n; - } - XTake.prototype['@@transducer/init'] = _xfBase.init; - XTake.prototype['@@transducer/result'] = _xfBase.result; - XTake.prototype['@@transducer/step'] = function (result, input) { - if (this.n === 0) { - return _reduced(result); - } else { - this.n -= 1; - return this.xf['@@transducer/step'](result, input); - } - }; - return _curry2(function _xtake(n, xf) { - return new XTake(n, xf); - }); - }(); + module.exports = { + isKeywordES5: isKeywordES5, + isKeywordES6: isKeywordES6, + isReservedWordES5: isReservedWordES5, + isReservedWordES6: isReservedWordES6, + isRestrictedWord: isRestrictedWord, + isIdentifierNameES5: isIdentifierNameES5, + isIdentifierNameES6: isIdentifierNameES6, + isIdentifierES5: isIdentifierES5, + isIdentifierES6: isIdentifierES6 + }; + }()); + /* vim: set sw=4 ts=4 et tw=80 : */ - var _xtakeWhile = function () { - function XTakeWhile(f, xf) { - this.xf = xf; - this.f = f; - } - XTakeWhile.prototype['@@transducer/init'] = _xfBase.init; - XTakeWhile.prototype['@@transducer/result'] = _xfBase.result; - XTakeWhile.prototype['@@transducer/step'] = function (result, input) { - return this.f(input) ? this.xf['@@transducer/step'](result, input) : _reduced(result); - }; - return _curry2(function _xtakeWhile(f, xf) { - return new XTakeWhile(f, xf); - }); - }(); - /** - * Adds two numbers. Equivalent to `a + b` but curried. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a - * @param {Number} b - * @return {Number} - * @see R.subtract - * @example - * - * R.add(2, 3); //=> 5 - * R.add(7)(10); //=> 17 - */ - var add = _curry2(function add(a, b) { - return a + b; - }); +/***/ }, +/* 19 */ +/***/ function(module, exports) { - /** - * Applies a function to the value at the given index of an array, returning a - * new copy of the array with the element at the given index replaced with the - * result of the function application. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig (a -> a) -> Number -> [a] -> [a] - * @param {Function} fn The function to apply. - * @param {Number} idx The index. - * @param {Array|Arguments} list An array-like object whose value - * at the supplied index will be replaced. - * @return {Array} A copy of the supplied array-like object with - * the element at index `idx` replaced with the value - * returned by applying `fn` to the existing element. - * @see R.update - * @example - * - * R.adjust(R.add(10), 1, [0, 1, 2]); //=> [0, 11, 2] - * R.adjust(R.add(10))(1)([0, 1, 2]); //=> [0, 11, 2] - */ - var adjust = _curry3(function adjust(fn, idx, list) { - if (idx >= list.length || idx < -list.length) { - return list; - } - var start = idx < 0 ? list.length : 0; - var _idx = start + idx; - var _list = _concat(list); - _list[_idx] = fn(list[_idx]); - return _list; - }); + "use strict"; - /** - * Returns `true` if all elements of the list match the predicate, `false` if - * there are any that don't. - * - * Dispatches to the `all` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is satisfied by every element, `false` - * otherwise. - * @see R.any, R.none, R.transduce - * @example - * - * var lessThan2 = R.flip(R.lt)(2); - * var lessThan3 = R.flip(R.lt)(3); - * R.all(lessThan2)([1, 2]); //=> false - * R.all(lessThan3)([1, 2]); //=> true - */ - var all = _curry2(_dispatchable('all', _xall, function all(fn, list) { - var idx = 0; - while (idx < list.length) { - if (!fn(list[idx])) { - return false; - } - idx += 1; - } - return true; - })); + 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; }; }(); - /** - * Returns a function that always returns the given value. Note that for - * non-primitives the value returned is a reference to the original value. - * - * This function is known as `const`, `constant`, or `K` (for K combinator) in - * other languages and libraries. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig a -> (* -> a) - * @param {*} val The value to wrap in a function - * @return {Function} A Function :: * -> val. - * @example - * - * var t = R.always('Tee'); - * t(); //=> 'Tee' - */ - var always = _curry1(function always(val) { - return function () { - return val; - }; - }); + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.getPrecedence = getPrecedence; + exports.escapeStringLiteral = escapeStringLiteral; - /** - * Returns `true` if both arguments are `true`; `false` otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig * -> * -> * - * @param {Boolean} a A boolean value - * @param {Boolean} b A boolean value - * @return {Boolean} `true` if both arguments are `true`, `false` otherwise - * @see R.both - * @example - * - * R.and(true, true); //=> true - * R.and(true, false); //=> false - * R.and(false, true); //=> false - * R.and(false, false); //=> false - */ - var and = _curry2(function and(a, b) { - return a && b; - }); + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - /** - * Returns `true` if at least one of elements of the list match the predicate, - * `false` otherwise. - * - * Dispatches to the `any` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false` - * otherwise. - * @see R.all, R.none, R.transduce - * @example - * - * var lessThan0 = R.flip(R.lt)(0); - * var lessThan2 = R.flip(R.lt)(2); - * R.any(lessThan0)([1, 2]); //=> false - * R.any(lessThan2)([1, 2]); //=> true - */ - var any = _curry2(_dispatchable('any', _xany, function any(fn, list) { - var idx = 0; - while (idx < list.length) { - if (fn(list[idx])) { - return true; - } - idx += 1; - } - return false; - })); + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - /** - * Returns a new list, composed of n-tuples of consecutive elements If `n` is - * greater than the length of the list, an empty list is returned. - * - * Dispatches to the `aperture` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category List - * @sig Number -> [a] -> [[a]] - * @param {Number} n The size of the tuples to create - * @param {Array} list The list to split into `n`-tuples - * @return {Array} The new list. - * @see R.transduce - * @example - * - * R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]] - * R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]] - * R.aperture(7, [1, 2, 3, 4, 5]); //=> [] - */ - var aperture = _curry2(_dispatchable('aperture', _xaperture, _aperture)); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - /** - * Returns a new list containing the contents of the given list, followed by - * the given element. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> [a] - * @param {*} el The element to add to the end of the new list. - * @param {Array} list The list whose contents will be added to the beginning of the output - * list. - * @return {Array} A new list containing the contents of the old list followed by `el`. - * @see R.prepend - * @example - * - * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests'] - * R.append('tests', []); //=> ['tests'] - * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']] - */ - var append = _curry2(function append(el, list) { - return _concat(list, [el]); - }); + var Precedence = { + Sequence: 0, + Yield: 1, + Assignment: 1, + Conditional: 2, + ArrowFunction: 2, + LogicalOR: 3, + LogicalAND: 4, + BitwiseOR: 5, + BitwiseXOR: 6, + BitwiseAND: 7, + Equality: 8, + Relational: 9, + BitwiseSHIFT: 10, + Additive: 11, + Multiplicative: 12, + Prefix: 13, + Postfix: 14, + New: 15, + Call: 16, + TaggedTemplate: 17, + Member: 18, + Primary: 19 + }; - /** - * Applies function `fn` to the argument list `args`. This is useful for - * creating a fixed-arity function from a variadic function. `fn` should be a - * bound function if context is significant. - * - * @func - * @memberOf R - * @since v0.7.0 - * @category Function - * @sig (*... -> a) -> [*] -> a - * @param {Function} fn - * @param {Array} args - * @return {*} - * @see R.call, R.unapply - * @example - * - * var nums = [1, 2, 3, -99, 42, 6, 7]; - * R.apply(Math.max, nums); //=> 42 - */ - var apply = _curry2(function apply(fn, args) { - return fn.apply(this, args); - }); + exports.Precedence = Precedence; - /** - * Makes a shallow clone of an object, setting or overriding the specified - * property with the given value. Note that this copies and flattens prototype - * properties onto the new object as well. All non-primitive properties are - * copied by reference. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Object - * @sig String -> a -> {k: v} -> {k: v} - * @param {String} prop the property name to set - * @param {*} val the new value - * @param {Object} obj the object to clone - * @return {Object} a new object similar to the original except for the specified property. - * @see R.dissoc - * @example - * - * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3} - */ - var assoc = _curry3(function assoc(prop, val, obj) { - var result = {}; - for (var p in obj) { - result[p] = obj[p]; - } - result[prop] = val; - return result; - }); + var BinaryPrecedence = { + ",": Precedence.Sequence, + "||": Precedence.LogicalOR, + "&&": Precedence.LogicalAND, + "|": Precedence.BitwiseOR, + "^": Precedence.BitwiseXOR, + "&": Precedence.BitwiseAND, + "==": Precedence.Equality, + "!=": Precedence.Equality, + "===": Precedence.Equality, + "!==": Precedence.Equality, + "<": Precedence.Relational, + ">": Precedence.Relational, + "<=": Precedence.Relational, + ">=": Precedence.Relational, + "in": Precedence.Relational, + "instanceof": Precedence.Relational, + "<<": Precedence.BitwiseSHIFT, + ">>": Precedence.BitwiseSHIFT, + ">>>": Precedence.BitwiseSHIFT, + "+": Precedence.Additive, + "-": Precedence.Additive, + "*": Precedence.Multiplicative, + "%": Precedence.Multiplicative, + "/": Precedence.Multiplicative + }; - /** - * Makes a shallow clone of an object, setting or overriding the nodes required - * to create the given path, and placing the specific value at the tail end of - * that path. Note that this copies and flattens prototype properties onto the - * new object as well. All non-primitive properties are copied by reference. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Object - * @sig [String] -> a -> {k: v} -> {k: v} - * @param {Array} path the path to set - * @param {*} val the new value - * @param {Object} obj the object to clone - * @return {Object} a new object similar to the original except along the specified path. - * @see R.dissocPath - * @example - * - * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}} - */ - var assocPath = _curry3(function assocPath(path, val, obj) { - switch (path.length) { - case 0: - return val; - case 1: - return assoc(path[0], val, obj); + function getPrecedence(node) { + switch (node.type) { + case "ArrayExpression": + case "FunctionExpression": + case "IdentifierExpression": + case "LiteralBooleanExpression": + case "LiteralNullExpression": + case "LiteralNumericExpression": + case "LiteralInfinityExpression": + case "LiteralRegExpExpression": + case "LiteralStringExpression": + case "ObjectExpression": + case "ThisExpression": + return Precedence.Primary; + + case "ArrowExpression": + case "AssignmentExpression": + case "CompoundAssignmentExpression": + case "YieldExpression": + case "YieldGeneratorExpression": + return Precedence.Assignment; + + case "ConditionalExpression": + return Precedence.Conditional; + + case "ComputedMemberExpression": + case "StaticMemberExpression": + switch (node.object.type) { + case "CallExpression": + case "ComputedMemberExpression": + case "StaticMemberExpression": + case "TemplateExpression": + return getPrecedence(node.object); default: - return assoc(path[0], assocPath(_slice(path, 1), val, Object(obj[path[0]])), obj); - } - }); + return Precedence.Member; + } - /** - * Creates a function that is bound to a context. - * Note: `R.bind` does not provide the additional argument-binding capabilities of - * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). - * - * @func - * @memberOf R - * @since v0.6.0 - * @category Function - * @category Object - * @sig (* -> *) -> {*} -> (* -> *) - * @param {Function} fn The function to bind to context - * @param {Object} thisObj The context to bind `fn` to - * @return {Function} A function that will execute in the context of `thisObj`. - * @see R.partial - */ - var bind = _curry2(function bind(fn, thisObj) { - return _arity(fn.length, function () { - return fn.apply(thisObj, arguments); - }); - }); + case "TemplateExpression": + if (node.tag == null) return Precedence.Member; + switch (node.tag.type) { + case "CallExpression": + case "ComputedMemberExpression": + case "StaticMemberExpression": + case "TemplateExpression": + return getPrecedence(node.tag); + default: + return Precedence.Member; + } - /** - * A function wrapping calls to the two functions in an `&&` operation, - * returning the result of the first function if it is false-y and the result - * of the second function otherwise. Note that this is short-circuited, - * meaning that the second function will not be invoked if the first returns a - * false-y value. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category Logic - * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) - * @param {Function} f a predicate - * @param {Function} g another predicate - * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together. - * @see R.and - * @example - * - * var gt10 = x => x > 10; - * var even = x => x % 2 === 0; - * var f = R.both(gt10, even); - * f(100); //=> true - * f(101); //=> false - */ - var both = _curry2(function both(f, g) { - return function _both() { - return f.apply(this, arguments) && g.apply(this, arguments); - }; - }); + case "BinaryExpression": + return BinaryPrecedence[node.operator]; - /** - * Makes a comparator function out of a function that reports whether the first - * element is less than the second. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (a, b -> Boolean) -> (a, b -> Number) - * @param {Function} pred A predicate function of arity two. - * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`. - * @example - * - * var cmp = R.comparator((a, b) => a.age < b.age); - * var people = [ - * // ... - * ]; - * R.sort(cmp, people); - */ - var comparator = _curry1(function comparator(pred) { - return function (a, b) { - return pred(a, b) ? -1 : pred(b, a) ? 1 : 0; - }; - }); + case "CallExpression": + return Precedence.Call; + case "NewExpression": + return node.arguments.length === 0 ? Precedence.New : Precedence.Member; + case "UpdateExpression": + return node.isPrefix ? Precedence.Prefix : Precedence.Postfix; + case "UnaryExpression": + return Precedence.Prefix; + } + } - /** - * Returns a function, `fn`, which encapsulates if/else-if/else logic. - * `R.cond` takes a list of [predicate, transform] pairs. All of the arguments - * to `fn` are applied to each of the predicates in turn until one returns a - * "truthy" value, at which point `fn` returns the result of applying its - * arguments to the corresponding transformer. If none of the predicates - * matches, `fn` returns undefined. - * - * @func - * @memberOf R - * @since v0.6.0 - * @category Logic - * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *) - * @param {Array} pairs - * @return {Function} - * @example - * - * var fn = R.cond([ - * [R.equals(0), R.always('water freezes at 0°C')], - * [R.equals(100), R.always('water boils at 100°C')], - * [R.T, temp => 'nothing special happens at ' + temp + '°C'] - * ]); - * fn(0); //=> 'water freezes at 0°C' - * fn(50); //=> 'nothing special happens at 50°C' - * fn(100); //=> 'water boils at 100°C' - */ - var cond = _curry1(function cond(pairs) { - return function () { - var idx = 0; - while (idx < pairs.length) { - if (pairs[idx][0].apply(this, arguments)) { - return pairs[idx][1].apply(this, arguments); - } - idx += 1; - } - }; - }); + function escapeStringLiteral(stringValue) { + var result = ""; + var nSingle = 0, + nDouble = 0; + for (var i = 0, l = stringValue.length; i < l; ++i) { + var ch = stringValue[i]; + if (ch === "\"") { + ++nDouble; + } else if (ch === "'") { + ++nSingle; + } + } + var delim = nDouble > nSingle ? "'" : "\""; + result += delim; + for (var i = 0; i < stringValue.length; i++) { + var ch = stringValue.charAt(i); + switch (ch) { + case delim: + result += "\\" + delim; + break; + case "\b": + result += "\\b"; + break; + case "\t": + result += "\\t"; + break; + case "\n": + result += "\\n"; + break; + case "\u000b": + result += "\\v"; + break; + case "\f": + result += "\\f"; + break; + case "\r": + result += "\\r"; + break; + case "\\": + result += "\\\\"; + break; + case "\u2028": + result += "\\u2028"; + break; + case "\u2029": + result += "\\u2029"; + break; + default: + result += ch; + break; + } + } + result += delim; + return result; + } - /** - * Counts the elements of a list according to how many match each value of a - * key generated by the supplied function. Returns an object mapping the keys - * produced by `fn` to the number of occurrences in the list. Note that all - * keys are coerced to strings because of how JavaScript objects work. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig (a -> String) -> [a] -> {*} - * @param {Function} fn The function used to map values to keys. - * @param {Array} list The list to count elements from. - * @return {Object} An object mapping keys to number of occurrences in the list. - * @example - * - * var numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2]; - * var letters = R.split('', 'abcABCaaaBBc'); - * R.countBy(Math.floor)(numbers); //=> {'1': 3, '2': 2, '3': 1} - * R.countBy(R.toLower)(letters); //=> {'a': 5, 'b': 4, 'c': 3} - */ - var countBy = _curry2(function countBy(fn, list) { - var counts = {}; - var len = list.length; - var idx = 0; - while (idx < len) { - var key = fn(list[idx]); - counts[key] = (_has(key, counts) ? counts[key] : 0) + 1; - idx += 1; - } - return counts; - }); + var CodeRep = exports.CodeRep = function () { + function CodeRep() { + _classCallCheck(this, CodeRep); - /** - * Returns a curried equivalent of the provided function, with the specified - * arity. The curried function has two unusual capabilities. First, its - * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the - * following are equivalent: - * - * - `g(1)(2)(3)` - * - `g(1)(2, 3)` - * - `g(1, 2)(3)` - * - `g(1, 2, 3)` - * - * Secondly, the special placeholder value `R.__` may be used to specify - * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is `R.__`, the - * following are equivalent: - * - * - `g(1, 2, 3)` - * - `g(_, 2, 3)(1)` - * - `g(_, _, 3)(1)(2)` - * - `g(_, _, 3)(1, 2)` - * - `g(_, 2)(1)(3)` - * - `g(_, 2)(1, 3)` - * - `g(_, 2)(_, 3)(1)` - * - * @func - * @memberOf R - * @since v0.5.0 - * @category Function - * @sig Number -> (* -> a) -> (* -> a) - * @param {Number} length The arity for the returned function. - * @param {Function} fn The function to curry. - * @return {Function} A new, curried function. - * @see R.curry - * @example - * - * var sumArgs = (...args) => R.sum(args); - * - * var curriedAddFourNumbers = R.curryN(4, sumArgs); - * var f = curriedAddFourNumbers(1, 2); - * var g = f(3); - * g(4); //=> 10 - */ - var curryN = _curry2(function curryN(length, fn) { - if (length === 1) { - return _curry1(fn); - } - return _arity(length, _curryN(length, [], fn)); - }); + this.containsIn = false; + this.containsGroup = false; + // restricted lookaheads: {, function, class, let, let [ + this.startsWithCurly = false; + this.startsWithFunctionOrClass = false; + this.startsWithLet = false; + this.startsWithLetSquareBracket = false; + this.endsWithMissingElse = false; + } - /** - * Decrements its argument. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Math - * @sig Number -> Number - * @param {Number} n - * @return {Number} - * @see R.inc - * @example - * - * R.dec(42); //=> 41 - */ - var dec = add(-1); + _createClass(CodeRep, [{ + key: "forEach", + value: function forEach(f) { + // Call a function on every CodeRep represented by this node. Always calls f on a node and then its children, so if you're careful you can modify a node's children online. + f(this); + } + }]); - /** - * Returns the second argument if it is not `null`, `undefined` or `NaN` - * otherwise the first argument is returned. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category Logic - * @sig a -> b -> a | b - * @param {a} val The default value. - * @param {b} val The value to return if it is not null or undefined - * @return {*} The the second value or the default value - * @example - * - * var defaultTo42 = R.defaultTo(42); - * - * defaultTo42(null); //=> 42 - * defaultTo42(undefined); //=> 42 - * defaultTo42('Ramda'); //=> 'Ramda' - * defaultTo42(parseInt('string')); //=> 42 - */ - var defaultTo = _curry2(function defaultTo(d, v) { - return v == null || v !== v ? d : v; - }); + return CodeRep; + }(); - /** - * Finds the set (i.e. no duplicates) of all elements in the first list not - * contained in the second list. Duplication is determined according to the - * value returned by applying the supplied predicate to two list elements. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig (a -> a -> Boolean) -> [*] -> [*] -> [*] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` that are not in `list2`. - * @see R.difference - * @example - * - * function cmp(x, y) => x.a === y.a; - * var l1 = [{a: 1}, {a: 2}, {a: 3}]; - * var l2 = [{a: 3}, {a: 4}]; - * R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}] - */ - var differenceWith = _curry3(function differenceWith(pred, first, second) { - var out = []; - var idx = 0; - var firstLen = first.length; - while (idx < firstLen) { - if (!_containsWith(pred, first[idx], second) && !_containsWith(pred, first[idx], out)) { - out.push(first[idx]); - } - idx += 1; - } - return out; - }); + var Empty = exports.Empty = function (_CodeRep) { + _inherits(Empty, _CodeRep); - /** - * Returns a new object that does not contain a `prop` property. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category Object - * @sig String -> {k: v} -> {k: v} - * @param {String} prop the name of the property to dissociate - * @param {Object} obj the object to clone - * @return {Object} a new object similar to the original but without the specified property - * @see R.assoc - * @example - * - * R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3} - */ - var dissoc = _curry2(function dissoc(prop, obj) { - var result = {}; - for (var p in obj) { - if (p !== prop) { - result[p] = obj[p]; - } - } - return result; - }); + function Empty() { + _classCallCheck(this, Empty); - /** - * Makes a shallow clone of an object, omitting the property at the given path. - * Note that this copies and flattens prototype properties onto the new object - * as well. All non-primitive properties are copied by reference. - * - * @func - * @memberOf R - * @since v0.11.0 - * @category Object - * @sig [String] -> {k: v} -> {k: v} - * @param {Array} path the path to set - * @param {Object} obj the object to clone - * @return {Object} a new object without the property at path - * @see R.assocPath - * @example - * - * R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}} - */ - var dissocPath = _curry2(function dissocPath(path, obj) { - switch (path.length) { - case 0: - return obj; - case 1: - return dissoc(path[0], obj); - default: - var head = path[0]; - var tail = _slice(path, 1); - return obj[head] == null ? obj : assoc(head, dissocPath(tail, obj[head]), obj); - } - }); + return _possibleConstructorReturn(this, Object.getPrototypeOf(Empty).call(this)); + } - /** - * Divides two numbers. Equivalent to `a / b`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The first value. - * @param {Number} b The second value. - * @return {Number} The result of `a / b`. - * @see R.multiply - * @example - * - * R.divide(71, 100); //=> 0.71 - * - * var half = R.divide(R.__, 2); - * half(42); //=> 21 - * - * var reciprocal = R.divide(1); - * reciprocal(4); //=> 0.25 - */ - var divide = _curry2(function divide(a, b) { - return a / b; - }); + _createClass(Empty, [{ + key: "emit", + value: function emit() {} + }]); - /** - * Returns a new list containing the last `n` elements of a given list, passing - * each value to the supplied predicate function, skipping elements while the - * predicate function returns `true`. The predicate function is passed one - * argument: *(value)*. - * - * Dispatches to the `dropWhile` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @param {Function} fn The function called per iteration. - * @param {Array} list The collection to iterate over. - * @return {Array} A new array. - * @see R.takeWhile, R.transduce, R.addIndex - * @example - * - * var lteTwo = x => x <= 2; - * - * R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1] - */ - var dropWhile = _curry2(_dispatchable('dropWhile', _xdropWhile, function dropWhile(pred, list) { - var idx = 0; - var len = list.length; - while (idx < len && pred(list[idx])) { - idx += 1; - } - return _slice(list, idx); - })); + return Empty; + }(CodeRep); - /** - * A function wrapping calls to the two functions in an `||` operation, - * returning the result of the first function if it is truth-y and the result - * of the second function otherwise. Note that this is short-circuited, - * meaning that the second function will not be invoked if the first returns a - * truth-y value. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category Logic - * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) - * @param {Function} f a predicate - * @param {Function} g another predicate - * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together. - * @see R.or - * @example - * - * var gt10 = x => x > 10; - * var even = x => x % 2 === 0; - * var f = R.either(gt10, even); - * f(101); //=> true - * f(8); //=> true - */ - var either = _curry2(function either(f, g) { - return function _either() { - return f.apply(this, arguments) || g.apply(this, arguments); - }; - }); + var Token = exports.Token = function (_CodeRep2) { + _inherits(Token, _CodeRep2); - /** - * Returns the empty value of its argument's type. Ramda defines the empty - * value of Array (`[]`), Object (`{}`), String (`''`), and Arguments. Other - * types are supported if they define `.empty` and/or - * `.prototype.empty`. - * - * Dispatches to the `empty` method of the first argument, if present. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category Function - * @sig a -> a - * @param {*} x - * @return {*} - * @example - * - * R.empty(Just(42)); //=> Nothing() - * R.empty([1, 2, 3]); //=> [] - * R.empty('unicorns'); //=> '' - * R.empty({x: 1, y: 2}); //=> {} - */ - // else - var empty = _curry1(function empty(x) { - return x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : _isArray(x) ? [] : _isString(x) ? '' : _isObject(x) ? {} : _isArguments(x) ? function () { - return arguments; - }() : // else - void 0; - }); + function Token(token) { + _classCallCheck(this, Token); - /** - * Creates a new object by recursively evolving a shallow copy of `object`, - * according to the `transformation` functions. All non-primitive properties - * are copied by reference. - * - * A `transformation` function will not be invoked if its corresponding key - * does not exist in the evolved object. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Object - * @sig {k: (v -> v)} -> {k: v} -> {k: v} - * @param {Object} transformations The object specifying transformation functions to apply - * to the object. - * @param {Object} object The object to be transformed. - * @return {Object} The transformed object. - * @example - * - * var tomato = {firstName: ' Tomato ', data: {elapsed: 100, remaining: 1400}, id:123}; - * var transformations = { - * firstName: R.trim, - * lastName: R.trim, // Will not get invoked. - * data: {elapsed: R.add(1), remaining: R.add(-1)} - * }; - * R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123} - */ - var evolve = _curry2(function evolve(transformations, object) { - var result = {}; - var transformation, key, type; - for (key in object) { - transformation = transformations[key]; - type = typeof transformation; - result[key] = type === 'function' ? transformation(object[key]) : type === 'object' ? evolve(transformations[key], object[key]) : object[key]; - } - return result; - }); + var _this2 = _possibleConstructorReturn(this, Object.getPrototypeOf(Token).call(this)); - /** - * Returns the first element of the list which matches the predicate, or - * `undefined` if no element matches. - * - * Dispatches to the `find` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> Boolean) -> [a] -> a | undefined - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Object} The element found, or `undefined`. - * @see R.transduce - * @example - * - * var xs = [{a: 1}, {a: 2}, {a: 3}]; - * R.find(R.propEq('a', 2))(xs); //=> {a: 2} - * R.find(R.propEq('a', 4))(xs); //=> undefined - */ - var find = _curry2(_dispatchable('find', _xfind, function find(fn, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (fn(list[idx])) { - return list[idx]; - } - idx += 1; - } - })); + _this2.token = token; + return _this2; + } - /** - * Returns the index of the first element of the list which matches the - * predicate, or `-1` if no element matches. - * - * Dispatches to the `findIndex` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> Boolean) -> [a] -> Number - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Number} The index of the element found, or `-1`. - * @see R.transduce - * @example - * - * var xs = [{a: 1}, {a: 2}, {a: 3}]; - * R.findIndex(R.propEq('a', 2))(xs); //=> 1 - * R.findIndex(R.propEq('a', 4))(xs); //=> -1 - */ - var findIndex = _curry2(_dispatchable('findIndex', _xfindIndex, function findIndex(fn, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - if (fn(list[idx])) { - return idx; - } - idx += 1; - } - return -1; - })); + _createClass(Token, [{ + key: "emit", + value: function emit(ts) { + ts.put(this.token); + } + }]); - /** - * Returns the last element of the list which matches the predicate, or - * `undefined` if no element matches. - * - * Dispatches to the `findLast` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> Boolean) -> [a] -> a | undefined - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Object} The element found, or `undefined`. - * @see R.transduce - * @example - * - * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; - * R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1} - * R.findLast(R.propEq('a', 4))(xs); //=> undefined - */ - var findLast = _curry2(_dispatchable('findLast', _xfindLast, function findLast(fn, list) { - var idx = list.length - 1; - while (idx >= 0) { - if (fn(list[idx])) { - return list[idx]; - } - idx -= 1; - } - })); + return Token; + }(CodeRep); - /** - * Returns the index of the last element of the list which matches the - * predicate, or `-1` if no element matches. - * - * Dispatches to the `findLastIndex` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> Boolean) -> [a] -> Number - * @param {Function} fn The predicate function used to determine if the element is the - * desired one. - * @param {Array} list The array to consider. - * @return {Number} The index of the element found, or `-1`. - * @see R.transduce - * @example - * - * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; - * R.findLastIndex(R.propEq('a', 1))(xs); //=> 1 - * R.findLastIndex(R.propEq('a', 4))(xs); //=> -1 - */ - var findLastIndex = _curry2(_dispatchable('findLastIndex', _xfindLastIndex, function findLastIndex(fn, list) { - var idx = list.length - 1; - while (idx >= 0) { - if (fn(list[idx])) { - return idx; - } - idx -= 1; - } - return -1; - })); + var NumberCodeRep = exports.NumberCodeRep = function (_CodeRep3) { + _inherits(NumberCodeRep, _CodeRep3); - /** - * Iterate over an input `list`, calling a provided function `fn` for each - * element in the list. - * - * `fn` receives one argument: *(value)*. - * - * Note: `R.forEach` does not skip deleted or unassigned indices (sparse - * arrays), unlike the native `Array.prototype.forEach` method. For more - * details on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description - * - * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns - * the original array. In some libraries this function is named `each`. - * - * Dispatches to the `forEach` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig (a -> *) -> [a] -> [a] - * @param {Function} fn The function to invoke. Receives one argument, `value`. - * @param {Array} list The list to iterate over. - * @return {Array} The original list. - * @see R.addIndex - * @example - * - * var printXPlusFive = x => console.log(x + 5); - * R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3] - * //-> 6 - * //-> 7 - * //-> 8 - */ - var forEach = _curry2(_checkForMethod('forEach', function forEach(fn, list) { - var len = list.length; - var idx = 0; - while (idx < len) { - fn(list[idx]); - idx += 1; - } - return list; - })); + function NumberCodeRep(number) { + _classCallCheck(this, NumberCodeRep); - /** - * Creates a new object out of a list key-value pairs. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category List - * @sig [[k,v]] -> {k: v} - * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object. - * @return {Object} The object made by pairing up `keys` and `values`. - * @see R.toPairs, R.pair - * @example - * - * R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3} - */ - var fromPairs = _curry1(function fromPairs(pairs) { - var idx = 0; - var len = pairs.length; - var out = {}; - while (idx < len) { - if (_isArray(pairs[idx]) && pairs[idx].length) { - out[pairs[idx][0]] = pairs[idx][1]; - } - idx += 1; - } - return out; - }); + var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(NumberCodeRep).call(this)); - /** - * Returns `true` if the first argument is greater than the second; `false` - * otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} - * @see R.lt - * @example - * - * R.gt(2, 1); //=> true - * R.gt(2, 2); //=> false - * R.gt(2, 3); //=> false - * R.gt('a', 'z'); //=> false - * R.gt('z', 'a'); //=> true - */ - var gt = _curry2(function gt(a, b) { - return a > b; - }); + _this3.number = number; + return _this3; + } - /** - * Returns `true` if the first argument is greater than or equal to the second; - * `false` otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {Number} a - * @param {Number} b - * @return {Boolean} - * @see R.lte - * @example - * - * R.gte(2, 1); //=> true - * R.gte(2, 2); //=> true - * R.gte(2, 3); //=> false - * R.gte('a', 'z'); //=> false - * R.gte('z', 'a'); //=> true - */ - var gte = _curry2(function gte(a, b) { - return a >= b; - }); + _createClass(NumberCodeRep, [{ + key: "emit", + value: function emit(ts) { + ts.putNumber(this.number); + } + }]); - /** - * Returns whether or not an object has an own property with the specified name - * - * @func - * @memberOf R - * @since v0.7.0 - * @category Object - * @sig s -> {s: x} -> Boolean - * @param {String} prop The name of the property to check for. - * @param {Object} obj The object to query. - * @return {Boolean} Whether the property exists. - * @example - * - * var hasName = R.has('name'); - * hasName({name: 'alice'}); //=> true - * hasName({name: 'bob'}); //=> true - * hasName({}); //=> false - * - * var point = {x: 0, y: 0}; - * var pointHas = R.has(R.__, point); - * pointHas('x'); //=> true - * pointHas('y'); //=> true - * pointHas('z'); //=> false - */ - var has = _curry2(_has); + return NumberCodeRep; + }(CodeRep); - /** - * Returns whether or not an object or its prototype chain has a property with - * the specified name - * - * @func - * @memberOf R - * @since v0.7.0 - * @category Object - * @sig s -> {s: x} -> Boolean - * @param {String} prop The name of the property to check for. - * @param {Object} obj The object to query. - * @return {Boolean} Whether the property exists. - * @example - * - * function Rectangle(width, height) { - * this.width = width; - * this.height = height; - * } - * Rectangle.prototype.area = function() { - * return this.width * this.height; - * }; - * - * var square = new Rectangle(2, 2); - * R.hasIn('width', square); //=> true - * R.hasIn('area', square); //=> true - */ - var hasIn = _curry2(function hasIn(prop, obj) { - return prop in obj; - }); + var Paren = exports.Paren = function (_CodeRep4) { + _inherits(Paren, _CodeRep4); - /** - * Returns true if its arguments are identical, false otherwise. Values are - * identical if they reference the same memory. `NaN` is identical to `NaN`; - * `0` and `-0` are not identical. - * - * @func - * @memberOf R - * @since v0.15.0 - * @category Relation - * @sig a -> a -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} - * @example - * - * var o = {}; - * R.identical(o, o); //=> true - * R.identical(1, 1); //=> true - * R.identical(1, '1'); //=> false - * R.identical([], []); //=> false - * R.identical(0, -0); //=> false - * R.identical(NaN, NaN); //=> true - */ - // SameValue algorithm - // Steps 1-5, 7-10 - // Steps 6.b-6.e: +0 != -0 - // Step 6.a: NaN == NaN - var identical = _curry2(function identical(a, b) { - // SameValue algorithm - if (a === b) { - // Steps 1-5, 7-10 - // Steps 6.b-6.e: +0 != -0 - return a !== 0 || 1 / a === 1 / b; - } else { - // Step 6.a: NaN == NaN - return a !== a && b !== b; - } - }); + function Paren(expr) { + _classCallCheck(this, Paren); - /** - * A function that does nothing but return the parameter supplied to it. Good - * as a default or placeholder function. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig a -> a - * @param {*} x The value to return. - * @return {*} The input value, `x`. - * @example - * - * R.identity(1); //=> 1 - * - * var obj = {}; - * R.identity(obj) === obj; //=> true - */ - var identity = _curry1(_identity); + var _this4 = _possibleConstructorReturn(this, Object.getPrototypeOf(Paren).call(this)); - /** - * Creates a function that will process either the `onTrue` or the `onFalse` - * function depending upon the result of the `condition` predicate. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Logic - * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *) - * @param {Function} condition A predicate function - * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value. - * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value. - * @return {Function} A new unary function that will process either the `onTrue` or the `onFalse` - * function depending upon the result of the `condition` predicate. - * @see R.unless, R.when - * @example - * - * var incCount = R.ifElse( - * R.has('count'), - * R.over(R.lensProp('count'), R.inc), - * R.assoc('count', 1) - * ); - * incCount({}); //=> { count: 1 } - * incCount({ count: 1 }); //=> { count: 2 } - */ - var ifElse = _curry3(function ifElse(condition, onTrue, onFalse) { - return curryN(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() { - return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments); - }); - }); + _this4.expr = expr; + return _this4; + } - /** - * Increments its argument. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Math - * @sig Number -> Number - * @param {Number} n - * @return {Number} - * @see R.dec - * @example - * - * R.inc(42); //=> 43 - */ - var inc = add(1); + _createClass(Paren, [{ + key: "emit", + value: function emit(ts) { + ts.put("("); + this.expr.emit(ts, false); + ts.put(")"); + } + }, { + key: "forEach", + value: function forEach(f) { + f(this); + this.expr.forEach(f); + } + }]); - /** - * Inserts the supplied element into the list, at index `index`. _Note that - * this is not destructive_: it returns a copy of the list with the changes. - * No lists have been harmed in the application of this function. - * - * @func - * @memberOf R - * @since v0.2.2 - * @category List - * @sig Number -> a -> [a] -> [a] - * @param {Number} index The position to insert the element - * @param {*} elt The element to insert into the Array - * @param {Array} list The list to insert into - * @return {Array} A new Array with `elt` inserted at `index`. - * @example - * - * R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4] - */ - var insert = _curry3(function insert(idx, elt, list) { - idx = idx < list.length && idx >= 0 ? idx : list.length; - var result = _slice(list); - result.splice(idx, 0, elt); - return result; - }); + return Paren; + }(CodeRep); - /** - * Inserts the sub-list into the list, at index `index`. _Note that this is not - * destructive_: it returns a copy of the list with the changes. - * No lists have been harmed in the application of this function. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category List - * @sig Number -> [a] -> [a] -> [a] - * @param {Number} index The position to insert the sub-list - * @param {Array} elts The sub-list to insert into the Array - * @param {Array} list The list to insert the sub-list into - * @return {Array} A new Array with `elts` inserted starting at `index`. - * @example - * - * R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4] - */ - var insertAll = _curry3(function insertAll(idx, elts, list) { - idx = idx < list.length && idx >= 0 ? idx : list.length; - return _concat(_concat(_slice(list, 0, idx), elts), _slice(list, idx)); - }); + var Bracket = exports.Bracket = function (_CodeRep5) { + _inherits(Bracket, _CodeRep5); - /** - * Creates a new list with the separator interposed between elements. - * - * Dispatches to the `intersperse` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig a -> [a] -> [a] - * @param {*} separator The element to add to the list. - * @param {Array} list The list to be interposed. - * @return {Array} The new list. - * @example - * - * R.intersperse('n', ['ba', 'a', 'a']); //=> ['ba', 'n', 'a', 'n', 'a'] - */ - var intersperse = _curry2(_checkForMethod('intersperse', function intersperse(separator, list) { - var out = []; - var idx = 0; - var length = list.length; - while (idx < length) { - if (idx === length - 1) { - out.push(list[idx]); - } else { - out.push(list[idx], separator); - } - idx += 1; - } - return out; - })); + function Bracket(expr) { + _classCallCheck(this, Bracket); - /** - * See if an object (`val`) is an instance of the supplied constructor. This - * function will check up the inheritance chain, if any. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category Type - * @sig (* -> {*}) -> a -> Boolean - * @param {Object} ctor A constructor - * @param {*} val The value to test - * @return {Boolean} - * @example - * - * R.is(Object, {}); //=> true - * R.is(Number, 1); //=> true - * R.is(Object, 1); //=> false - * R.is(String, 's'); //=> true - * R.is(String, new String('')); //=> true - * R.is(Object, new String('')); //=> true - * R.is(Object, 's'); //=> false - * R.is(Number, {}); //=> false - */ - var is = _curry2(function is(Ctor, val) { - return val != null && val.constructor === Ctor || val instanceof Ctor; - }); + var _this5 = _possibleConstructorReturn(this, Object.getPrototypeOf(Bracket).call(this)); - /** - * Tests whether or not an object is similar to an array. - * - * @func - * @memberOf R - * @since v0.5.0 - * @category Type - * @category List - * @sig * -> Boolean - * @param {*} x The object to test. - * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise. - * @example - * - * R.isArrayLike([]); //=> true - * R.isArrayLike(true); //=> false - * R.isArrayLike({}); //=> false - * R.isArrayLike({length: 10}); //=> false - * R.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true - */ - var isArrayLike = _curry1(function isArrayLike(x) { - if (_isArray(x)) { - return true; - } - if (!x) { - return false; - } - if (typeof x !== 'object') { - return false; - } - if (x instanceof String) { - return false; - } - if (x.nodeType === 1) { - return !!x.length; - } - if (x.length === 0) { - return true; - } - if (x.length > 0) { - return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1); - } - return false; - }); + _this5.expr = expr; + return _this5; + } - /** - * Checks if the input value is `null` or `undefined`. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Type - * @sig * -> Boolean - * @param {*} x The value to test. - * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`. - * @example - * - * R.isNil(null); //=> true - * R.isNil(undefined); //=> true - * R.isNil(0); //=> false - * R.isNil([]); //=> false - */ - var isNil = _curry1(function isNil(x) { - return x == null; - }); + _createClass(Bracket, [{ + key: "emit", + value: function emit(ts) { + ts.put("["); + this.expr.emit(ts, false); + ts.put("]"); + } + }, { + key: "forEach", + value: function forEach(f) { + f(this); + this.expr.forEach(f); + } + }]); - /** - * Returns a list containing the names of all the enumerable own properties of - * the supplied object. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig {k: v} -> [k] - * @param {Object} obj The object to extract properties from - * @return {Array} An array of the object's own properties. - * @example - * - * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c'] - */ - // cover IE < 9 keys issues - // Safari bug - var keys = function () { - // cover IE < 9 keys issues - var hasEnumBug = !{ toString: null }.propertyIsEnumerable('toString'); - var nonEnumerableProps = [ - 'constructor', - 'valueOf', - 'isPrototypeOf', - 'toString', - 'propertyIsEnumerable', - 'hasOwnProperty', - 'toLocaleString' - ]; - // Safari bug - var hasArgsEnumBug = function () { - 'use strict'; - return arguments.propertyIsEnumerable('length'); - }(); - var contains = function contains(list, item) { - var idx = 0; - while (idx < list.length) { - if (list[idx] === item) { - return true; - } - idx += 1; - } - return false; - }; - return typeof Object.keys === 'function' && !hasArgsEnumBug ? _curry1(function keys(obj) { - return Object(obj) !== obj ? [] : Object.keys(obj); - }) : _curry1(function keys(obj) { - if (Object(obj) !== obj) { - return []; - } - var prop, nIdx; - var ks = []; - var checkArgsLength = hasArgsEnumBug && _isArguments(obj); - for (prop in obj) { - if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) { - ks[ks.length] = prop; - } - } - if (hasEnumBug) { - nIdx = nonEnumerableProps.length - 1; - while (nIdx >= 0) { - prop = nonEnumerableProps[nIdx]; - if (_has(prop, obj) && !contains(ks, prop)) { - ks[ks.length] = prop; - } - nIdx -= 1; - } - } - return ks; - }); - }(); + return Bracket; + }(CodeRep); - /** - * Returns a list containing the names of all the properties of the supplied - * object, including prototype properties. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Object - * @sig {k: v} -> [k] - * @param {Object} obj The object to extract properties from - * @return {Array} An array of the object's own and prototype properties. - * @example - * - * var F = function() { this.x = 'X'; }; - * F.prototype.y = 'Y'; - * var f = new F(); - * R.keysIn(f); //=> ['x', 'y'] - */ - var keysIn = _curry1(function keysIn(obj) { - var prop; - var ks = []; - for (prop in obj) { - ks[ks.length] = prop; - } - return ks; - }); + var Brace = exports.Brace = function (_CodeRep6) { + _inherits(Brace, _CodeRep6); - /** - * Returns the number of elements in the array by returning `list.length`. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category List - * @sig [a] -> Number - * @param {Array} list The array to inspect. - * @return {Number} The length of the array. - * @example - * - * R.length([]); //=> 0 - * R.length([1, 2, 3]); //=> 3 - */ - var length = _curry1(function length(list) { - return list != null && is(Number, list.length) ? list.length : NaN; - }); + function Brace(expr) { + _classCallCheck(this, Brace); - /** - * Returns `true` if the first argument is less than the second; `false` - * otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} - * @see R.gt - * @example - * - * R.lt(2, 1); //=> false - * R.lt(2, 2); //=> false - * R.lt(2, 3); //=> true - * R.lt('a', 'z'); //=> true - * R.lt('z', 'a'); //=> false - */ - var lt = _curry2(function lt(a, b) { - return a < b; - }); + var _this6 = _possibleConstructorReturn(this, Object.getPrototypeOf(Brace).call(this)); - /** - * Returns `true` if the first argument is less than or equal to the second; - * `false` otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> Boolean - * @param {Number} a - * @param {Number} b - * @return {Boolean} - * @see R.gte - * @example - * - * R.lte(2, 1); //=> false - * R.lte(2, 2); //=> true - * R.lte(2, 3); //=> true - * R.lte('a', 'z'); //=> true - * R.lte('z', 'a'); //=> false - */ - var lte = _curry2(function lte(a, b) { - return a <= b; - }); + _this6.expr = expr; + return _this6; + } - /** - * The mapAccum function behaves like a combination of map and reduce; it - * applies a function to each element of a list, passing an accumulating - * parameter from left to right, and returning a final value of this - * accumulator together with the new list. - * - * The iterator function receives two arguments, *acc* and *value*, and should - * return a tuple *[acc, value]*. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category List - * @sig (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]) - * @param {Function} fn The function to be called on every element of the input `list`. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.addIndex - * @example - * - * var digits = ['1', '2', '3', '4']; - * var append = (a, b) => [a + b, a + b]; - * - * R.mapAccum(append, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']] - */ - var mapAccum = _curry3(function mapAccum(fn, acc, list) { - var idx = 0; - var len = list.length; - var result = []; - var tuple = [acc]; - while (idx < len) { - tuple = fn(tuple[0], list[idx]); - result[idx] = tuple[1]; - idx += 1; - } - return [ - tuple[0], - result - ]; - }); + _createClass(Brace, [{ + key: "emit", + value: function emit(ts) { + ts.put("{"); + this.expr.emit(ts, false); + ts.put("}"); + } + }, { + key: "forEach", + value: function forEach(f) { + f(this); + this.expr.forEach(f); + } + }]); - /** - * The mapAccumRight function behaves like a combination of map and reduce; it - * applies a function to each element of a list, passing an accumulating - * parameter from right to left, and returning a final value of this - * accumulator together with the new list. - * - * Similar to `mapAccum`, except moves through the input list from the right to - * the left. - * - * The iterator function receives two arguments, *acc* and *value*, and should - * return a tuple *[acc, value]*. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category List - * @sig (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]) - * @param {Function} fn The function to be called on every element of the input `list`. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.addIndex - * @example - * - * var digits = ['1', '2', '3', '4']; - * var append = (a, b) => [a + b, a + b]; - * - * R.mapAccumRight(append, 0, digits); //=> ['04321', ['04321', '0432', '043', '04']] - */ - var mapAccumRight = _curry3(function mapAccumRight(fn, acc, list) { - var idx = list.length - 1; - var result = []; - var tuple = [acc]; - while (idx >= 0) { - tuple = fn(tuple[0], list[idx]); - result[idx] = tuple[1]; - idx -= 1; - } - return [ - tuple[0], - result - ]; - }); + return Brace; + }(CodeRep); - /** - * Tests a regular expression against a String. Note that this function will - * return an empty array when there are no matches. This differs from - * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match) - * which returns `null` when there are no matches. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category String - * @sig RegExp -> String -> [String | Undefined] - * @param {RegExp} rx A regular expression. - * @param {String} str The string to match against - * @return {Array} The list of matches or empty array. - * @see R.test - * @example - * - * R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na'] - * R.match(/a/, 'b'); //=> [] - * R.match(/a/, null); //=> TypeError: null does not have a method named "match" - */ - var match = _curry2(function match(rx, str) { - return str.match(rx) || []; - }); + var NoIn = exports.NoIn = function (_CodeRep7) { + _inherits(NoIn, _CodeRep7); - /** - * mathMod behaves like the modulo operator should mathematically, unlike the - * `%` operator (and by extension, R.modulo). So while "-17 % 5" is -2, - * mathMod(-17, 5) is 3. mathMod requires Integer arguments, and returns NaN - * when the modulus is zero or negative. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} m The dividend. - * @param {Number} p the modulus. - * @return {Number} The result of `b mod a`. - * @example - * - * R.mathMod(-17, 5); //=> 3 - * R.mathMod(17, 5); //=> 2 - * R.mathMod(17, -5); //=> NaN - * R.mathMod(17, 0); //=> NaN - * R.mathMod(17.2, 5); //=> NaN - * R.mathMod(17, 5.3); //=> NaN - * - * var clock = R.mathMod(R.__, 12); - * clock(15); //=> 3 - * clock(24); //=> 0 - * - * var seventeenMod = R.mathMod(17); - * seventeenMod(3); //=> 2 - * seventeenMod(4); //=> 1 - * seventeenMod(10); //=> 7 - */ - var mathMod = _curry2(function mathMod(m, p) { - if (!_isInteger(m)) { - return NaN; - } - if (!_isInteger(p) || p < 1) { - return NaN; - } - return (m % p + p) % p; - }); + function NoIn(expr) { + _classCallCheck(this, NoIn); - /** - * Returns the larger of its two arguments. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> a - * @param {*} a - * @param {*} b - * @return {*} - * @see R.maxBy, R.min - * @example - * - * R.max(789, 123); //=> 789 - * R.max('a', 'b'); //=> 'b' - */ - var max = _curry2(function max(a, b) { - return b > a ? b : a; - }); + var _this7 = _possibleConstructorReturn(this, Object.getPrototypeOf(NoIn).call(this)); - /** - * Takes a function and two values, and returns whichever value produces the - * larger result when passed to the provided function. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Relation - * @sig Ord b => (a -> b) -> a -> a -> a - * @param {Function} f - * @param {*} a - * @param {*} b - * @return {*} - * @see R.max, R.minBy - * @example - * - * // square :: Number -> Number - * var square = n => n * n; - * - * R.maxBy(square, -3, 2); //=> -3 - * - * R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5 - * R.reduce(R.maxBy(square), 0, []); //=> 0 - */ - var maxBy = _curry3(function maxBy(f, a, b) { - return f(b) > f(a) ? b : a; - }); + _this7.expr = expr; + return _this7; + } - /** - * Creates a new object with the own properties of the two provided objects. If - * a key exists in both objects, the provided function is applied to the key - * and the values associated with the key in each object, with the result being - * used as the value associated with the key in the returned object. The key - * will be excluded from the returned object if the resulting value is - * `undefined`. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category Object - * @sig (String -> a -> a -> a) -> {a} -> {a} -> {a} - * @param {Function} fn - * @param {Object} l - * @param {Object} r - * @return {Object} - * @see R.merge, R.mergeWith - * @example - * - * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r - * R.mergeWithKey(concatValues, - * { a: true, thing: 'foo', values: [10, 20] }, - * { b: true, thing: 'bar', values: [15, 35] }); - * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] } - */ - var mergeWithKey = _curry3(function mergeWithKey(fn, l, r) { - var result = {}; - var k; - for (k in l) { - if (_has(k, l)) { - result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k]; - } - } - for (k in r) { - if (_has(k, r) && !_has(k, result)) { - result[k] = r[k]; - } - } - return result; - }); + _createClass(NoIn, [{ + key: "emit", + value: function emit(ts) { + this.expr.emit(ts, true); + } + }, { + key: "forEach", + value: function forEach(f) { + f(this); + this.expr.forEach(f); + } + }]); - /** - * Returns the smaller of its two arguments. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord a => a -> a -> a - * @param {*} a - * @param {*} b - * @return {*} - * @see R.minBy, R.max - * @example - * - * R.min(789, 123); //=> 123 - * R.min('a', 'b'); //=> 'a' - */ - var min = _curry2(function min(a, b) { - return b < a ? b : a; - }); + return NoIn; + }(CodeRep); - /** - * Takes a function and two values, and returns whichever value produces the - * smaller result when passed to the provided function. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Relation - * @sig Ord b => (a -> b) -> a -> a -> a - * @param {Function} f - * @param {*} a - * @param {*} b - * @return {*} - * @see R.min, R.maxBy - * @example - * - * // square :: Number -> Number - * var square = n => n * n; - * - * R.minBy(square, -3, 2); //=> 2 - * - * R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1 - * R.reduce(R.minBy(square), Infinity, []); //=> Infinity - */ - var minBy = _curry3(function minBy(f, a, b) { - return f(b) < f(a) ? b : a; - }); + var ContainsIn = exports.ContainsIn = function (_CodeRep8) { + _inherits(ContainsIn, _CodeRep8); - /** - * Divides the second parameter by the first and returns the remainder. Note - * that this function preserves the JavaScript-style behavior for modulo. For - * mathematical modulo see `mathMod`. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The value to the divide. - * @param {Number} b The pseudo-modulus - * @return {Number} The result of `b % a`. - * @see R.mathMod - * @example - * - * R.modulo(17, 3); //=> 2 - * // JS behavior: - * R.modulo(-17, 3); //=> -2 - * R.modulo(17, -3); //=> 2 - * - * var isOdd = R.modulo(R.__, 2); - * isOdd(42); //=> 0 - * isOdd(21); //=> 1 - */ - var modulo = _curry2(function modulo(a, b) { - return a % b; - }); + function ContainsIn(expr) { + _classCallCheck(this, ContainsIn); - /** - * Multiplies two numbers. Equivalent to `a * b` but curried. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The first value. - * @param {Number} b The second value. - * @return {Number} The result of `a * b`. - * @see R.divide - * @example - * - * var double = R.multiply(2); - * var triple = R.multiply(3); - * double(3); //=> 6 - * triple(4); //=> 12 - * R.multiply(2, 5); //=> 10 - */ - var multiply = _curry2(function multiply(a, b) { - return a * b; - }); + var _this8 = _possibleConstructorReturn(this, Object.getPrototypeOf(ContainsIn).call(this)); - /** - * Wraps a function of any arity (including nullary) in a function that accepts - * exactly `n` parameters. Any extraneous parameters will not be passed to the - * supplied function. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig Number -> (* -> a) -> (* -> a) - * @param {Number} n The desired arity of the new function. - * @param {Function} fn The function to wrap. - * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of - * arity `n`. - * @example - * - * var takesTwoArgs = (a, b) => [a, b]; - * - * takesTwoArgs.length; //=> 2 - * takesTwoArgs(1, 2); //=> [1, 2] - * - * var takesOneArg = R.nAry(1, takesTwoArgs); - * takesOneArg.length; //=> 1 - * // Only `n` arguments are passed to the wrapped function - * takesOneArg(1, 2); //=> [1, undefined] - */ - var nAry = _curry2(function nAry(n, fn) { - switch (n) { - case 0: - return function () { - return fn.call(this); - }; - case 1: - return function (a0) { - return fn.call(this, a0); - }; - case 2: - return function (a0, a1) { - return fn.call(this, a0, a1); - }; - case 3: - return function (a0, a1, a2) { - return fn.call(this, a0, a1, a2); - }; - case 4: - return function (a0, a1, a2, a3) { - return fn.call(this, a0, a1, a2, a3); - }; - case 5: - return function (a0, a1, a2, a3, a4) { - return fn.call(this, a0, a1, a2, a3, a4); - }; - case 6: - return function (a0, a1, a2, a3, a4, a5) { - return fn.call(this, a0, a1, a2, a3, a4, a5); - }; - case 7: - return function (a0, a1, a2, a3, a4, a5, a6) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6); - }; - case 8: - return function (a0, a1, a2, a3, a4, a5, a6, a7) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7); - }; - case 9: - return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8); - }; - case 10: - return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { - return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); - }; - default: - throw new Error('First argument to nAry must be a non-negative integer no greater than ten'); - } - }); + _this8.expr = expr; + return _this8; + } - /** - * Negates its argument. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Math - * @sig Number -> Number - * @param {Number} n - * @return {Number} - * @example - * - * R.negate(42); //=> -42 - */ - var negate = _curry1(function negate(n) { - return -n; - }); + _createClass(ContainsIn, [{ + key: "emit", + value: function emit(ts, noIn) { + if (noIn) { + ts.put("("); + this.expr.emit(ts, false); + ts.put(")"); + } else { + this.expr.emit(ts, false); + } + } + }, { + key: "forEach", + value: function forEach(f) { + f(this); + this.expr.forEach(f); + } + }]); - /** - * Returns `true` if no elements of the list match the predicate, `false` - * otherwise. - * - * Dispatches to the `any` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category List - * @sig (a -> Boolean) -> [a] -> Boolean - * @param {Function} fn The predicate function. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise. - * @see R.all, R.any - * @example - * - * var isEven = n => n % 2 === 0; - * - * R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true - * R.none(isEven, [1, 3, 5, 7, 8, 11]); //=> false - */ - var none = _curry2(_complement(_dispatchable('any', _xany, any))); + return ContainsIn; + }(CodeRep); - /** - * A function that returns the `!` of its argument. It will return `true` when - * passed false-y value, and `false` when passed a truth-y one. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig * -> Boolean - * @param {*} a any value - * @return {Boolean} the logical inverse of passed argument. - * @see R.complement - * @example - * - * R.not(true); //=> false - * R.not(false); //=> true - * R.not(0); => true - * R.not(1); => false - */ - var not = _curry1(function not(a) { - return !a; - }); + var Seq = exports.Seq = function (_CodeRep9) { + _inherits(Seq, _CodeRep9); - /** - * Returns the nth element of the given list or string. If n is negative the - * element at index length + n is returned. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> [a] -> a | Undefined - * @sig Number -> String -> String - * @param {Number} offset - * @param {*} list - * @return {*} - * @example - * - * var list = ['foo', 'bar', 'baz', 'quux']; - * R.nth(1, list); //=> 'bar' - * R.nth(-1, list); //=> 'quux' - * R.nth(-99, list); //=> undefined - * - * R.nth('abc', 2); //=> 'c' - * R.nth('abc', 3); //=> '' - */ - var nth = _curry2(function nth(offset, list) { - var idx = offset < 0 ? list.length + offset : offset; - return _isString(list) ? list.charAt(idx) : list[idx]; - }); + function Seq(children) { + _classCallCheck(this, Seq); - /** - * Returns a function which returns its nth argument. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig Number -> *... -> * - * @param {Number} n - * @return {Function} - * @example - * - * R.nthArg(1)('a', 'b', 'c'); //=> 'b' - * R.nthArg(-1)('a', 'b', 'c'); //=> 'c' - */ - var nthArg = _curry1(function nthArg(n) { - return function () { - return nth(n, arguments); - }; - }); + var _this9 = _possibleConstructorReturn(this, Object.getPrototypeOf(Seq).call(this)); - /** - * Creates an object containing a single key:value pair. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Object - * @sig String -> a -> {String:a} - * @param {String} key - * @param {*} val - * @return {Object} - * @see R.pair - * @example - * - * var matchPhrases = R.compose( - * R.objOf('must'), - * R.map(R.objOf('match_phrase')) - * ); - * matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]} - */ - var objOf = _curry2(function objOf(key, val) { - var obj = {}; - obj[key] = val; - return obj; - }); + _this9.children = children; + return _this9; + } - /** - * Returns a singleton array containing the value provided. - * - * Note this `of` is different from the ES6 `of`; See - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of - * - * @func - * @memberOf R - * @since v0.3.0 - * @category Function - * @sig a -> [a] - * @param {*} x any value - * @return {Array} An array wrapping `x`. - * @example - * - * R.of(null); //=> [null] - * R.of([42]); //=> [[42]] - */ - var of = _curry1(_of); + _createClass(Seq, [{ + key: "emit", + value: function emit(ts, noIn) { + this.children.forEach(function (cr) { + return cr.emit(ts, noIn); + }); + } + }, { + key: "forEach", + value: function forEach(f) { + f(this); + this.children.forEach(function (x) { + return x.forEach(f); + }); + } + }]); - /** - * Accepts a function `fn` and returns a function that guards invocation of - * `fn` such that `fn` can only ever be called once, no matter how many times - * the returned function is invoked. The first value calculated is returned in - * subsequent invocations. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (a... -> b) -> (a... -> b) - * @param {Function} fn The function to wrap in a call-only-once wrapper. - * @return {Function} The wrapped function. - * @example - * - * var addOneOnce = R.once(x => x + 1); - * addOneOnce(10); //=> 11 - * addOneOnce(addOneOnce(50)); //=> 11 - */ - var once = _curry1(function once(fn) { - var called = false; - var result; - return _arity(fn.length, function () { - if (called) { - return result; - } - called = true; - result = fn.apply(this, arguments); - return result; - }); - }); + return Seq; + }(CodeRep); - /** - * Returns `true` if one or both of its arguments are `true`. Returns `false` - * if both arguments are `false`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig * -> * -> * - * @param {Boolean} a A boolean value - * @param {Boolean} b A boolean value - * @return {Boolean} `true` if one or both arguments are `true`, `false` otherwise - * @see R.either - * @example - * - * R.or(true, true); //=> true - * R.or(true, false); //=> true - * R.or(false, true); //=> true - * R.or(false, false); //=> false - */ - var or = _curry2(function or(a, b) { - return a || b; - }); + var Semi = exports.Semi = function (_Token) { + _inherits(Semi, _Token); - /** - * Returns the result of "setting" the portion of the given data structure - * focused by the given lens to the result of applying the given function to - * the focused value. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Lens s a -> (a -> a) -> s -> s - * @param {Lens} lens - * @param {*} v - * @param {*} x - * @return {*} - * @see R.prop, R.lensIndex, R.lensProp - * @example - * - * var headLens = R.lensIndex(0); - * - * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz'] - */ - var over = function () { - var Identity = function (x) { - return { - value: x, - map: function (f) { - return Identity(f(x)); - } - }; - }; - return _curry3(function over(lens, f, x) { - return lens(function (y) { - return Identity(f(y)); - })(x).value; - }); - }(); + function Semi() { + _classCallCheck(this, Semi); - /** - * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category List - * @sig a -> b -> (a,b) - * @param {*} fst - * @param {*} snd - * @return {Array} - * @see R.createMapEntry, R.of - * @example - * - * R.pair('foo', 'bar'); //=> ['foo', 'bar'] - */ - var pair = _curry2(function pair(fst, snd) { - return [ - fst, - snd - ]; - }); + return _possibleConstructorReturn(this, Object.getPrototypeOf(Semi).call(this, ";")); + } - /** - * Retrieve the value at a given path. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Object - * @sig [String] -> {k: v} -> v | Undefined - * @param {Array} path The path to use. - * @param {Object} obj The object to retrieve the nested property from. - * @return {*} The data at `path`. - * @example - * - * R.path(['a', 'b'], {a: {b: 2}}); //=> 2 - * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined - */ - var path = _curry2(function path(paths, obj) { - var val = obj; - var idx = 0; - while (idx < paths.length) { - if (val == null) { - return; - } - val = val[paths[idx]]; - idx += 1; - } - return val; - }); + return Semi; + }(Token); - /** - * If the given, non-null object has a value at the given path, returns the - * value at that path. Otherwise returns the provided default value. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Object - * @sig a -> [String] -> Object -> a - * @param {*} d The default value. - * @param {Array} p The path to use. - * @param {Object} obj The object to retrieve the nested property from. - * @return {*} The data at `path` of the supplied object or the default value. - * @example - * - * R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2 - * R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A" - */ - var pathOr = _curry3(function pathOr(d, p, obj) { - return defaultTo(d, path(p, obj)); - }); + var CommaSep = exports.CommaSep = function (_CodeRep10) { + _inherits(CommaSep, _CodeRep10); - /** - * Returns `true` if the specified object property at given path satisfies the - * given predicate; `false` otherwise. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category Logic - * @sig (a -> Boolean) -> [String] -> Object -> Boolean - * @param {Function} pred - * @param {Array} propPath - * @param {*} obj - * @return {Boolean} - * @see R.propSatisfies, R.path - * @example - * - * R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true - */ - var pathSatisfies = _curry3(function pathSatisfies(pred, propPath, obj) { - return propPath.length > 0 && pred(path(propPath, obj)); - }); + function CommaSep(children) { + _classCallCheck(this, CommaSep); - /** - * Returns a partial copy of an object containing only the keys specified. If - * the key does not exist, the property is ignored. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [k] -> {k: v} -> {k: v} - * @param {Array} names an array of String property names to copy onto a new object - * @param {Object} obj The object to copy from - * @return {Object} A new object with only properties from `names` on it. - * @see R.omit, R.props - * @example - * - * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} - * R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1} - */ - var pick = _curry2(function pick(names, obj) { - var result = {}; - var idx = 0; - while (idx < names.length) { - if (names[idx] in obj) { - result[names[idx]] = obj[names[idx]]; - } - idx += 1; - } - return result; - }); + var _this11 = _possibleConstructorReturn(this, Object.getPrototypeOf(CommaSep).call(this)); - /** - * Similar to `pick` except that this one includes a `key: undefined` pair for - * properties that don't exist. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [k] -> {k: v} -> {k: v} - * @param {Array} names an array of String property names to copy onto a new object - * @param {Object} obj The object to copy from - * @return {Object} A new object with only properties from `names` on it. - * @see R.pick - * @example - * - * R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} - * R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined} - */ - var pickAll = _curry2(function pickAll(names, obj) { - var result = {}; - var idx = 0; - var len = names.length; - while (idx < len) { - var name = names[idx]; - result[name] = obj[name]; - idx += 1; - } - return result; - }); + _this11.children = children; + return _this11; + } - /** - * Returns a partial copy of an object containing only the keys that satisfy - * the supplied predicate. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Object - * @sig (v, k -> Boolean) -> {k: v} -> {k: v} - * @param {Function} pred A predicate to determine whether or not a key - * should be included on the output object. - * @param {Object} obj The object to copy from - * @return {Object} A new object with only properties that satisfy `pred` - * on it. - * @see R.pick, R.filter - * @example - * - * var isUpperCase = (val, key) => key.toUpperCase() === key; - * R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4} - */ - var pickBy = _curry2(function pickBy(test, obj) { - var result = {}; - for (var prop in obj) { - if (test(obj[prop], prop, obj)) { - result[prop] = obj[prop]; - } + _createClass(CommaSep, [{ + key: "emit", + value: function emit(ts, noIn) { + var first = true; + this.children.forEach(function (cr) { + if (first) { + first = false; + } else { + ts.put(","); } - return result; - }); + cr.emit(ts, noIn); + }); + } + }, { + key: "forEach", + value: function forEach(f) { + f(this); + this.children.forEach(function (x) { + return x.forEach(f); + }); + } + }]); - /** - * Returns a new list with the given element at the front, followed by the - * contents of the list. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> [a] - * @param {*} el The item to add to the head of the output list. - * @param {Array} list The array to add to the tail of the output list. - * @return {Array} A new array. - * @see R.append - * @example - * - * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum'] - */ - var prepend = _curry2(function prepend(el, list) { - return _concat([el], list); - }); + return CommaSep; + }(CodeRep); - /** - * Returns a function that when supplied an object returns the indicated - * property of that object, if it exists. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig s -> {s: a} -> a | Undefined - * @param {String} p The property name - * @param {Object} obj The object to query - * @return {*} The value at `obj.p`. - * @example - * - * R.prop('x', {x: 100}); //=> 100 - * R.prop('x', {}); //=> undefined - */ - var prop = _curry2(function prop(p, obj) { - return obj[p]; - }); + var SemiOp = exports.SemiOp = function (_CodeRep11) { + _inherits(SemiOp, _CodeRep11); - /** - * If the given, non-null object has an own property with the specified name, - * returns the value of that property. Otherwise returns the provided default - * value. - * - * @func - * @memberOf R - * @since v0.6.0 - * @category Object - * @sig a -> String -> Object -> a - * @param {*} val The default value. - * @param {String} p The name of the property to return. - * @param {Object} obj The object to query. - * @return {*} The value of given property of the supplied object or the default value. - * @example - * - * var alice = { - * name: 'ALICE', - * age: 101 - * }; - * var favorite = R.prop('favoriteLibrary'); - * var favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary'); - * - * favorite(alice); //=> undefined - * favoriteWithDefault(alice); //=> 'Ramda' - */ - var propOr = _curry3(function propOr(val, p, obj) { - return obj != null && _has(p, obj) ? obj[p] : val; - }); + function SemiOp() { + _classCallCheck(this, SemiOp); - /** - * Returns `true` if the specified object property satisfies the given - * predicate; `false` otherwise. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Logic - * @sig (a -> Boolean) -> String -> {String: a} -> Boolean - * @param {Function} pred - * @param {String} name - * @param {*} obj - * @return {Boolean} - * @see R.propEq, R.propIs - * @example - * - * R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true - */ - var propSatisfies = _curry3(function propSatisfies(pred, name, obj) { - return pred(obj[name]); - }); + return _possibleConstructorReturn(this, Object.getPrototypeOf(SemiOp).call(this)); + } - /** - * Acts as multiple `prop`: array of keys in, array of values out. Preserves - * order. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [k] -> {k: v} -> [v] - * @param {Array} ps The property names to fetch - * @param {Object} obj The object to query - * @return {Array} The corresponding values or partially applied function. - * @example - * - * R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2] - * R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2] - * - * var fullName = R.compose(R.join(' '), R.props(['first', 'last'])); - * fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth' - */ - var props = _curry2(function props(ps, obj) { - var len = ps.length; - var out = []; - var idx = 0; - while (idx < len) { - out[idx] = obj[ps[idx]]; - idx += 1; - } - return out; - }); + _createClass(SemiOp, [{ + key: "emit", + value: function emit(ts) { + ts.putOptionalSemi(); + } + }]); - /** - * Returns a list of numbers from `from` (inclusive) to `to` (exclusive). - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> Number -> [Number] - * @param {Number} from The first number in the list. - * @param {Number} to One more than the last number in the list. - * @return {Array} The list of numbers in tthe set `[a, b)`. - * @example - * - * R.range(1, 5); //=> [1, 2, 3, 4] - * R.range(50, 53); //=> [50, 51, 52] - */ - var range = _curry2(function range(from, to) { - if (!(_isNumber(from) && _isNumber(to))) { - throw new TypeError('Both arguments to range must be numbers'); - } - var result = []; - var n = from; - while (n < to) { - result.push(n); - n += 1; - } - return result; - }); + return SemiOp; + }(CodeRep); - /** - * Returns a single item by iterating through the list, successively calling - * the iterator function and passing it an accumulator value and the current - * value from the array, and then passing the result to the next call. - * - * Similar to `reduce`, except moves through the input list from the right to - * the left. - * - * The iterator function receives two values: *(acc, value)* - * - * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse - * arrays), unlike the native `Array.prototype.reduce` method. For more details - * on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a,b -> a) -> a -> [b] -> a - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.addIndex - * @example - * - * var pairs = [ ['a', 1], ['b', 2], ['c', 3] ]; - * var flattenPairs = (acc, pair) => acc.concat(pair); - * - * R.reduceRight(flattenPairs, [], pairs); //=> [ 'c', 3, 'b', 2, 'a', 1 ] - */ - var reduceRight = _curry3(function reduceRight(fn, acc, list) { - var idx = list.length - 1; - while (idx >= 0) { - acc = fn(acc, list[idx]); - idx -= 1; - } - return acc; - }); +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { - /** - * Returns a value wrapped to indicate that it is the final value of the reduce - * and transduce functions. The returned value should be considered a black - * box: the internal structure is not guaranteed to be stable. - * - * Note: this optimization is unavailable to functions not explicitly listed - * above. For instance, it is not currently supported by reduceRight. - * - * @func - * @memberOf R - * @since v0.15.0 - * @category List - * @sig a -> * - * @param {*} x The final value of the reduce. - * @return {*} The wrapped value. - * @see R.reduce, R.transduce - * @example - * - * R.reduce( - * R.pipe(R.add, R.when(R.gte(R.__, 10), R.reduced)), - * 0, - * [1, 2, 3, 4, 5]) // 10 - */ - var reduced = _curry1(_reduced); + "use strict"; - /** - * Removes the sub-list of `list` starting at index `start` and containing - * `count` elements. _Note that this is not destructive_: it returns a copy of - * the list with the changes. - * No lists have been harmed in the application of this function. - * - * @func - * @memberOf R - * @since v0.2.2 - * @category List - * @sig Number -> Number -> [a] -> [a] - * @param {Number} start The position to start removing elements - * @param {Number} count The number of elements to remove - * @param {Array} list The list to remove from - * @return {Array} A new Array with `count` elements from `start` removed. - * @example - * - * R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8] - */ - var remove = _curry3(function remove(start, count, list) { - return _concat(_slice(list, 0, Math.min(start, list.length)), _slice(list, Math.min(list.length, start + count))); - }); + 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; }; }(); - /** - * Replace a substring or regex match in a string with a replacement. - * - * @func - * @memberOf R - * @since v0.7.0 - * @category String - * @sig RegExp|String -> String -> String -> String - * @param {RegExp|String} pattern A regular expression or a substring to match. - * @param {String} replacement The string to replace the matches with. - * @param {String} str The String to do the search and replacement in. - * @return {String} The result. - * @example - * - * R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo' - * R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo' - * - * // Use the "g" (global) flag to replace all occurrences: - * R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar' - */ - var replace = _curry3(function replace(regex, replacement, str) { - return str.replace(regex, replacement); - }); + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.FormattedCodeGen = exports.ExtensibleCodeGen = exports.Sep = undefined; - /** - * Returns a new list or string with the elements or characters in reverse - * order. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [a] - * @sig String -> String - * @param {Array|String} list - * @return {Array|String} - * @example - * - * R.reverse([1, 2, 3]); //=> [3, 2, 1] - * R.reverse([1, 2]); //=> [2, 1] - * R.reverse([1]); //=> [1] - * R.reverse([]); //=> [] - * - * R.reverse('abc'); //=> 'cba' - * R.reverse('ab'); //=> 'ba' - * R.reverse('a'); //=> 'a' - * R.reverse(''); //=> '' - */ - var reverse = _curry1(function reverse(list) { - return _isString(list) ? list.split('').reverse().join('') : _slice(list).reverse(); - }); + var _objectAssign = __webpack_require__(14); - /** - * Scan is similar to reduce, but returns a list of successively reduced values - * from the left - * - * @func - * @memberOf R - * @since v0.10.0 - * @category List - * @sig (a,b -> a) -> a -> [b] -> [a] - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {Array} A list of all intermediately reduced values. - * @example - * - * var numbers = [1, 2, 3, 4]; - * var factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24] - */ - var scan = _curry3(function scan(fn, acc, list) { - var idx = 0; - var len = list.length; - var result = [acc]; - while (idx < len) { - acc = fn(acc, list[idx]); - result[idx + 1] = acc; - idx += 1; - } - return result; - }); + var _objectAssign2 = _interopRequireDefault(_objectAssign); - /** - * Returns the result of "setting" the portion of the given data structure - * focused by the given lens to the given value. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Lens s a -> a -> s -> s - * @param {Lens} lens - * @param {*} v - * @param {*} x - * @return {*} - * @see R.prop, R.lensIndex, R.lensProp - * @example - * - * var xLens = R.lensProp('x'); - * - * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} - * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2} - */ - var set = _curry3(function set(lens, v, x) { - return over(lens, always(v), x); - }); + var _esutils = __webpack_require__(15); - /** - * Returns the elements of the given list or string (or object with a `slice` - * method) from `fromIndex` (inclusive) to `toIndex` (exclusive). - * - * Dispatches to the `slice` method of the third argument, if present. - * - * @func - * @memberOf R - * @since v0.1.4 - * @category List - * @sig Number -> Number -> [a] -> [a] - * @sig Number -> Number -> String -> String - * @param {Number} fromIndex The start index (inclusive). - * @param {Number} toIndex The end index (exclusive). - * @param {*} list - * @return {*} - * @example - * - * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] - * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd'] - * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c'] - * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] - * R.slice(0, 3, 'ramda'); //=> 'ram' - */ - var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) { - return Array.prototype.slice.call(list, fromIndex, toIndex); - })); + var _coderep = __webpack_require__(19); - /** - * Returns a copy of the list, sorted according to the comparator function, - * which should accept two values at a time and return a negative number if the - * first value is smaller, a positive number if it's larger, and zero if they - * are equal. Please note that this is a **copy** of the list. It does not - * modify the original. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a,a -> Number) -> [a] -> [a] - * @param {Function} comparator A sorting function :: a -> b -> Int - * @param {Array} list The list to sort - * @return {Array} a new array with its elements sorted by the comparator function. - * @example - * - * var diff = function(a, b) { return a - b; }; - * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7] - */ - var sort = _curry2(function sort(comparator, list) { - return _slice(list).sort(comparator); - }); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - /** - * Sorts the list according to the supplied function. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig Ord b => (a -> b) -> [a] -> [a] - * @param {Function} fn - * @param {Array} list The list to sort. - * @return {Array} A new list sorted by the keys generated by `fn`. - * @example - * - * var sortByFirstItem = R.sortBy(R.prop(0)); - * var sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name'))); - * var pairs = [[-1, 1], [-2, 2], [-3, 3]]; - * sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]] - * var alice = { - * name: 'ALICE', - * age: 101 - * }; - * var bob = { - * name: 'Bob', - * age: -10 - * }; - * var clara = { - * name: 'clara', - * age: 314.159 - * }; - * var people = [clara, bob, alice]; - * sortByNameCaseInsensitive(people); //=> [alice, bob, clara] - */ - var sortBy = _curry2(function sortBy(fn, list) { - return _slice(list).sort(function (a, b) { - var aa = fn(a); - var bb = fn(b); - return aa < bb ? -1 : aa > bb ? 1 : 0; - }); - }); + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - /** - * Splits a given list or string at a given index. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category List - * @sig Number -> [a] -> [[a], [a]] - * @sig Number -> String -> [String, String] - * @param {Number} index The index where the array/string is split. - * @param {Array|String} array The array/string to be split. - * @return {Array} - * @example - * - * R.splitAt(1, [1, 2, 3]); //=> [[1], [2, 3]] - * R.splitAt(5, 'hello world'); //=> ['hello', ' world'] - * R.splitAt(-1, 'foobar'); //=> ['fooba', 'r'] - */ - var splitAt = _curry2(function splitAt(index, array) { - return [ - slice(0, index, array), - slice(index, length(array), array) - ]; - }); + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - /** - * Splits a collection into slices of the specified length. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig Number -> [a] -> [[a]] - * @sig Number -> String -> [String] - * @param {Number} n - * @param {Array} list - * @return {Array} - * @example - * - * R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]] - * R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz'] - */ - var splitEvery = _curry2(function splitEvery(n, list) { - if (n <= 0) { - throw new Error('First argument to splitEvery must be a positive integer'); - } - var result = []; - var idx = 0; - while (idx < list.length) { - result.push(slice(idx, idx += n, list)); - } - return result; - }); + function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - /** - * Takes a list and a predicate and returns a pair of lists with the following properties: - * - * - the result of concatenating the two output lists is equivalent to the input list; - * - none of the elements of the first output list satisfies the predicate; and - * - if the second output list is non-empty, its first element satisfies the predicate. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [[a], [a]] - * @param {Function} pred The predicate that determines where the array is split. - * @param {Array} list The array to be split. - * @return {Array} - * @example - * - * R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]); //=> [[1], [2, 3, 1, 2, 3]] - */ - var splitWhen = _curry2(function splitWhen(pred, list) { - var idx = 0; - var len = list.length; - var prefix = []; - while (idx < len && !pred(list[idx])) { - prefix.push(list[idx]); - idx += 1; - } - return [ - prefix, - _slice(list, idx) - ]; - }); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - /** - * Subtracts two numbers. Equivalent to `a - b` but curried. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig Number -> Number -> Number - * @param {Number} a The first value. - * @param {Number} b The second value. - * @return {Number} The result of `a - b`. - * @see R.add - * @example - * - * R.subtract(10, 8); //=> 2 - * - * var minus5 = R.subtract(R.__, 5); - * minus5(17); //=> 12 - * - * var complementaryAngle = R.subtract(90); - * complementaryAngle(30); //=> 60 - * complementaryAngle(72); //=> 18 - */ - var subtract = _curry2(function subtract(a, b) { - return a - b; - }); + function empty() { + return new _coderep.Empty(); + } - /** - * Returns all but the first element of the given list or string (or object - * with a `tail` method). - * - * Dispatches to the `slice` method of the first argument, if present. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [a] - * @sig String -> String - * @param {*} list - * @return {*} - * @see R.head, R.init, R.last - * @example - * - * R.tail([1, 2, 3]); //=> [2, 3] - * R.tail([1, 2]); //=> [2] - * R.tail([1]); //=> [] - * R.tail([]); //=> [] - * - * R.tail('abc'); //=> 'bc' - * R.tail('ab'); //=> 'b' - * R.tail('a'); //=> '' - * R.tail(''); //=> '' - */ - var tail = _checkForMethod('tail', slice(1, Infinity)); + function noIn(rep) { + return new _coderep.NoIn(rep); + } - /** - * Returns the first `n` elements of the given list, string, or - * transducer/transformer (or object with a `take` method). - * - * Dispatches to the `take` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n - * @param {*} list - * @return {*} - * @see R.drop - * @example - * - * R.take(1, ['foo', 'bar', 'baz']); //=> ['foo'] - * R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] - * R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.take(3, 'ramda'); //=> 'ram' - * - * var personnel = [ - * 'Dave Brubeck', - * 'Paul Desmond', - * 'Eugene Wright', - * 'Joe Morello', - * 'Gerry Mulligan', - * 'Bob Bates', - * 'Joe Dodge', - * 'Ron Crotty' - * ]; - * - * var takeFive = R.take(5); - * takeFive(personnel); - * //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan'] - */ - var take = _curry2(_dispatchable('take', _xtake, function take(n, xs) { - return slice(0, n < 0 ? Infinity : n, xs); - })); + function markContainsIn(state) { + return state.containsIn ? new _coderep.ContainsIn(state) : state; + } - /** - * Returns a new list containing the last `n` elements of a given list, passing - * each value to the supplied predicate function, and terminating when the - * predicate function returns `false`. Excludes the element that caused the - * predicate function to fail. The predicate function is passed one argument: - * *(value)*. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @param {Function} fn The function called per iteration. - * @param {Array} list The collection to iterate over. - * @return {Array} A new array. - * @see R.dropLastWhile, R.addIndex - * @example - * - * var isNotOne = x => x !== 1; - * - * R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4] - */ - var takeLastWhile = _curry2(function takeLastWhile(fn, list) { - var idx = list.length - 1; - while (idx >= 0 && fn(list[idx])) { - idx -= 1; - } - return _slice(list, idx + 1, Infinity); - }); + function seq() { + for (var _len = arguments.length, reps = Array(_len), _key = 0; _key < _len; _key++) { + reps[_key] = arguments[_key]; + } - /** - * Returns a new list containing the first `n` elements of a given list, - * passing each value to the supplied predicate function, and terminating when - * the predicate function returns `false`. Excludes the element that caused the - * predicate function to fail. The predicate function is passed one argument: - * *(value)*. - * - * Dispatches to the `takeWhile` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @param {Function} fn The function called per iteration. - * @param {Array} list The collection to iterate over. - * @return {Array} A new array. - * @see R.dropWhile, R.transduce, R.addIndex - * @example - * - * var isNotFour = x => x !== 4; - * - * R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3] - */ - var takeWhile = _curry2(_dispatchable('takeWhile', _xtakeWhile, function takeWhile(fn, list) { - var idx = 0; - var len = list.length; - while (idx < len && fn(list[idx])) { - idx += 1; - } - return _slice(list, 0, idx); - })); + return new _coderep.Seq(reps); + } - /** - * Runs the given function with the supplied object, then returns the object. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (a -> *) -> a -> a - * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away. - * @param {*} x - * @return {*} `x`. - * @example - * - * var sayX = x => console.log('x is ' + x); - * R.tap(sayX, 100); //=> 100 - * //-> 'x is 100' - */ - var tap = _curry2(function tap(fn, x) { - fn(x); - return x; - }); + function isEmpty(codeRep) { + return codeRep instanceof _coderep.Empty || codeRep instanceof Linebreak || codeRep instanceof _coderep.Seq && codeRep.children.every(isEmpty); + } - /** - * Calls an input function `n` times, returning an array containing the results - * of those function calls. - * - * `fn` is passed one argument: The current value of `n`, which begins at `0` - * and is gradually incremented to `n - 1`. - * - * @func - * @memberOf R - * @since v0.2.3 - * @category List - * @sig (Number -> a) -> Number -> [a] - * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`. - * @param {Number} n A value between `0` and `n - 1`. Increments after each function call. - * @return {Array} An array containing the return values of all calls to `fn`. - * @example - * - * R.times(R.identity, 5); //=> [0, 1, 2, 3, 4] - */ - var times = _curry2(function times(fn, n) { - var len = Number(n); - var idx = 0; - var list; - if (len < 0 || isNaN(len)) { - throw new RangeError('n must be a non-negative number'); - } - list = new Array(len); - while (idx < len) { - list[idx] = fn(idx); - idx += 1; - } - return list; - }); + var Sep = {}; + var separatorNames = ["ARRAY_EMPTY", "ARRAY_BEFORE_COMMA", "ARRAY_AFTER_COMMA", "SPREAD", "BEFORE_DEFAULT_EQUALS", "AFTER_DEFAULT_EQUALS", "REST", "OBJECT_BEFORE_COMMA", "OBJECT_AFTER_COMMA", "BEFORE_PROP", "AFTER_PROP", "BEFORE_JUMP_LABEL", "ARGS_BEFORE_COMMA", "ARGS_AFTER_COMMA", "CALL", "BEFORE_CATCH_BINDING", "AFTER_CATCH_BINDING", "BEFORE_CLASS_NAME", "BEFORE_EXTENDS", "AFTER_EXTENDS", "BEFORE_CLASS_DECLARATION_ELEMENTS", "BEFORE_CLASS_EXPRESSION_ELEMENTS", "AFTER_STATIC", "BEFORE_CLASS_ELEMENT", "AFTER_CLASS_ELEMENT", "BEFORE_TERNARY_QUESTION", "AFTER_TERNARY_QUESTION", "BEFORE_TERNARY_COLON", "AFTER_TERNARY_COLON", "COMPUTED_MEMBER_EXPRESSION", "AFTER_DO", "BEFORE_DOWHILE_WHILE", "AFTER_DOWHILE_WHILE", "AFTER_FORIN_FOR", "BEFORE_FORIN_IN", "AFTER_FORIN_FOR", "BEFORE_FORIN_BODY", "AFTER_FOROF_FOR", "BEFORE_FOROF_OF", "AFTER_FOROF_FOR", "BEFORE_FOROF_BODY", "AFTER_FOR_FOR", "BEFORE_FOR_INIT", "AFTER_FOR_INIT", "EMPTY_FOR_INIT", "BEFORE_FOR_TEST", "AFTER_FOR_TEST", "EMPTY_FOR_TEST", "BEFORE_FOR_UPDATE", "AFTER_FOR_UPDATE", "EMPTY_FOR_UPDATE", "BEFORE_FOR_BODY", "BEFORE_GENERATOR_STAR", "AFTER_GENERATOR_STAR", "BEFORE_FUNCTION_PARAMS", "BEFORE_FUNCTION_DECLARATION_BODY", "BEFORE_FUNCTION_EXPRESSION_BODY", "AFTER_FUNCTION_DIRECTIVES", "BEFORE_ARROW", "AFTER_ARROW", "AFTER_GET", "BEFORE_GET_PARAMS", "BEFORE_GET_BODY", "AFTER_IF", "AFTER_IF_TEST", "BEFORE_ELSE", "AFTER_ELSE", "PARAMETER_BEFORE_COMMA", "PARAMETER_AFTER_COMMA", "NAMED_IMPORT_BEFORE_COMMA", "NAMED_IMPORT_AFTER_COMMA", "IMPORT_BEFORE_COMMA", "IMPORT_AFTER_COMMA", "BEFORE_IMPORT_BINDINGS", "BEFORE_IMPORT_MODULE", "AFTER_IMPORT_BINDINGS", "AFTER_FROM", "BEFORE_IMPORT_NAMESPACE", "BEFORE_IMPORT_STAR", "AFTER_IMPORT_STAR", "AFTER_IMPORT_AS", "AFTER_NAMESPACE_BINDING", "BEFORE_IMPORT_AS", "AFTER_IMPORT_AS", "EXPORTS_BEFORE_COMMA", "EXPORTS_AFTER_COMMA", "BEFORE_EXPORT_STAR", "AFTER_EXPORT_STAR", "BEFORE_EXPORT_BINDINGS", "AFTER_EXPORT_BINDINGS", "AFTER_EXPORT", "EXPORT_DEFAULT", "AFTER_EXPORT_DEFAULT", "BEFORE_EXPORT_AS", "AFTER_EXPORT_AS", "BEFORE_LABEL_COLON", "AFTER_LABEL_COLON", "AFTER_METHOD_GENERATOR_STAR", "AFTER_METHOD_NAME", "BEFORE_METHOD_BODY", "AFTER_MODULE_DIRECTIVES", "AFTER_NEW", "BEFORE_NEW_ARGS", "EMPTY_NEW_CALL", "NEW_TARGET_BEFORE_DOT", "NEW_TARGET_AFTER_DOT", "RETURN", "AFTER_SET", "BEFORE_SET_PARAMS", "BEFORE_SET_BODY", "AFTER_SCRIPT_DIRECTIVES", "BEFORE_STATIC_MEMBER_DOT", "AFTER_STATIC_MEMBER_DOT", "BEFORE_CASE_TEST", "AFTER_CASE_TEST", "BEFORE_CASE_BODY", "AFTER_CASE_BODY", "DEFAULT", "AFTER_DEFAULT_BODY", "BEFORE_SWITCH_DISCRIM", "BEFORE_SWITCH_BODY", "TEMPLATE_TAG", "BEFORE_TEMPLATE_EXPRESSION", "AFTER_TEMPLATE_EXPRESSION", "THROW", "AFTER_TRY", "BEFORE_CATCH", "BEFORE_FINALLY", "AFTER_FINALLY", "VARIABLE_DECLARATION", "YIELD", "BEFORE_YIELD_STAR", "AFTER_YIELD_STAR", "DECLARATORS_BEFORE_COMMA", "DECLARATORS_AFTER_COMMA", "BEFORE_INIT_EQUALS", "AFTER_INIT_EQUALS", "AFTER_WHILE", "BEFORE_WHILE_BODY", "AFTER_WITH", "BEFORE_WITH_BODY", "PAREN_AVOIDING_DIRECTIVE_BEFORE", "PAREN_AVOIDING_DIRECTIVE_AFTER", "PRECEDENCE_BEFORE", "PRECEDENCE_AFTER", "EXPRESSION_PAREN_BEFORE", "EXPRESSION_PAREN_AFTER", "CALL_PAREN_BEFORE", "CALL_PAREN_AFTER", "CALL_PAREN_EMPTY", "CATCH_PAREN_BEFORE", "CATCH_PAREN_AFTER", "DO_WHILE_TEST_PAREN_BEFORE", "DO_WHILE_TEST_PAREN_AFTER", "EXPRESSION_STATEMENT_PAREN_BEFORE", "EXPRESSION_STATEMENT_PAREN_AFTER", "FOR_IN_LET_PAREN_BEFORE", "FOR_IN_LET_PAREN_AFTER", "FOR_IN_PAREN_BEFORE", "FOR_IN_PAREN_AFTER", "FOR_OF_LET_PAREN_BEFORE", "FOR_OF_LET_PAREN_AFTER", "FOR_OF_PAREN_BEFORE", "FOR_OF_PAREN_AFTER", "PARAMETERS_PAREN_BEFORE", "PARAMETERS_PAREN_AFTER", "PARAMETERS_PAREN_EMPTY", "ARROW_PARAMETERS_PAREN_BEFORE", "ARROW_PARAMETERS_PAREN_AFTER", "ARROW_PARAMETERS_PAREN_EMPTY", "ARROW_BODY_PAREN_BEFORE", "ARROW_BODY_PAREN_AFTER", "GETTER_PARAMS", "IF_PAREN_BEFORE", "IF_PAREN_AFTER", "EXPORT_PAREN_BEFORE", "EXPORT_PAREN_AFTER", "NEW_CALLEE_PAREN_BEFORE", "NEW_CALLEE_PAREN_AFTER", "NEW_PAREN_BEFORE", "NEW_PAREN_AFTER", "NEW_PAREN_EMPTY", "SETTER_PARAM_BEFORE", "SETTER_PARAM_AFTER", "SWITCH_DISCRIM_PAREN_BEFORE", "SWITCH_DISCRIM_PAREN_AFTER", "WHILE_TEST_PAREN_BEFORE", "WHILE_TEST_PAREN_AFTER", "WITH_PAREN_BEFORE", "WITH_PAREN_AFTER", "OBJECT_BRACE_INITIAL", "OBJECT_BRACE_FINAL", "OBJECT_EMPTY", "BLOCK_BRACE_INITIAL", "BLOCK_BRACE_FINAL", "BLOCK_EMPTY", "CLASS_BRACE_INITIAL", "CLASS_BRACE_FINAL", "CLASS_EMPTY", "CLASS_EXPRESSION_BRACE_INITIAL", "CLASS_EXPRESSION_BRACE_FINAL", "CLASS_EXPRESSION_BRACE_EMPTY", "FUNCTION_BRACE_INITIAL", "FUNCTION_BRACE_FINAL", "FUNCTION_EMPTY", "FUNCTION_EXPRESSION_BRACE_INITIAL", "FUNCTION_EXPRESSION_BRACE_FINAL", "FUNCTION_EXPRESSION_EMPTY", "ARROW_BRACE_INITIAL", "ARROW_BRACE_FINAL", "ARROW_BRACE_EMPTY", "GET_BRACE_INTIAL", "GET_BRACE_FINAL", "GET_BRACE_EMPTY", "MISSING_ELSE_INTIIAL", "MISSING_ELSE_FINAL", "MISSING_ELSE_EMPTY", "IMPORT_BRACE_INTIAL", "IMPORT_BRACE_FINAL", "IMPORT_BRACE_EMPTY", "EXPORT_BRACE_INITIAL", "EXPORT_BRACE_FINAL", "EXPORT_BRACE_EMPTY", "METHOD_BRACE_INTIAL", "METHOD_BRACE_FINAL", "METHOD_BRACE_EMPTY", "SET_BRACE_INTIIAL", "SET_BRACE_FINAL", "SET_BRACE_EMPTY", "SWITCH_BRACE_INTIAL", "SWITCH_BRACE_FINAL", "SWITCH_BRACE_EMPTY", "ARRAY_INITIAL", "ARRAY_FINAL", "COMPUTED_MEMBER_BRACKET_INTIAL", "COMPUTED_MEMBER_BRACKET_FINAL", "COMPUTED_PROPERTY_BRACKET_INTIAL", "COMPUTED_PROPERTY_BRACKET_FINAL"]; + for (var i = 0; i < separatorNames.length; ++i) { + Sep[separatorNames[i]] = { type: separatorNames[i] }; + } - /** - * Converts an object into an array of key, value arrays. Only the object's - * own properties are used. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. - * - * @func - * @memberOf R - * @since v0.4.0 - * @category Object - * @sig {String: *} -> [[String,*]] - * @param {Object} obj The object to extract from - * @return {Array} An array of key, value arrays from the object's own properties. - * @see R.fromPairs - * @example - * - * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]] - */ - var toPairs = _curry1(function toPairs(obj) { - var pairs = []; - for (var prop in obj) { - if (_has(prop, obj)) { - pairs[pairs.length] = [ - prop, - obj[prop] - ]; - } - } - return pairs; - }); + Sep.BEFORE_ASSIGN_OP = function (op) { + return { + type: "BEFORE_ASSIGN_OP", + op: op + }; + }; - /** - * Converts an object into an array of key, value arrays. The object's own - * properties and prototype properties are used. Note that the order of the - * output array is not guaranteed to be consistent across different JS - * platforms. - * - * @func - * @memberOf R - * @since v0.4.0 - * @category Object - * @sig {String: *} -> [[String,*]] - * @param {Object} obj The object to extract from - * @return {Array} An array of key, value arrays from the object's own - * and prototype properties. - * @example - * - * var F = function() { this.x = 'X'; }; - * F.prototype.y = 'Y'; - * var f = new F(); - * R.toPairsIn(f); //=> [['x','X'], ['y','Y']] - */ - var toPairsIn = _curry1(function toPairsIn(obj) { - var pairs = []; - for (var prop in obj) { - pairs[pairs.length] = [ - prop, - obj[prop] - ]; - } - return pairs; - }); + Sep.AFTER_ASSIGN_OP = function (op) { + return { + type: "AFTER_ASSIGN_OP", + op: op + }; + }; - /** - * Transposes the rows and columns of a 2D list. - * When passed a list of `n` lists of length `x`, - * returns a list of `x` lists of length `n`. - * - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category List - * @sig [[a]] -> [[a]] - * @param {Array} list A 2D list - * @return {Array} A 2D list - * @example - * - * R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']] - * R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']] - * - * If some of the rows are shorter than the following rows, their elements are skipped: - * - * R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]] - */ - var transpose = _curry1(function transpose(outerlist) { - var i = 0; - var result = []; - while (i < outerlist.length) { - var innerlist = outerlist[i]; - var j = 0; - while (j < innerlist.length) { - if (typeof result[j] === 'undefined') { - result[j] = []; - } - result[j].push(innerlist[j]); - j += 1; - } - i += 1; - } - return result; - }); + Sep.BEFORE_BINOP = function (op) { + return { + type: "BEFORE_BINOP", + op: op + }; + }; - /** - * Removes (strips) whitespace from both ends of the string. - * - * @func - * @memberOf R - * @since v0.6.0 - * @category String - * @sig String -> String - * @param {String} str The string to trim. - * @return {String} Trimmed version of `str`. - * @example - * - * R.trim(' xyz '); //=> 'xyz' - * R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z'] - */ - var trim = function () { - var ws = '\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + '\u2029\uFEFF'; - var zeroWidth = '\u200B'; - var hasProtoTrim = typeof String.prototype.trim === 'function'; - if (!hasProtoTrim || (ws.trim() || !zeroWidth.trim())) { - return _curry1(function trim(str) { - var beginRx = new RegExp('^[' + ws + '][' + ws + ']*'); - var endRx = new RegExp('[' + ws + '][' + ws + ']*$'); - return str.replace(beginRx, '').replace(endRx, ''); - }); - } else { - return _curry1(function trim(str) { - return str.trim(); - }); - } - }(); + Sep.AFTER_BINOP = function (op) { + return { + type: "AFTER_BINOP", + op: op + }; + }; - /** - * Gives a single-word string description of the (native) type of a value, - * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not - * attempt to distinguish user Object types any further, reporting them all as - * 'Object'. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Type - * @sig (* -> {*}) -> String - * @param {*} val The value to test - * @return {String} - * @example - * - * R.type({}); //=> "Object" - * R.type(1); //=> "Number" - * R.type(false); //=> "Boolean" - * R.type('s'); //=> "String" - * R.type(null); //=> "Null" - * R.type([]); //=> "Array" - * R.type(/[A-z]/); //=> "RegExp" - */ - var type = _curry1(function type(val) { - return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1); - }); + Sep.BEFORE_POSTFIX = function (op) { + return { + type: "BEFORE_POSTFIX", + op: op + }; + }; - /** - * Takes a function `fn`, which takes a single array argument, and returns a - * function which: - * - * - takes any number of positional arguments; - * - passes these arguments to `fn` as an array; and - * - returns the result. - * - * In other words, R.unapply derives a variadic function from a function which - * takes an array. R.unapply is the inverse of R.apply. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Function - * @sig ([*...] -> a) -> (*... -> a) - * @param {Function} fn - * @return {Function} - * @see R.apply - * @example - * - * R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]' - */ - var unapply = _curry1(function unapply(fn) { - return function () { - return fn(_slice(arguments)); - }; - }); + Sep.UNARY = function (op) { + return { + type: "UNARY", + op: op + }; + }; - /** - * Wraps a function of any arity (including nullary) in a function that accepts - * exactly 1 parameter. Any extraneous parameters will not be passed to the - * supplied function. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Function - * @sig (* -> b) -> (a -> b) - * @param {Function} fn The function to wrap. - * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of - * arity 1. - * @example - * - * var takesTwoArgs = function(a, b) { - * return [a, b]; - * }; - * takesTwoArgs.length; //=> 2 - * takesTwoArgs(1, 2); //=> [1, 2] - * - * var takesOneArg = R.unary(takesTwoArgs); - * takesOneArg.length; //=> 1 - * // Only 1 argument is passed to the wrapped function - * takesOneArg(1, 2); //=> [1, undefined] - */ - var unary = _curry1(function unary(fn) { - return nAry(1, fn); - }); + Sep.AFTER_STATEMENT = function (node) { + return { + type: "AFTER_STATEMENT", + node: node + }; + }; - /** - * Returns a function of arity `n` from a (manually) curried function. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Function - * @sig Number -> (a -> b) -> (a -> c) - * @param {Number} length The arity for the returned function. - * @param {Function} fn The function to uncurry. - * @return {Function} A new function. - * @see R.curry - * @example - * - * var addFour = a => b => c => d => a + b + c + d; - * - * var uncurriedAddFour = R.uncurryN(4, addFour); - * uncurriedAddFour(1, 2, 3, 4); //=> 10 - */ - var uncurryN = _curry2(function uncurryN(depth, fn) { - return curryN(depth, function () { - var currentDepth = 1; - var value = fn; - var idx = 0; - var endIdx; - while (currentDepth <= depth && typeof value === 'function') { - endIdx = currentDepth === depth ? arguments.length : idx + value.length; - value = value.apply(this, _slice(arguments, idx, endIdx)); - currentDepth += 1; - idx = endIdx; - } - return value; - }); - }); + Sep.BEFORE_FUNCTION_NAME = function (node) { + return { + type: "BEFORE_FUNCTION_NAME", + node: node + }; + }; + exports.Sep = Sep; - /** - * Builds a list from a seed value. Accepts an iterator function, which returns - * either false to stop iteration or an array of length 2 containing the value - * to add to the resulting list and the seed to be used in the next call to the - * iterator function. - * - * The iterator function receives one argument: *(seed)*. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category List - * @sig (a -> [b]) -> * -> [b] - * @param {Function} fn The iterator function. receives one argument, `seed`, and returns - * either false to quit iteration or an array of length two to proceed. The element - * at index 0 of this array will be added to the resulting array, and the element - * at index 1 will be passed to the next call to `fn`. - * @param {*} seed The seed value. - * @return {Array} The final list. - * @example - * - * var f = n => n > 50 ? false : [-n, n + 10]; - * R.unfold(f, 10); //=> [-10, -20, -30, -40, -50] - */ - var unfold = _curry2(function unfold(fn, seed) { - var pair = fn(seed); - var result = []; - while (pair && pair.length) { - result[result.length] = pair[0]; - pair = fn(pair[1]); - } - return result; - }); + var ExtensibleCodeGen = exports.ExtensibleCodeGen = function () { + function ExtensibleCodeGen() { + _classCallCheck(this, ExtensibleCodeGen); + } - /** - * Returns a new list containing only one copy of each element in the original - * list, based upon the value returned by applying the supplied predicate to - * two list elements. Prefers the first item if two items compare equal based - * on the predicate. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category List - * @sig (a, a -> Boolean) -> [a] -> [a] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list The array to consider. - * @return {Array} The list of unique items. - * @example - * - * var strEq = R.eqBy(String); - * R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2] - * R.uniqWith(strEq)([{}, {}]); //=> [{}] - * R.uniqWith(strEq)([1, '1', 1]); //=> [1] - * R.uniqWith(strEq)(['1', 1, 1]); //=> ['1'] - */ - var uniqWith = _curry2(function uniqWith(pred, list) { - var idx = 0; - var len = list.length; - var result = []; - var item; - while (idx < len) { - item = list[idx]; - if (!_containsWith(pred, item, result)) { - result[result.length] = item; - } - idx += 1; + _createClass(ExtensibleCodeGen, [{ + key: "parenToAvoidBeingDirective", + value: function parenToAvoidBeingDirective(element, original) { + if (element && element.type === "ExpressionStatement" && element.expression.type === "LiteralStringExpression") { + return seq(this.paren(original.children[0], Sep.PAREN_AVOIDING_DIRECTIVE_BEFORE, Sep.PAREN_AVOIDING_DIRECTIVE_AFTER), this.semiOp()); + } + return original; + } + }, { + key: "t", + value: function t(token) { + return new _coderep.Token(token); + } + }, { + key: "p", + value: function p(node, precedence, a) { + return (0, _coderep.getPrecedence)(node) < precedence ? this.paren(a, Sep.PRECEDENCE_BEFORE, Sep.PRECEDENCE_AFTER) : a; + } + }, { + key: "getAssignmentExpr", + value: function getAssignmentExpr(state) { + return state ? state.containsGroup ? this.paren(state, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER) : state : empty(); + } + }, { + key: "paren", + value: function paren(rep, first, last, empty) { + if (isEmpty(rep)) { + return new _coderep.Paren(this.sep(empty)); + } + return new _coderep.Paren(seq(first ? this.sep(first) : new _coderep.Empty(), rep, last ? this.sep(last) : new _coderep.Empty())); + } + }, { + key: "brace", + value: function brace(rep, node, first, last, empty) { + if (isEmpty(rep)) { + return new _coderep.Brace(this.sep(empty)); + } + return new _coderep.Brace(seq(this.sep(first), rep, this.sep(last))); + } + }, { + key: "bracket", + value: function bracket(rep, first, last, empty) { + if (isEmpty(rep)) { + return new _coderep.Bracket(this.sep(empty)); + } + return new _coderep.Bracket(seq(this.sep(first), rep, this.sep(last))); + } + }, { + key: "commaSep", + value: function commaSep(pieces, before, after) { + var _this = this; + + var first = true; + pieces = pieces.map(function (p) { + if (first) { + first = false; + return p; + } else { + return seq(_this.sep(before), _this.t(","), _this.sep(after), p); } - return result; - }); + }); + return seq.apply(undefined, _toConsumableArray(pieces)); + } + }, { + key: "semiOp", + value: function semiOp() { + return new _coderep.SemiOp(); + } + }, { + key: "sep", + value: function sep(kind) { + return new _coderep.Empty(); + } + }, { + key: "reduceArrayExpression", + value: function reduceArrayExpression(node, _ref) { + var _this2 = this; - /** - * Tests the final argument by passing it to the given predicate function. If - * the predicate is not satisfied, the function will return the result of - * calling the `whenFalseFn` function with the same argument. If the predicate - * is satisfied, the argument is returned as is. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Logic - * @sig (a -> Boolean) -> (a -> a) -> a -> a - * @param {Function} pred A predicate function - * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates - * to a falsy value. - * @param {*} x An object to test with the `pred` function and - * pass to `whenFalseFn` if necessary. - * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`. - * @see R.ifElse, R.when - * @example - * - * // coerceArray :: (a|[a]) -> [a] - * var coerceArray = R.unless(R.isArrayLike, R.of); - * coerceArray([1, 2, 3]); //=> [1, 2, 3] - * coerceArray(1); //=> [1] - */ - var unless = _curry3(function unless(pred, whenFalseFn, x) { - return pred(x) ? x : whenFalseFn(x); - }); + var elements = _ref.elements; - /** - * Returns a new copy of the array with the element at the provided index - * replaced with the given value. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig Number -> a -> [a] -> [a] - * @param {Number} idx The index to update. - * @param {*} x The value to exist at the given index of the returned array. - * @param {Array|Arguments} list The source array-like object to be updated. - * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`. - * @see R.adjust - * @example - * - * R.update(1, 11, [0, 1, 2]); //=> [0, 11, 2] - * R.update(1)(11)([0, 1, 2]); //=> [0, 11, 2] - */ - var update = _curry3(function update(idx, x, list) { - return adjust(always(x), idx, list); - }); + if (elements.length === 0) { + return this.bracket(empty(), null, null, Sep.ARRAY_EMPTY); + } - /** - * Accepts a function `fn` and a list of transformer functions and returns a - * new curried function. When the new function is invoked, it calls the - * function `fn` with parameters consisting of the result of calling each - * supplied handler on successive arguments to the new function. - * - * If more arguments are passed to the returned function than transformer - * functions, those arguments are passed directly to `fn` as additional - * parameters. If you expect additional arguments that don't need to be - * transformed, although you can ignore them, it's best to pass an identity - * function so that the new function reports the correct arity. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (x1 -> x2 -> ... -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z) - * @param {Function} fn The function to wrap. - * @param {Array} transformers A list of transformer functions - * @return {Function} The wrapped function. - * @example - * - * R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81 - * R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81 - * R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32 - * R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32 - */ - var useWith = _curry2(function useWith(fn, transformers) { - return curryN(transformers.length, function () { - var args = []; - var idx = 0; - while (idx < transformers.length) { - args.push(transformers[idx].call(this, arguments[idx])); - idx += 1; - } - return fn.apply(this, args.concat(_slice(arguments, transformers.length))); - }); - }); + var content = this.commaSep(elements.map(function (e) { + return _this2.getAssignmentExpr(e); + }), Sep.ARRAY_BEFORE_COMMA, Sep.ARRAY_AFTER_COMMA); + if (elements.length > 0 && elements[elements.length - 1] == null) { + content = seq(content, this.sep(Sep.ARRAY_BEFORE_COMMA), this.t(","), this.sep(Sep.ARRAY_AFTER_COMMA)); + } + return this.bracket(content, Sep.ARRAY_INITIAL, Sep.ARRAY_FINAL); + } + }, { + key: "reduceSpreadElement", + value: function reduceSpreadElement(node, _ref2) { + var expression = _ref2.expression; - /** - * Returns a list of all the enumerable own properties of the supplied object. - * Note that the order of the output array is not guaranteed across different - * JS platforms. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig {k: v} -> [v] - * @param {Object} obj The object to extract values from - * @return {Array} An array of the values of the object's own properties. - * @example - * - * R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3] - */ - var values = _curry1(function values(obj) { - var props = keys(obj); - var len = props.length; - var vals = []; - var idx = 0; - while (idx < len) { - vals[idx] = obj[props[idx]]; - idx += 1; - } - return vals; - }); + return seq(this.t("..."), this.sep(Sep.SPREAD), this.p(node.expression, _coderep.Precedence.Assignment, expression)); + } + }, { + key: "reduceAssignmentExpression", + value: function reduceAssignmentExpression(node, _ref3) { + var binding = _ref3.binding; + var expression = _ref3.expression; - /** - * Returns a list of all the properties, including prototype properties, of the - * supplied object. - * Note that the order of the output array is not guaranteed to be consistent - * across different JS platforms. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Object - * @sig {k: v} -> [v] - * @param {Object} obj The object to extract values from - * @return {Array} An array of the values of the object's own and prototype properties. - * @example - * - * var F = function() { this.x = 'X'; }; - * F.prototype.y = 'Y'; - * var f = new F(); - * R.valuesIn(f); //=> ['X', 'Y'] - */ - var valuesIn = _curry1(function valuesIn(obj) { - var prop; - var vs = []; - for (prop in obj) { - vs[vs.length] = obj[prop]; - } - return vs; - }); + var leftCode = binding; + var rightCode = expression; + var containsIn = expression.containsIn; + var startsWithCurly = binding.startsWithCurly; + var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; + var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; + if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { + rightCode = this.paren(rightCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); + containsIn = false; + } + return (0, _objectAssign2.default)(seq(leftCode, this.sep(Sep.BEFORE_ASSIGN_OP("=")), this.t("="), this.sep(Sep.AFTER_ASSIGN_OP("=")), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); + } + }, { + key: "reduceCompoundAssignmentExpression", + value: function reduceCompoundAssignmentExpression(node, _ref4) { + var binding = _ref4.binding; + var expression = _ref4.expression; - /** - * Returns a "view" of the given data structure, determined by the given lens. - * The lens's focus determines which portion of the data structure is visible. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Lens s a -> s -> a - * @param {Lens} lens - * @param {*} x - * @return {*} - * @see R.prop, R.lensIndex, R.lensProp - * @example - * - * var xLens = R.lensProp('x'); - * - * R.view(xLens, {x: 1, y: 2}); //=> 1 - * R.view(xLens, {x: 4, y: 2}); //=> 4 - */ - var view = function () { - var Const = function (x) { - return { - value: x, - map: function () { - return this; - } - }; - }; - return _curry2(function view(lens, x) { - return lens(Const)(x).value; - }); - }(); + var leftCode = binding; + var rightCode = expression; + var containsIn = expression.containsIn; + var startsWithCurly = binding.startsWithCurly; + var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; + var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; + if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { + rightCode = this.paren(rightCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); + containsIn = false; + } + return (0, _objectAssign2.default)(seq(leftCode, this.sep(Sep.BEFORE_ASSIGN_OP(node.operator)), this.t(node.operator), this.sep(Sep.AFTER_ASSIGN_OP(node.operator)), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); + } + }, { + key: "reduceBinaryExpression", + value: function reduceBinaryExpression(node, _ref5) { + var left = _ref5.left; + var right = _ref5.right; - /** - * Tests the final argument by passing it to the given predicate function. If - * the predicate is satisfied, the function will return the result of calling - * the `whenTrueFn` function with the same argument. If the predicate is not - * satisfied, the argument is returned as is. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Logic - * @sig (a -> Boolean) -> (a -> a) -> a -> a - * @param {Function} pred A predicate function - * @param {Function} whenTrueFn A function to invoke when the `condition` - * evaluates to a truthy value. - * @param {*} x An object to test with the `pred` function and - * pass to `whenTrueFn` if necessary. - * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`. - * @see R.ifElse, R.unless - * @example - * - * // truncate :: String -> String - * var truncate = R.when( - * R.propSatisfies(R.gt(R.__, 10), 'length'), - * R.pipe(R.take(10), R.append('…'), R.join('')) - * ); - * truncate('12345'); //=> '12345' - * truncate('0123456789ABC'); //=> '0123456789…' - */ - var when = _curry3(function when(pred, whenTrueFn, x) { - return pred(x) ? whenTrueFn(x) : x; - }); + var leftCode = left; + var startsWithCurly = left.startsWithCurly; + var startsWithLetSquareBracket = left.startsWithLetSquareBracket; + var startsWithFunctionOrClass = left.startsWithFunctionOrClass; + var leftContainsIn = left.containsIn; + if ((0, _coderep.getPrecedence)(node.left) < (0, _coderep.getPrecedence)(node)) { + leftCode = this.paren(leftCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); + startsWithCurly = false; + startsWithLetSquareBracket = false; + startsWithFunctionOrClass = false; + leftContainsIn = false; + } + var rightCode = right; + var rightContainsIn = right.containsIn; + if ((0, _coderep.getPrecedence)(node.right) <= (0, _coderep.getPrecedence)(node)) { + rightCode = this.paren(rightCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); + rightContainsIn = false; + } + return (0, _objectAssign2.default)(seq(leftCode, this.sep(Sep.BEFORE_BINOP(node.operator)), this.t(node.operator), this.sep(Sep.AFTER_BINOP(node.operator)), rightCode), { + containsIn: leftContainsIn || rightContainsIn || node.operator === "in", + containsGroup: node.operator == ",", + startsWithCurly: startsWithCurly, + startsWithLetSquareBracket: startsWithLetSquareBracket, + startsWithFunctionOrClass: startsWithFunctionOrClass + }); + } + }, { + key: "reduceBindingWithDefault", + value: function reduceBindingWithDefault(node, _ref6) { + var binding = _ref6.binding; + var init = _ref6.init; - /** - * Takes a spec object and a test object; returns true if the test satisfies - * the spec. Each of the spec's own properties must be a predicate function. - * Each predicate is applied to the value of the corresponding property of the - * test object. `where` returns true if all the predicates return true, false - * otherwise. - * - * `where` is well suited to declaratively expressing constraints for other - * functions such as `filter` and `find`. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category Object - * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean - * @param {Object} spec - * @param {Object} testObj - * @return {Boolean} - * @example - * - * // pred :: Object -> Boolean - * var pred = R.where({ - * a: R.equals('foo'), - * b: R.complement(R.equals('bar')), - * x: R.gt(_, 10), - * y: R.lt(_, 20) - * }); - * - * pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true - * pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false - * pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false - * pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false - * pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false - */ - var where = _curry2(function where(spec, testObj) { - for (var prop in spec) { - if (_has(prop, spec) && !spec[prop](testObj[prop])) { - return false; - } - } - return true; - }); + return seq(binding, this.sep(Sep.BEFORE_DEFAULT_EQUALS), this.t("="), this.sep(Sep.AFTER_DEFAULT_EQUALS), init); + } + }, { + key: "reduceBindingIdentifier", + value: function reduceBindingIdentifier(node) { + var a = this.t(node.name); + if (node.name === "let") { + a.startsWithLet = true; + } + return a; + } + }, { + key: "reduceArrayBinding", + value: function reduceArrayBinding(node, _ref7) { + var _this3 = this; - /** - * Wrap a function inside another to allow you to make adjustments to the - * parameters, or do other processing either before the internal function is - * called or with its results. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (a... -> b) -> ((a... -> b) -> a... -> c) -> (a... -> c) - * @param {Function} fn The function to wrap. - * @param {Function} wrapper The wrapper function. - * @return {Function} The wrapped function. - * @example - * - * var greet = name => 'Hello ' + name; - * - * var shoutedGreet = R.wrap(greet, (gr, name) => gr(name).toUpperCase()); - * - * shoutedGreet("Kathy"); //=> "HELLO KATHY" - * - * var shortenedGreet = R.wrap(greet, function(gr, name) { - * return gr(name.substring(0, 3)); - * }); - * shortenedGreet("Robert"); //=> "Hello Rob" - */ - var wrap = _curry2(function wrap(fn, wrapper) { - return curryN(fn.length, function () { - return wrapper.apply(this, _concat([fn], arguments)); - }); - }); + var elements = _ref7.elements; + var restElement = _ref7.restElement; - /** - * Creates a new list out of the two supplied by creating each possible pair - * from the lists. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [b] -> [[a,b]] - * @param {Array} as The first list. - * @param {Array} bs The second list. - * @return {Array} The list made by combining each possible pair from - * `as` and `bs` into pairs (`[a, b]`). - * @example - * - * R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] - */ - // = xprodWith(prepend); (takes about 3 times as long...) - var xprod = _curry2(function xprod(a, b) { - // = xprodWith(prepend); (takes about 3 times as long...) - var idx = 0; - var ilen = a.length; - var j; - var jlen = b.length; - var result = []; - while (idx < ilen) { - j = 0; - while (j < jlen) { - result[result.length] = [ - a[idx], - b[j] - ]; - j += 1; - } - idx += 1; + var content = undefined; + if (elements.length === 0) { + content = restElement == null ? empty() : seq(this.t("..."), this.sep(Sep.REST), restElement); + } else { + elements = elements.concat(restElement == null ? [] : [seq(this.t("..."), this.sep(Sep.REST), restElement)]); + content = this.commaSep(elements.map(function (e) { + return _this3.getAssignmentExpr(e); + }), Sep.ARRAY_BEFORE_COMMA, Sep.ARRAY_AFTER_COMMA); + if (elements.length > 0 && elements[elements.length - 1] == null) { + content = seq(content, this.sep(Sep.ARRAY_BEFORE_COMMA), this.t(","), this.sep(Sep.ARRAY_AFTER_COMMA)); } - return result; - }); + } + return this.bracket(content, Sep.ARRAY_INITIAL, Sep.ARRAY_FINAL, Sep.ARRAY_EMPTY); + } + }, { + key: "reduceObjectBinding", + value: function reduceObjectBinding(node, _ref8) { + var properties = _ref8.properties; - /** - * Creates a new list out of the two supplied by pairing up equally-positioned - * items from both lists. The returned list is truncated to the length of the - * shorter of the two input lists. - * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [b] -> [[a,b]] - * @param {Array} list1 The first array to consider. - * @param {Array} list2 The second array to consider. - * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`. - * @example - * - * R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']] - */ - var zip = _curry2(function zip(a, b) { - var rv = []; - var idx = 0; - var len = Math.min(a.length, b.length); - while (idx < len) { - rv[idx] = [ - a[idx], - b[idx] - ]; - idx += 1; - } - return rv; - }); + var state = this.brace(this.commaSep(properties, Sep.OBJECT_BEFORE_COMMA, Sep.OBJECT_AFTER_COMMA), node, Sep.OBJECT_BRACE_INITIAL, Sep.OBJECT_BRACE_FINAL, Sep.OBJECT_EMPTY); + state.startsWithCurly = true; + return state; + } + }, { + key: "reduceBindingPropertyIdentifier", + value: function reduceBindingPropertyIdentifier(node, _ref9) { + var binding = _ref9.binding; + var init = _ref9.init; - /** - * Creates a new object out of a list of keys and a list of values. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category List - * @sig [String] -> [*] -> {String: *} - * @param {Array} keys The array that will be properties on the output object. - * @param {Array} values The list of values on the output object. - * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`. - * @example - * - * R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3} - */ - var zipObj = _curry2(function zipObj(keys, values) { - var idx = 0; - var len = keys.length; - var out = {}; - while (idx < len) { - out[keys[idx]] = values[idx]; - idx += 1; - } - return out; - }); + if (node.init == null) return binding; + return seq(binding, this.sep(Sep.BEFORE_DEFAULT_EQUALS), this.t("="), this.sep(Sep.AFTER_DEFAULT_EQUALS), init); + } + }, { + key: "reduceBindingPropertyProperty", + value: function reduceBindingPropertyProperty(node, _ref10) { + var name = _ref10.name; + var binding = _ref10.binding; - /** - * Creates a new list out of the two supplied by applying the function to each - * equally-positioned pair in the lists. The returned list is truncated to the - * length of the shorter of the two input lists. - * - * @function - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a,b -> c) -> [a] -> [b] -> [c] - * @param {Function} fn The function used to combine the two elements into one value. - * @param {Array} list1 The first array to consider. - * @param {Array} list2 The second array to consider. - * @return {Array} The list made by combining same-indexed elements of `list1` and `list2` - * using `fn`. - * @example - * - * var f = (x, y) => { - * // ... - * }; - * R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']); - * //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')] - */ - var zipWith = _curry3(function zipWith(fn, a, b) { - var rv = []; - var idx = 0; - var len = Math.min(a.length, b.length); - while (idx < len) { - rv[idx] = fn(a[idx], b[idx]); - idx += 1; - } - return rv; - }); + return seq(name, this.sep(Sep.BEFORE_PROP), this.t(":"), this.sep(Sep.AFTER_PROP), binding); + } + }, { + key: "reduceBlock", + value: function reduceBlock(node, _ref11) { + var statements = _ref11.statements; - /** - * A function that always returns `false`. Any passed in parameters are ignored. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig * -> Boolean - * @param {*} - * @return {Boolean} - * @see R.always, R.T - * @example - * - * R.F(); //=> false - */ - var F = always(false); + return this.brace(seq.apply(undefined, _toConsumableArray(statements)), node, Sep.BLOCK_BRACE_INITIAL, Sep.BLOCK_BRACE_FINAL, Sep.BLOCK_EMPTY); + } + }, { + key: "reduceBlockStatement", + value: function reduceBlockStatement(node, _ref12) { + var block = _ref12.block; - /** - * A function that always returns `true`. Any passed in parameters are ignored. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig * -> Boolean - * @param {*} - * @return {Boolean} - * @see R.always, R.F - * @example - * - * R.T(); //=> true - */ - var T = always(true); + return seq(block, this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceBreakStatement", + value: function reduceBreakStatement(node, _ref13) { + var label = _ref13.label; - /** - * Copies an object. - * - * @private - * @param {*} value The value to be copied - * @param {Array} refFrom Array containing the source references - * @param {Array} refTo Array containing the copied source references - * @return {*} The copied value. - */ - var _clone = function _clone(value, refFrom, refTo) { - var copy = function copy(copiedValue) { - var len = refFrom.length; - var idx = 0; - while (idx < len) { - if (value === refFrom[idx]) { - return refTo[idx]; - } - idx += 1; - } - refFrom[idx + 1] = value; - refTo[idx + 1] = copiedValue; - for (var key in value) { - copiedValue[key] = _clone(value[key], refFrom, refTo); - } - return copiedValue; - }; - switch (type(value)) { - case 'Object': - return copy({}); - case 'Array': - return copy([]); - case 'Date': - return new Date(value.valueOf()); - case 'RegExp': - return _cloneRegExp(value); - default: - return value; - } - }; + return seq(this.t("break"), label ? seq(this.sep(Sep.BEFORE_JUMP_LABEL), this.t(label)) : empty(), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceCallExpression", + value: function reduceCallExpression(node, _ref14) { + var callee = _ref14.callee; + var args = _ref14.arguments; - var _createPartialApplicator = function _createPartialApplicator(concat) { - return _curry2(function (fn, args) { - return _arity(Math.max(0, fn.length - args.length), function () { - return fn.apply(this, concat(args, arguments)); - }); - }); - }; + return (0, _objectAssign2.default)(seq(this.p(node.callee, (0, _coderep.getPrecedence)(node), callee), this.sep(Sep.CALL), this.paren(this.commaSep(args, Sep.ARGS_BEFORE_COMMA, Sep.ARGS_AFTER_COMMA), Sep.CALL_PAREN_BEFORE, Sep.CALL_PAREN_AFTER, Sep.CALL_PAREN_EMPTY)), { + startsWithCurly: callee.startsWithCurly, + startsWithLetSquareBracket: callee.startsWithLetSquareBracket, + startsWithFunctionOrClass: callee.startsWithFunctionOrClass + }); + } + }, { + key: "reduceCatchClause", + value: function reduceCatchClause(node, _ref15) { + var binding = _ref15.binding; + var body = _ref15.body; - var _dropLast = function dropLast(n, xs) { - return take(n < xs.length ? xs.length - n : 0, xs); - }; + return seq(this.t("catch"), this.sep(Sep.BEFORE_CATCH_BINDING), this.paren(binding, Sep.CATCH_PAREN_BEFORE, Sep.CATCH_PAREN_AFTER), this.sep(Sep.AFTER_CATCH_BINDING), body); + } + }, { + key: "reduceClassDeclaration", + value: function reduceClassDeclaration(node, _ref16) { + var name = _ref16.name; + var _super = _ref16.super; + var elements = _ref16.elements; - // Values of other types are only equal if identical. - var _equals = function _equals(a, b, stackA, stackB) { - if (identical(a, b)) { - return true; - } - if (type(a) !== type(b)) { - return false; - } - if (a == null || b == null) { - return false; - } - if (typeof a.equals === 'function' || typeof b.equals === 'function') { - return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a); - } - switch (type(a)) { - case 'Arguments': - case 'Array': - case 'Object': - break; - case 'Boolean': - case 'Number': - case 'String': - if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) { - return false; - } - break; - case 'Date': - if (!identical(a.valueOf(), b.valueOf())) { - return false; - } - break; - case 'Error': - return a.name === b.name && a.message === b.message; - case 'RegExp': - if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) { - return false; - } - break; - case 'Map': - case 'Set': - if (!_equals(_arrayFromIterator(a.entries()), _arrayFromIterator(b.entries()), stackA, stackB)) { - return false; - } - break; - case 'Int8Array': - case 'Uint8Array': - case 'Uint8ClampedArray': - case 'Int16Array': - case 'Uint16Array': - case 'Int32Array': - case 'Uint32Array': - case 'Float32Array': - case 'Float64Array': - break; - case 'ArrayBuffer': - break; - default: - // Values of other types are only equal if identical. - return false; - } - var keysA = keys(a); - if (keysA.length !== keys(b).length) { - return false; - } - var idx = stackA.length - 1; - while (idx >= 0) { - if (stackA[idx] === a) { - return stackB[idx] === b; - } - idx -= 1; - } - stackA.push(a); - stackB.push(b); - idx = keysA.length - 1; - while (idx >= 0) { - var key = keysA[idx]; - if (!(_has(key, b) && _equals(b[key], a[key], stackA, stackB))) { - return false; - } - idx -= 1; - } - stackA.pop(); - stackB.pop(); - return true; - }; + var state = seq(this.t("class"), this.sep(Sep.BEFORE_CLASS_NAME), name); + if (_super != null) { + state = seq(state, this.sep(Sep.BEFORE_EXTENDS), this.t("extends"), this.sep(Sep.AFTER_EXTENDS), _super); + } + state = seq(state, this.sep(Sep.BEFORE_CLASS_DECLARATION_ELEMENTS), this.brace(seq.apply(undefined, _toConsumableArray(elements)), node, Sep.CLASS_BRACE_INITIAL, Sep.CLASS_BRACE_FINAL, Sep.CLASS_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); + return state; + } + }, { + key: "reduceClassExpression", + value: function reduceClassExpression(node, _ref17) { + var name = _ref17.name; + var _super = _ref17.super; + var elements = _ref17.elements; - /** - * `_makeFlat` is a helper function that returns a one-level or fully recursive - * function based on the flag passed in. - * - * @private - */ - var _makeFlat = function _makeFlat(recursive) { - return function flatt(list) { - var value, jlen, j; - var result = []; - var idx = 0; - var ilen = list.length; - while (idx < ilen) { - if (isArrayLike(list[idx])) { - value = recursive ? flatt(list[idx]) : list[idx]; - j = 0; - jlen = value.length; - while (j < jlen) { - result[result.length] = value[j]; - j += 1; - } - } else { - result[result.length] = list[idx]; - } - idx += 1; - } - return result; - }; - }; + var state = this.t("class"); + if (name != null) { + state = seq(state, this.sep(Sep.BEFORE_CLASS_NAME), name); + } + if (_super != null) { + state = seq(state, this.sep(Sep.BEFORE_EXTENDS), this.t("extends"), this.sep(Sep.AFTER_EXTENDS), _super); + } + state = seq(state, this.sep(Sep.BEFORE_CLASS_EXPRESSION_ELEMENTS), this.brace(seq.apply(undefined, _toConsumableArray(elements)), node, Sep.CLASS_EXPRESSION_BRACE_INITIAL, Sep.CLASS_EXPRESSION_BRACE_FINAL, Sep.CLASS_EXPRESSION_BRACE_EMPTY)); + state.startsWithFunctionOrClass = true; + return state; + } + }, { + key: "reduceClassElement", + value: function reduceClassElement(node, _ref18) { + var method = _ref18.method; - var _reduce = function () { - function _arrayReduce(xf, acc, list) { - var idx = 0; - var len = list.length; - while (idx < len) { - acc = xf['@@transducer/step'](acc, list[idx]); - if (acc && acc['@@transducer/reduced']) { - acc = acc['@@transducer/value']; - break; - } - idx += 1; - } - return xf['@@transducer/result'](acc); - } - function _iterableReduce(xf, acc, iter) { - var step = iter.next(); - while (!step.done) { - acc = xf['@@transducer/step'](acc, step.value); - if (acc && acc['@@transducer/reduced']) { - acc = acc['@@transducer/value']; - break; - } - step = iter.next(); - } - return xf['@@transducer/result'](acc); - } - function _methodReduce(xf, acc, obj) { - return xf['@@transducer/result'](obj.reduce(bind(xf['@@transducer/step'], xf), acc)); - } - var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator'; - return function _reduce(fn, acc, list) { - if (typeof fn === 'function') { - fn = _xwrap(fn); - } - if (isArrayLike(list)) { - return _arrayReduce(fn, acc, list); - } - if (typeof list.reduce === 'function') { - return _methodReduce(fn, acc, list); - } - if (list[symIterator] != null) { - return _iterableReduce(fn, acc, list[symIterator]()); - } - if (typeof list.next === 'function') { - return _iterableReduce(fn, acc, list); - } - throw new TypeError('reduce: list must be array or iterable'); - }; - }(); + method = seq(this.sep(Sep.BEFORE_CLASS_ELEMENT), method, this.sep(Sep.AFTER_CLASS_ELEMENT)); + if (!node.isStatic) return method; + return seq(this.t("static"), this.sep(Sep.AFTER_STATIC), method); + } + }, { + key: "reduceComputedMemberExpression", + value: function reduceComputedMemberExpression(node, _ref19) { + var object = _ref19.object; + var expression = _ref19.expression; - var _xdropLastWhile = function () { - function XDropLastWhile(fn, xf) { - this.f = fn; - this.retained = []; - this.xf = xf; - } - XDropLastWhile.prototype['@@transducer/init'] = _xfBase.init; - XDropLastWhile.prototype['@@transducer/result'] = function (result) { - this.retained = null; - return this.xf['@@transducer/result'](result); - }; - XDropLastWhile.prototype['@@transducer/step'] = function (result, input) { - return this.f(input) ? this.retain(result, input) : this.flush(result, input); - }; - XDropLastWhile.prototype.flush = function (result, input) { - result = _reduce(this.xf['@@transducer/step'], result, this.retained); - this.retained = []; - return this.xf['@@transducer/step'](result, input); - }; - XDropLastWhile.prototype.retain = function (result, input) { - this.retained.push(input); - return result; - }; - return _curry2(function _xdropLastWhile(fn, xf) { - return new XDropLastWhile(fn, xf); - }); - }(); + var startsWithLetSquareBracket = object.startsWithLetSquareBracket || node.object.type === "IdentifierExpression" && node.object.name === "let"; + return (0, _objectAssign2.default)(seq(this.p(node.object, (0, _coderep.getPrecedence)(node), object), this.sep(Sep.COMPUTED_MEMBER_EXPRESSION), this.bracket(expression, Sep.COMPUTED_MEMBER_BRACKET_INTIAL, Sep.COMPUTED_MEMBER_BRACKET_FINAL)), { + startsWithLet: object.startsWithLet, + startsWithLetSquareBracket: startsWithLetSquareBracket, + startsWithCurly: object.startsWithCurly, + startsWithFunctionOrClass: object.startsWithFunctionOrClass + }); + } + }, { + key: "reduceComputedPropertyName", + value: function reduceComputedPropertyName(node, _ref20) { + var expression = _ref20.expression; - var _xgroupBy = function () { - function XGroupBy(f, xf) { - this.xf = xf; - this.f = f; - this.inputs = {}; - } - XGroupBy.prototype['@@transducer/init'] = _xfBase.init; - XGroupBy.prototype['@@transducer/result'] = function (result) { - var key; - for (key in this.inputs) { - if (_has(key, this.inputs)) { - result = this.xf['@@transducer/step'](result, this.inputs[key]); - if (result['@@transducer/reduced']) { - result = result['@@transducer/value']; - break; - } - } - } - this.inputs = null; - return this.xf['@@transducer/result'](result); - }; - XGroupBy.prototype['@@transducer/step'] = function (result, input) { - var key = this.f(input); - this.inputs[key] = this.inputs[key] || [ - key, - [] - ]; - this.inputs[key][1] = append(input, this.inputs[key][1]); - return result; - }; - return _curry2(function _xgroupBy(f, xf) { - return new XGroupBy(f, xf); - }); - }(); + return this.bracket(expression, Sep.COMPUTED_PROPERTY_BRACKET_INTIAL, Sep.COMPUTED_PROPERTY_BRACKET_FINAL); + } + }, { + key: "reduceConditionalExpression", + value: function reduceConditionalExpression(node, _ref21) { + var test = _ref21.test; + var consequent = _ref21.consequent; + var alternate = _ref21.alternate; - /** - * Creates a new list iteration function from an existing one by adding two new - * parameters to its callback function: the current index, and the entire list. - * - * This would turn, for instance, Ramda's simple `map` function into one that - * more closely resembles `Array.prototype.map`. Note that this will only work - * for functions in which the iteration callback function is the first - * parameter, and where the list is the last parameter. (This latter might be - * unimportant if the list parameter is not used.) - * - * @func - * @memberOf R - * @since v0.15.0 - * @category Function - * @category List - * @sig ((a ... -> b) ... -> [a] -> *) -> (a ..., Int, [a] -> b) ... -> [a] -> *) - * @param {Function} fn A list iteration function that does not pass index or list to its callback - * @return {Function} An altered list iteration function that passes (item, index, list) to its callback - * @example - * - * var mapIndexed = R.addIndex(R.map); - * mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']); - * //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r'] - */ - var addIndex = _curry1(function addIndex(fn) { - return curryN(fn.length, function () { - var idx = 0; - var origFn = arguments[0]; - var list = arguments[arguments.length - 1]; - var args = _slice(arguments); - args[0] = function () { - var result = origFn.apply(this, _concat(arguments, [ - idx, - list - ])); - idx += 1; - return result; - }; - return fn.apply(this, args); - }); - }); + var containsIn = test.containsIn || alternate.containsIn; + var startsWithCurly = test.startsWithCurly; + var startsWithLetSquareBracket = test.startsWithLetSquareBracket; + var startsWithFunctionOrClass = test.startsWithFunctionOrClass; + return (0, _objectAssign2.default)(seq(this.p(node.test, _coderep.Precedence.LogicalOR, test), this.sep(Sep.BEFORE_TERNARY_QUESTION), this.t("?"), this.sep(Sep.AFTER_TERNARY_QUESTION), this.p(node.consequent, _coderep.Precedence.Assignment, consequent), this.sep(Sep.BEFORE_TERNARY_COLON), this.t(":"), this.sep(Sep.AFTER_TERNARY_COLON), this.p(node.alternate, _coderep.Precedence.Assignment, alternate)), { + containsIn: containsIn, + startsWithCurly: startsWithCurly, + startsWithLetSquareBracket: startsWithLetSquareBracket, + startsWithFunctionOrClass: startsWithFunctionOrClass + }); + } + }, { + key: "reduceContinueStatement", + value: function reduceContinueStatement(node, _ref22) { + var label = _ref22.label; - /** - * Wraps a function of any arity (including nullary) in a function that accepts - * exactly 2 parameters. Any extraneous parameters will not be passed to the - * supplied function. - * - * @func - * @memberOf R - * @since v0.2.0 - * @category Function - * @sig (* -> c) -> (a, b -> c) - * @param {Function} fn The function to wrap. - * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of - * arity 2. - * @example - * - * var takesThreeArgs = function(a, b, c) { - * return [a, b, c]; - * }; - * takesThreeArgs.length; //=> 3 - * takesThreeArgs(1, 2, 3); //=> [1, 2, 3] - * - * var takesTwoArgs = R.binary(takesThreeArgs); - * takesTwoArgs.length; //=> 2 - * // Only 2 arguments are passed to the wrapped function - * takesTwoArgs(1, 2, 3); //=> [1, 2, undefined] - */ - var binary = _curry1(function binary(fn) { - return nAry(2, fn); - }); + return seq(this.t("continue"), label ? seq(this.sep(Sep.BEFORE_JUMP_LABEL), this.t(label)) : empty(), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceDataProperty", + value: function reduceDataProperty(node, _ref23) { + var name = _ref23.name; + var expression = _ref23.expression; - /** - * Creates a deep copy of the value which may contain (nested) `Array`s and - * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are not - * copied, but assigned by their reference. - * - * Dispatches to a `clone` method if present. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig {*} -> {*} - * @param {*} value The object or array to clone - * @return {*} A new object or array. - * @example - * - * var objects = [{}, {}, {}]; - * var objectsClone = R.clone(objects); - * objects[0] === objectsClone[0]; //=> false - */ - var clone = _curry1(function clone(value) { - return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], []); - }); + return seq(name, this.sep(Sep.BEFORE_PROP), this.t(":"), this.sep(Sep.AFTER_PROP), this.getAssignmentExpr(expression)); + } + }, { + key: "reduceDebuggerStatement", + value: function reduceDebuggerStatement(node) { + return seq(this.t("debugger"), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceDoWhileStatement", + value: function reduceDoWhileStatement(node, _ref24) { + var body = _ref24.body; + var test = _ref24.test; - /** - * Returns a curried equivalent of the provided function. The curried function - * has two unusual capabilities. First, its arguments needn't be provided one - * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the - * following are equivalent: - * - * - `g(1)(2)(3)` - * - `g(1)(2, 3)` - * - `g(1, 2)(3)` - * - `g(1, 2, 3)` - * - * Secondly, the special placeholder value `R.__` may be used to specify - * "gaps", allowing partial application of any combination of arguments, - * regardless of their positions. If `g` is as above and `_` is `R.__`, the - * following are equivalent: - * - * - `g(1, 2, 3)` - * - `g(_, 2, 3)(1)` - * - `g(_, _, 3)(1)(2)` - * - `g(_, _, 3)(1, 2)` - * - `g(_, 2)(1)(3)` - * - `g(_, 2)(1, 3)` - * - `g(_, 2)(_, 3)(1)` - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (* -> a) -> (* -> a) - * @param {Function} fn The function to curry. - * @return {Function} A new, curried function. - * @see R.curryN - * @example - * - * var addFourNumbers = (a, b, c, d) => a + b + c + d; - * - * var curriedAddFourNumbers = R.curry(addFourNumbers); - * var f = curriedAddFourNumbers(1, 2); - * var g = f(3); - * g(4); //=> 10 - */ - var curry = _curry1(function curry(fn) { - return curryN(fn.length, fn); - }); + return seq(this.t("do"), this.sep(Sep.AFTER_DO), body, this.sep(Sep.BEFORE_DOWHILE_WHILE), this.t("while"), this.sep(Sep.AFTER_DOWHILE_WHILE), this.paren(test, Sep.DO_WHILE_TEST_PAREN_BEFORE, Sep.DO_WHILE_TEST_PAREN_AFTER), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceEmptyStatement", + value: function reduceEmptyStatement(node) { + return seq(this.t(";"), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceExpressionStatement", + value: function reduceExpressionStatement(node, _ref25) { + var expression = _ref25.expression; - /** - * Returns all but the first `n` elements of the given list, string, or - * transducer/transformer (or object with a `drop` method). - * - * Dispatches to the `drop` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n - * @param {*} list - * @return {*} - * @see R.take, R.transduce - * @example - * - * R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] - * R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz'] - * R.drop(3, ['foo', 'bar', 'baz']); //=> [] - * R.drop(4, ['foo', 'bar', 'baz']); //=> [] - * R.drop(3, 'ramda'); //=> 'da' - */ - var drop = _curry2(_dispatchable('drop', _xdrop, function drop(n, xs) { - return slice(Math.max(0, n), Infinity, xs); - })); + var needsParens = expression.startsWithCurly || expression.startsWithLetSquareBracket || expression.startsWithFunctionOrClass; + return seq(needsParens ? this.paren(expression, Sep.EXPRESSION_STATEMENT_PAREN_BEFORE, Sep.EXPRESSION_STATEMENT_PAREN_AFTER) : expression, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceForInStatement", + value: function reduceForInStatement(node, _ref26) { + var left = _ref26.left; + var right = _ref26.right; + var body = _ref26.body; - /** - * Returns a list containing all but the last `n` elements of the given `list`. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n The number of elements of `xs` to skip. - * @param {Array} xs The collection to consider. - * @return {Array} - * @see R.takeLast - * @example - * - * R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] - * R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo'] - * R.dropLast(3, ['foo', 'bar', 'baz']); //=> [] - * R.dropLast(4, ['foo', 'bar', 'baz']); //=> [] - * R.dropLast(3, 'ramda'); //=> 'ra' - */ - var dropLast = _curry2(_dispatchable('dropLast', _xdropLast, _dropLast)); + var leftP = left; + switch (node.left.type) { + case "VariableDeclaration": + leftP = noIn(markContainsIn(left)); + break; + case "BindingIdentifier": + if (node.left.name === "let") { + leftP = this.paren(left, Sep.FOR_IN_LET_PAREN_BEFORE, Sep.FOR_IN_LET_PAREN_BEFORE); + } + break; + } + return (0, _objectAssign2.default)(seq(this.t("for"), this.sep(Sep.AFTER_FORIN_FOR), this.paren(seq(leftP, this.sep(Sep.BEFORE_FORIN_IN), this.t("in"), this.sep(Sep.AFTER_FORIN_FOR), right), Sep.FOR_IN_PAREN_BEFORE, Sep.FOR_IN_PAREN_AFTER), this.sep(Sep.BEFORE_FORIN_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceForOfStatement", + value: function reduceForOfStatement(node, _ref27) { + var left = _ref27.left; + var right = _ref27.right; + var body = _ref27.body; - /** - * Returns a new list containing all but last the`n` elements of a given list, - * passing each value from the right to the supplied predicate function, - * skipping elements while the predicate function returns `true`. The predicate - * function is passed one argument: (value)*. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig (a -> Boolean) -> [a] -> [a] - * @param {Function} fn The function called per iteration. - * @param {Array} list The collection to iterate over. - * @return {Array} A new array. - * @see R.takeLastWhile, R.addIndex - * @example - * - * var lteThree = x => x <= 3; - * - * R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4] - */ - var dropLastWhile = _curry2(_dispatchable('dropLastWhile', _xdropLastWhile, _dropLastWhile)); + left = node.left.type === "VariableDeclaration" ? noIn(markContainsIn(left)) : left; + return (0, _objectAssign2.default)(seq(this.t("for"), this.sep(Sep.AFTER_FOROF_FOR), this.paren(seq(left.startsWithLet ? this.paren(left, Sep.FOR_OF_LET_PAREN_BEFORE, Sep.FOR_OF_LET_PAREN_AFTER) : left, this.sep(Sep.BEFORE_FOROF_OF), this.t("of"), this.sep(Sep.AFTER_FOROF_FOR), right), Sep.FOR_OF_PAREN_BEFORE, Sep.FOR_OF_PAREN_AFTER), this.sep(Sep.BEFORE_FOROF_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceForStatement", + value: function reduceForStatement(node, _ref28) { + var init = _ref28.init; + var test = _ref28.test; + var update = _ref28.update; + var body = _ref28.body; - /** - * Returns `true` if its arguments are equivalent, `false` otherwise. Handles - * cyclical data structures. - * - * Dispatches symmetrically to the `equals` methods of both arguments, if - * present. - * - * @func - * @memberOf R - * @since v0.15.0 - * @category Relation - * @sig a -> b -> Boolean - * @param {*} a - * @param {*} b - * @return {Boolean} - * @example - * - * R.equals(1, 1); //=> true - * R.equals(1, '1'); //=> false - * R.equals([1, 2, 3], [1, 2, 3]); //=> true - * - * var a = {}; a.v = a; - * var b = {}; b.v = b; - * R.equals(a, b); //=> true - */ - var equals = _curry2(function equals(a, b) { - return _equals(a, b, [], []); - }); + return (0, _objectAssign2.default)(seq(this.t("for"), this.sep(Sep.AFTER_FOR_FOR), this.paren(seq(init ? seq(this.sep(Sep.BEFORE_FOR_INIT), noIn(markContainsIn(init)), this.sep(Sep.AFTER_FOR_INIT)) : this.sep(Sep.EMPTY_FOR_INIT), this.t(";"), test ? seq(this.sep(Sep.BEFORE_FOR_TEST), test, this.sep(Sep.AFTER_FOR_TEST)) : this.sep(Sep.EMPTY_FOR_TEST), this.t(";"), update ? seq(this.sep(Sep.BEFORE_FOR_UPDATE), update, this.sep(Sep.AFTER_FOR_UPDATE)) : this.sep(Sep.EMPTY_FOR_UPDATE))), this.sep(Sep.BEFORE_FOR_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { + endsWithMissingElse: body.endsWithMissingElse + }); + } + }, { + key: "reduceFunctionBody", + value: function reduceFunctionBody(node, _ref29) { + var directives = _ref29.directives; + var statements = _ref29.statements; - /** - * Takes a predicate and a "filterable", and returns a new filterable of the - * same type containing the members of the given filterable which satisfy the - * given predicate. - * - * Dispatches to the `filter` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Filterable f => (a -> Boolean) -> f a -> f a - * @param {Function} pred - * @param {Array} filterable - * @return {Array} - * @see R.reject, R.transduce, R.addIndex - * @example - * - * var isEven = n => n % 2 === 0; - * - * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4] - * - * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} - */ - // else - var filter = _curry2(_dispatchable('filter', _xfilter, function (pred, filterable) { - return _isObject(filterable) ? _reduce(function (acc, key) { - if (pred(filterable[key])) { - acc[key] = filterable[key]; - } - return acc; - }, {}, keys(filterable)) : // else - _filter(pred, filterable); - })); + if (statements.length) { + statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); + } + return seq.apply(undefined, _toConsumableArray(directives).concat([directives.length ? this.sep(Sep.AFTER_FUNCTION_DIRECTIVES) : empty()], _toConsumableArray(statements))); + } + }, { + key: "reduceFunctionDeclaration", + value: function reduceFunctionDeclaration(node, _ref30) { + var name = _ref30.name; + var params = _ref30.params; + var body = _ref30.body; - /** - * Returns a new list by pulling every item out of it (and all its sub-arrays) - * and putting them in a new array, depth-first. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [b] - * @param {Array} list The array to consider. - * @return {Array} The flattened list. - * @see R.unnest - * @example - * - * R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]); - * //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] - */ - var flatten = _curry1(_makeFlat(true)); + return seq(this.t("function"), node.isGenerator ? seq(this.sep(Sep.BEFORE_GENERATOR_STAR), this.t("*"), this.sep(Sep.AFTER_GENERATOR_STAR)) : empty(), this.sep(Sep.BEFORE_FUNCTION_NAME(node)), node.name.name === "*default*" ? empty() : name, this.sep(Sep.BEFORE_FUNCTION_PARAMS), this.paren(params, Sep.PARAMETERS_PAREN_BEFORE, Sep.PARAMETERS_PAREN_AFTER, Sep.PARAMETERS_PAREN_EMPTY), this.sep(Sep.BEFORE_FUNCTION_DECLARATION_BODY), this.brace(body, node, Sep.FUNCTION_BRACE_INITIAL, Sep.FUNCTION_BRACE_FINAL, Sep.FUNCTION_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceFunctionExpression", + value: function reduceFunctionExpression(node, _ref31) { + var name = _ref31.name; + var params = _ref31.params; + var body = _ref31.body; - /** - * Returns a new function much like the supplied one, except that the first two - * arguments' order is reversed. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (a -> b -> c -> ... -> z) -> (b -> a -> c -> ... -> z) - * @param {Function} fn The function to invoke with its first two parameters reversed. - * @return {*} The result of invoking `fn` with its first two parameters' order reversed. - * @example - * - * var mergeThree = (a, b, c) => [].concat(a, b, c); - * - * mergeThree(1, 2, 3); //=> [1, 2, 3] - * - * R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3] - */ - var flip = _curry1(function flip(fn) { - return curry(function (a, b) { - var args = _slice(arguments); - args[0] = b; - args[1] = a; - return fn.apply(this, args); - }); - }); + var state = seq(this.t("function"), node.isGenerator ? seq(this.sep(Sep.BEFORE_GENERATOR_STAR), this.t("*"), this.sep(Sep.AFTER_GENERATOR_STAR)) : empty(), this.sep(Sep.BEFORE_FUNCTION_NAME(node)), name ? name : empty(), this.sep(Sep.BEFORE_FUNCTION_PARAMS), this.paren(params, Sep.PARAMETERS_PAREN_BEFORE, Sep.PARAMETERS_PAREN_AFTER, Sep.PARAMETERS_PAREN_EMPTY), this.sep(Sep.BEFORE_FUNCTION_EXPRESSION_BODY), this.brace(body, node, Sep.FUNCTION_EXPRESSION_BRACE_INITIAL, Sep.FUNCTION_EXPRESSION_BRACE_FINAL, Sep.FUNCTION_EXPRESSION_EMPTY)); + state.startsWithFunctionOrClass = true; + return state; + } + }, { + key: "reduceFormalParameters", + value: function reduceFormalParameters(node, _ref32) { + var items = _ref32.items; + var rest = _ref32.rest; - /** - * Splits a list into sub-lists stored in an object, based on the result of - * calling a String-returning function on each element, and grouping the - * results according to values returned. - * - * Dispatches to the `groupBy` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig (a -> String) -> [a] -> {String: [a]} - * @param {Function} fn Function :: a -> String - * @param {Array} list The array to group - * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements - * that produced that key when passed to `fn`. - * @see R.transduce - * @example - * - * var byGrade = R.groupBy(function(student) { - * var score = student.score; - * return score < 65 ? 'F' : - * score < 70 ? 'D' : - * score < 80 ? 'C' : - * score < 90 ? 'B' : 'A'; - * }); - * var students = [{name: 'Abby', score: 84}, - * {name: 'Eddy', score: 58}, - * // ... - * {name: 'Jack', score: 69}]; - * byGrade(students); - * // { - * // 'A': [{name: 'Dianne', score: 99}], - * // 'B': [{name: 'Abby', score: 84}] - * // // ..., - * // 'F': [{name: 'Eddy', score: 58}] - * // } - */ - var groupBy = _curry2(_dispatchable('groupBy', _xgroupBy, function groupBy(fn, list) { - return _reduce(function (acc, elt) { - var key = fn(elt); - acc[key] = append(elt, acc[key] || (acc[key] = [])); - return acc; - }, {}, list); - })); + return this.commaSep(items.concat(rest == null ? [] : [seq(this.t("..."), this.sep(Sep.REST), rest)]), Sep.PARAMETER_BEFORE_COMMA, Sep.PARAMETER_AFTER_COMMA); + } + }, { + key: "reduceArrowExpression", + value: function reduceArrowExpression(node, _ref33) { + var params = _ref33.params; + var body = _ref33.body; - /** - * Returns the first element of the given list or string. In some libraries - * this function is named `first`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> a | Undefined - * @sig String -> String - * @param {Array|String} list - * @return {*} - * @see R.tail, R.init, R.last - * @example - * - * R.head(['fi', 'fo', 'fum']); //=> 'fi' - * R.head([]); //=> undefined - * - * R.head('abc'); //=> 'a' - * R.head(''); //=> '' - */ - var head = nth(0); + if (node.params.rest != null || node.params.items.length !== 1 || node.params.items[0].type !== "BindingIdentifier") { + params = this.paren(params, Sep.ARROW_PARAMETERS_PAREN_BEFORE, Sep.ARROW_PARAMETERS_PAREN_AFTER, Sep.ARROW_PARAMETERS_PAREN_EMPTY); + } + if (node.body.type === "FunctionBody") { + body = this.brace(body, node, Sep.ARROW_BRACE_INITIAL, Sep.ARROW_BRACE_FINAL, Sep.ARROW_BRACE_EMPTY); + } else if (body.startsWithCurly) { + body = this.paren(body, Sep.ARROW_BODY_PAREN_BEFORE, Sep.ARROW_BODY_PAREN_AFTER); + } + return seq(params, this.sep(Sep.BEFORE_ARROW), this.t("=>"), this.sep(Sep.AFTER_ARROW), this.p(node.body, _coderep.Precedence.Assignment, body)); + } + }, { + key: "reduceGetter", + value: function reduceGetter(node, _ref34) { + var name = _ref34.name; + var body = _ref34.body; - /** - * Given a function that generates a key, turns a list of objects into an - * object indexing the objects by the given key. Note that if multiple - * objects generate the same value for the indexing key only the last value - * will be included in the generated object. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category List - * @sig (a -> String) -> [{k: v}] -> {k: {k: v}} - * @param {Function} fn Function :: a -> String - * @param {Array} array The array of objects to index - * @return {Object} An object indexing each array element by the given property. - * @example - * - * var list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}]; - * R.indexBy(R.prop('id'), list); - * //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}} - */ - var indexBy = _curry2(function indexBy(fn, list) { - return _reduce(function (acc, elem) { - var key = fn(elem); - acc[key] = elem; - return acc; - }, {}, list); - }); + return seq(this.t("get"), this.sep(Sep.AFTER_GET), name, this.sep(Sep.BEFORE_GET_PARAMS), this.paren(empty(), null, null, Sep.GETTER_PARAMS), this.sep(Sep.BEFORE_GET_BODY), this.brace(body, node, Sep.GET_BRACE_INTIAL, Sep.GET_BRACE_FINAL, Sep.GET_BRACE_EMPTY)); + } + }, { + key: "reduceIdentifierExpression", + value: function reduceIdentifierExpression(node) { + var a = this.t(node.name); + if (node.name === "let") { + a.startsWithLet = true; + } + return a; + } + }, { + key: "reduceIfStatement", + value: function reduceIfStatement(node, _ref35) { + var test = _ref35.test; + var consequent = _ref35.consequent; + var alternate = _ref35.alternate; - /** - * Returns all but the last element of the given list or string. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category List - * @sig [a] -> [a] - * @sig String -> String - * @param {*} list - * @return {*} - * @see R.last, R.head, R.tail - * @example - * - * R.init([1, 2, 3]); //=> [1, 2] - * R.init([1, 2]); //=> [1] - * R.init([1]); //=> [] - * R.init([]); //=> [] - * - * R.init('abc'); //=> 'ab' - * R.init('ab'); //=> 'a' - * R.init('a'); //=> '' - * R.init(''); //=> '' - */ - var init = slice(0, -1); - - /** - * Combines two lists into a set (i.e. no duplicates) composed of those - * elements common to both lists. Duplication is determined according to the - * value returned by applying the supplied predicate to two list elements. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig (a -> a -> Boolean) -> [*] -> [*] -> [*] - * @param {Function} pred A predicate function that determines whether - * the two supplied elements are equal. - * @param {Array} list1 One list of items to compare - * @param {Array} list2 A second list of items to compare - * @return {Array} A new list containing those elements common to both lists. - * @see R.intersection - * @example - * - * var buffaloSpringfield = [ - * {id: 824, name: 'Richie Furay'}, - * {id: 956, name: 'Dewey Martin'}, - * {id: 313, name: 'Bruce Palmer'}, - * {id: 456, name: 'Stephen Stills'}, - * {id: 177, name: 'Neil Young'} - * ]; - * var csny = [ - * {id: 204, name: 'David Crosby'}, - * {id: 456, name: 'Stephen Stills'}, - * {id: 539, name: 'Graham Nash'}, - * {id: 177, name: 'Neil Young'} - * ]; - * - * R.intersectionWith(R.eqBy(R.prop('id')), buffaloSpringfield, csny); - * //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}] - */ - var intersectionWith = _curry3(function intersectionWith(pred, list1, list2) { - var results = []; - var idx = 0; - while (idx < list1.length) { - if (_containsWith(pred, list1[idx], list2)) { - results[results.length] = list1[idx]; - } - idx += 1; - } - return uniqWith(pred, results); - }); + if (alternate && consequent.endsWithMissingElse) { + consequent = this.brace(consequent, node, Sep.MISSING_ELSE_INTIIAL, Sep.MISSING_ELSE_FINAL, Sep.MISSING_ELSE_EMPTY); + } + return (0, _objectAssign2.default)(seq(this.t("if"), this.sep(Sep.AFTER_IF), this.paren(test, Sep.IF_PAREN_BEFORE, Sep.IF_PAREN_AFTER), this.sep(Sep.AFTER_IF_TEST), consequent, alternate ? seq(this.sep(Sep.BEFORE_ELSE), this.t("else"), this.sep(Sep.AFTER_ELSE), alternate) : empty(), this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: alternate ? alternate.endsWithMissingElse : true }); + } + }, { + key: "reduceImport", + value: function reduceImport(node, _ref36) { + var defaultBinding = _ref36.defaultBinding; + var namedImports = _ref36.namedImports; - /** - * Same as R.invertObj, however this accounts for objects with duplicate values - * by putting the values into an array. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Object - * @sig {s: x} -> {x: [ s, ... ]} - * @param {Object} obj The object or array to invert - * @return {Object} out A new object with keys - * in an array. - * @example - * - * var raceResultsByFirstName = { - * first: 'alice', - * second: 'jake', - * third: 'alice', - * }; - * R.invert(raceResultsByFirstName); - * //=> { 'alice': ['first', 'third'], 'jake':['second'] } - */ - var invert = _curry1(function invert(obj) { - var props = keys(obj); - var len = props.length; - var idx = 0; - var out = {}; - while (idx < len) { - var key = props[idx]; - var val = obj[key]; - var list = _has(val, out) ? out[val] : out[val] = []; - list[list.length] = key; - idx += 1; - } - return out; - }); + var bindings = []; + if (defaultBinding != null) { + bindings.push(defaultBinding); + } + if (namedImports.length > 0) { + bindings.push(this.brace(this.commaSep(namedImports, Sep.NAMED_IMPORT_BEFORE_COMMA, Sep.NAMED_IMPORT_AFTER_COMMA), node, Sep.IMPORT_BRACE_INTIAL, Sep.IMPORT_BRACE_FINAL, Sep.IMPORT_BRACE_EMPTY)); + } + if (bindings.length === 0) { + return seq(this.t("import"), this.sep(Sep.BEFORE_IMPORT_MODULE), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + return seq(this.t("import"), this.sep(Sep.BEFORE_IMPORT_BINDINGS), this.commaSep(bindings, Sep.IMPORT_BEFORE_COMMA, Sep.IMPORT_AFTER_COMMA), this.sep(Sep.AFTER_IMPORT_BINDINGS), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceImportNamespace", + value: function reduceImportNamespace(node, _ref37) { + var defaultBinding = _ref37.defaultBinding; + var namespaceBinding = _ref37.namespaceBinding; - /** - * Returns a new object with the keys of the given object as values, and the - * values of the given object, which are coerced to strings, as keys. Note - * that the last key found is preferred when handling the same value. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Object - * @sig {s: x} -> {x: s} - * @param {Object} obj The object or array to invert - * @return {Object} out A new object - * @example - * - * var raceResults = { - * first: 'alice', - * second: 'jake' - * }; - * R.invertObj(raceResults); - * //=> { 'alice': 'first', 'jake':'second' } - * - * // Alternatively: - * var raceResults = ['alice', 'jake']; - * R.invertObj(raceResults); - * //=> { 'alice': '0', 'jake':'1' } - */ - var invertObj = _curry1(function invertObj(obj) { - var props = keys(obj); - var len = props.length; - var idx = 0; - var out = {}; - while (idx < len) { - var key = props[idx]; - out[obj[key]] = key; - idx += 1; - } - return out; - }); + return seq(this.t("import"), this.sep(Sep.BEFORE_IMPORT_NAMESPACE), defaultBinding == null ? empty() : seq(defaultBinding, this.sep(Sep.IMPORT_BEFORE_COMMA), this.t(","), this.sep(Sep.IMPORT_AFTER_COMMA)), this.sep(Sep.BEFORE_IMPORT_STAR), this.t("*"), this.sep(Sep.AFTER_IMPORT_STAR), this.t("as"), this.sep(Sep.AFTER_IMPORT_AS), namespaceBinding, this.sep(Sep.AFTER_NAMESPACE_BINDING), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceImportSpecifier", + value: function reduceImportSpecifier(node, _ref38) { + var binding = _ref38.binding; - /** - * Returns `true` if the given value is its type's empty value; `false` - * otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Logic - * @sig a -> Boolean - * @param {*} x - * @return {Boolean} - * @see R.empty - * @example - * - * R.isEmpty([1, 2, 3]); //=> false - * R.isEmpty([]); //=> true - * R.isEmpty(''); //=> true - * R.isEmpty(null); //=> false - * R.isEmpty({}); //=> true - * R.isEmpty({length: 0}); //=> false - */ - var isEmpty = _curry1(function isEmpty(x) { - return x != null && equals(x, empty(x)); - }); + if (node.name == null) return binding; + return seq(this.t(node.name), this.sep(Sep.BEFORE_IMPORT_AS), this.t("as"), this.sep(Sep.AFTER_IMPORT_AS), binding); + } + }, { + key: "reduceExportAllFrom", + value: function reduceExportAllFrom(node) { + return seq(this.t("export"), this.sep(Sep.BEFORE_EXPORT_STAR), this.t("*"), this.sep(Sep.AFTER_EXPORT_STAR), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceExportFrom", + value: function reduceExportFrom(node, _ref39) { + var namedExports = _ref39.namedExports; - /** - * Returns the last element of the given list or string. - * - * @func - * @memberOf R - * @since v0.1.4 - * @category List - * @sig [a] -> a | Undefined - * @sig String -> String - * @param {*} list - * @return {*} - * @see R.init, R.head, R.tail - * @example - * - * R.last(['fi', 'fo', 'fum']); //=> 'fum' - * R.last([]); //=> undefined - * - * R.last('abc'); //=> 'c' - * R.last(''); //=> '' - */ - var last = nth(-1); + return seq(this.t("export"), this.sep(Sep.BEFORE_EXPORT_BINDINGS), this.brace(this.commaSep(namedExports, Sep.EXPORTS_BEFORE_COMMA, Sep.EXPORTS_AFTER_COMMA), node, Sep.EXPORT_BRACE_INITIAL, Sep.EXPORT_BRACE_FINAL, Sep.EXPORT_BRACE_EMPTY), node.moduleSpecifier == null ? empty() : seq(this.sep(Sep.AFTER_EXPORT_BINDINGS), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node)))); + } + }, { + key: "reduceExport", + value: function reduceExport(node, _ref40) { + var declaration = _ref40.declaration; - /** - * Returns the position of the last occurrence of an item in an array, or -1 if - * the item is not included in the array. `R.equals` is used to determine - * equality. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> Number - * @param {*} target The item to find. - * @param {Array} xs The array to search in. - * @return {Number} the index of the target, or -1 if the target is not found. - * @see R.indexOf - * @example - * - * R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6 - * R.lastIndexOf(10, [1,2,3,4]); //=> -1 - */ - var lastIndexOf = _curry2(function lastIndexOf(target, xs) { - if (typeof xs.lastIndexOf === 'function' && !_isArray(xs)) { - return xs.lastIndexOf(target); - } else { - var idx = xs.length - 1; - while (idx >= 0) { - if (equals(xs[idx], target)) { - return idx; - } - idx -= 1; - } - return -1; - } - }); + switch (node.declaration.type) { + case "FunctionDeclaration": + case "ClassDeclaration": + break; + default: + declaration = seq(declaration, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + return seq(this.t("export"), this.sep(Sep.AFTER_EXPORT), declaration); + } + }, { + key: "reduceExportDefault", + value: function reduceExportDefault(node, _ref41) { + var body = _ref41.body; - /** - * Takes a function and - * a [functor](https://github.com/fantasyland/fantasy-land#functor), - * applies the function to each of the functor's values, and returns - * a functor of the same shape. - * - * Ramda provides suitable `map` implementations for `Array` and `Object`, - * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`. - * - * Dispatches to the `map` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * Also treats functions as functors and will compose them together. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Functor f => (a -> b) -> f a -> f b - * @param {Function} fn The function to be called on every element of the input `list`. - * @param {Array} list The list to be iterated over. - * @return {Array} The new list. - * @see R.transduce, R.addIndex - * @example - * - * var double = x => x * 2; - * - * R.map(double, [1, 2, 3]); //=> [2, 4, 6] - * - * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6} - */ - var map = _curry2(_dispatchable('map', _xmap, function map(fn, functor) { - switch (Object.prototype.toString.call(functor)) { - case '[object Function]': - return curryN(functor.length, function () { - return fn.call(this, functor.apply(this, arguments)); - }); - case '[object Object]': - return _reduce(function (acc, key) { - acc[key] = fn(functor[key]); - return acc; - }, {}, keys(functor)); + body = body.startsWithFunctionOrClass ? this.paren(body, Sep.EXPORT_PAREN_BEFORE, Sep.EXPORT_PAREN_AFTER) : body; + switch (node.body.type) { + case "FunctionDeclaration": + case "ClassDeclaration": + break; default: - return _map(fn, functor); - } - })); + body = seq(body, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + return seq(this.t("export"), this.sep(Sep.EXPORT_DEFAULT), this.t("default"), this.sep(Sep.AFTER_EXPORT_DEFAULT), body); + } + }, { + key: "reduceExportSpecifier", + value: function reduceExportSpecifier(node) { + if (node.name == null) return this.t(node.exportedName); + return seq(this.t(node.name), this.sep(Sep.BEFORE_EXPORT_AS), this.t("as"), this.sep(Sep.AFTER_EXPORT_AS), this.t(node.exportedName)); + } + }, { + key: "reduceLabeledStatement", + value: function reduceLabeledStatement(node, _ref42) { + var label = _ref42.label; + var body = _ref42.body; - /** - * An Object-specific version of `map`. The function is applied to three - * arguments: *(value, key, obj)*. If only the value is significant, use - * `map` instead. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Object - * @sig ((*, String, Object) -> *) -> Object -> Object - * @param {Function} fn - * @param {Object} obj - * @return {Object} - * @see R.map - * @example - * - * var values = { x: 1, y: 2, z: 3 }; - * var prependKeyAndDouble = (num, key, obj) => key + (num * 2); - * - * R.mapObjIndexed(prependKeyAndDouble, values); //=> { x: 'x2', y: 'y4', z: 'z6' } - */ - var mapObjIndexed = _curry2(function mapObjIndexed(fn, obj) { - return _reduce(function (acc, key) { - acc[key] = fn(obj[key], key, obj); - return acc; - }, {}, keys(obj)); - }); + return (0, _objectAssign2.default)(seq(this.t(label), this.sep(Sep.BEFORE_LABEL_COLON), this.t(":"), this.sep(Sep.AFTER_LABEL_COLON), body), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceLiteralBooleanExpression", + value: function reduceLiteralBooleanExpression(node) { + return this.t(node.value.toString()); + } + }, { + key: "reduceLiteralNullExpression", + value: function reduceLiteralNullExpression(node) { + return this.t("null"); + } + }, { + key: "reduceLiteralInfinityExpression", + value: function reduceLiteralInfinityExpression(node) { + return this.t("2e308"); + } + }, { + key: "reduceLiteralNumericExpression", + value: function reduceLiteralNumericExpression(node) { + return new _coderep.NumberCodeRep(node.value); + } + }, { + key: "reduceLiteralRegExpExpression", + value: function reduceLiteralRegExpExpression(node) { + return this.t("/" + node.pattern + "/" + node.flags); + } + }, { + key: "reduceLiteralStringExpression", + value: function reduceLiteralStringExpression(node) { + return this.t((0, _coderep.escapeStringLiteral)(node.value)); + } + }, { + key: "reduceMethod", + value: function reduceMethod(node, _ref43) { + var name = _ref43.name; + var params = _ref43.params; + var body = _ref43.body; - /** - * Creates a new object with the own properties of the two provided objects. If - * a key exists in both objects, the provided function is applied to the values - * associated with the key in each object, with the result being used as the - * value associated with the key in the returned object. The key will be - * excluded from the returned object if the resulting value is `undefined`. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category Object - * @sig (a -> a -> a) -> {a} -> {a} -> {a} - * @param {Function} fn - * @param {Object} l - * @param {Object} r - * @return {Object} - * @see R.merge, R.mergeWithKey - * @example - * - * R.mergeWith(R.concat, - * { a: true, values: [10, 20] }, - * { b: true, values: [15, 35] }); - * //=> { a: true, b: true, values: [10, 20, 15, 35] } - */ - var mergeWith = _curry3(function mergeWith(fn, l, r) { - return mergeWithKey(function (_, _l, _r) { - return fn(_l, _r); - }, l, r); - }); + return seq(node.isGenerator ? seq(this.t("*"), this.sep(Sep.AFTER_METHOD_GENERATOR_STAR)) : empty(), name, this.sep(Sep.AFTER_METHOD_NAME), this.paren(params, Sep.PARAMETERS_PAREN_BEFORE, Sep.PARAMETERS_PAREN_AFTER, Sep.PARAMETERS_PAREN_EMPTY), this.sep(Sep.BEFORE_METHOD_BODY), this.brace(body, node, Sep.METHOD_BRACE_INTIAL, Sep.METHOD_BRACE_FINAL, Sep.METHOD_BRACE_EMPTY)); + } + }, { + key: "reduceModule", + value: function reduceModule(node, _ref44) { + var directives = _ref44.directives; + var items = _ref44.items; - /** - * Takes a function `f` and a list of arguments, and returns a function `g`. - * When applied, `g` returns the result of applying `f` to the arguments - * provided initially followed by the arguments provided to `g`. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category Function - * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x) - * @param {Function} f - * @param {Array} args - * @return {Function} - * @see R.partialRight - * @example - * - * var multiply = (a, b) => a * b; - * var double = R.partial(multiply, [2]); - * double(2); //=> 4 - * - * var greet = (salutation, title, firstName, lastName) => - * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; - * - * var sayHello = R.partial(greet, ['Hello']); - * var sayHelloToMs = R.partial(sayHello, ['Ms.']); - * sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!' - */ - var partial = _createPartialApplicator(_concat); + if (items.length) { + items[0] = this.parenToAvoidBeingDirective(node.items[0], items[0]); + } + return seq.apply(undefined, _toConsumableArray(directives).concat([directives.length ? this.sep(Sep.AFTER_MODULE_DIRECTIVES) : empty()], _toConsumableArray(items))); + } + }, { + key: "reduceNewExpression", + value: function reduceNewExpression(node, _ref45) { + var callee = _ref45.callee; + var args = _ref45.arguments; - /** - * Takes a function `f` and a list of arguments, and returns a function `g`. - * When applied, `g` returns the result of applying `f` to the arguments - * provided to `g` followed by the arguments provided initially. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category Function - * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x) - * @param {Function} f - * @param {Array} args - * @return {Function} - * @see R.partial - * @example - * - * var greet = (salutation, title, firstName, lastName) => - * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; - * - * var greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']); - * - * greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!' - */ - var partialRight = _createPartialApplicator(flip(_concat)); + var calleeRep = (0, _coderep.getPrecedence)(node.callee) == _coderep.Precedence.Call ? this.paren(callee, Sep.NEW_CALLEE_PAREN_BEFORE, Sep.NEW_CALLEE_PAREN_AFTER) : this.p(node.callee, (0, _coderep.getPrecedence)(node), callee); + return seq(this.t("new"), this.sep(Sep.AFTER_NEW), calleeRep, args.length === 0 ? this.sep(Sep.EMPTY_NEW_CALL) : seq(this.sep(Sep.BEFORE_NEW_ARGS), this.paren(this.commaSep(args, Sep.ARGS_BEFORE_COMMA, Sep.ARGS_AFTER_COMMA), Sep.NEW_PAREN_BEFORE, Sep.NEW_PAREN_AFTER, Sep.NEW_PAREN_EMPTY))); + } + }, { + key: "reduceNewTargetExpression", + value: function reduceNewTargetExpression() { + return seq(this.t("new"), this.sep(Sep.NEW_TARGET_BEFORE_DOT), this.t("."), this.sep(Sep.NEW_TARGET_AFTER_DOT), this.t("target")); + } + }, { + key: "reduceObjectExpression", + value: function reduceObjectExpression(node, _ref46) { + var properties = _ref46.properties; - /** - * Takes a predicate and a list and returns the pair of lists of elements which - * do and do not satisfy the predicate, respectively. - * - * @func - * @memberOf R - * @since v0.1.4 - * @category List - * @sig (a -> Boolean) -> [a] -> [[a],[a]] - * @param {Function} pred A predicate to determine which array the element belongs to. - * @param {Array} list The array to partition. - * @return {Array} A nested array, containing first an array of elements that satisfied the predicate, - * and second an array of elements that did not satisfy. - * @see R.filter, R.reject - * @example - * - * R.partition(R.contains('s'), ['sss', 'ttt', 'foo', 'bars']); - * //=> [ [ 'sss', 'bars' ], [ 'ttt', 'foo' ] ] - */ - var partition = _curry2(function partition(pred, list) { - return _reduce(function (acc, elt) { - var xs = acc[pred(elt) ? 0 : 1]; - xs[xs.length] = elt; - return acc; - }, [ - [], - [] - ], list); - }); + var state = this.brace(this.commaSep(properties, Sep.OBJECT_BEFORE_COMMA, Sep.OBJECT_AFTER_COMMA), node, Sep.OBJECT_BRACE_INITIAL, Sep.OBJECT_BRACE_FINAL, Sep.OBJECT_EMPTY); + state.startsWithCurly = true; + return state; + } + }, { + key: "reduceUpdateExpression", + value: function reduceUpdateExpression(node, _ref47) { + var operand = _ref47.operand; - /** - * Determines whether a nested path on an object has a specific value, in - * `R.equals` terms. Most likely used to filter a list. - * - * @func - * @memberOf R - * @since v0.7.0 - * @category Relation - * @sig [String] -> * -> {String: *} -> Boolean - * @param {Array} path The path of the nested property to use - * @param {*} val The value to compare the nested property with - * @param {Object} obj The object to check the nested property in - * @return {Boolean} `true` if the value equals the nested object property, - * `false` otherwise. - * @example - * - * var user1 = { address: { zipCode: 90210 } }; - * var user2 = { address: { zipCode: 55555 } }; - * var user3 = { name: 'Bob' }; - * var users = [ user1, user2, user3 ]; - * var isFamous = R.pathEq(['address', 'zipCode'], 90210); - * R.filter(isFamous, users); //=> [ user1 ] - */ - var pathEq = _curry3(function pathEq(_path, val, obj) { - return equals(path(_path, obj), val); - }); + if (node.isPrefix) { + return this.reduceUnaryExpression.apply(this, arguments); + } else { + return (0, _objectAssign2.default)(seq(this.p(node.operand, _coderep.Precedence.New, operand), this.sep(Sep.BEFORE_POSTFIX(node.operator)), this.t(node.operator)), { + startsWithCurly: operand.startsWithCurly, + startsWithLetSquareBracket: operand.startsWithLetSquareBracket, + startsWithFunctionOrClass: operand.startsWithFunctionOrClass + }); + } + } + }, { + key: "reduceUnaryExpression", + value: function reduceUnaryExpression(node, _ref48) { + var operand = _ref48.operand; - /** - * Returns a new list by plucking the same named property off all objects in - * the list supplied. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig k -> [{k: v}] -> [v] - * @param {Number|String} key The key name to pluck off of each object. - * @param {Array} list The array to consider. - * @return {Array} The list of values for the given key. - * @see R.props - * @example - * - * R.pluck('a')([{a: 1}, {a: 2}]); //=> [1, 2] - * R.pluck(0)([[1, 2], [3, 4]]); //=> [1, 3] - */ - var pluck = _curry2(function pluck(p, list) { - return map(prop(p), list); - }); + return seq(this.t(node.operator), this.sep(Sep.UNARY(node.operator)), this.p(node.operand, (0, _coderep.getPrecedence)(node), operand)); + } + }, { + key: "reduceReturnStatement", + value: function reduceReturnStatement(node, _ref49) { + var expression = _ref49.expression; - /** - * Reasonable analog to SQL `select` statement. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @category Relation - * @sig [k] -> [{k: v}] -> [{k: v}] - * @param {Array} props The property names to project - * @param {Array} objs The objects to query - * @return {Array} An array of objects with just the `props` properties. - * @example - * - * var abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2}; - * var fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7}; - * var kids = [abby, fred]; - * R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}] - */ - // passing `identity` gives correct arity - var project = useWith(_map, [ - pickAll, - identity - ]); + return seq(this.t("return"), expression ? seq(this.sep(Sep.RETURN), expression) : empty(), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceScript", + value: function reduceScript(node, _ref50) { + var directives = _ref50.directives; + var statements = _ref50.statements; - /** - * Returns `true` if the specified object property is equal, in `R.equals` - * terms, to the given value; `false` otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig String -> a -> Object -> Boolean - * @param {String} name - * @param {*} val - * @param {*} obj - * @return {Boolean} - * @see R.equals, R.propSatisfies - * @example - * - * var abby = {name: 'Abby', age: 7, hair: 'blond'}; - * var fred = {name: 'Fred', age: 12, hair: 'brown'}; - * var rusty = {name: 'Rusty', age: 10, hair: 'brown'}; - * var alois = {name: 'Alois', age: 15, disposition: 'surly'}; - * var kids = [abby, fred, rusty, alois]; - * var hasBrownHair = R.propEq('hair', 'brown'); - * R.filter(hasBrownHair, kids); //=> [fred, rusty] - */ - var propEq = _curry3(function propEq(name, val, obj) { - return propSatisfies(equals(val), name, obj); - }); + if (statements.length) { + statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); + } + return seq.apply(undefined, _toConsumableArray(directives).concat([directives.length ? this.sep(Sep.AFTER_SCRIPT_DIRECTIVES) : empty()], _toConsumableArray(statements))); + } + }, { + key: "reduceSetter", + value: function reduceSetter(node, _ref51) { + var name = _ref51.name; + var param = _ref51.param; + var body = _ref51.body; - /** - * Returns `true` if the specified object property is of the given type; - * `false` otherwise. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Type - * @sig Type -> String -> Object -> Boolean - * @param {Function} type - * @param {String} name - * @param {*} obj - * @return {Boolean} - * @see R.is, R.propSatisfies - * @example - * - * R.propIs(Number, 'x', {x: 1, y: 2}); //=> true - * R.propIs(Number, 'x', {x: 'foo'}); //=> false - * R.propIs(Number, 'x', {}); //=> false - */ - var propIs = _curry3(function propIs(type, name, obj) { - return propSatisfies(is(type), name, obj); - }); + return seq(this.t("set"), this.sep(Sep.AFTER_SET), name, this.sep(Sep.BEFORE_SET_PARAMS), this.paren(param, Sep.SETTER_PARAM_BEFORE, Sep.SETTER_PARAM_AFTER), this.sep(Sep.BEFORE_SET_BODY), this.brace(body, node, Sep.SET_BRACE_INTIIAL, Sep.SET_BRACE_FINAL, Sep.SET_BRACE_EMPTY)); + } + }, { + key: "reduceShorthandProperty", + value: function reduceShorthandProperty(node) { + return this.t(node.name); + } + }, { + key: "reduceStaticMemberExpression", + value: function reduceStaticMemberExpression(node, _ref52) { + var object = _ref52.object; + var property = _ref52.property; - /** - * Returns a single item by iterating through the list, successively calling - * the iterator function and passing it an accumulator value and the current - * value from the array, and then passing the result to the next call. - * - * The iterator function receives two values: *(acc, value)*. It may use - * `R.reduced` to shortcut the iteration. - * - * Note: `R.reduce` does not skip deleted or unassigned indices (sparse - * arrays), unlike the native `Array.prototype.reduce` method. For more details - * on this behavior, see: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description - * - * Dispatches to the `reduce` method of the third argument, if present. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig ((a, b) -> a) -> a -> [b] -> a - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array. - * @param {*} acc The accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.reduced, R.addIndex - * @example - * - * var numbers = [1, 2, 3]; - * var add = (a, b) => a + b; - * - * R.reduce(add, 10, numbers); //=> 16 - */ - var reduce = _curry3(_reduce); + var state = seq(this.p(node.object, (0, _coderep.getPrecedence)(node), object), this.sep(Sep.BEFORE_STATIC_MEMBER_DOT), this.t("."), this.sep(Sep.AFTER_STATIC_MEMBER_DOT), this.t(property)); + state.startsWithLet = object.startsWithLet; + state.startsWithCurly = object.startsWithCurly; + state.startsWithLetSquareBracket = object.startsWithLetSquareBracket; + state.startsWithFunctionOrClass = object.startsWithFunctionOrClass; + return state; + } + }, { + key: "reduceStaticPropertyName", + value: function reduceStaticPropertyName(node) { + var n; + if (_esutils.keyword.isIdentifierNameES6(node.value)) { + return this.t(node.value); + } else if (n = parseFloat(node.value), n === n) { + return new _coderep.NumberCodeRep(n); + } + return this.t((0, _coderep.escapeStringLiteral)(node.value)); + } + }, { + key: "reduceSuper", + value: function reduceSuper() { + return this.t("super"); + } + }, { + key: "reduceSwitchCase", + value: function reduceSwitchCase(node, _ref53) { + var test = _ref53.test; + var consequent = _ref53.consequent; - /** - * The complement of `filter`. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig Filterable f => (a -> Boolean) -> f a -> f a - * @param {Function} pred - * @param {Array} filterable - * @return {Array} - * @see R.filter, R.transduce, R.addIndex - * @example - * - * var isOdd = (n) => n % 2 === 1; - * - * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4] - * - * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4} - */ - var reject = _curry2(function reject(pred, filterable) { - return filter(_complement(pred), filterable); - }); + return seq(this.t("case"), this.sep(Sep.BEFORE_CASE_TEST), test, this.sep(Sep.AFTER_CASE_TEST), this.t(":"), this.sep(Sep.BEFORE_CASE_BODY), seq.apply(undefined, _toConsumableArray(consequent)), this.sep(Sep.AFTER_CASE_BODY)); + } + }, { + key: "reduceSwitchDefault", + value: function reduceSwitchDefault(node, _ref54) { + var consequent = _ref54.consequent; - /** - * Returns a fixed list of size `n` containing a specified identical value. - * - * @func - * @memberOf R - * @since v0.1.1 - * @category List - * @sig a -> n -> [a] - * @param {*} value The value to repeat. - * @param {Number} n The desired size of the output list. - * @return {Array} A new array containing `n` `value`s. - * @example - * - * R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi'] - * - * var obj = {}; - * var repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}] - * repeatedObjs[0] === repeatedObjs[1]; //=> true - */ - var repeat = _curry2(function repeat(value, n) { - return times(always(value), n); - }); + return seq(this.t("default"), this.sep(Sep.DEFAULT), this.t(":"), this.sep(Sep.BEFORE_CASE_BODY), seq.apply(undefined, _toConsumableArray(consequent)), this.sep(Sep.AFTER_DEFAULT_BODY)); + } + }, { + key: "reduceSwitchStatement", + value: function reduceSwitchStatement(node, _ref55) { + var discriminant = _ref55.discriminant; + var cases = _ref55.cases; - /** - * Adds together all the elements of a list. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list An array of numbers - * @return {Number} The sum of all the numbers in the list. - * @see R.reduce - * @example - * - * R.sum([2,4,6,8,100,1]); //=> 121 - */ - var sum = reduce(add, 0); + return seq(this.t("switch"), this.sep(Sep.BEFORE_SWITCH_DISCRIM), this.paren(discriminant, Sep.SWITCH_DISCRIM_PAREN_BEFORE, Sep.SWITCH_DISCRIM_PAREN_AFTER), this.sep(Sep.BEFORE_SWITCH_BODY), this.brace(seq.apply(undefined, _toConsumableArray(cases)), node, Sep.SWITCH_BRACE_INTIAL, Sep.SWITCH_BRACE_FINAL, Sep.SWITCH_BRACE_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceSwitchStatementWithDefault", + value: function reduceSwitchStatementWithDefault(node, _ref56) { + var discriminant = _ref56.discriminant; + var preDefaultCases = _ref56.preDefaultCases; + var defaultCase = _ref56.defaultCase; + var postDefaultCases = _ref56.postDefaultCases; - /** - * Returns a new list containing the last `n` elements of the given list. - * If `n > list.length`, returns a list of `list.length` elements. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig Number -> [a] -> [a] - * @sig Number -> String -> String - * @param {Number} n The number of elements to return. - * @param {Array} xs The collection to consider. - * @return {Array} - * @see R.dropLast - * @example - * - * R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz'] - * R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] - * R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] - * R.takeLast(3, 'ramda'); //=> 'mda' - */ - var takeLast = _curry2(function takeLast(n, xs) { - return drop(n >= 0 ? xs.length - n : 0, xs); - }); + return seq(this.t("switch"), this.sep(Sep.BEFORE_SWITCH_DISCRIM), this.paren(discriminant, Sep.SWITCH_DISCRIM_PAREN_BEFORE, Sep.SWITCH_DISCRIM_PAREN_AFTER), this.sep(Sep.BEFORE_SWITCH_BODY), this.brace(seq.apply(undefined, _toConsumableArray(preDefaultCases).concat([defaultCase], _toConsumableArray(postDefaultCases))), node, Sep.SWITCH_BRACE_INTIAL, Sep.SWITCH_BRACE_FINAL, Sep.SWITCH_BRACE_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceTemplateExpression", + value: function reduceTemplateExpression(node, _ref57) { + var tag = _ref57.tag; + var elements = _ref57.elements; - /** - * Initializes a transducer using supplied iterator function. Returns a single - * item by iterating through the list, successively calling the transformed - * iterator function and passing it an accumulator value and the current value - * from the array, and then passing the result to the next call. - * - * The iterator function receives two values: *(acc, value)*. It will be - * wrapped as a transformer to initialize the transducer. A transformer can be - * passed directly in place of an iterator function. In both cases, iteration - * may be stopped early with the `R.reduced` function. - * - * A transducer is a function that accepts a transformer and returns a - * transformer and can be composed directly. - * - * A transformer is an an object that provides a 2-arity reducing iterator - * function, step, 0-arity initial value function, init, and 1-arity result - * extraction function, result. The step function is used as the iterator - * function in reduce. The result function is used to convert the final - * accumulator into the return type and in most cases is R.identity. The init - * function can be used to provide an initial accumulator, but is ignored by - * transduce. - * - * The iteration is performed with R.reduce after initializing the transducer. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category List - * @sig (c -> c) -> (a,b -> a) -> a -> [b] -> a - * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. - * @param {Function} fn The iterator function. Receives two values, the accumulator and the - * current element from the array. Wrapped as transformer, if necessary, and used to - * initialize the transducer - * @param {*} acc The initial accumulator value. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. - * @see R.reduce, R.reduced, R.into - * @example - * - * var numbers = [1, 2, 3, 4]; - * var transducer = R.compose(R.map(R.add(1)), R.take(2)); - * - * R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3] - */ - var transduce = curryN(4, function transduce(xf, fn, acc, list) { - return _reduce(xf(typeof fn === 'function' ? _xwrap(fn) : fn), acc, list); - }); + var state = node.tag == null ? empty() : seq(this.p(node.tag, (0, _coderep.getPrecedence)(node), tag), this.sep(Sep.TEMPLATE_TAG)); + var templateData = ""; + state = seq(state, this.t("`")); + for (var i = 0, l = node.elements.length; i < l; ++i) { + if (node.elements[i].type === "TemplateElement") { + var d = ""; + if (i > 0) d += "}"; + d += node.elements[i].rawValue; + if (i < l - 1) d += "${"; + state = seq(state, this.t(d)); + } else { + state = seq(state, this.sep(Sep.BEFORE_TEMPLATE_EXPRESSION), elements[i], this.sep(Sep.AFTER_TEMPLATE_EXPRESSION)); + } + } + state = seq(state, this.t("`")); + if (node.tag != null) { + state.startsWithCurly = tag.startsWithCurly; + state.startsWithLetSquareBracket = tag.startsWithLetSquareBracket; + state.startsWithFunctionOrClass = tag.startsWithFunctionOrClass; + } + return state; + } + }, { + key: "reduceTemplateElement", + value: function reduceTemplateElement(node) { + return this.t(node.rawValue); + } + }, { + key: "reduceThisExpression", + value: function reduceThisExpression(node) { + return this.t("this"); + } + }, { + key: "reduceThrowStatement", + value: function reduceThrowStatement(node, _ref58) { + var expression = _ref58.expression; - /** - * Combines two lists into a set (i.e. no duplicates) composed of the elements - * of each list. Duplication is determined according to the value returned by - * applying the supplied predicate to two list elements. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig (a -> a -> Boolean) -> [*] -> [*] -> [*] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The first and second lists concatenated, with - * duplicates removed. - * @see R.union - * @example - * - * var l1 = [{a: 1}, {a: 2}]; - * var l2 = [{a: 1}, {a: 4}]; - * R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}] - */ - var unionWith = _curry3(function unionWith(pred, list1, list2) { - return uniqWith(pred, _concat(list1, list2)); - }); + return seq(this.t("throw"), this.sep(Sep.THROW), expression, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceTryCatchStatement", + value: function reduceTryCatchStatement(node, _ref59) { + var body = _ref59.body; + var catchClause = _ref59.catchClause; - /** - * Takes a spec object and a test object; returns true if the test satisfies - * the spec, false otherwise. An object satisfies the spec if, for each of the - * spec's own properties, accessing that property of the object gives the same - * value (in `R.equals` terms) as accessing that property of the spec. - * - * `whereEq` is a specialization of [`where`](#where). - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Object - * @sig {String: *} -> {String: *} -> Boolean - * @param {Object} spec - * @param {Object} testObj - * @return {Boolean} - * @see R.where - * @example - * - * // pred :: Object -> Boolean - * var pred = R.whereEq({a: 1, b: 2}); - * - * pred({a: 1}); //=> false - * pred({a: 1, b: 2}); //=> true - * pred({a: 1, b: 2, c: 3}); //=> true - * pred({a: 1, b: 1}); //=> false - */ - var whereEq = _curry2(function whereEq(spec, testObj) { - return where(map(equals, spec), testObj); - }); + return seq(this.t("try"), this.sep(Sep.AFTER_TRY), body, this.sep(Sep.BEFORE_CATCH), catchClause, this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceTryFinallyStatement", + value: function reduceTryFinallyStatement(node, _ref60) { + var body = _ref60.body; + var catchClause = _ref60.catchClause; + var finalizer = _ref60.finalizer; - var _flatCat = function () { - var preservingReduced = function (xf) { - return { - '@@transducer/init': _xfBase.init, - '@@transducer/result': function (result) { - return xf['@@transducer/result'](result); - }, - '@@transducer/step': function (result, input) { - var ret = xf['@@transducer/step'](result, input); - return ret['@@transducer/reduced'] ? _forceReduced(ret) : ret; - } - }; - }; - return function _xcat(xf) { - var rxf = preservingReduced(xf); - return { - '@@transducer/init': _xfBase.init, - '@@transducer/result': function (result) { - return rxf['@@transducer/result'](result); - }, - '@@transducer/step': function (result, input) { - return !isArrayLike(input) ? _reduce(rxf, result, [input]) : _reduce(rxf, result, input); - } - }; - }; - }(); + return seq(this.t("try"), this.sep(Sep.AFTER_TRY), body, catchClause ? seq(this.sep(Sep.BEFORE_CATCH), catchClause) : empty(), this.sep(Sep.BEFORE_FINALLY), this.t("finally"), this.sep(Sep.AFTER_FINALLY), finalizer, this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceYieldExpression", + value: function reduceYieldExpression(node, _ref61) { + var expression = _ref61.expression; - // Array.prototype.indexOf doesn't exist below IE9 - // manually crawl the list to distinguish between +0 and -0 - // NaN - // non-zero numbers can utilise Set - // all these types can utilise Set - // null can utilise Set - // anything else not covered above, defer to R.equals - var _indexOf = function _indexOf(list, a, idx) { - var inf, item; - // Array.prototype.indexOf doesn't exist below IE9 - if (typeof list.indexOf === 'function') { - switch (typeof a) { - case 'number': - if (a === 0) { - // manually crawl the list to distinguish between +0 and -0 - inf = 1 / a; - while (idx < list.length) { - item = list[idx]; - if (item === 0 && 1 / item === inf) { - return idx; - } - idx += 1; - } - return -1; - } else if (a !== a) { - // NaN - while (idx < list.length) { - item = list[idx]; - if (typeof item === 'number' && item !== item) { - return idx; - } - idx += 1; - } - return -1; - } - // non-zero numbers can utilise Set - return list.indexOf(a, idx); - // all these types can utilise Set - case 'string': - case 'boolean': - case 'function': - case 'undefined': - return list.indexOf(a, idx); - case 'object': - if (a === null) { - // null can utilise Set - return list.indexOf(a, idx); - } - } - } - // anything else not covered above, defer to R.equals - while (idx < list.length) { - if (equals(list[idx], a)) { - return idx; - } - idx += 1; - } - return -1; - }; + if (node.expression == null) return this.t("yield"); + return seq(this.t("yield"), this.sep(Sep.YIELD), this.p(node.expression, (0, _coderep.getPrecedence)(node), expression)); + } + }, { + key: "reduceYieldGeneratorExpression", + value: function reduceYieldGeneratorExpression(node, _ref62) { + var expression = _ref62.expression; - var _xchain = _curry2(function _xchain(f, xf) { - return map(f, _flatCat(xf)); - }); + return seq(this.t("yield"), this.sep(Sep.BEFORE_YIELD_STAR), this.t("*"), this.sep(Sep.AFTER_YIELD_STAR), this.p(node.expression, (0, _coderep.getPrecedence)(node), expression)); + } + }, { + key: "reduceDirective", + value: function reduceDirective(node) { + var delim = /^(?:[^"\\]|\\.)*$/.test(node.rawValue) ? "\"" : "'"; + return seq(this.t(delim + node.rawValue + delim), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceVariableDeclaration", + value: function reduceVariableDeclaration(node, _ref63) { + var declarators = _ref63.declarators; - /** - * Takes a list of predicates and returns a predicate that returns true for a - * given list of arguments if every one of the provided predicates is satisfied - * by those arguments. - * - * The function returned is a curried function whose arity matches that of the - * highest-arity predicate. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Logic - * @sig [(*... -> Boolean)] -> (*... -> Boolean) - * @param {Array} preds - * @return {Function} - * @see R.anyPass - * @example - * - * var isQueen = R.propEq('rank', 'Q'); - * var isSpade = R.propEq('suit', '♠︎'); - * var isQueenOfSpades = R.allPass([isQueen, isSpade]); - * - * isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false - * isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true - */ - var allPass = _curry1(function allPass(preds) { - return curryN(reduce(max, 0, pluck('length', preds)), function () { - var idx = 0; - var len = preds.length; - while (idx < len) { - if (!preds[idx].apply(this, arguments)) { - return false; - } - idx += 1; - } - return true; - }); - }); + return seq(this.t(node.kind), this.sep(Sep.VARIABLE_DECLARATION), this.commaSep(declarators, Sep.DECLARATORS_BEFORE_COMMA, Sep.DECLARATORS_AFTER_COMMA)); + } + }, { + key: "reduceVariableDeclarationStatement", + value: function reduceVariableDeclarationStatement(node, _ref64) { + var declaration = _ref64.declaration; - /** - * Returns `true` if all elements are unique, in `R.equals` terms, otherwise - * `false`. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category List - * @sig [a] -> Boolean - * @param {Array} list The array to consider. - * @return {Boolean} `true` if all elements are unique, else `false`. - * @example - * - * R.allUniq(['1', 1]); //=> true - * R.allUniq([1, 1]); //=> false - * R.allUniq([[42], [42]]); //=> false - */ - var allUniq = _curry1(function allUniq(list) { - var len = list.length; - var idx = 0; - while (idx < len) { - if (_indexOf(list, list[idx], idx + 1) >= 0) { - return false; - } - idx += 1; + return seq(declaration, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceVariableDeclarator", + value: function reduceVariableDeclarator(node, _ref65) { + var binding = _ref65.binding; + var init = _ref65.init; + + var containsIn = init && init.containsIn && !init.containsGroup; + if (init) { + if (init.containsGroup) { + init = this.paren(init, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); + } else { + init = markContainsIn(init); } - return true; - }); + } + return (0, _objectAssign2.default)(init == null ? binding : seq(binding, this.sep(Sep.BEFORE_INIT_EQUALS), this.t("="), this.sep(Sep.AFTER_INIT_EQUALS), init), { containsIn: containsIn }); + } + }, { + key: "reduceWhileStatement", + value: function reduceWhileStatement(node, _ref66) { + var test = _ref66.test; + var body = _ref66.body; - /** - * Takes a list of predicates and returns a predicate that returns true for a - * given list of arguments if at least one of the provided predicates is - * satisfied by those arguments. - * - * The function returned is a curried function whose arity matches that of the - * highest-arity predicate. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Logic - * @sig [(*... -> Boolean)] -> (*... -> Boolean) - * @param {Array} preds - * @return {Function} - * @see R.allPass - * @example - * - * var gte = R.anyPass([R.gt, R.equals]); - * - * gte(3, 2); //=> true - * gte(2, 2); //=> true - * gte(2, 3); //=> false - */ - var anyPass = _curry1(function anyPass(preds) { - return curryN(reduce(max, 0, pluck('length', preds)), function () { - var idx = 0; - var len = preds.length; - while (idx < len) { - if (preds[idx].apply(this, arguments)) { - return true; - } - idx += 1; - } - return false; - }); - }); + return (0, _objectAssign2.default)(seq(this.t("while"), this.sep(Sep.AFTER_WHILE), this.paren(test, Sep.WHILE_TEST_PAREN_BEFORE, Sep.WHILE_TEST_PAREN_AFTER), this.sep(Sep.BEFORE_WHILE_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); + } + }, { + key: "reduceWithStatement", + value: function reduceWithStatement(node, _ref67) { + var object = _ref67.object; + var body = _ref67.body; - /** - * ap applies a list of functions to a list of values. - * - * Dispatches to the `ap` method of the second argument, if present. Also - * treats functions as applicatives. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category Function - * @sig [f] -> [a] -> [f a] - * @param {Array} fns An array of functions - * @param {Array} vs An array of values - * @return {Array} An array of results of applying each of `fns` to all of `vs` in turn. - * @example - * - * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6] - */ - // else - var ap = _curry2(function ap(applicative, fn) { - return typeof applicative.ap === 'function' ? applicative.ap(fn) : typeof applicative === 'function' ? curryN(Math.max(applicative.length, fn.length), function () { - return applicative.apply(this, arguments)(fn.apply(this, arguments)); - }) : // else - _reduce(function (acc, f) { - return _concat(acc, map(f, fn)); - }, [], applicative); - }); + return (0, _objectAssign2.default)(seq(this.t("with"), this.sep(Sep.AFTER_WITH), this.paren(object, Sep.WITH_PAREN_BEFORE, Sep.WITH_PAREN_AFTER), this.sep(Sep.BEFORE_WITH_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); + } + }]); - /** - * Returns the result of calling its first argument with the remaining - * arguments. This is occasionally useful as a converging function for - * `R.converge`: the left branch can produce a function while the right branch - * produces a value to be passed to that function as an argument. - * - * @func - * @memberOf R - * @since v0.9.0 - * @category Function - * @sig (*... -> a),*... -> a - * @param {Function} fn The function to apply to the remaining arguments. - * @param {...*} args Any number of positional arguments. - * @return {*} - * @see R.apply - * @example - * - * var indentN = R.pipe(R.times(R.always(' ')), - * R.join(''), - * R.replace(/^(?!$)/gm)); - * - * var format = R.converge(R.call, [ - * R.pipe(R.prop('indent'), indentN), - * R.prop('value') - * ]); - * - * format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> ' foo\n bar\n baz\n' - */ - var call = curry(function call(fn) { - return fn.apply(this, _slice(arguments, 1)); - }); + return ExtensibleCodeGen; + }(); - /** - * `chain` maps a function over a list and concatenates the results. `chain` - * is also known as `flatMap` in some libraries - * - * Dispatches to the `chain` method of the second argument, if present. - * - * @func - * @memberOf R - * @since v0.3.0 - * @category List - * @sig (a -> [b]) -> [a] -> [b] - * @param {Function} fn - * @param {Array} list - * @return {Array} - * @example - * - * var duplicate = n => [n, n]; - * R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3] - */ - var chain = _curry2(_dispatchable('chain', _xchain, function chain(fn, monad) { - if (typeof monad === 'function') { - return function () { - return monad.call(this, fn.apply(this, arguments)).apply(this, arguments); - }; - } - return _makeFlat(false)(map(fn, monad)); - })); + var INDENT = " "; - /** - * Turns a list of Functors into a Functor of a list, applying a mapping - * function to the elements of the list along the way. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category List - * @sig Functor f => (a -> f b) -> (x -> f x) -> [a] -> f [b] - * @param {Function} fn The transformation function - * @param {Function} of A function that returns the data type to return - * @param {Array} list An array of functors of the same type - * @return {*} - * @see R.traverse - * @deprecated since v0.19.0 - * @example - * - * var add10 = R.map(R.add(10)); - * R.commuteMap(add10, R.of, [[1], [2, 3]]); //=> [[11, 12], [11, 13]] - * R.commuteMap(add10, R.of, [[1, 2], [3]]); //=> [[11, 13], [12, 13]] - * R.commuteMap(add10, R.of, [[1], [2], [3]]); //=> [[11, 12, 13]] - * R.commuteMap(add10, Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([11, 12, 13]) - * R.commuteMap(add10, Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() - * - * var fetch = url => Future((rej, res) => http.get(url, res).on('error', rej)); - * R.commuteMap(fetch, Future.of, [ - * 'http://ramdajs.com', - * 'http://github.com/ramda' - * ]); //=> Future([IncomingMessage, IncomingMessage]) - */ - var commuteMap = _curry3(function commuteMap(fn, of, list) { - function consF(acc, x) { - return ap(map(prepend, fn(x)), acc); - } - return reduceRight(consF, of([]), list); - }); + var Linebreak = function (_CodeRep) { + _inherits(Linebreak, _CodeRep); - /** - * Wraps a constructor function inside a curried function that can be called - * with the same arguments and returns the same type. The arity of the function - * returned is specified to allow using variadic constructor functions. - * - * @func - * @memberOf R - * @since v0.4.0 - * @category Function - * @sig Number -> (* -> {*}) -> (* -> {*}) - * @param {Number} n The arity of the constructor function. - * @param {Function} Fn The constructor function to wrap. - * @return {Function} A wrapped, curried constructor function. - * @example - * - * // Variadic constructor function - * var Widget = () => { - * this.children = Array.prototype.slice.call(arguments); - * // ... - * }; - * Widget.prototype = { - * // ... - * }; - * var allConfigs = [ - * // ... - * ]; - * R.map(R.constructN(1, Widget), allConfigs); // a list of Widgets - */ - var constructN = _curry2(function constructN(n, Fn) { - if (n > 10) { - throw new Error('Constructor with greater than ten arguments'); - } - if (n === 0) { - return function () { - return new Fn(); - }; - } - return curry(nAry(n, function ($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) { - switch (arguments.length) { - case 1: - return new Fn($0); - case 2: - return new Fn($0, $1); - case 3: - return new Fn($0, $1, $2); - case 4: - return new Fn($0, $1, $2, $3); - case 5: - return new Fn($0, $1, $2, $3, $4); - case 6: - return new Fn($0, $1, $2, $3, $4, $5); - case 7: - return new Fn($0, $1, $2, $3, $4, $5, $6); - case 8: - return new Fn($0, $1, $2, $3, $4, $5, $6, $7); - case 9: - return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8); - case 10: - return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9); - } - })); - }); + function Linebreak() { + _classCallCheck(this, Linebreak); - /** - * Accepts a converging function and a list of branching functions and returns - * a new function. When invoked, this new function is applied to some - * arguments, each branching function is applied to those same arguments. The - * results of each branching function are passed as arguments to the converging - * function to produce the return value. - * - * @func - * @memberOf R - * @since v0.4.2 - * @category Function - * @sig (x1 -> x2 -> ... -> z) -> [(a -> b -> ... -> x1), (a -> b -> ... -> x2), ...] -> (a -> b -> ... -> z) - * @param {Function} after A function. `after` will be invoked with the return values of - * `fn1` and `fn2` as its arguments. - * @param {Array} functions A list of functions. - * @return {Function} A new function. - * @example - * - * var add = (a, b) => a + b; - * var multiply = (a, b) => a * b; - * var subtract = (a, b) => a - b; - * - * //≅ multiply( add(1, 2), subtract(1, 2) ); - * R.converge(multiply, [add, subtract])(1, 2); //=> -3 - * - * var add3 = (a, b, c) => a + b + c; - * R.converge(add3, [multiply, add, subtract])(1, 2); //=> 4 - */ - var converge = _curry2(function converge(after, fns) { - return curryN(Math.max.apply(Math, pluck('length', fns)), function () { - var args = arguments; - var context = this; - return after.apply(context, _map(function (fn) { - return fn.apply(context, args); - }, fns)); - }); - }); + var _this4 = _possibleConstructorReturn(this, Object.getPrototypeOf(Linebreak).call(this)); - /** - * Returns a new list without any consecutively repeating elements. Equality is - * determined by applying the supplied predicate two consecutive elements. The - * first element in a series of equal element is the one being preserved. - * - * Dispatches to the `dropRepeatsWith` method of the second argument, if present. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category List - * @sig (a, a -> Boolean) -> [a] -> [a] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list The array to consider. - * @return {Array} `list` without repeating elements. - * @see R.transduce - * @example - * - * var lengthEq = (x, y) => Math.abs(x) === Math.abs(y); - * var l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3]; - * R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3] - */ - var dropRepeatsWith = _curry2(_dispatchable('dropRepeatsWith', _xdropRepeatsWith, function dropRepeatsWith(pred, list) { - var result = []; - var idx = 1; - var len = list.length; - if (len !== 0) { - result[0] = list[0]; - while (idx < len) { - if (!pred(last(result), list[idx])) { - result[result.length] = list[idx]; - } - idx += 1; - } - } - return result; - })); - - /** - * Takes a function and two values in its domain and returns `true` if the - * values map to the same value in the codomain; `false` otherwise. - * - * @func - * @memberOf R - * @since v0.18.0 - * @category Relation - * @sig (a -> b) -> a -> a -> Boolean - * @param {Function} f - * @param {*} x - * @param {*} y - * @return {Boolean} - * @example - * - * R.eqBy(Math.abs, 5, -5); //=> true - */ - var eqBy = _curry3(function eqBy(f, x, y) { - return equals(f(x), f(y)); - }); - - /** - * Reports whether two objects have the same value, in `R.equals` terms, for - * the specified property. Useful as a curried predicate. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig k -> {k: v} -> {k: v} -> Boolean - * @param {String} prop The name of the property to compare - * @param {Object} obj1 - * @param {Object} obj2 - * @return {Boolean} - * - * @example - * - * var o1 = { a: 1, b: 2, c: 3, d: 4 }; - * var o2 = { a: 10, b: 20, c: 3, d: 40 }; - * R.eqProps('a', o1, o2); //=> false - * R.eqProps('c', o1, o2); //=> true - */ - var eqProps = _curry3(function eqProps(prop, obj1, obj2) { - return equals(obj1[prop], obj2[prop]); - }); - - /** - * Returns the position of the first occurrence of an item in an array, or -1 - * if the item is not included in the array. `R.equals` is used to determine - * equality. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> Number - * @param {*} target The item to find. - * @param {Array} xs The array to search in. - * @return {Number} the index of the target, or -1 if the target is not found. - * @see R.lastIndexOf - * @example - * - * R.indexOf(3, [1,2,3,4]); //=> 2 - * R.indexOf(10, [1,2,3,4]); //=> -1 - */ - var indexOf = _curry2(function indexOf(target, xs) { - return typeof xs.indexOf === 'function' && !_isArray(xs) ? xs.indexOf(target) : _indexOf(xs, target, 0); - }); + _this4.indentation = 0; + return _this4; + } - /** - * juxt applies a list of functions to a list of values. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category Function - * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n]) - * @param {Array} fns An array of functions - * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters. - * @example - * - * var range = R.juxt([Math.min, Math.max]); - * range(3, 4, 9, -3); //=> [-3, 9] - */ - var juxt = _curry1(function juxt(fns) { - return function () { - return map(apply(__, arguments), fns); - }; - }); + _createClass(Linebreak, [{ + key: "emit", + value: function emit(ts) { + ts.put("\n"); + for (var i = 0; i < this.indentation; ++i) { + ts.put(INDENT); + } + } + }]); - /** - * Returns a lens for the given getter and setter functions. The getter "gets" - * the value of the focus; the setter "sets" the value of the focus. The setter - * should not mutate the data structure. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig (s -> a) -> ((a, s) -> s) -> Lens s a - * @param {Function} getter - * @param {Function} setter - * @return {Lens} - * @see R.view, R.set, R.over, R.lensIndex, R.lensProp - * @example - * - * var xLens = R.lens(R.prop('x'), R.assoc('x')); - * - * R.view(xLens, {x: 1, y: 2}); //=> 1 - * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} - * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} - */ - var lens = _curry2(function lens(getter, setter) { - return function (f) { - return function (s) { - return map(function (v) { - return setter(v, s); - }, f(getter(s))); - }; - }; - }); + return Linebreak; + }(_coderep.CodeRep); - /** - * Returns a lens whose focus is the specified index. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig Number -> Lens s a - * @param {Number} n - * @return {Lens} - * @see R.view, R.set, R.over - * @example - * - * var headLens = R.lensIndex(0); - * - * R.view(headLens, ['a', 'b', 'c']); //=> 'a' - * R.set(headLens, 'x', ['a', 'b', 'c']); //=> ['x', 'b', 'c'] - * R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c'] - */ - var lensIndex = _curry1(function lensIndex(n) { - return lens(nth(n), update(n)); - }); + function withoutTrailingLinebreak(state) { + if (state && state instanceof _coderep.Seq) { + var lastChild = state.children[state.children.length - 1]; + /* istanbul ignore next */ + while (lastChild instanceof _coderep.Empty) { + state.children.pop(); + lastChild = state.children[state.children.length - 1]; + } + /* istanbul ignore else */ + if (lastChild instanceof _coderep.Seq) { + withoutTrailingLinebreak(lastChild); + } else if (lastChild instanceof Linebreak) { + state.children.pop(); + } + } + return state; + } - /** - * Returns a lens whose focus is the specified path. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig [String] -> Lens s a - * @param {Array} path The path to use. - * @return {Lens} - * @see R.view, R.set, R.over - * @example - * - * var xyLens = R.lensPath(['x', 'y']); - * - * R.view(xyLens, {x: {y: 2, z: 3}}); //=> 2 - * R.set(xyLens, 4, {x: {y: 2, z: 3}}); //=> {x: {y: 4, z: 3}} - * R.over(xyLens, R.negate, {x: {y: 2, z: 3}}); //=> {x: {y: -2, z: 3}} - */ - var lensPath = _curry1(function lensPath(p) { - return lens(path(p), assocPath(p)); - }); + function indent(rep, includingFinal) { + var finalLinebreak = undefined; + function indentNode(node) { + if (node instanceof Linebreak) { + finalLinebreak = node; + ++node.indentation; + } + } + rep.forEach(indentNode); + if (!includingFinal) { + --finalLinebreak.indentation; + } + return rep; + } - /** - * Returns a lens whose focus is the specified property. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Object - * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s - * @sig String -> Lens s a - * @param {String} k - * @return {Lens} - * @see R.view, R.set, R.over - * @example - * - * var xLens = R.lensProp('x'); - * - * R.view(xLens, {x: 1, y: 2}); //=> 1 - * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} - * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} - */ - var lensProp = _curry1(function lensProp(k) { - return lens(prop(k), assoc(k)); - }); + var FormattedCodeGen = exports.FormattedCodeGen = function (_ExtensibleCodeGen) { + _inherits(FormattedCodeGen, _ExtensibleCodeGen); - /** - * "lifts" a function to be the specified arity, so that it may "map over" that - * many lists (or other objects that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply)). - * - * @func - * @memberOf R - * @since v0.7.0 - * @category Function - * @sig Number -> (*... -> *) -> ([*]... -> [*]) - * @param {Function} fn The function to lift into higher context - * @return {Function} The lifted function. - * @see R.lift - * @example - * - * var madd3 = R.liftN(3, R.curryN(3, (...args) => R.sum(args))); - * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7] - */ - var liftN = _curry2(function liftN(arity, fn) { - var lifted = curryN(arity, fn); - return curryN(arity, function () { - return _reduce(ap, map(lifted, arguments[0]), _slice(arguments, 1)); - }); - }); + function FormattedCodeGen() { + _classCallCheck(this, FormattedCodeGen); - /** - * Returns the mean of the given list of numbers. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list - * @return {Number} - * @example - * - * R.mean([2, 7, 9]); //=> 6 - * R.mean([]); //=> NaN - */ - var mean = _curry1(function mean(list) { - return sum(list) / list.length; - }); + return _possibleConstructorReturn(this, Object.getPrototypeOf(FormattedCodeGen).apply(this, arguments)); + } - /** - * Returns the median of the given list of numbers. - * - * @func - * @memberOf R - * @since v0.14.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list - * @return {Number} - * @example - * - * R.median([2, 9, 7]); //=> 7 - * R.median([7, 2, 10, 9]); //=> 8 - * R.median([]); //=> NaN - */ - var median = _curry1(function median(list) { - var len = list.length; - if (len === 0) { - return NaN; - } - var width = 2 - len % 2; - var idx = (len - width) / 2; - return mean(_slice(list).sort(function (a, b) { - return a < b ? -1 : a > b ? 1 : 0; - }).slice(idx, idx + width)); - }); + _createClass(FormattedCodeGen, [{ + key: "parenToAvoidBeingDirective", + value: function parenToAvoidBeingDirective(element, original) { + if (element && element.type === "ExpressionStatement" && element.expression.type === "LiteralStringExpression") { + return seq(this.paren(original.children[0], Sep.PAREN_AVOIDING_DIRECTIVE_BEFORE, Sep.PAREN_AVOIDING_DIRECTIVE_AFTER), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(element))); + } + return original; + } + }, { + key: "brace", + value: function brace(rep, node) { + if (isEmpty(rep)) { + return this.t("{}"); + } - /** - * Create a new object with the own properties of the first object merged with - * the own properties of the second object. If a key exists in both objects, - * the value from the second object will be used. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig {k: v} -> {k: v} -> {k: v} - * @param {Object} l - * @param {Object} r - * @return {Object} - * @see R.mergeWith, R.mergeWithKey - * @example - * - * R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); - * //=> { 'name': 'fred', 'age': 40 } - * - * var resetToDefault = R.merge(R.__, {x: 0}); - * resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2} - */ - var merge = mergeWith(function (l, r) { - return r; - }); + switch (node.type) { + case "ObjectBinding": + case "Import": + case "ExportFrom": + case "ObjectExpression": + return new _coderep.Brace(rep); + } - /** - * Merges a list of objects together into one object. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category List - * @sig [{k: v}] -> {k: v} - * @param {Array} list An array of objects - * @return {Object} A merged object. - * @see R.reduce - * @example - * - * R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3} - * R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2} - */ - var mergeAll = _curry1(function mergeAll(list) { - return reduce(merge, {}, list); - }); + rep = seq(new Linebreak(), rep); + indent(rep, false); + return new _coderep.Brace(rep); + } + }, { + key: "reduceDoWhileStatement", + value: function reduceDoWhileStatement(node, _ref68) { + var body = _ref68.body; + var test = _ref68.test; - /** - * Performs left-to-right function composition. The leftmost function may have - * any arity; the remaining functions must be unary. - * - * In some libraries this function is named `sequence`. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z) - * @param {...Function} functions - * @return {Function} - * @see R.compose - * @example - * - * var f = R.pipe(Math.pow, R.negate, R.inc); - * - * f(3, 4); // -(3^4) + 1 - */ - var pipe = function pipe() { - if (arguments.length === 0) { - throw new Error('pipe requires at least one argument'); - } - return _arity(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments))); - }; + return seq(this.t("do"), this.sep(Sep.AFTER_DO), withoutTrailingLinebreak(body), this.sep(Sep.BEFORE_DOWHILE_WHILE), this.t("while"), this.sep(Sep.AFTER_DOWHILE_WHILE), this.paren(test, Sep.DO_WHILE_TEST_PAREN_BEFORE, Sep.DO_WHILE_TEST_PAREN_AFTER), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + } + }, { + key: "reduceIfStatement", + value: function reduceIfStatement(node, _ref69) { + var test = _ref69.test; + var consequent = _ref69.consequent; + var alternate = _ref69.alternate; - /** - * Performs left-to-right composition of one or more Promise-returning - * functions. The leftmost function may have any arity; the remaining functions - * must be unary. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category Function - * @sig ((a -> Promise b), (b -> Promise c), ..., (y -> Promise z)) -> (a -> Promise z) - * @param {...Function} functions - * @return {Function} - * @see R.composeP - * @example - * - * // followersForUser :: String -> Promise [User] - * var followersForUser = R.pipeP(db.getUserById, db.getFollowers); - */ - var pipeP = function pipeP() { - if (arguments.length === 0) { - throw new Error('pipeP requires at least one argument'); - } - return _arity(arguments[0].length, reduce(_pipeP, arguments[0], tail(arguments))); - }; + if (alternate && consequent.endsWithMissingElse) { + consequent = this.brace(consequent, node); + } + return (0, _objectAssign2.default)(seq(this.t("if"), this.sep(Sep.AFTER_IF), this.paren(test, Sep.IF_PAREN_BEFORE, Sep.IF_PAREN_AFTER), this.sep(Sep.AFTER_IF_TEST), withoutTrailingLinebreak(consequent), alternate ? seq(this.sep(Sep.BEFORE_ELSE), this.t("else"), this.sep(Sep.AFTER_ELSE), withoutTrailingLinebreak(alternate)) : empty(), this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: alternate ? alternate.endsWithMissingElse : true }); + } + }, { + key: "reduceSwitchCase", + value: function reduceSwitchCase(node, _ref70) { + var test = _ref70.test; + var consequent = _ref70.consequent; - /** - * Multiplies together all the elements of a list. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Math - * @sig [Number] -> Number - * @param {Array} list An array of numbers - * @return {Number} The product of all the numbers in the list. - * @see R.reduce - * @example - * - * R.product([2,4,6,8,100,1]); //=> 38400 - */ - var product = reduce(multiply, 1); + consequent = indent(withoutTrailingLinebreak(seq.apply(undefined, [this.sep(Sep.BEFORE_CASE_BODY)].concat(_toConsumableArray(consequent)))), true); + return seq(this.t("case"), this.sep(Sep.BEFORE_CASE_TEST), test, this.sep(Sep.AFTER_CASE_TEST), this.t(":"), consequent, this.sep(Sep.AFTER_CASE_BODY)); + } + }, { + key: "reduceSwitchDefault", + value: function reduceSwitchDefault(node, _ref71) { + var consequent = _ref71.consequent; - /** - * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable) - * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an - * Applicative of Traversable. - * - * Dispatches to the `sequence` method of the second argument, if present. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category List - * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a) - * @param {Function} of - * @param {*} traversable - * @return {*} - * @see R.traverse - * @example - * - * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3]) - * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() - * - * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)] - * R.sequence(R.of, Nothing()); //=> [Nothing()] - */ - var sequence = _curry2(function sequence(of, traversable) { - return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight(function (acc, x) { - return ap(map(prepend, x), acc); - }, of([]), traversable); - }); - - /** - * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning - * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable), - * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative - * into an Applicative of Traversable. - * - * Dispatches to the `sequence` method of the third argument, if present. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category List - * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b) - * @param {Function} of - * @param {Function} f - * @param {*} traversable - * @return {*} - * @see R.sequence - * @example - * - * R.traverse(Maybe.of, R.negate, [Just(1), Just(2), Just(3)]); //=> Just([-1, -2, -3]) - * R.traverse(Maybe.of, R.negate, [Just(1), Just(2), Nothing()]); //=> Nothing() - * - * R.traverse(R.of, R.negate, Just([1, 2, 3])); //=> [Just(-1), Just(-2), Just(-3)] - * R.traverse(R.of, R.negate, Nothing()); //=> [Nothing()] - */ - var traverse = _curry3(function traverse(of, f, traversable) { - return sequence(of, map(f, traversable)); - }); + consequent = indent(withoutTrailingLinebreak(seq.apply(undefined, [this.sep(Sep.BEFORE_CASE_BODY)].concat(_toConsumableArray(consequent)))), true); + return seq(this.t("default"), this.sep(Sep.DEFAULT), this.t(":"), consequent, this.sep(Sep.AFTER_DEFAULT_BODY)); + } + }, { + key: "sep", + value: function sep(separator) { + switch (separator.type) { + case "ARRAY_AFTER_COMMA": + case "OBJECT_AFTER_COMMA": + case "ARGS_AFTER_COMMA": + case "PARAMETER_AFTER_COMMA": + case "DECLARATORS_AFTER_COMMA": + case "NAMED_IMPORT_AFTER_COMMA": + case "IMPORT_AFTER_COMMA": + case "BEFORE_DEFAULT_EQUALS": + case "AFTER_DEFAULT_EQUALS": + case "AFTER_PROP": + case "BEFORE_JUMP_LABEL": + case "BEFORE_CATCH": + case "BEFORE_CATCH_BINDING": + case "AFTER_CATCH_BINDING": + case "BEFORE_CLASS_NAME": + case "BEFORE_EXTENDS": + case "AFTER_EXTENDS": + case "BEFORE_CLASS_DECLARATION_ELEMENTS": + case "BEFORE_CLASS_EXPRESSION_ELEMENTS": + case "AFTER_STATIC": + case "BEFORE_TERNARY_QUESTION": + case "AFTER_TERNARY_QUESTION": + case "BEFORE_TERNARY_COLON": + case "AFTER_TERNARY_COLON": + case "AFTER_DO": + case "BEFORE_DOWHILE_WHILE": + case "AFTER_DOWHILE_WHILE": + case "AFTER_FORIN_FOR": + case "BEFORE_FORIN_IN": + case "AFTER_FORIN_FOR": + case "BEFORE_FORIN_BODY": + case "AFTER_FOROF_FOR": + case "BEFORE_FOROF_OF": + case "AFTER_FOROF_FOR": + case "BEFORE_FOROF_BODY": + case "AFTER_FOR_FOR": + case "BEFORE_FOR_TEST": + case "BEFORE_FOR_UPDATE": + case "BEFORE_FOR_BODY": + case "BEFORE_FUNCTION_DECLARATION_BODY": + case "BEFORE_FUNCTION_EXPRESSION_BODY": + case "BEFORE_ARROW": + case "AFTER_ARROW": + case "AFTER_GET": + case "BEFORE_GET_BODY": + case "AFTER_IF": + case "AFTER_IF_TEST": + case "BEFORE_ELSE": + case "AFTER_ELSE": + case "BEFORE_IMPORT_BINDINGS": + case "BEFORE_IMPORT_MODULE": + case "AFTER_IMPORT_BINDINGS": + case "AFTER_FROM": + case "BEFORE_IMPORT_NAMESPACE": + case "BEFORE_IMPORT_STAR": + case "AFTER_IMPORT_STAR": + case "AFTER_IMPORT_AS": + case "AFTER_NAMESPACE_BINDING": + case "BEFORE_IMPORT_AS": + case "AFTER_IMPORT_AS": + case "EXPORTS_AFTER_COMMA": + case "BEFORE_EXPORT_STAR": + case "AFTER_EXPORT_STAR": + case "BEFORE_EXPORT_BINDINGS": + case "AFTER_EXPORT_BINDINGS": + case "AFTER_EXPORT": + case "AFTER_EXPORT_DEFAULT": + case "BEFORE_EXPORT_AS": + case "AFTER_EXPORT_AS": + case "AFTER_LABEL_COLON": + case "BEFORE_METHOD_BODY": + case "AFTER_NEW": + case "RETURN": + case "AFTER_SET": + case "BEFORE_SET_BODY": + case "BEFORE_SET_PARAMS": + case "BEFORE_CASE_TEST": + case "BEFORE_SWITCH_DISCRIM": + case "BEFORE_SWITCH_BODY": + case "THROW": + case "AFTER_TRY": + case "BEFORE_CATCH": + case "BEFORE_FINALLY": + case "AFTER_FINALLY": + case "VARIABLE_DECLARATION": + case "YIELD": + case "AFTER_YIELD_STAR": + case "DECLARATORS_AFTER_COMMA": + case "BEFORE_INIT_EQUALS": + case "AFTER_INIT_EQUALS": + case "AFTER_WHILE": + case "BEFORE_WHILE_BODY": + case "AFTER_WITH": + case "BEFORE_WITH_BODY": + case "BEFORE_FUNCTION_NAME": + case "AFTER_BINOP": + case "BEFORE_ASSIGN_OP": + case "AFTER_ASSIGN_OP": + return this.t(" "); + case "AFTER_STATEMENT": + switch (separator.node.type) { + case "ForInStatement": + case "ForOfStatement": + case "ForStatement": + case "WhileStatement": + case "WithStatement": + return empty(); // because those already end with an AFTER_STATEMENT + default: + return new Linebreak(); + } + case "AFTER_CLASS_ELEMENT": + case "BEFORE_CASE_BODY": + case "AFTER_CASE_BODY": + case "AFTER_DEFAULT_BODY": + return new Linebreak(); + case "BEFORE_BINOP": + return separator.op === "," ? empty() : this.t(" "); + case "UNARY": + return separator.op === "delete" || separator.op === "void" || separator.op === "typeof" ? this.t(" ") : empty(); + default: + return empty(); + } + } + }]); - /** - * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from - * any [Chain](https://github.com/fantasyland/fantasy-land#chain). - * - * @func - * @memberOf R - * @since v0.3.0 - * @category List - * @sig Chain c => c (c a) -> c a - * @param {*} list - * @return {*} - * @see R.flatten, R.chain - * @example - * - * R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]] - * R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6] - */ - var unnest = chain(_identity); + return FormattedCodeGen; + }(ExtensibleCodeGen); - var _contains = function _contains(a, list) { - return _indexOf(list, a, 0) >= 0; - }; +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { - var _stepCat = function () { - var _stepCatArray = { - '@@transducer/init': Array, - '@@transducer/step': function (xs, x) { - return _concat(xs, [x]); - }, - '@@transducer/result': _identity - }; - var _stepCatString = { - '@@transducer/init': String, - '@@transducer/step': function (a, b) { - return a + b; - }, - '@@transducer/result': _identity - }; - var _stepCatObject = { - '@@transducer/init': Object, - '@@transducer/step': function (result, input) { - return merge(result, isArrayLike(input) ? objOf(input[0], input[1]) : input); - }, - '@@transducer/result': _identity - }; - return function _stepCat(obj) { - if (_isTransformer(obj)) { - return obj; - } - if (isArrayLike(obj)) { - return _stepCatArray; - } - if (typeof obj === 'string') { - return _stepCatString; - } - if (typeof obj === 'object') { - return _stepCatObject; - } - throw new Error('Cannot create transformer for ' + obj); - }; - }(); + "use strict"; - // mapPairs :: (Object, [String]) -> [String] - var _toString = function _toString(x, seen) { - var recur = function recur(y) { - var xs = seen.concat([x]); - return _contains(y, xs) ? '' : _toString(y, xs); - }; - // mapPairs :: (Object, [String]) -> [String] - var mapPairs = function (obj, keys) { - return _map(function (k) { - return _quote(k) + ': ' + recur(obj[k]); - }, keys.slice().sort()); - }; - switch (Object.prototype.toString.call(x)) { - case '[object Arguments]': - return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))'; - case '[object Array]': - return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) { - return /^\d+$/.test(k); - }, keys(x)))).join(', ') + ']'; - case '[object Boolean]': - return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString(); - case '[object Date]': - return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')'; - case '[object Null]': - return 'null'; - case '[object Number]': - return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10); - case '[object String]': - return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x); - case '[object Undefined]': - return 'undefined'; - default: - if (typeof x.toString === 'function') { - var repr = x.toString(); - if (repr !== '[object Object]') { - return repr; - } - } - return '{' + mapPairs(x, keys(x)).join(', ') + '}'; - } - }; + 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; }; }(); /** + * 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. + */ - /** - * Turns a list of Functors into a Functor of a list. - * - * @func - * @memberOf R - * @since v0.8.0 - * @category List - * @sig Functor f => (x -> f x) -> [f a] -> f [a] - * @param {Function} of A function that returns the data type to return - * @param {Array} list An array of functors of the same type - * @return {*} - * @see R.sequence - * @deprecated since v0.19.0 - * @example - * - * R.commute(R.of, [[1], [2, 3]]); //=> [[1, 2], [1, 3]] - * R.commute(R.of, [[1, 2], [3]]); //=> [[1, 3], [2, 3]] - * R.commute(R.of, [[1], [2], [3]]); //=> [[1, 2, 3]] - * R.commute(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3]) - * R.commute(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() - */ - var commute = commuteMap(identity); + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.TokenStream = undefined; - /** - * Performs right-to-left function composition. The rightmost function may have - * any arity; the remaining functions must be unary. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z) - * @param {...Function} functions - * @return {Function} - * @see R.pipe - * @example - * - * var f = R.compose(R.inc, R.negate, Math.pow); - * - * f(3, 4); // -(3^4) + 1 - */ - var compose = function compose() { - if (arguments.length === 0) { - throw new Error('compose requires at least one argument'); - } - return pipe.apply(this, reverse(arguments)); - }; + var _esutils = __webpack_require__(15); - /** - * Returns the right-to-left Kleisli composition of the provided functions, - * each of which must return a value of a type supported by [`chain`](#chain). - * - * `R.composeK(h, g, f)` is equivalent to `R.compose(R.chain(h), R.chain(g), R.chain(f))`. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category Function - * @sig Chain m => ((y -> m z), (x -> m y), ..., (a -> m b)) -> (m a -> m z) - * @param {...Function} - * @return {Function} - * @see R.pipeK - * @example - * - * // parseJson :: String -> Maybe * - * // get :: String -> Object -> Maybe * - * - * // getStateCode :: Maybe String -> Maybe String - * var getStateCode = R.composeK( - * R.compose(Maybe.of, R.toUpper), - * get('state'), - * get('address'), - * get('user'), - * parseJson - * ); - * - * getStateCode(Maybe.of('{"user":{"address":{"state":"ny"}}}')); - * //=> Just('NY') - * getStateCode(Maybe.of('[Invalid JSON]')); - * //=> Nothing() - */ - var composeK = function composeK() { - return compose.apply(this, prepend(identity, map(chain, arguments))); - }; + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - /** - * Performs right-to-left composition of one or more Promise-returning - * functions. The rightmost function may have any arity; the remaining - * functions must be unary. - * - * @func - * @memberOf R - * @since v0.10.0 - * @category Function - * @sig ((y -> Promise z), (x -> Promise y), ..., (a -> Promise b)) -> (a -> Promise z) - * @param {...Function} functions - * @return {Function} - * @see R.pipeP - * @example - * - * // followersForUser :: String -> Promise [User] - * var followersForUser = R.composeP(db.getFollowers, db.getUserById); - */ - var composeP = function composeP() { - if (arguments.length === 0) { - throw new Error('composeP requires at least one argument'); - } - return pipeP.apply(this, reverse(arguments)); - }; + function numberDot(fragment) { + if (fragment.indexOf(".") < 0 && fragment.indexOf("e") < 0) { + return ".."; + } + return "."; + } - /** - * Wraps a constructor function inside a curried function that can be called - * with the same arguments and returns the same type. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (* -> {*}) -> (* -> {*}) - * @param {Function} Fn The constructor function to wrap. - * @return {Function} A wrapped, curried constructor function. - * @example - * - * // Constructor function - * var Widget = config => { - * // ... - * }; - * Widget.prototype = { - * // ... - * }; - * var allConfigs = [ - * // ... - * ]; - * R.map(R.construct(Widget), allConfigs); // a list of Widgets - */ - var construct = _curry1(function construct(Fn) { - return constructN(Fn.length, Fn); + function renderNumber(n) { + var s; + if (n >= 1e3 && n % 10 === 0) { + s = n.toString(10); + if (/[eE]/.test(s)) { + return s.replace(/[eE]\+/, "e"); + } + return n.toString(10).replace(/0+$/, function (match) { + return "e" + match.length; }); + } else if (n % 1 === 0) { + if (n > 1e15 && n < 1e20) { + return "0x" + n.toString(16).toUpperCase(); + } + return n.toString(10).replace(/[eE]\+/, "e"); + } else { + return n.toString(10).replace(/^0\./, ".").replace(/[eE]\+/, "e"); + } + } - /** - * Returns `true` if the specified value is equal, in `R.equals` terms, to at - * least one element of the given list; `false` otherwise. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig a -> [a] -> Boolean - * @param {Object} a The item to compare against. - * @param {Array} list The array to consider. - * @return {Boolean} `true` if the item is in the list, `false` otherwise. - * @see R.any - * @example - * - * R.contains(3, [1, 2, 3]); //=> true - * R.contains(4, [1, 2, 3]); //=> false - * R.contains([42], [[42]]); //=> true - */ - var contains = _curry2(_contains); + var TokenStream = exports.TokenStream = function () { + function TokenStream() { + _classCallCheck(this, TokenStream); - /** - * Finds the set (i.e. no duplicates) of all elements in the first list not - * contained in the second list. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` that are not in `list2`. - * @see R.differenceWith - * @example - * - * R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2] - * R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5] - */ - var difference = _curry2(function difference(first, second) { - var out = []; - var idx = 0; - var firstLen = first.length; - while (idx < firstLen) { - if (!_contains(first[idx], second) && !_contains(first[idx], out)) { - out[out.length] = first[idx]; - } - idx += 1; + this.result = ""; + this.lastNumber = null; + this.lastChar = null; + this.optionalSemi = false; + } + + _createClass(TokenStream, [{ + key: "putNumber", + value: function putNumber(number) { + var tokenStr = renderNumber(number); + this.put(tokenStr); + this.lastNumber = tokenStr; + } + }, { + key: "putOptionalSemi", + value: function putOptionalSemi() { + this.optionalSemi = true; + } + }, { + key: "put", + value: function put(tokenStr) { + if (this.optionalSemi) { + this.optionalSemi = false; + if (tokenStr !== "}") { + this.put(";"); } - return out; - }); + } + if (this.lastNumber !== null && tokenStr.length == 1) { + if (tokenStr === ".") { + this.result += numberDot(this.lastNumber); + this.lastNumber = null; + this.lastChar = "."; + return; + } + } + this.lastNumber = null; + var rightChar = tokenStr.charAt(0); + var lastChar = this.lastChar; + this.lastChar = tokenStr.charAt(tokenStr.length - 1); + if (lastChar && ((lastChar == "+" || lastChar == "-") && lastChar == rightChar || _esutils.code.isIdentifierPartES6(lastChar.charCodeAt(0)) && _esutils.code.isIdentifierPartES6(rightChar.charCodeAt(0)) || lastChar == "/" && rightChar == "i")) { + this.result += " "; + } - /** - * Returns a new list without any consecutively repeating elements. `R.equals` - * is used to determine equality. + this.result += tokenStr; + } + }]); + + return TokenStream; + }(); + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _immutable = __webpack_require__(3); + + var _errors = __webpack_require__(23); + + var _ramdaFantasy = __webpack_require__(24); + + class BindingMap { + constructor() { + this._map = new Map(); + } + + // given a syntax object and a binding, + // add the binding to the map associating the binding with the syntax object's + // scope set + add(stx, _ref) { + let binding = _ref.binding; + let phase = _ref.phase; + var _ref$skipDup = _ref.skipDup; + let skipDup = _ref$skipDup === undefined ? false : _ref$skipDup; + + let stxName = stx.val(); + let allScopeset = stx.scopesets.all; + let scopeset = stx.scopesets.phase.has(phase) ? stx.scopesets.phase.get(phase) : (0, _immutable.List)(); + scopeset = allScopeset.concat(scopeset); + (0, _errors.assert)(phase != null, "must provide a phase for binding add"); + + if (this._map.has(stxName)) { + let scopesetBindingList = this._map.get(stxName); + if (skipDup && scopesetBindingList.some(s => s.scopes.equals(scopeset))) { + return; + } + this._map.set(stxName, scopesetBindingList.push({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.Nothing() + })); + } else { + this._map.set(stxName, _immutable.List.of({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.Nothing() + })); + } + } + + addForward(stx, forwardStx, binding, phase) { + let stxName = stx.token.value; + let allScopeset = stx.scopesets.all; + let scopeset = stx.scopesets.phase.has(phase) ? stx.scopesets.phase.get(phase) : (0, _immutable.List)(); + scopeset = allScopeset.concat(scopeset); + (0, _errors.assert)(phase != null, "must provide a phase for binding add"); + + if (this._map.has(stxName)) { + let scopesetBindingList = this._map.get(stxName); + this._map.set(stxName, scopesetBindingList.push({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.of(forwardStx) + })); + } else { + this._map.set(stxName, _immutable.List.of({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.of(forwardStx) + })); + } + } + + // Syntax -> ?List<{ scopes: ScopeSet, binding: Binding }> + get(stx) { + return this._map.get(stx.token.value); + } + + } + exports.default = BindingMap; + //# sourceMappingURL=data:application/json;base64,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VDtBQUhzQixPQUFSLENBQXZCO0FBS0Q7QUFFRjs7QUFFRDtBQUNBLE1BQUksR0FBSixFQUFTO0FBQ1AsV0FBTyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsSUFBSSxLQUFKLENBQVUsS0FBeEIsQ0FBUDtBQUNEOztBQTdENkI7a0JBQVgsVSIsImZpbGUiOiJiaW5kaW5nLW1hcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IE1heWJlIH0gZnJvbSAncmFtZGEtZmFudGFzeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJpbmRpbmdNYXAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvLyBnaXZlbiBhIHN5bnRheCBvYmplY3QgYW5kIGEgYmluZGluZyxcbiAgLy8gYWRkIHRoZSBiaW5kaW5nIHRvIHRoZSBtYXAgYXNzb2NpYXRpbmcgdGhlIGJpbmRpbmcgd2l0aCB0aGUgc3ludGF4IG9iamVjdCdzXG4gIC8vIHNjb3BlIHNldFxuICBhZGQoc3R4LCB7IGJpbmRpbmcsIHBoYXNlLCBza2lwRHVwID0gZmFsc2UgfSkge1xuICAgIGxldCBzdHhOYW1lID0gc3R4LnZhbCgpO1xuICAgIGxldCBhbGxTY29wZXNldCA9IHN0eC5zY29wZXNldHMuYWxsO1xuICAgIGxldCBzY29wZXNldCA9IHN0eC5zY29wZXNldHMucGhhc2UuaGFzKHBoYXNlKSA/IHN0eC5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlKSA6IExpc3QoKTtcbiAgICBzY29wZXNldCA9IGFsbFNjb3Blc2V0LmNvbmNhdChzY29wZXNldCk7XG4gICAgYXNzZXJ0KHBoYXNlICE9IG51bGwsIFwibXVzdCBwcm92aWRlIGEgcGhhc2UgZm9yIGJpbmRpbmcgYWRkXCIpO1xuXG4gICAgaWYgKHRoaXMuX21hcC5oYXMoc3R4TmFtZSkpIHtcbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gdGhpcy5fbWFwLmdldChzdHhOYW1lKTtcbiAgICAgIGlmIChza2lwRHVwICYmIHNjb3Blc2V0QmluZGluZ0xpc3Quc29tZShzID0+IHMuc2NvcGVzLmVxdWFscyhzY29wZXNldCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZSwgc2NvcGVzZXRCaW5kaW5nTGlzdC5wdXNoKHtcbiAgICAgICAgc2NvcGVzOiBzY29wZXNldCxcbiAgICAgICAgYmluZGluZzogYmluZGluZyxcbiAgICAgICAgYWxpYXM6IE1heWJlLk5vdGhpbmcoKVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXAuc2V0KHN0eE5hbWUsIExpc3Qub2Yoe1xuICAgICAgICBzY29wZXM6IHNjb3Blc2V0LFxuICAgICAgICBiaW5kaW5nOiBiaW5kaW5nLFxuICAgICAgICBhbGlhczogTWF5YmUuTm90aGluZygpXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgYWRkRm9yd2FyZChzdHgsIGZvcndhcmRTdHgsIGJpbmRpbmcsIHBoYXNlKSB7XG4gICAgbGV0IHN0eE5hbWUgPSBzdHgudG9rZW4udmFsdWU7XG4gICAgbGV0IGFsbFNjb3Blc2V0ID0gc3R4LnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHNjb3Blc2V0ID0gc3R4LnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2UpID8gc3R4LnNjb3Blc2V0cy5waGFzZS5nZXQocGhhc2UpIDogTGlzdCgpO1xuICAgIHNjb3Blc2V0ID0gYWxsU2NvcGVzZXQuY29uY2F0KHNjb3Blc2V0KTtcbiAgICBhc3NlcnQocGhhc2UgIT0gbnVsbCwgXCJtdXN0IHByb3ZpZGUgYSBwaGFzZSBmb3IgYmluZGluZyBhZGRcIik7XG5cbiAgICBpZiAodGhpcy5fbWFwLmhhcyhzdHhOYW1lKSkge1xuICAgICAgbGV0IHNjb3Blc2V0QmluZGluZ0xpc3QgPSB0aGlzLl9tYXAuZ2V0KHN0eE5hbWUpO1xuICAgICAgdGhpcy5fbWFwLnNldChzdHhOYW1lLCBzY29wZXNldEJpbmRpbmdMaXN0LnB1c2goe1xuICAgICAgICBzY29wZXM6IHNjb3Blc2V0LFxuICAgICAgICBiaW5kaW5nOiBiaW5kaW5nLFxuICAgICAgICBhbGlhczogTWF5YmUub2YoZm9yd2FyZFN0eClcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWFwLnNldChzdHhOYW1lLCBMaXN0Lm9mKHtcbiAgICAgICAgc2NvcGVzOiBzY29wZXNldCxcbiAgICAgICAgYmluZGluZzogYmluZGluZyxcbiAgICAgICAgYWxpYXM6IE1heWJlLm9mKGZvcndhcmRTdHgpXG4gICAgICB9KSk7XG4gICAgfVxuXG4gIH1cblxuICAvLyBTeW50YXggLT4gP0xpc3Q8eyBzY29wZXM6IFNjb3BlU2V0LCBiaW5kaW5nOiBCaW5kaW5nIH0+XG4gIGdldChzdHgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwLmdldChzdHgudG9rZW4udmFsdWUpO1xuICB9XG5cbn1cbiJdfQ== + +/***/ }, +/* 23 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.expect = expect; + exports.assert = assert; + function expect(cond, message, offendingSyntax, rest) { + if (!cond) { + let ctx = ""; + if (rest) { + ctx = rest.slice(0, 20).map(s => { + let val = s.isDelimiter() ? "( ... )" : s.val(); + if (s === offendingSyntax) { + return "__" + val + "__"; + } + return val; + }).join(" "); + } + throw new Error("[error]: " + message + "\n" + ctx); + } + } + + function assert(cond, message) { + if (!cond) { + throw new Error("[assertion error]: " + message); + } + } + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFBZ0IsTSxHQUFBLE07UUFnQkEsTSxHQUFBLE07QUFoQlQsU0FBUyxNQUFULENBQWdCLElBQWhCLEVBQXNCLE9BQXRCLEVBQStCLGVBQS9CLEVBQWdELElBQWhELEVBQXNEO0FBQzNELE1BQUksQ0FBQyxJQUFMLEVBQVc7QUFDVCxRQUFJLE1BQU0sRUFBVjtBQUNBLFFBQUksSUFBSixFQUFVO0FBQ1IsWUFBTSxLQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsRUFBZCxFQUFrQixHQUFsQixDQUFzQixLQUFLO0FBQy9CLFlBQUksTUFBTSxFQUFFLFdBQUYsS0FBa0IsU0FBbEIsR0FBOEIsRUFBRSxHQUFGLEVBQXhDO0FBQ0EsWUFBSSxNQUFNLGVBQVYsRUFBMkI7QUFDekIsaUJBQU8sT0FBTyxHQUFQLEdBQWEsSUFBcEI7QUFDRDtBQUNELGVBQU8sR0FBUDtBQUNELE9BTkssRUFNSCxJQU5HLENBTUUsR0FORixDQUFOO0FBT0Q7QUFDRCxVQUFNLElBQUksS0FBSixDQUFVLGNBQWMsT0FBZCxHQUF3QixJQUF4QixHQUErQixHQUF6QyxDQUFOO0FBQ0Q7QUFDRjs7QUFFTSxTQUFTLE1BQVQsQ0FBZ0IsSUFBaEIsRUFBc0IsT0FBdEIsRUFBK0I7QUFDcEMsTUFBSSxDQUFDLElBQUwsRUFBVztBQUNULFVBQU0sSUFBSSxLQUFKLENBQVUsd0JBQXdCLE9BQWxDLENBQU47QUFDRDtBQUNGIiwiZmlsZSI6ImVycm9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBleHBlY3QoY29uZCwgbWVzc2FnZSwgb2ZmZW5kaW5nU3ludGF4LCByZXN0KSB7XG4gIGlmICghY29uZCkge1xuICAgIGxldCBjdHggPSBcIlwiO1xuICAgIGlmIChyZXN0KSB7XG4gICAgICBjdHggPSByZXN0LnNsaWNlKDAsIDIwKS5tYXAocyA9PiB7XG4gICAgICAgIGxldCB2YWwgPSBzLmlzRGVsaW1pdGVyKCkgPyBcIiggLi4uIClcIiA6IHMudmFsKCk7XG4gICAgICAgIGlmIChzID09PSBvZmZlbmRpbmdTeW50YXgpIHtcbiAgICAgICAgICByZXR1cm4gXCJfX1wiICsgdmFsICsgXCJfX1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9KS5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW2Vycm9yXTogXCIgKyBtZXNzYWdlICsgXCJcXG5cIiArIGN0eCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kLCBtZXNzYWdlKSB7XG4gIGlmICghY29uZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlthc3NlcnRpb24gZXJyb3JdOiBcIiArIG1lc3NhZ2UpO1xuICB9XG59XG4iXX0= + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = { + Either: __webpack_require__(25), + Future: __webpack_require__(28), + Identity: __webpack_require__(29), + IO: __webpack_require__(30), + lift2: __webpack_require__(31), + lift3: __webpack_require__(32), + Maybe: __webpack_require__(33), + Tuple: __webpack_require__(34), + Reader: __webpack_require__(35) + }; + + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + var R = __webpack_require__(26); + + var util = __webpack_require__(27); + + + function Either(left, right) { + switch (arguments.length) { + case 0: + throw new TypeError('no arguments to Either'); + case 1: + return function(right) { + return right == null ? Either.Left(left) : Either.Right(right); + }; + default: + return right == null ? Either.Left(left) : Either.Right(right); + } + } + + Either.prototype.map = util.returnThis; + + Either.of = Either.prototype.of = function(value) { + return Either.Right(value); + }; + + Either.prototype.chain = util.returnThis; // throw? + + Either.equals = Either.prototype.equals = util.getEquals(Either); + + + // Right + function _Right(x) { + this.value = x; + } + util.extend(_Right, Either); + + _Right.prototype.map = function(fn) { + return new _Right(fn(this.value)); + }; + + _Right.prototype.ap = function(that) { + return that.map(this.value); + }; + + _Right.prototype.chain = function(f) { + return f(this.value); + }; + + _Right.prototype.bimap = function(_, f) { + return new _Right(f(this.value)); + }; + + _Right.prototype.extend = function(f) { + return new _Right(f(this)); + }; + + _Right.prototype.toString = function() { + return 'Either.Right(' + R.toString(this.value) + ')'; + }; + + Either.Right = function(value) { + return new _Right(value); + }; + + + // Left + function _Left(x) { + this.value = x; + } + util.extend(_Left, Either); + + _Left.prototype.ap = function(that) { return that; }; + + _Left.prototype.bimap = function(f) { + return new _Left(f(this.value)); + }; + + _Left.prototype.extend = util.returnThis; + + _Left.prototype.toString = function() { + return 'Either.Left(' + R.toString(this.value) + ')'; + }; + + Either.Left = function(value) { + return new _Left(value); + }; + + + module.exports = Either; + + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + // Ramda v0.17.1 + // https://github.com/ramda/ramda + // (c) 2013-2015 Scott Sauyet, Michael Hurley, and David Chambers + // Ramda may be freely distributed under the MIT license. + + ;(function() { + + 'use strict'; + + /** + * A special placeholder value used to specify "gaps" within curried functions, + * allowing partial application of any combination of arguments, + * regardless of their positions. * - * Dispatches to the `dropRepeats` method of the first argument, if present. + * If `g` is a curried ternary function and `_` is `R.__`, the following are equivalent: * - * Acts as a transducer if a transformer is given in list position. + * - `g(1, 2, 3)` + * - `g(_, 2, 3)(1)` + * - `g(_, _, 3)(1)(2)` + * - `g(_, _, 3)(1, 2)` + * - `g(_, 2, _)(1, 3)` + * - `g(_, 2)(1)(3)` + * - `g(_, 2)(1, 3)` + * - `g(_, 2)(_, 3)(1)` * - * @func + * @constant * @memberOf R - * @since v0.14.0 - * @category List - * @sig [a] -> [a] - * @param {Array} list The array to consider. - * @return {Array} `list` without repeating elements. - * @see R.transduce + * @category Function * @example * - * R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2] + * var greet = R.replace('{name}', R.__, 'Hello, {name}!'); + * greet('Alice'); //=> 'Hello, Alice!' */ - var dropRepeats = _curry1(_dispatchable('dropRepeats', _xdropRepeatsWith(equals), dropRepeatsWith(equals))); + var __ = { '@@functional/placeholder': true }; + + // jshint unused:vars + var _arity = function _arity(n, fn) { + // jshint unused:vars + switch (n) { + case 0: + return function () { + return fn.apply(this, arguments); + }; + case 1: + return function (a0) { + return fn.apply(this, arguments); + }; + case 2: + return function (a0, a1) { + return fn.apply(this, arguments); + }; + case 3: + return function (a0, a1, a2) { + return fn.apply(this, arguments); + }; + case 4: + return function (a0, a1, a2, a3) { + return fn.apply(this, arguments); + }; + case 5: + return function (a0, a1, a2, a3, a4) { + return fn.apply(this, arguments); + }; + case 6: + return function (a0, a1, a2, a3, a4, a5) { + return fn.apply(this, arguments); + }; + case 7: + return function (a0, a1, a2, a3, a4, a5, a6) { + return fn.apply(this, arguments); + }; + case 8: + return function (a0, a1, a2, a3, a4, a5, a6, a7) { + return fn.apply(this, arguments); + }; + case 9: + return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) { + return fn.apply(this, arguments); + }; + case 10: + return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + return fn.apply(this, arguments); + }; + default: + throw new Error('First argument to _arity must be a non-negative integer no greater than ten'); + } + }; + + var _cloneRegExp = function _cloneRegExp(pattern) { + return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : '')); + }; + + var _complement = function _complement(f) { + return function () { + return !f.apply(this, arguments); + }; + }; /** - * Transforms the items of the list with the transducer and appends the - * transformed items to the accumulator using an appropriate iterator function - * based on the accumulator type. - * - * The accumulator can be an array, string, object or a transformer. Iterated - * items will be appended to arrays and concatenated to strings. Objects will - * be merged directly or 2-item arrays will be merged as key, value pairs. - * - * The accumulator can also be a transformer object that provides a 2-arity - * reducing iterator function, step, 0-arity initial value function, init, and - * 1-arity result extraction function result. The step function is used as the - * iterator function in reduce. The result function is used to convert the - * final accumulator into the return type and in most cases is R.identity. The - * init function is used to provide the initial accumulator. - * - * The iteration is performed with R.reduce after initializing the transducer. + * Private `concat` function to merge two array-like objects. * - * @func - * @memberOf R - * @since v0.12.0 - * @category List - * @sig a -> (b -> b) -> [c] -> a - * @param {*} acc The initial accumulator value. - * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. - * @param {Array} list The list to iterate over. - * @return {*} The final, accumulated value. + * @private + * @param {Array|Arguments} [set1=[]] An array-like object. + * @param {Array|Arguments} [set2=[]] An array-like object. + * @return {Array} A new, merged array. * @example * - * var numbers = [1, 2, 3, 4]; - * var transducer = R.compose(R.map(R.add(1)), R.take(2)); - * - * R.into([], transducer, numbers); //=> [2, 3] - * - * var intoArray = R.into([]); - * intoArray(transducer, numbers); //=> [2, 3] + * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] */ - var into = _curry3(function into(acc, xf, list) { - return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), acc, list); - }); + var _concat = function _concat(set1, set2) { + set1 = set1 || []; + set2 = set2 || []; + var idx; + var len1 = set1.length; + var len2 = set2.length; + var result = []; + idx = 0; + while (idx < len1) { + result[result.length] = set1[idx]; + idx += 1; + } + idx = 0; + while (idx < len2) { + result[result.length] = set2[idx]; + idx += 1; + } + return result; + }; + + var _containsWith = function _containsWith(pred, x, list) { + var idx = 0, len = list.length; + while (idx < len) { + if (pred(x, list[idx])) { + return true; + } + idx += 1; + } + return false; + }; /** - * "lifts" a function of arity > 1 so that it may "map over" an Array or other - * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply). + * Optimized internal two-arity curry function. * - * @func - * @memberOf R - * @since v0.7.0 + * @private * @category Function - * @sig (*... -> *) -> ([*]... -> [*]) - * @param {Function} fn The function to lift into higher context - * @return {Function} The lifted function. - * @see R.liftN - * @example - * - * var madd3 = R.lift(R.curry((a, b, c) => a + b + c)); - * - * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7] - * - * var madd5 = R.lift(R.curry((a, b, c, d, e) => a + b + c + d + e)); - * - * madd5([1,2], [3], [4, 5], [6], [7, 8]); //=> [21, 22, 22, 23, 22, 23, 23, 24] + * @param {Function} fn The function to curry. + * @return {Function} The curried function. */ - var lift = _curry1(function lift(fn) { - return liftN(fn.length, fn); - }); + var _curry1 = function _curry1(fn) { + return function f1(a) { + if (arguments.length === 0) { + return f1; + } else if (a != null && a['@@functional/placeholder'] === true) { + return f1; + } else { + return fn.apply(this, arguments); + } + }; + }; /** - * Returns a partial copy of an object omitting the keys specified. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Object - * @sig [String] -> {String: *} -> {String: *} - * @param {Array} names an array of String property names to omit from the new object - * @param {Object} obj The object to copy from - * @return {Object} A new object with properties from `names` not on it. - * @see R.pick - * @example + * Optimized internal two-arity curry function. * - * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3} + * @private + * @category Function + * @param {Function} fn The function to curry. + * @return {Function} The curried function. */ - var omit = _curry2(function omit(names, obj) { - var result = {}; - for (var prop in obj) { - if (!_contains(prop, names)) { - result[prop] = obj[prop]; + var _curry2 = function _curry2(fn) { + return function f2(a, b) { + var n = arguments.length; + if (n === 0) { + return f2; + } else if (n === 1 && a != null && a['@@functional/placeholder'] === true) { + return f2; + } else if (n === 1) { + return _curry1(function (b) { + return fn(a, b); + }); + } else if (n === 2 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true) { + return f2; + } else if (n === 2 && a != null && a['@@functional/placeholder'] === true) { + return _curry1(function (a) { + return fn(a, b); + }); + } else if (n === 2 && b != null && b['@@functional/placeholder'] === true) { + return _curry1(function (b) { + return fn(a, b); + }); + } else { + return fn(a, b); } - } - return result; - }); + }; + }; /** - * Returns the left-to-right Kleisli composition of the provided functions, - * each of which must return a value of a type supported by [`chain`](#chain). - * - * `R.pipeK(f, g, h)` is equivalent to `R.pipe(R.chain(f), R.chain(g), R.chain(h))`. + * Optimized internal three-arity curry function. * - * @func - * @memberOf R - * @since v0.16.0 + * @private * @category Function - * @sig Chain m => ((a -> m b), (b -> m c), ..., (y -> m z)) -> (m a -> m z) - * @param {...Function} - * @return {Function} - * @see R.composeK - * @example - * - * // parseJson :: String -> Maybe * - * // get :: String -> Object -> Maybe * - * - * // getStateCode :: Maybe String -> Maybe String - * var getStateCode = R.pipeK( - * parseJson, - * get('user'), - * get('address'), - * get('state'), - * R.compose(Maybe.of, R.toUpper) - * ); - * - * getStateCode(Maybe.of('{"user":{"address":{"state":"ny"}}}')); - * //=> Just('NY') - * getStateCode(Maybe.of('[Invalid JSON]')); - * //=> Nothing() + * @param {Function} fn The function to curry. + * @return {Function} The curried function. */ - var pipeK = function pipeK() { - return composeK.apply(this, reverse(arguments)); + var _curry3 = function _curry3(fn) { + return function f3(a, b, c) { + var n = arguments.length; + if (n === 0) { + return f3; + } else if (n === 1 && a != null && a['@@functional/placeholder'] === true) { + return f3; + } else if (n === 1) { + return _curry2(function (b, c) { + return fn(a, b, c); + }); + } else if (n === 2 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true) { + return f3; + } else if (n === 2 && a != null && a['@@functional/placeholder'] === true) { + return _curry2(function (a, c) { + return fn(a, b, c); + }); + } else if (n === 2 && b != null && b['@@functional/placeholder'] === true) { + return _curry2(function (b, c) { + return fn(a, b, c); + }); + } else if (n === 2) { + return _curry1(function (c) { + return fn(a, b, c); + }); + } else if (n === 3 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true && c != null && c['@@functional/placeholder'] === true) { + return f3; + } else if (n === 3 && a != null && a['@@functional/placeholder'] === true && b != null && b['@@functional/placeholder'] === true) { + return _curry2(function (a, b) { + return fn(a, b, c); + }); + } else if (n === 3 && a != null && a['@@functional/placeholder'] === true && c != null && c['@@functional/placeholder'] === true) { + return _curry2(function (a, c) { + return fn(a, b, c); + }); + } else if (n === 3 && b != null && b['@@functional/placeholder'] === true && c != null && c['@@functional/placeholder'] === true) { + return _curry2(function (b, c) { + return fn(a, b, c); + }); + } else if (n === 3 && a != null && a['@@functional/placeholder'] === true) { + return _curry1(function (a) { + return fn(a, b, c); + }); + } else if (n === 3 && b != null && b['@@functional/placeholder'] === true) { + return _curry1(function (b) { + return fn(a, b, c); + }); + } else if (n === 3 && c != null && c['@@functional/placeholder'] === true) { + return _curry1(function (c) { + return fn(a, b, c); + }); + } else { + return fn(a, b, c); + } + }; }; /** - * Returns the string representation of the given value. `eval`'ing the output - * should result in a value equivalent to the input value. Many of the built-in - * `toString` methods do not satisfy this requirement. - * - * If the given value is an `[object Object]` with a `toString` method other - * than `Object.prototype.toString`, this method is invoked with no arguments - * to produce the return value. This means user-defined constructor functions - * can provide a suitable `toString` method. For example: - * - * function Point(x, y) { - * this.x = x; - * this.y = y; - * } - * - * Point.prototype.toString = function() { - * return 'new Point(' + this.x + ', ' + this.y + ')'; - * }; - * - * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)' - * - * @func - * @memberOf R - * @since v0.14.0 - * @category String - * @sig * -> String - * @param {*} val - * @return {String} - * @example - * - * R.toString(42); //=> '42' - * R.toString('abc'); //=> '"abc"' - * R.toString([1, 2, 3]); //=> '[1, 2, 3]' - * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}' - * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")' - */ - var toString = _curry1(function toString(val) { - return _toString(val, []); - }); - - /** - * Returns a new list containing only one copy of each element in the original - * list, based upon the value returned by applying the supplied function to - * each list element. Prefers the first item if the supplied function produces - * the same value on two items. `R.equals` is used for comparison. - * - * @func - * @memberOf R - * @since v0.16.0 - * @category List - * @sig (a -> b) -> [a] -> [a] - * @param {Function} fn A function used to produce a value to use during comparisons. - * @param {Array} list The array to consider. - * @return {Array} The list of unique items. - * @example + * Internal curryN function. * - * R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10] + * @private + * @category Function + * @param {Number} length The arity of the curried function. + * @return {array} An array of arguments received thus far. + * @param {Function} fn The function to curry. */ - /* globals Set */ - // distinguishing between +0 and -0 is not supported by Set - /* falls through */ - // these types can all utilise Set - // prevent scan for null by tracking as a boolean - /* falls through */ - // scan through all previously applied items - var uniqBy = _curry2(/* globals Set */ - typeof Set === 'undefined' ? function uniqBy(fn, list) { - var idx = 0; - var applied = []; - var result = []; - var appliedItem, item; - while (idx < list.length) { - item = list[idx]; - appliedItem = fn(item); - if (!_contains(appliedItem, applied)) { - result.push(item); - applied.push(appliedItem); - } - idx += 1; - } - return result; - } : function uniqBySet(fn, list) { - var set = new Set(); - var applied = []; - var prevSetSize = 0; - var result = []; - var nullExists = false; - var negZeroExists = false; - var idx = 0; - var appliedItem, item, newSetSize; - while (idx < list.length) { - item = list[idx]; - appliedItem = fn(item); - switch (typeof appliedItem) { - case 'number': - // distinguishing between +0 and -0 is not supported by Set - if (appliedItem === 0 && !negZeroExists && 1 / appliedItem === -Infinity) { - negZeroExists = true; - result.push(item); - break; - } - /* falls through */ - case 'string': - case 'boolean': - case 'function': - case 'undefined': - // these types can all utilise Set - set.add(appliedItem); - newSetSize = set.size; - if (newSetSize > prevSetSize) { - result.push(item); - prevSetSize = newSetSize; - } - break; - case 'object': - if (appliedItem === null) { - if (!nullExists) { - // prevent scan for null by tracking as a boolean - nullExists = true; - result.push(null); - } - break; + var _curryN = function _curryN(length, received, fn) { + return function () { + var combined = []; + var argsIdx = 0; + var left = length; + var combinedIdx = 0; + while (combinedIdx < received.length || argsIdx < arguments.length) { + var result; + if (combinedIdx < received.length && (received[combinedIdx] == null || received[combinedIdx]['@@functional/placeholder'] !== true || argsIdx >= arguments.length)) { + result = received[combinedIdx]; + } else { + result = arguments[argsIdx]; + argsIdx += 1; } - /* falls through */ - default: - // scan through all previously applied items - if (!_contains(appliedItem, applied)) { - applied.push(appliedItem); - result.push(item); + combined[combinedIdx] = result; + if (result == null || result['@@functional/placeholder'] !== true) { + left -= 1; } + combinedIdx += 1; + } + return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn)); + }; + }; + + var _filter = function _filter(fn, list) { + var idx = 0, len = list.length, result = []; + while (idx < len) { + if (fn(list[idx])) { + result[result.length] = list[idx]; } idx += 1; } return result; - }); + }; - /** - * Returns a new list without values in the first argument. - * `R.equals` is used to determine equality. - * - * Acts as a transducer if a transformer is given in list position. - * - * @func - * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category List - * @sig [a] -> [a] -> [a] - * @param {Array} list1 The values to be removed from `list2`. - * @param {Array} list2 The array to remove values from. - * @return {Array} The new array without values in `list1`. - * @see R.transduce - * @example - * - * R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4] - */ - var without = _curry2(function (xs, list) { - return reject(flip(_contains)(xs), list); - }); + var _forceReduced = function _forceReduced(x) { + return { + '@@transducer/value': x, + '@@transducer/reduced': true + }; + }; /** - * Takes a function `f` and returns a function `g` such that: - * - * - applying `g` to zero or more arguments will give __true__ if applying - * the same arguments to `f` gives a logical __false__ value; and - * - * - applying `g` to zero or more arguments will give __false__ if applying - * the same arguments to `f` gives a logical __true__ value. - * - * `R.complement` will work on all other functors as well. - * - * @func - * @memberOf R - * @since v0.12.0 - * @category Logic - * @sig (*... -> *) -> (*... -> Boolean) - * @param {Function} f - * @return {Function} - * @see R.not - * @example - * - * var isEven = n => n % 2 === 0; - * var isOdd = R.complement(isEven); - * isOdd(21); //=> true - * isOdd(42); //=> false + * @private + * @param {Function} fn The strategy for extracting function names from an object + * @return {Function} A function that takes an object and returns an array of function names. */ - var complement = lift(not); + var _functionsWith = function _functionsWith(fn) { + return function (obj) { + return _filter(function (key) { + return typeof obj[key] === 'function'; + }, fn(obj)); + }; + }; - /** - * Turns a named method with a specified arity into a function that can be - * called directly supplied with arguments and a target object. - * - * The returned function is curried and accepts `arity + 1` parameters where - * the final parameter is the target object. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *) - * @param {Number} arity Number of arguments the returned function should take - * before the target object. - * @param {String} method Name of the method to call. - * @return {Function} A new curried function. - * @example - * - * var sliceFrom = R.invoker(1, 'slice'); - * sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm' - * var sliceFrom6 = R.invoker(2, 'slice')(6); - * sliceFrom6(8, 'abcdefghijklm'); //=> 'gh' - */ - var invoker = _curry2(function invoker(arity, method) { - return curryN(arity + 1, function () { - var target = arguments[arity]; - if (target != null && is(Function, target[method])) { - return target[method].apply(target, _slice(arguments, 0, arity)); - } - throw new TypeError(toString(target) + ' does not have a method named "' + method + '"'); - }); - }); + var _has = function _has(prop, obj) { + return Object.prototype.hasOwnProperty.call(obj, prop); + }; - /** - * Returns a string made by inserting the `separator` between each element and - * concatenating all the elements into a single string. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category List - * @sig String -> [a] -> String - * @param {Number|String} separator The string used to separate the elements. - * @param {Array} xs The elements to join into a string. - * @return {String} str The string made by concatenating `xs` with `separator`. - * @see R.split - * @example - * - * var spacer = R.join(' '); - * spacer(['a', 2, 3.4]); //=> 'a 2 3.4' - * R.join('|', [1, 2, 3]); //=> '1|2|3' - */ - var join = invoker(1, 'join'); + var _identity = function _identity(x) { + return x; + }; /** - * Creates a new function that, when invoked, caches the result of calling `fn` - * for a given argument set and returns the result. Subsequent calls to the - * memoized `fn` with the same argument set will not result in an additional - * call to `fn`; instead, the cached result for that set of arguments will be - * returned. + * Tests whether or not an object is an array. * - * @func - * @memberOf R - * @since v0.1.0 - * @category Function - * @sig (*... -> a) -> (*... -> a) - * @param {Function} fn The function to memoize. - * @return {Function} Memoized version of `fn`. + * @private + * @param {*} val The object to test. + * @return {Boolean} `true` if `val` is an array, `false` otherwise. * @example * - * var count = 0; - * var factorial = R.memoize(n => { - * count += 1; - * return R.product(R.range(1, n + 1)); - * }); - * factorial(5); //=> 120 - * factorial(5); //=> 120 - * factorial(5); //=> 120 - * count; //=> 1 + * _isArray([]); //=> true + * _isArray(null); //=> false + * _isArray({}); //=> false */ - var memoize = _curry1(function memoize(fn) { - var cache = {}; - return _arity(fn.length, function () { - var key = toString(arguments); - if (!_has(key, cache)) { - cache[key] = fn.apply(this, arguments); - } - return cache[key]; - }); - }); + var _isArray = Array.isArray || function _isArray(val) { + return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]'; + }; /** - * Splits a string into an array of strings based on the given - * separator. - * - * @func - * @memberOf R - * @since v0.1.0 - * @category String - * @sig (String | RegExp) -> String -> [String] - * @param {String|RegExp} sep The pattern. - * @param {String} str The string to separate into an array. - * @return {Array} The array of strings from `str` separated by `str`. - * @see R.join - * @example - * - * var pathComponents = R.split('/'); - * R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node'] + * Determine if the passed argument is an integer. * - * R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd'] + * @private + * @param {*} n + * @category Type + * @return {Boolean} */ - var split = invoker(1, 'split'); + var _isInteger = Number.isInteger || function _isInteger(n) { + return n << 0 === n; + }; + + var _isNumber = function _isNumber(x) { + return Object.prototype.toString.call(x) === '[object Number]'; + }; + + var _isString = function _isString(x) { + return Object.prototype.toString.call(x) === '[object String]'; + }; + + var _isTransformer = function _isTransformer(obj) { + return typeof obj['@@transducer/step'] === 'function'; + }; + + var _map = function _map(fn, list) { + var idx = 0, len = list.length, result = Array(len); + while (idx < len) { + result[idx] = fn(list[idx]); + idx += 1; + } + return result; + }; + + var _pipe = function _pipe(f, g) { + return function () { + return g.call(this, f.apply(this, arguments)); + }; + }; + + var _pipeP = function _pipeP(f, g) { + return function () { + var ctx = this; + return f.apply(ctx, arguments).then(function (x) { + return g.call(ctx, x); + }); + }; + }; + + var _quote = function _quote(s) { + return '"' + s.replace(/"/g, '\\"') + '"'; + }; + + var _reduced = function _reduced(x) { + return x && x['@@transducer/reduced'] ? x : { + '@@transducer/value': x, + '@@transducer/reduced': true + }; + }; /** - * Determines whether a given string matches a given regular expression. + * An optimized, private array `slice` implementation. * - * @func - * @memberOf R - * @since v0.12.0 - * @category String - * @sig RegExp -> String -> Boolean - * @param {RegExp} pattern - * @param {String} str - * @return {Boolean} - * @see R.match + * @private + * @param {Arguments|Array} args The array or arguments object to consider. + * @param {Number} [from=0] The array index to slice from, inclusive. + * @param {Number} [to=args.length] The array index to slice to, exclusive. + * @return {Array} A new, sliced array. * @example * - * R.test(/^x/, 'xyz'); //=> true - * R.test(/^y/, 'xyz'); //=> false + * _slice([1, 2, 3, 4, 5], 1, 3); //=> [2, 3] + * + * var firstThreeArgs = function(a, b, c, d) { + * return _slice(arguments, 0, 3); + * }; + * firstThreeArgs(1, 2, 3, 4); //=> [1, 2, 3] */ - var test = _curry2(function test(pattern, str) { - if (!_isRegExp(pattern)) { - throw new TypeError('\u2018test\u2019 requires a value of type RegExp as its first argument; received ' + toString(pattern)); + var _slice = function _slice(args, from, to) { + switch (arguments.length) { + case 1: + return _slice(args, 0, args.length); + case 2: + return _slice(args, from, args.length); + default: + var list = []; + var idx = 0; + var len = Math.max(0, Math.min(args.length, to) - from); + while (idx < len) { + list[idx] = args[from + idx]; + idx += 1; + } + return list; } - return _cloneRegExp(pattern).test(str); - }); + }; /** - * The lower case version of a string. - * + * Polyfill from . + */ + var _toISOString = function () { + var pad = function pad(n) { + return (n < 10 ? '0' : '') + n; + }; + return typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) { + return d.toISOString(); + } : function _toISOString(d) { + return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'; + }; + }(); + + var _xdropRepeatsWith = function () { + function XDropRepeatsWith(pred, xf) { + this.xf = xf; + this.pred = pred; + this.lastValue = undefined; + this.seenFirstValue = false; + } + XDropRepeatsWith.prototype['@@transducer/init'] = function () { + return this.xf['@@transducer/init'](); + }; + XDropRepeatsWith.prototype['@@transducer/result'] = function (result) { + return this.xf['@@transducer/result'](result); + }; + XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) { + var sameAsLast = false; + if (!this.seenFirstValue) { + this.seenFirstValue = true; + } else if (this.pred(this.lastValue, input)) { + sameAsLast = true; + } + this.lastValue = input; + return sameAsLast ? result : this.xf['@@transducer/step'](result, input); + }; + return _curry2(function _xdropRepeatsWith(pred, xf) { + return new XDropRepeatsWith(pred, xf); + }); + }(); + + var _xfBase = { + init: function () { + return this.xf['@@transducer/init'](); + }, + result: function (result) { + return this.xf['@@transducer/result'](result); + } + }; + + var _xfilter = function () { + function XFilter(f, xf) { + this.xf = xf; + this.f = f; + } + XFilter.prototype['@@transducer/init'] = _xfBase.init; + XFilter.prototype['@@transducer/result'] = _xfBase.result; + XFilter.prototype['@@transducer/step'] = function (result, input) { + return this.f(input) ? this.xf['@@transducer/step'](result, input) : result; + }; + return _curry2(function _xfilter(f, xf) { + return new XFilter(f, xf); + }); + }(); + + var _xfind = function () { + function XFind(f, xf) { + this.xf = xf; + this.f = f; + this.found = false; + } + XFind.prototype['@@transducer/init'] = _xfBase.init; + XFind.prototype['@@transducer/result'] = function (result) { + if (!this.found) { + result = this.xf['@@transducer/step'](result, void 0); + } + return this.xf['@@transducer/result'](result); + }; + XFind.prototype['@@transducer/step'] = function (result, input) { + if (this.f(input)) { + this.found = true; + result = _reduced(this.xf['@@transducer/step'](result, input)); + } + return result; + }; + return _curry2(function _xfind(f, xf) { + return new XFind(f, xf); + }); + }(); + + var _xfindIndex = function () { + function XFindIndex(f, xf) { + this.xf = xf; + this.f = f; + this.idx = -1; + this.found = false; + } + XFindIndex.prototype['@@transducer/init'] = _xfBase.init; + XFindIndex.prototype['@@transducer/result'] = function (result) { + if (!this.found) { + result = this.xf['@@transducer/step'](result, -1); + } + return this.xf['@@transducer/result'](result); + }; + XFindIndex.prototype['@@transducer/step'] = function (result, input) { + this.idx += 1; + if (this.f(input)) { + this.found = true; + result = _reduced(this.xf['@@transducer/step'](result, this.idx)); + } + return result; + }; + return _curry2(function _xfindIndex(f, xf) { + return new XFindIndex(f, xf); + }); + }(); + + var _xfindLast = function () { + function XFindLast(f, xf) { + this.xf = xf; + this.f = f; + } + XFindLast.prototype['@@transducer/init'] = _xfBase.init; + XFindLast.prototype['@@transducer/result'] = function (result) { + return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last)); + }; + XFindLast.prototype['@@transducer/step'] = function (result, input) { + if (this.f(input)) { + this.last = input; + } + return result; + }; + return _curry2(function _xfindLast(f, xf) { + return new XFindLast(f, xf); + }); + }(); + + var _xfindLastIndex = function () { + function XFindLastIndex(f, xf) { + this.xf = xf; + this.f = f; + this.idx = -1; + this.lastIdx = -1; + } + XFindLastIndex.prototype['@@transducer/init'] = _xfBase.init; + XFindLastIndex.prototype['@@transducer/result'] = function (result) { + return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx)); + }; + XFindLastIndex.prototype['@@transducer/step'] = function (result, input) { + this.idx += 1; + if (this.f(input)) { + this.lastIdx = this.idx; + } + return result; + }; + return _curry2(function _xfindLastIndex(f, xf) { + return new XFindLastIndex(f, xf); + }); + }(); + + var _xmap = function () { + function XMap(f, xf) { + this.xf = xf; + this.f = f; + } + XMap.prototype['@@transducer/init'] = _xfBase.init; + XMap.prototype['@@transducer/result'] = _xfBase.result; + XMap.prototype['@@transducer/step'] = function (result, input) { + return this.xf['@@transducer/step'](result, this.f(input)); + }; + return _curry2(function _xmap(f, xf) { + return new XMap(f, xf); + }); + }(); + + var _xtake = function () { + function XTake(n, xf) { + this.xf = xf; + this.n = n; + } + XTake.prototype['@@transducer/init'] = _xfBase.init; + XTake.prototype['@@transducer/result'] = _xfBase.result; + XTake.prototype['@@transducer/step'] = function (result, input) { + if (this.n === 0) { + return _reduced(result); + } else { + this.n -= 1; + return this.xf['@@transducer/step'](result, input); + } + }; + return _curry2(function _xtake(n, xf) { + return new XTake(n, xf); + }); + }(); + + var _xtakeWhile = function () { + function XTakeWhile(f, xf) { + this.xf = xf; + this.f = f; + } + XTakeWhile.prototype['@@transducer/init'] = _xfBase.init; + XTakeWhile.prototype['@@transducer/result'] = _xfBase.result; + XTakeWhile.prototype['@@transducer/step'] = function (result, input) { + return this.f(input) ? this.xf['@@transducer/step'](result, input) : _reduced(result); + }; + return _curry2(function _xtakeWhile(f, xf) { + return new XTakeWhile(f, xf); + }); + }(); + + var _xwrap = function () { + function XWrap(fn) { + this.f = fn; + } + XWrap.prototype['@@transducer/init'] = function () { + throw new Error('init not implemented on XWrap'); + }; + XWrap.prototype['@@transducer/result'] = function (acc) { + return acc; + }; + XWrap.prototype['@@transducer/step'] = function (acc, x) { + return this.f(acc, x); + }; + return function _xwrap(fn) { + return new XWrap(fn); + }; + }(); + + /** + * Adds two numbers. Equivalent to `a + b` but curried. + * * @func * @memberOf R - * @since v0.9.0 - * @category String - * @sig String -> String - * @param {String} str The string to lower case. - * @return {String} The lower case version of `str`. - * @see R.toUpper + * @category Math + * @sig Number -> Number -> Number + * @param {Number} a + * @param {Number} b + * @return {Number} + * @see R.subtract * @example * - * R.toLower('XYZ'); //=> 'xyz' + * R.add(2, 3); //=> 5 + * R.add(7)(10); //=> 17 */ - var toLower = invoker(0, 'toLowerCase'); + var add = _curry2(function add(a, b) { + return a + b; + }); /** - * The upper case version of a string. + * Applies a function to the value at the given index of an array, + * returning a new copy of the array with the element at the given + * index replaced with the result of the function application. + * @see R.update * * @func * @memberOf R - * @since v0.9.0 - * @category String - * @sig String -> String - * @param {String} str The string to upper case. - * @return {String} The upper case version of `str`. - * @see R.toLower + * @category List + * @sig (a -> a) -> Number -> [a] -> [a] + * @param {Function} fn The function to apply. + * @param {Number} idx The index. + * @param {Array|Arguments} list An array-like object whose value + * at the supplied index will be replaced. + * @return {Array} A copy of the supplied array-like object with + * the element at index `idx` replaced with the value + * returned by applying `fn` to the existing element. * @example * - * R.toUpper('abc'); //=> 'ABC' + * R.adjust(R.add(10), 1, [0, 1, 2]); //=> [0, 11, 2] + * R.adjust(R.add(10))(1)([0, 1, 2]); //=> [0, 11, 2] */ - var toUpper = invoker(0, 'toUpperCase'); + var adjust = _curry3(function adjust(fn, idx, list) { + if (idx >= list.length || idx < -list.length) { + return list; + } + var start = idx < 0 ? list.length : 0; + var _idx = start + idx; + var _list = _concat(list); + _list[_idx] = fn(list[_idx]); + return _list; + }); /** - * Returns a new list containing only one copy of each element in the original - * list. `R.equals` is used to determine equality. + * Returns a function that always returns the given value. Note that for + * non-primitives the value returned is a reference to the original value. + * + * This function is known as `const`, `constant`, or `K` (for K combinator) + * in other languages and libraries. * * @func * @memberOf R - * @since v0.1.0 - * @category List - * @sig [a] -> [a] - * @param {Array} list The array to consider. - * @return {Array} The list of unique items. + * @category Function + * @sig a -> (* -> a) + * @param {*} val The value to wrap in a function + * @return {Function} A Function :: * -> val. * @example * - * R.uniq([1, 1, 2, 1]); //=> [1, 2] - * R.uniq([1, '1']); //=> [1, '1'] - * R.uniq([[42], [42]]); //=> [[42]] + * var t = R.always('Tee'); + * t(); //=> 'Tee' */ - var uniq = uniqBy(identity); + var always = _curry1(function always(val) { + return function () { + return val; + }; + }); /** - * Returns the result of concatenating the given lists or strings. - * - * Dispatches to the `concat` method of the second argument, if present. + * Returns a new list, composed of n-tuples of consecutive elements + * If `n` is greater than the length of the list, an empty list is returned. * * @func * @memberOf R - * @since v0.1.0 * @category List - * @sig [a] -> [a] -> [a] - * @sig String -> String -> String - * @param {Array|String} a - * @param {Array|String} b - * @return {Array|String} - * + * @sig Number -> [a] -> [[a]] + * @param {Number} n The size of the tuples to create + * @param {Array} list The list to split into `n`-tuples + * @return {Array} The new list. * @example * - * R.concat([], []); //=> [] - * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] - * R.concat('ABC', 'DEF'); // 'ABCDEF' + * R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]] + * R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]] + * R.aperture(7, [1, 2, 3, 4, 5]); //=> [] */ - var concat = flip(invoker(1, 'concat')); + var aperture = _curry2(function aperture(n, list) { + var idx = 0; + var limit = list.length - (n - 1); + var acc = new Array(limit >= 0 ? limit : 0); + while (idx < limit) { + acc[idx] = _slice(list, idx, idx + n); + idx += 1; + } + return acc; + }); /** - * Combines two lists into a set (i.e. no duplicates) composed of those - * elements common to both lists. + * Returns a new list containing the contents of the given list, followed by the given + * element. * * @func * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The list of elements found in both `list1` and `list2`. - * @see R.intersectionWith + * @category List + * @sig a -> [a] -> [a] + * @param {*} el The element to add to the end of the new list. + * @param {Array} list The list whose contents will be added to the beginning of the output + * list. + * @return {Array} A new list containing the contents of the old list followed by `el`. + * @see R.prepend * @example * - * R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3] + * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests'] + * R.append('tests', []); //=> ['tests'] + * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']] */ - var intersection = _curry2(function intersection(list1, list2) { - return uniq(_filter(flip(_contains)(list1), list2)); + var append = _curry2(function append(el, list) { + return _concat(list, [el]); }); /** - * Finds the set (i.e. no duplicates) of all elements contained in the first or - * second list, but not both. + * Applies function `fn` to the argument list `args`. This is useful for + * creating a fixed-arity function from a variadic function. `fn` should + * be a bound function if context is significant. * * @func * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` or `list2`, but not both. - * @see R.symmetricDifferenceWith + * @category Function + * @sig (*... -> a) -> [*] -> a + * @param {Function} fn + * @param {Array} args + * @return {*} + * @see R.call, R.unapply * @example * - * R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5] - * R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2] + * var nums = [1, 2, 3, -99, 42, 6, 7]; + * R.apply(Math.max, nums); //=> 42 */ - var symmetricDifference = _curry2(function symmetricDifference(list1, list2) { - return concat(difference(list1, list2), difference(list2, list1)); + var apply = _curry2(function apply(fn, args) { + return fn.apply(this, args); }); /** - * Finds the set (i.e. no duplicates) of all elements contained in the first or - * second list, but not both. Duplication is determined according to the value - * returned by applying the supplied predicate to two list elements. + * Makes a shallow clone of an object, setting or overriding the specified + * property with the given value. Note that this copies and flattens + * prototype properties onto the new object as well. All non-primitive + * properties are copied by reference. * * @func * @memberOf R - * @since 0.19.1 - * @since 0.19.0 - * @category Relation - * @sig (a -> a -> Boolean) -> [a] -> [a] -> [a] - * @param {Function} pred A predicate used to test whether two items are equal. - * @param {Array} list1 The first list. - * @param {Array} list2 The second list. - * @return {Array} The elements in `list1` or `list2`, but not both. - * @see R.symmetricDifference + * @category Object + * @sig String -> a -> {k: v} -> {k: v} + * @param {String} prop the property name to set + * @param {*} val the new value + * @param {Object} obj the object to clone + * @return {Object} a new object similar to the original except for the specified property. + * @see R.dissoc * @example * - * var eqA = R.eqBy(R.prop('a')); - * var l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}]; - * var l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}]; - * R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}] + * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3} */ - var symmetricDifferenceWith = _curry3(function symmetricDifferenceWith(pred, list1, list2) { - return concat(differenceWith(pred, list1, list2), differenceWith(pred, list2, list1)); + var assoc = _curry3(function assoc(prop, val, obj) { + var result = {}; + for (var p in obj) { + result[p] = obj[p]; + } + result[prop] = val; + return result; }); /** - * Combines two lists into a set (i.e. no duplicates) composed of the elements - * of each list. + * Makes a shallow clone of an object, setting or overriding the nodes + * required to create the given path, and placing the specific value at the + * tail end of that path. Note that this copies and flattens prototype + * properties onto the new object as well. All non-primitive properties + * are copied by reference. * * @func * @memberOf R - * @since v0.1.0 - * @category Relation - * @sig [*] -> [*] -> [*] - * @param {Array} as The first list. - * @param {Array} bs The second list. - * @return {Array} The first and second lists concatenated, with - * duplicates removed. + * @category Object + * @sig [String] -> a -> {k: v} -> {k: v} + * @param {Array} path the path to set + * @param {*} val the new value + * @param {Object} obj the object to clone + * @return {Object} a new object similar to the original except along the specified path. + * @see R.dissocPath * @example * - * R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4] + * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}} */ - var union = _curry2(compose(uniq, _concat)); + var assocPath = _curry3(function assocPath(path, val, obj) { + switch (path.length) { + case 0: + return obj; + case 1: + return assoc(path[0], val, obj); + default: + return assoc(path[0], assocPath(_slice(path, 1), val, Object(obj[path[0]])), obj); + } + }); - var R = { - F: F, - T: T, - __: __, - add: add, - addIndex: addIndex, - adjust: adjust, - all: all, - allPass: allPass, - allUniq: allUniq, - always: always, - and: and, - any: any, - anyPass: anyPass, - ap: ap, - aperture: aperture, - append: append, - apply: apply, - assoc: assoc, - assocPath: assocPath, - binary: binary, - bind: bind, - both: both, - call: call, - chain: chain, - clone: clone, - commute: commute, - commuteMap: commuteMap, - comparator: comparator, - complement: complement, - compose: compose, - composeK: composeK, - composeP: composeP, - concat: concat, - cond: cond, - construct: construct, - constructN: constructN, - contains: contains, - converge: converge, - countBy: countBy, - curry: curry, - curryN: curryN, - dec: dec, - defaultTo: defaultTo, - difference: difference, - differenceWith: differenceWith, - dissoc: dissoc, - dissocPath: dissocPath, - divide: divide, - drop: drop, - dropLast: dropLast, - dropLastWhile: dropLastWhile, - dropRepeats: dropRepeats, - dropRepeatsWith: dropRepeatsWith, - dropWhile: dropWhile, - either: either, - empty: empty, - eqBy: eqBy, - eqProps: eqProps, - equals: equals, - evolve: evolve, - filter: filter, - find: find, - findIndex: findIndex, - findLast: findLast, - findLastIndex: findLastIndex, - flatten: flatten, - flip: flip, - forEach: forEach, - fromPairs: fromPairs, - groupBy: groupBy, - gt: gt, - gte: gte, - has: has, - hasIn: hasIn, - head: head, - identical: identical, - identity: identity, - ifElse: ifElse, - inc: inc, - indexBy: indexBy, - indexOf: indexOf, - init: init, - insert: insert, - insertAll: insertAll, - intersection: intersection, - intersectionWith: intersectionWith, - intersperse: intersperse, - into: into, - invert: invert, - invertObj: invertObj, - invoker: invoker, - is: is, - isArrayLike: isArrayLike, - isEmpty: isEmpty, - isNil: isNil, - join: join, - juxt: juxt, - keys: keys, - keysIn: keysIn, - last: last, - lastIndexOf: lastIndexOf, - length: length, - lens: lens, - lensIndex: lensIndex, - lensPath: lensPath, - lensProp: lensProp, - lift: lift, - liftN: liftN, - lt: lt, - lte: lte, - map: map, - mapAccum: mapAccum, - mapAccumRight: mapAccumRight, - mapObjIndexed: mapObjIndexed, - match: match, - mathMod: mathMod, - max: max, - maxBy: maxBy, - mean: mean, - median: median, - memoize: memoize, - merge: merge, - mergeAll: mergeAll, - mergeWith: mergeWith, - mergeWithKey: mergeWithKey, - min: min, - minBy: minBy, - modulo: modulo, - multiply: multiply, - nAry: nAry, - negate: negate, - none: none, - not: not, - nth: nth, - nthArg: nthArg, - objOf: objOf, - of: of, - omit: omit, - once: once, - or: or, - over: over, - pair: pair, - partial: partial, - partialRight: partialRight, - partition: partition, - path: path, - pathEq: pathEq, - pathOr: pathOr, - pathSatisfies: pathSatisfies, - pick: pick, - pickAll: pickAll, - pickBy: pickBy, - pipe: pipe, - pipeK: pipeK, - pipeP: pipeP, - pluck: pluck, - prepend: prepend, - product: product, - project: project, - prop: prop, - propEq: propEq, - propIs: propIs, - propOr: propOr, - propSatisfies: propSatisfies, - props: props, - range: range, - reduce: reduce, - reduceRight: reduceRight, - reduced: reduced, - reject: reject, - remove: remove, - repeat: repeat, - replace: replace, - reverse: reverse, - scan: scan, - sequence: sequence, - set: set, - slice: slice, - sort: sort, - sortBy: sortBy, - split: split, - splitAt: splitAt, - splitEvery: splitEvery, - splitWhen: splitWhen, - subtract: subtract, - sum: sum, - symmetricDifference: symmetricDifference, - symmetricDifferenceWith: symmetricDifferenceWith, - tail: tail, - take: take, - takeLast: takeLast, - takeLastWhile: takeLastWhile, - takeWhile: takeWhile, - tap: tap, - test: test, - times: times, - toLower: toLower, - toPairs: toPairs, - toPairsIn: toPairsIn, - toString: toString, - toUpper: toUpper, - transduce: transduce, - transpose: transpose, - traverse: traverse, - trim: trim, - type: type, - unapply: unapply, - unary: unary, - uncurryN: uncurryN, - unfold: unfold, - union: union, - unionWith: unionWith, - uniq: uniq, - uniqBy: uniqBy, - uniqWith: uniqWith, - unless: unless, - unnest: unnest, - update: update, - useWith: useWith, - values: values, - valuesIn: valuesIn, - view: view, - when: when, - where: where, - whereEq: whereEq, - without: without, - wrap: wrap, - xprod: xprod, - zip: zip, - zipObj: zipObj, - zipWith: zipWith - }; - /* eslint-env amd */ - - /* TEST_ENTRY_POINT */ - - if (true) { - module.exports = R; - } else if (typeof define === 'function' && define.amd) { - define(function() { return R; }); - } else { - this.R = R; - } - - }.call(this)); - - -/***/ }, -/* 28 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.isImportDeclaration = exports.isCompiletimeStatement = exports.isCompiletimeDeclaration = exports.isSyntaxDeclarationStatement = exports.isExportSyntax = exports.isParenthesizedExpression = exports.isFunctionWithName = exports.isFunctionTerm = exports.isSyntaxrecDeclaration = exports.isSyntaxDeclaration = exports.isEOF = exports.isVariableDeclarator = exports.isVariableDeclaration = exports.isSyntaxTemplate = exports.isTemplateElement = exports.isSwitchDefault = exports.isSwitchCase = exports.isSuper = exports.isSpreadElement = exports.isScript = exports.isFunctionDeclaration = exports.isFunctionBody = exports.isFormalParameters = exports.isDirective = exports.isCatchClause = exports.isBlock = exports.isPragma = exports.isWithStatement = exports.isWhileStatement = exports.isVariableDeclarationStatement = exports.isTryFinallyStatement = exports.isTryCatchStatement = exports.isThrowStatement = exports.isSwitchStatementWithDefault = exports.isSwitchStatement = exports.isReturnStatement = exports.isLabeledStatement = exports.isIfStatement = exports.isForStatement = exports.isForOfStatement = exports.isForInStatement = exports.isExpressionStatement = exports.isEmptyStatement = exports.isDoWhileStatement = exports.isDebuggerStatement = exports.isCompoundAssignmentExpression = exports.isContinueStatement = exports.isBreakStatement = exports.isBlockStatement = exports.isYieldGeneratorExpression = exports.isYieldExpression = exports.isUpdateExpression = exports.isThisExpression = exports.isTemplateExpression = exports.isStaticMemberExpression = exports.isUnaryExpression = exports.isObjectExpression = exports.isNewTargetExpression = exports.isNewExpression = exports.isIdentifierExpression = exports.isFunctionExpression = exports.isConditionalExpression = exports.isComputedMemberExpression = exports.isComputedAssignmentExpression = exports.isCallExpression = exports.isBinaryExpression = exports.isAssignmentExpression = exports.isArrowExpression = exports.isArrayExpression = exports.isLiteralStringExpression = exports.isLiteralRegExpExpression = exports.isLiteralNumericExpression = exports.isLiteralNullExpression = exports.isLiteralInfinityExpression = exports.isLiteralBooleanExpression = exports.isStaticPropertyName = exports.isComputedPropertyName = exports.isShorthandProperty = exports.isDataProperty = exports.isSetter = exports.isGetter = exports.isMethod = exports.isExportSpecifier = exports.isExportDefault = exports.isExport = exports.isExportFrom = exports.isExportAllFrom = exports.isImportSpecifier = exports.isImportNamespace = exports.isImport = exports.isModule = exports.isClassElement = exports.isClassDeclaration = exports.isClassExpression = exports.isBindingPropertyProperty = exports.isBindingPropertyIdentifier = exports.isObjectBinding = exports.isArrayBinding = exports.isBindingIdentifier = exports.isBindingWithDefault = undefined; - - var _immutable = __webpack_require__(11); + /** + * Creates a function that is bound to a context. + * Note: `R.bind` does not provide the additional argument-binding capabilities of + * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). + * + * @func + * @memberOf R + * @category Function + * @category Object + * @see R.partial + * @sig (* -> *) -> {*} -> (* -> *) + * @param {Function} fn The function to bind to context + * @param {Object} thisObj The context to bind `fn` to + * @return {Function} A function that will execute in the context of `thisObj`. + */ + var bind = _curry2(function bind(fn, thisObj) { + return _arity(fn.length, function () { + return fn.apply(thisObj, arguments); + }); + }); - var _errors = __webpack_require__(13); + /** + * A function wrapping calls to the two functions in an `&&` operation, returning the result of the first + * function if it is false-y and the result of the second function otherwise. Note that this is + * short-circuited, meaning that the second function will not be invoked if the first returns a false-y + * value. + * + * @func + * @memberOf R + * @category Logic + * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) + * @param {Function} f a predicate + * @param {Function} g another predicate + * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together. + * @see R.and + * @example + * + * var gt10 = function(x) { return x > 10; }; + * var even = function(x) { return x % 2 === 0 }; + * var f = R.both(gt10, even); + * f(100); //=> true + * f(101); //=> false + */ + var both = _curry2(function both(f, g) { + return function _both() { + return f.apply(this, arguments) && g.apply(this, arguments); + }; + }); - var _utils = __webpack_require__(29); + /** + * Makes a comparator function out of a function that reports whether the first element is less than the second. + * + * @func + * @memberOf R + * @category Function + * @sig (a, b -> Boolean) -> (a, b -> Number) + * @param {Function} pred A predicate function of arity two. + * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`. + * @example + * + * var cmp = R.comparator(function(a, b) { + * return a.age < b.age; + * }); + * var people = [ + * // ... + * ]; + * R.sort(cmp, people); + */ + var comparator = _curry1(function comparator(pred) { + return function (a, b) { + return pred(a, b) ? -1 : pred(b, a) ? 1 : 0; + }; + }); - var _syntax = __webpack_require__(12); + /** + * Takes a function `f` and returns a function `g` such that: + * + * - applying `g` to zero or more arguments will give __true__ if applying + * the same arguments to `f` gives a logical __false__ value; and + * + * - applying `g` to zero or more arguments will give __false__ if applying + * the same arguments to `f` gives a logical __true__ value. + * + * @func + * @memberOf R + * @category Logic + * @sig (*... -> *) -> (*... -> Boolean) + * @param {Function} f + * @return {Function} + * @see R.not + * @example + * + * var isEven = function(n) { return n % 2 === 0; }; + * var isOdd = R.complement(isEven); + * isOdd(21); //=> true + * isOdd(42); //=> false + */ + var complement = _curry1(_complement); - var _syntax2 = _interopRequireDefault(_syntax); + /** + * Returns a function, `fn`, which encapsulates if/else-if/else logic. + * `R.cond` takes a list of [predicate, transform] pairs. All of the + * arguments to `fn` are applied to each of the predicates in turn + * until one returns a "truthy" value, at which point `fn` returns the + * result of applying its arguments to the corresponding transformer. + * If none of the predicates matches, `fn` returns undefined. + * + * @func + * @memberOf R + * @category Logic + * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *) + * @param {Array} pairs + * @return {Function} + * @example + * + * var fn = R.cond([ + * [R.equals(0), R.always('water freezes at 0°C')], + * [R.equals(100), R.always('water boils at 100°C')], + * [R.T, function(temp) { return 'nothing special happens at ' + temp + '°C'; }] + * ]); + * fn(0); //=> 'water freezes at 0°C' + * fn(50); //=> 'nothing special happens at 50°C' + * fn(100); //=> 'water boils at 100°C' + */ + var cond = _curry1(function cond(pairs) { + return function () { + var idx = 0; + while (idx < pairs.length) { + if (pairs[idx][0].apply(this, arguments)) { + return pairs[idx][1].apply(this, arguments); + } + idx += 1; + } + }; + }); - var _termSpec = __webpack_require__(30); + /** + * Returns `true` if the `x` is found in the `list`, using `pred` as an + * equality predicate for `x`. + * + * @func + * @memberOf R + * @category List + * @sig (a, a -> Boolean) -> a -> [a] -> Boolean + * @param {Function} pred A predicate used to test whether two items are equal. + * @param {*} x The item to find + * @param {Array} list The list to iterate over + * @return {Boolean} `true` if `x` is in `list`, else `false`. + * @example + * + * var xs = [{x: 12}, {x: 11}, {x: 10}]; + * R.containsWith(function(a, b) { return a.x === b.x; }, {x: 10}, xs); //=> true + * R.containsWith(function(a, b) { return a.x === b.x; }, {x: 1}, xs); //=> false + */ + var containsWith = _curry3(_containsWith); - var _termSpec2 = _interopRequireDefault(_termSpec); + /** + * Counts the elements of a list according to how many match each value + * of a key generated by the supplied function. Returns an object + * mapping the keys produced by `fn` to the number of occurrences in + * the list. Note that all keys are coerced to strings because of how + * JavaScript objects work. + * + * @func + * @memberOf R + * @category Relation + * @sig (a -> String) -> [a] -> {*} + * @param {Function} fn The function used to map values to keys. + * @param {Array} list The list to count elements from. + * @return {Object} An object mapping keys to number of occurrences in the list. + * @example + * + * var numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2]; + * var letters = R.split('', 'abcABCaaaBBc'); + * R.countBy(Math.floor)(numbers); //=> {'1': 3, '2': 2, '3': 1} + * R.countBy(R.toLower)(letters); //=> {'a': 5, 'b': 4, 'c': 3} + */ + var countBy = _curry2(function countBy(fn, list) { + var counts = {}; + var len = list.length; + var idx = 0; + while (idx < len) { + var key = fn(list[idx]); + counts[key] = (_has(key, counts) ? counts[key] : 0) + 1; + idx += 1; + } + return counts; + }); - var _ramda = __webpack_require__(27); + /** + * Creates an object containing a single key:value pair. + * + * @func + * @memberOf R + * @category Object + * @sig String -> a -> {String:a} + * @param {String} key + * @param {*} val + * @return {Object} + * @example + * + * var matchPhrases = R.compose( + * R.createMapEntry('must'), + * R.map(R.createMapEntry('match_phrase')) + * ); + * matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]} + */ + var createMapEntry = _curry2(function createMapEntry(key, val) { + var obj = {}; + obj[key] = val; + return obj; + }); - var R = _interopRequireWildcard(_ramda); + /** + * Returns a curried equivalent of the provided function, with the + * specified arity. The curried function has two unusual capabilities. + * First, its arguments needn't be provided one at a time. If `g` is + * `R.curryN(3, f)`, the following are equivalent: + * + * - `g(1)(2)(3)` + * - `g(1)(2, 3)` + * - `g(1, 2)(3)` + * - `g(1, 2, 3)` + * + * Secondly, the special placeholder value `R.__` may be used to specify + * "gaps", allowing partial application of any combination of arguments, + * regardless of their positions. If `g` is as above and `_` is `R.__`, + * the following are equivalent: + * + * - `g(1, 2, 3)` + * - `g(_, 2, 3)(1)` + * - `g(_, _, 3)(1)(2)` + * - `g(_, _, 3)(1, 2)` + * - `g(_, 2)(1)(3)` + * - `g(_, 2)(1, 3)` + * - `g(_, 2)(_, 3)(1)` + * + * @func + * @memberOf R + * @category Function + * @sig Number -> (* -> a) -> (* -> a) + * @param {Number} length The arity for the returned function. + * @param {Function} fn The function to curry. + * @return {Function} A new, curried function. + * @see R.curry + * @example + * + * var addFourNumbers = function() { + * return R.sum([].slice.call(arguments, 0, 4)); + * }; + * + * var curriedAddFourNumbers = R.curryN(4, addFourNumbers); + * var f = curriedAddFourNumbers(1, 2); + * var g = f(3); + * g(4); //=> 10 + */ + var curryN = _curry2(function curryN(length, fn) { + if (length === 1) { + return _curry1(fn); + } + return _arity(length, _curryN(length, [], fn)); + }); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + /** + * Decrements its argument. + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number + * @param {Number} n + * @return {Number} + * @see R.inc + * @example + * + * R.dec(42); //=> 41 + */ + var dec = add(-1); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * Returns the second argument if it is not null or undefined. If it is null + * or undefined, the first (default) argument is returned. + * + * @func + * @memberOf R + * @category Logic + * @sig a -> b -> a | b + * @param {a} val The default value. + * @param {b} val The value to return if it is not null or undefined + * @return {*} The the second value or the default value + * @example + * + * var defaultTo42 = defaultTo(42); + * + * defaultTo42(null); //=> 42 + * defaultTo42(undefined); //=> 42 + * defaultTo42('Ramda'); //=> 'Ramda' + */ + var defaultTo = _curry2(function defaultTo(d, v) { + return v == null ? d : v; + }); - class Term { - constructor(type_1349, props_1350) { - this.type = type_1349; - this.loc = null; - for (let prop of Object.keys(props_1350)) { - this[prop] = props_1350[prop]; - } - } - extend(props_1351) { - let newProps_1352 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (props_1351.hasOwnProperty(field)) { - newProps_1352[field] = props_1351[field]; - } else { - newProps_1352[field] = this[field]; - } - } - return new Term(this.type, newProps_1352); - } - gen() { - var _ref = arguments.length <= 0 || arguments[0] === undefined ? { includeImports: true } : arguments[0]; - - let includeImports = _ref.includeImports; - - let next_1353 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (this[field] == null) { - next_1353[field] = null; - } else if (this[field] instanceof Term) { - next_1353[field] = this[field].gen(includeImports); - } else if (_immutable.List.isList(this[field])) { - let pred = includeImports ? R.complement(isCompiletimeStatement_1347) : R.both(R.complement(isImportDeclaration_1348), R.complement(isCompiletimeStatement_1347)); - next_1353[field] = this[field].filter(pred).map(term_1354 => term_1354 instanceof Term ? term_1354.gen(includeImports) : term_1354); - } else { - next_1353[field] = this[field]; - } - } - return new Term(this.type, next_1353); - } - visit(f_1355) { - let next_1356 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (this[field] == null) { - next_1356[field] = null; - } else if (_immutable.List.isList(this[field])) { - next_1356[field] = this[field].map(field_1357 => field_1357 != null ? f_1355(field_1357) : null); - } else { - next_1356[field] = f_1355(this[field]); - } - } - return this.extend(next_1356); - } - addScope(scope_1358, bindings_1359, phase_1360, options_1361) { - return this.visit(term_1362 => { - if (typeof term_1362.addScope === "function") { - return term_1362.addScope(scope_1358, bindings_1359, phase_1360, options_1361); - } - return term_1362; - }); - } - removeScope(scope_1363, phase_1364) { - return this.visit(term_1365 => { - if (typeof term_1365.removeScope === "function") { - return term_1365.removeScope(scope_1363, phase_1364); - } - return term_1365; + /** + * Finds the set (i.e. no duplicates) of all elements in the first list not contained in the second list. + * Duplication is determined according to the value returned by applying the supplied predicate to two list + * elements. + * + * @func + * @memberOf R + * @category Relation + * @sig (a,a -> Boolean) -> [a] -> [a] -> [a] + * @param {Function} pred A predicate used to test whether two items are equal. + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @see R.difference + * @return {Array} The elements in `list1` that are not in `list2`. + * @example + * + * function cmp(x, y) { return x.a === y.a; } + * var l1 = [{a: 1}, {a: 2}, {a: 3}]; + * var l2 = [{a: 3}, {a: 4}]; + * R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}] + */ + var differenceWith = _curry3(function differenceWith(pred, first, second) { + var out = []; + var idx = 0; + var firstLen = first.length; + var containsPred = containsWith(pred); + while (idx < firstLen) { + if (!containsPred(first[idx], second) && !containsPred(first[idx], out)) { + out[out.length] = first[idx]; + } + idx += 1; + } + return out; }); - } - lineNumber() { - for (let field of _termSpec2.default.spec[this.type].fields) { - if (typeof this[field] && this[field].lineNumber === "function") { - return this[field].lineNumber(); - } - } - } - setLineNumber(line_1366) { - let next_1367 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (this[field] == null) { - next_1367[field] = null; - } else if (typeof this[field].setLineNumber === "function") { - next_1367[field] = this[field].setLineNumber(line_1366); - } else if (_immutable.List.isList(this[field])) { - next_1367[field] = this[field].map(f_1368 => f_1368.setLineNumber(line_1366)); - } else { - next_1367[field] = this[field]; - } - } - return new Term(this.type, next_1367); - } - } - exports.default = Term; - const isBindingWithDefault_1249 = R.whereEq({ type: "BindingWithDefault" }); - ; - const isBindingIdentifier_1250 = R.whereEq({ type: "BindingIdentifier" }); - ; - const isArrayBinding_1251 = R.whereEq({ type: "ArrayBinding" }); - ; - const isObjectBinding_1252 = R.whereEq({ type: "ObjectBinding" }); - ; - const isBindingPropertyIdentifier_1253 = R.whereEq({ type: "BindingPropertyIdentifier" }); - ; - const isBindingPropertyProperty_1254 = R.whereEq({ type: "BindingPropertyIdentifier" }); - ; - const isClassExpression_1255 = R.whereEq({ type: "ClassExpression" }); - ; - const isClassDeclaration_1256 = R.whereEq({ type: "ClassDeclaration" }); - ; - const isClassElement_1257 = R.whereEq({ type: "ClassElement" }); - ; - const isModule_1258 = R.whereEq({ type: "Module" }); - ; - const isImport_1259 = R.whereEq({ type: "Import" }); - ; - const isImportNamespace_1260 = R.whereEq({ type: "ImportNamespace" }); - ; - const isImportSpecifier_1261 = R.whereEq({ type: "ImportSpecifier" }); - ; - const isExportAllFrom_1262 = R.whereEq({ type: "ExportAllFrom" }); - ; - const isExportFrom_1263 = R.whereEq({ type: "ExportFrom" }); - ; - const isExport_1264 = R.whereEq({ type: "Export" }); - ; - const isExportDefault_1265 = R.whereEq({ type: "ExportDefault" }); - ; - const isExportSpecifier_1266 = R.whereEq({ type: "ExportSpecifier" }); - ; - const isMethod_1267 = R.whereEq({ type: "Method" }); - ; - const isGetter_1268 = R.whereEq({ type: "Getter" }); - ; - const isSetter_1269 = R.whereEq({ type: "Setter" }); - ; - const isDataProperty_1270 = R.whereEq({ type: "DataProperty" }); - ; - const isShorthandProperty_1271 = R.whereEq({ type: "ShorthandProperty" }); - ; - const isComputedPropertyName_1272 = R.whereEq({ type: "ComputedPropertyName" }); - ; - const isStaticPropertyName_1273 = R.whereEq({ type: "StaticPropertyName" }); - ; - const isLiteralBooleanExpression_1274 = R.whereEq({ type: "LiteralBooleanExpression" }); - ; - const isLiteralInfinityExpression_1275 = R.whereEq({ type: "LiteralInfinityExpression" }); - ; - const isLiteralNullExpression_1276 = R.whereEq({ type: "LiteralNullExpression" }); - ; - const isLiteralNumericExpression_1277 = R.whereEq({ type: "LiteralNumericExpression" }); - ; - const isLiteralRegExpExpression_1278 = R.whereEq({ type: "LiteralRegExpExpression" }); - ; - const isLiteralStringExpression_1279 = R.whereEq({ type: "LiteralStringExpression" }); - ; - const isArrayExpression_1280 = R.whereEq({ type: "ArrayExpression" }); - ; - const isArrowExpression_1281 = R.whereEq({ type: "ArrowExpression" }); - ; - const isAssignmentExpression_1282 = R.whereEq({ type: "AssignmentExpression" }); - ; - const isBinaryExpression_1283 = R.whereEq({ type: "BinaryExpression" }); - ; - const isCallExpression_1284 = R.whereEq({ type: "CallExpression" }); - ; - const isComputedAssignmentExpression_1285 = R.whereEq({ type: "ComputedAssignmentExpression" }); - ; - const isComputedMemberExpression_1286 = R.whereEq({ type: "ComputedMemberExpression" }); - ; - const isConditionalExpression_1287 = R.whereEq({ type: "ConditionalExpression" }); - ; - const isFunctionExpression_1288 = R.whereEq({ type: "FunctionExpression" }); - ; - const isIdentifierExpression_1289 = R.whereEq({ type: "IdentifierExpression" }); - ; - const isNewExpression_1290 = R.whereEq({ type: "NewExpression" }); - ; - const isNewTargetExpression_1291 = R.whereEq({ type: "NewTargetExpression" }); - ; - const isObjectExpression_1292 = R.whereEq({ type: "ObjectExpression" }); - ; - const isUnaryExpression_1293 = R.whereEq({ type: "UnaryExpression" }); - ; - const isStaticMemberExpression_1294 = R.whereEq({ type: "StaticMemberExpression" }); - ; - const isTemplateExpression_1295 = R.whereEq({ type: "TemplateExpression" }); - ; - const isThisExpression_1296 = R.whereEq({ type: "ThisExpression" }); - ; - const isUpdateExpression_1297 = R.whereEq({ type: "UpdateExpression" }); - ; - const isYieldExpression_1298 = R.whereEq({ type: "YieldExpression" }); - ; - const isYieldGeneratorExpression_1299 = R.whereEq({ type: "YieldGeneratorExpression" }); - ; - const isBlockStatement_1300 = R.whereEq({ type: "BlockStatement" }); - ; - const isBreakStatement_1301 = R.whereEq({ type: "BreakStatement" }); - ; - const isContinueStatement_1302 = R.whereEq({ type: "ContinueStatement" }); - ; - const isCompoundAssignmentExpression_1303 = R.whereEq({ type: "CompoundAssignmentExpression" }); - ; - const isDebuggerStatement_1304 = R.whereEq({ type: "DebuggerStatement" }); - ; - const isDoWhileStatement_1305 = R.whereEq({ type: "DoWhileStatement" }); - ; - const isEmptyStatement_1306 = R.whereEq({ type: "EmptyStatement" }); - ; - const isExpressionStatement_1307 = R.whereEq({ type: "ExpressionStatement" }); - ; - const isForInStatement_1308 = R.whereEq({ type: "ForInStatement" }); - ; - const isForOfStatement_1309 = R.whereEq({ type: "ForOfStatement" }); - ; - const isForStatement_1310 = R.whereEq({ type: "ForStatement" }); - ; - const isIfStatement_1311 = R.whereEq({ type: "IfStatement" }); - ; - const isLabeledStatement_1312 = R.whereEq({ type: "LabeledStatement" }); - ; - const isReturnStatement_1313 = R.whereEq({ type: "ReturnStatement" }); - ; - const isSwitchStatement_1314 = R.whereEq({ type: "SwitchStatement" }); - ; - const isSwitchStatementWithDefault_1315 = R.whereEq({ type: "SwitchStatementWithDefault" }); - ; - const isThrowStatement_1316 = R.whereEq({ type: "ThrowStatement" }); - ; - const isTryCatchStatement_1317 = R.whereEq({ type: "TryCatchStatement" }); - ; - const isTryFinallyStatement_1318 = R.whereEq({ type: "TryFinallyStatement" }); - ; - const isVariableDeclarationStatement_1319 = R.whereEq({ type: "VariableDeclarationStatement" }); - ; - const isWhileStatement_1320 = R.whereEq({ type: "WhileStatement" }); - ; - const isWithStatement_1321 = R.whereEq({ type: "WithStatement" }); - ; - const isPragma_1322 = R.whereEq({ type: "Pragma" }); - ; - const isBlock_1323 = R.whereEq({ type: "Block" }); - ; - const isCatchClause_1324 = R.whereEq({ type: "CatchClause" }); - ; - const isDirective_1325 = R.whereEq({ type: "Directive" }); - ; - const isFormalParameters_1326 = R.whereEq({ type: "FormalParameters" }); - ; - const isFunctionBody_1327 = R.whereEq({ type: "FunctionBody" }); - ; - const isFunctionDeclaration_1328 = R.whereEq({ type: "FunctionDeclaration" }); - ; - const isScript_1329 = R.whereEq({ type: "Script" }); - ; - const isSpreadElement_1330 = R.whereEq({ type: "SpreadElement" }); - ; - const isSuper_1331 = R.whereEq({ type: "Super" }); - ; - const isSwitchCase_1332 = R.whereEq({ type: "SwitchCase" }); - ; - const isSwitchDefault_1333 = R.whereEq({ type: "SwitchDefault" }); - ; - const isTemplateElement_1334 = R.whereEq({ type: "TemplateElement" }); - ; - const isSyntaxTemplate_1335 = R.whereEq({ type: "SyntaxTemplate" }); - ; - const isVariableDeclaration_1336 = R.whereEq({ type: "VariableDeclaration" }); - ; - const isVariableDeclarator_1337 = R.whereEq({ type: "VariableDeclarator" }); - ; - const isEOF_1338 = R.whereEq({ type: "EOF" }); - ; - const isSyntaxDeclaration_1339 = R.both(isVariableDeclaration_1336, R.whereEq({ kind: "syntax" })); - ; - const isSyntaxrecDeclaration_1340 = R.both(isVariableDeclaration_1336, R.whereEq({ kind: "syntaxrec" })); - ; - const isFunctionTerm_1341 = R.either(isFunctionDeclaration_1328, isFunctionExpression_1288); - ; - const isFunctionWithName_1342 = R.and(isFunctionTerm_1341, R.complement(R.where({ name: R.isNil }))); - ; - const isParenthesizedExpression_1343 = R.whereEq({ type: "ParenthesizedExpression" }); - ; - const isExportSyntax_1344 = R.both(isExport_1264, exp_1369 => R.or(isSyntaxDeclaration_1339(exp_1369.declaration), isSyntaxrecDeclaration_1340(exp_1369.declaration))); - ; - const isSyntaxDeclarationStatement_1345 = R.both(isVariableDeclarationStatement_1319, decl_1370 => isCompiletimeDeclaration_1346(decl_1370.declaration)); - ; - const isCompiletimeDeclaration_1346 = R.either(isSyntaxDeclaration_1339, isSyntaxrecDeclaration_1340); - ; - const isCompiletimeStatement_1347 = term_1371 => { - return term_1371 instanceof Term && isVariableDeclarationStatement_1319(term_1371) && isCompiletimeDeclaration_1346(term_1371.declaration); - }; - ; - const isImportDeclaration_1348 = R.either(isImport_1259, isImportNamespace_1260); - ; - exports.isBindingWithDefault = isBindingWithDefault_1249; - exports.isBindingIdentifier = isBindingIdentifier_1250; - exports.isArrayBinding = isArrayBinding_1251; - exports.isObjectBinding = isObjectBinding_1252; - exports.isBindingPropertyIdentifier = isBindingPropertyIdentifier_1253; - exports.isBindingPropertyProperty = isBindingPropertyProperty_1254; - exports.isClassExpression = isClassExpression_1255; - exports.isClassDeclaration = isClassDeclaration_1256; - exports.isClassElement = isClassElement_1257; - exports.isModule = isModule_1258; - exports.isImport = isImport_1259; - exports.isImportNamespace = isImportNamespace_1260; - exports.isImportSpecifier = isImportSpecifier_1261; - exports.isExportAllFrom = isExportAllFrom_1262; - exports.isExportFrom = isExportFrom_1263; - exports.isExport = isExport_1264; - exports.isExportDefault = isExportDefault_1265; - exports.isExportSpecifier = isExportSpecifier_1266; - exports.isMethod = isMethod_1267; - exports.isGetter = isGetter_1268; - exports.isSetter = isSetter_1269; - exports.isDataProperty = isDataProperty_1270; - exports.isShorthandProperty = isShorthandProperty_1271; - exports.isComputedPropertyName = isComputedPropertyName_1272; - exports.isStaticPropertyName = isStaticPropertyName_1273; - exports.isLiteralBooleanExpression = isLiteralBooleanExpression_1274; - exports.isLiteralInfinityExpression = isLiteralInfinityExpression_1275; - exports.isLiteralNullExpression = isLiteralNullExpression_1276; - exports.isLiteralNumericExpression = isLiteralNumericExpression_1277; - exports.isLiteralRegExpExpression = isLiteralRegExpExpression_1278; - exports.isLiteralStringExpression = isLiteralStringExpression_1279; - exports.isArrayExpression = isArrayExpression_1280; - exports.isArrowExpression = isArrowExpression_1281; - exports.isAssignmentExpression = isAssignmentExpression_1282; - exports.isBinaryExpression = isBinaryExpression_1283; - exports.isCallExpression = isCallExpression_1284; - exports.isComputedAssignmentExpression = isComputedAssignmentExpression_1285; - exports.isComputedMemberExpression = isComputedMemberExpression_1286; - exports.isConditionalExpression = isConditionalExpression_1287; - exports.isFunctionExpression = isFunctionExpression_1288; - exports.isIdentifierExpression = isIdentifierExpression_1289; - exports.isNewExpression = isNewExpression_1290; - exports.isNewTargetExpression = isNewTargetExpression_1291; - exports.isObjectExpression = isObjectExpression_1292; - exports.isUnaryExpression = isUnaryExpression_1293; - exports.isStaticMemberExpression = isStaticMemberExpression_1294; - exports.isTemplateExpression = isTemplateExpression_1295; - exports.isThisExpression = isThisExpression_1296; - exports.isUpdateExpression = isUpdateExpression_1297; - exports.isYieldExpression = isYieldExpression_1298; - exports.isYieldGeneratorExpression = isYieldGeneratorExpression_1299; - exports.isBlockStatement = isBlockStatement_1300; - exports.isBreakStatement = isBreakStatement_1301; - exports.isContinueStatement = isContinueStatement_1302; - exports.isCompoundAssignmentExpression = isCompoundAssignmentExpression_1303; - exports.isDebuggerStatement = isDebuggerStatement_1304; - exports.isDoWhileStatement = isDoWhileStatement_1305; - exports.isEmptyStatement = isEmptyStatement_1306; - exports.isExpressionStatement = isExpressionStatement_1307; - exports.isForInStatement = isForInStatement_1308; - exports.isForOfStatement = isForOfStatement_1309; - exports.isForStatement = isForStatement_1310; - exports.isIfStatement = isIfStatement_1311; - exports.isLabeledStatement = isLabeledStatement_1312; - exports.isReturnStatement = isReturnStatement_1313; - exports.isSwitchStatement = isSwitchStatement_1314; - exports.isSwitchStatementWithDefault = isSwitchStatementWithDefault_1315; - exports.isThrowStatement = isThrowStatement_1316; - exports.isTryCatchStatement = isTryCatchStatement_1317; - exports.isTryFinallyStatement = isTryFinallyStatement_1318; - exports.isVariableDeclarationStatement = isVariableDeclarationStatement_1319; - exports.isWhileStatement = isWhileStatement_1320; - exports.isWithStatement = isWithStatement_1321; - exports.isPragma = isPragma_1322; - exports.isBlock = isBlock_1323; - exports.isCatchClause = isCatchClause_1324; - exports.isDirective = isDirective_1325; - exports.isFormalParameters = isFormalParameters_1326; - exports.isFunctionBody = isFunctionBody_1327; - exports.isFunctionDeclaration = isFunctionDeclaration_1328; - exports.isScript = isScript_1329; - exports.isSpreadElement = isSpreadElement_1330; - exports.isSuper = isSuper_1331; - exports.isSwitchCase = isSwitchCase_1332; - exports.isSwitchDefault = isSwitchDefault_1333; - exports.isTemplateElement = isTemplateElement_1334; - exports.isSyntaxTemplate = isSyntaxTemplate_1335; - exports.isVariableDeclaration = isVariableDeclaration_1336; - exports.isVariableDeclarator = isVariableDeclarator_1337; - exports.isEOF = isEOF_1338; - exports.isSyntaxDeclaration = isSyntaxDeclaration_1339; - exports.isSyntaxrecDeclaration = isSyntaxrecDeclaration_1340; - exports.isFunctionTerm = isFunctionTerm_1341; - exports.isFunctionWithName = isFunctionWithName_1342; - exports.isParenthesizedExpression = isParenthesizedExpression_1343; - exports.isExportSyntax = isExportSyntax_1344; - exports.isSyntaxDeclarationStatement = isSyntaxDeclarationStatement_1345; - exports.isCompiletimeDeclaration = isCompiletimeDeclaration_1346; - exports.isCompiletimeStatement = isCompiletimeStatement_1347; - exports.isImportDeclaration = isImportDeclaration_1348; - //# sourceMappingURL=data:application/json;base64,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LEdBQTFCLHNCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDaUIsUSxHQUFqQixhO1FBQ2lCLFEsR0FBakIsYTtRQUMwQixpQixHQUExQixzQjtRQUMwQixpQixHQUExQixzQjtRQUN3QixlLEdBQXhCLG9CO1FBQ3FCLFksR0FBckIsaUI7UUFDaUIsUSxHQUFqQixhO1FBQ3dCLGUsR0FBeEIsb0I7UUFDMEIsaUIsR0FBMUIsc0I7UUFDaUIsUSxHQUFqQixhO1FBQ2lCLFEsR0FBakIsYTtRQUNpQixRLEdBQWpCLGE7UUFDdUIsYyxHQUF2QixtQjtRQUM0QixtQixHQUE1Qix3QjtRQUMrQixzQixHQUEvQiwyQjtRQUM2QixvQixHQUE3Qix5QjtRQUNtQywwQixHQUFuQywrQjtRQUNvQywyQixHQUFwQyxnQztRQUNnQyx1QixHQUFoQyw0QjtRQUNtQywwQixHQUFuQywrQjtRQUNrQyx5QixHQUFsQyw4QjtRQUNrQyx5QixHQUFsQyw4QjtRQUMwQixpQixHQUExQixzQjtRQUMwQixpQixHQUExQixzQjtRQUMrQixzQixHQUEvQiwyQjtRQUMyQixrQixHQUEzQix1QjtRQUN5QixnQixHQUF6QixxQjtRQUN1Qyw4QixHQUF2QyxtQztRQUNtQywwQixHQUFuQywrQjtRQUNnQyx1QixHQUFoQyw0QjtRQUM2QixvQixHQUE3Qix5QjtRQUMrQixzQixHQUEvQiwyQjtRQUN3QixlLEdBQXhCLG9CO1FBQzhCLHFCLEdBQTlCLDBCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQzBCLGlCLEdBQTFCLHNCO1FBQ2lDLHdCLEdBQWpDLDZCO1FBQzZCLG9CLEdBQTdCLHlCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQzBCLGlCLEdBQTFCLHNCO1FBQ21DLDBCLEdBQW5DLCtCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQzRCLG1CLEdBQTVCLHdCO1FBQ3VDLDhCLEdBQXZDLG1DO1FBQzRCLG1CLEdBQTVCLHdCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQzhCLHFCLEdBQTlCLDBCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDc0IsYSxHQUF0QixrQjtRQUMyQixrQixHQUEzQix1QjtRQUMwQixpQixHQUExQixzQjtRQUMwQixpQixHQUExQixzQjtRQUNxQyw0QixHQUFyQyxpQztRQUN5QixnQixHQUF6QixxQjtRQUM0QixtQixHQUE1Qix3QjtRQUM4QixxQixHQUE5QiwwQjtRQUN1Qyw4QixHQUF2QyxtQztRQUN5QixnQixHQUF6QixxQjtRQUN3QixlLEdBQXhCLG9CO1FBQ2lCLFEsR0FBakIsYTtRQUNnQixPLEdBQWhCLFk7UUFDc0IsYSxHQUF0QixrQjtRQUNvQixXLEdBQXBCLGdCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDOEIscUIsR0FBOUIsMEI7UUFDaUIsUSxHQUFqQixhO1FBQ3dCLGUsR0FBeEIsb0I7UUFDZ0IsTyxHQUFoQixZO1FBQ3FCLFksR0FBckIsaUI7UUFDd0IsZSxHQUF4QixvQjtRQUMwQixpQixHQUExQixzQjtRQUN5QixnQixHQUF6QixxQjtRQUM4QixxQixHQUE5QiwwQjtRQUM2QixvQixHQUE3Qix5QjtRQUNjLEssR0FBZCxVO1FBQzRCLG1CLEdBQTVCLHdCO1FBQytCLHNCLEdBQS9CLDJCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDMkIsa0IsR0FBM0IsdUI7UUFDa0MseUIsR0FBbEMsOEI7UUFDdUIsYyxHQUF2QixtQjtRQUNxQyw0QixHQUFyQyxpQztRQUNpQyx3QixHQUFqQyw2QjtRQUMrQixzQixHQUEvQiwyQjtRQUM0QixtQixHQUE1Qix3QiIsImZpbGUiOiJ0ZXJtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHthc3NlcnQsIGV4cGVjdH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQge21peGlufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IFN5bnRheCBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBUZXJtU3BlYyBmcm9tIFwiLi90ZXJtLXNwZWNcIjtcbmltcG9ydCAgKiBhcyBSIGZyb20gXCJyYW1kYVwiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVybSB7XG4gIGNvbnN0cnVjdG9yKHR5cGVfMTM0OSwgcHJvcHNfMTM1MCkge1xuICAgIHRoaXMudHlwZSA9IHR5cGVfMTM0OTtcbiAgICB0aGlzLmxvYyA9IG51bGw7XG4gICAgZm9yIChsZXQgcHJvcCBvZiBPYmplY3Qua2V5cyhwcm9wc18xMzUwKSkge1xuICAgICAgdGhpc1twcm9wXSA9IHByb3BzXzEzNTBbcHJvcF07XG4gICAgfVxuICB9XG4gIGV4dGVuZChwcm9wc18xMzUxKSB7XG4gICAgbGV0IG5ld1Byb3BzXzEzNTIgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5zcGVjW3RoaXMudHlwZV0uZmllbGRzKSB7XG4gICAgICBpZiAocHJvcHNfMTM1MS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgbmV3UHJvcHNfMTM1MltmaWVsZF0gPSBwcm9wc18xMzUxW2ZpZWxkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1Byb3BzXzEzNTJbZmllbGRdID0gdGhpc1tmaWVsZF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSh0aGlzLnR5cGUsIG5ld1Byb3BzXzEzNTIpO1xuICB9XG4gIGdlbih7aW5jbHVkZUltcG9ydHN9ID0ge2luY2x1ZGVJbXBvcnRzOiB0cnVlfSkge1xuICAgIGxldCBuZXh0XzEzNTMgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5zcGVjW3RoaXMudHlwZV0uZmllbGRzKSB7XG4gICAgICBpZiAodGhpc1tmaWVsZF0gPT0gbnVsbCkge1xuICAgICAgICBuZXh0XzEzNTNbZmllbGRdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpc1tmaWVsZF0gaW5zdGFuY2VvZiBUZXJtKSB7XG4gICAgICAgIG5leHRfMTM1M1tmaWVsZF0gPSB0aGlzW2ZpZWxkXS5nZW4oaW5jbHVkZUltcG9ydHMpO1xuICAgICAgfSBlbHNlIGlmIChMaXN0LmlzTGlzdCh0aGlzW2ZpZWxkXSkpIHtcbiAgICAgICAgbGV0IHByZWQgPSBpbmNsdWRlSW1wb3J0cyA/IFIuY29tcGxlbWVudChpc0NvbXBpbGV0aW1lU3RhdGVtZW50XzEzNDcpIDogUi5ib3RoKFIuY29tcGxlbWVudChpc0ltcG9ydERlY2xhcmF0aW9uXzEzNDgpLCBSLmNvbXBsZW1lbnQoaXNDb21waWxldGltZVN0YXRlbWVudF8xMzQ3KSk7XG4gICAgICAgIG5leHRfMTM1M1tmaWVsZF0gPSB0aGlzW2ZpZWxkXS5maWx0ZXIocHJlZCkubWFwKHRlcm1fMTM1NCA9PiB0ZXJtXzEzNTQgaW5zdGFuY2VvZiBUZXJtID8gdGVybV8xMzU0LmdlbihpbmNsdWRlSW1wb3J0cykgOiB0ZXJtXzEzNTQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dF8xMzUzW2ZpZWxkXSA9IHRoaXNbZmllbGRdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odGhpcy50eXBlLCBuZXh0XzEzNTMpO1xuICB9XG4gIHZpc2l0KGZfMTM1NSkge1xuICAgIGxldCBuZXh0XzEzNTYgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5zcGVjW3RoaXMudHlwZV0uZmllbGRzKSB7XG4gICAgICBpZiAodGhpc1tmaWVsZF0gPT0gbnVsbCkge1xuICAgICAgICBuZXh0XzEzNTZbZmllbGRdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodGhpc1tmaWVsZF0pKSB7XG4gICAgICAgIG5leHRfMTM1NltmaWVsZF0gPSB0aGlzW2ZpZWxkXS5tYXAoZmllbGRfMTM1NyA9PiBmaWVsZF8xMzU3ICE9IG51bGwgPyBmXzEzNTUoZmllbGRfMTM1NykgOiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRfMTM1NltmaWVsZF0gPSBmXzEzNTUodGhpc1tmaWVsZF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leHRlbmQobmV4dF8xMzU2KTtcbiAgfVxuICBhZGRTY29wZShzY29wZV8xMzU4LCBiaW5kaW5nc18xMzU5LCBwaGFzZV8xMzYwLCBvcHRpb25zXzEzNjEpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpdCh0ZXJtXzEzNjIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0ZXJtXzEzNjIuYWRkU2NvcGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gdGVybV8xMzYyLmFkZFNjb3BlKHNjb3BlXzEzNTgsIGJpbmRpbmdzXzEzNTksIHBoYXNlXzEzNjAsIG9wdGlvbnNfMTM2MSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybV8xMzYyO1xuICAgIH0pO1xuICB9XG4gIHJlbW92ZVNjb3BlKHNjb3BlXzEzNjMsIHBoYXNlXzEzNjQpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpdCh0ZXJtXzEzNjUgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0ZXJtXzEzNjUucmVtb3ZlU2NvcGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gdGVybV8xMzY1LnJlbW92ZVNjb3BlKHNjb3BlXzEzNjMsIHBoYXNlXzEzNjQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlcm1fMTM2NTtcbiAgICB9KTtcbiAgfVxuICBsaW5lTnVtYmVyKCkge1xuICAgIGZvciAobGV0IGZpZWxkIG9mIFRlcm1TcGVjLnNwZWNbdGhpcy50eXBlXS5maWVsZHMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpc1tmaWVsZF0gJiYgdGhpc1tmaWVsZF0ubGluZU51bWJlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ZpZWxkXS5saW5lTnVtYmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNldExpbmVOdW1iZXIobGluZV8xMzY2KSB7XG4gICAgbGV0IG5leHRfMTM2NyA9IHt9O1xuICAgIGZvciAobGV0IGZpZWxkIG9mIFRlcm1TcGVjLnNwZWNbdGhpcy50eXBlXS5maWVsZHMpIHtcbiAgICAgIGlmICh0aGlzW2ZpZWxkXSA9PSBudWxsKSB7XG4gICAgICAgIG5leHRfMTM2N1tmaWVsZF0gPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpc1tmaWVsZF0uc2V0TGluZU51bWJlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5leHRfMTM2N1tmaWVsZF0gPSB0aGlzW2ZpZWxkXS5zZXRMaW5lTnVtYmVyKGxpbmVfMTM2Nik7XG4gICAgICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHRoaXNbZmllbGRdKSkge1xuICAgICAgICBuZXh0XzEzNjdbZmllbGRdID0gdGhpc1tmaWVsZF0ubWFwKGZfMTM2OCA9PiBmXzEzNjguc2V0TGluZU51bWJlcihsaW5lXzEzNjYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRfMTM2N1tmaWVsZF0gPSB0aGlzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKHRoaXMudHlwZSwgbmV4dF8xMzY3KTtcbiAgfVxufVxuY29uc3QgaXNCaW5kaW5nV2l0aERlZmF1bHRfMTI0OSA9IFIud2hlcmVFcSh7dHlwZTogXCJCaW5kaW5nV2l0aERlZmF1bHRcIn0pO1xuO1xuY29uc3QgaXNCaW5kaW5nSWRlbnRpZmllcl8xMjUwID0gUi53aGVyZUVxKHt0eXBlOiBcIkJpbmRpbmdJZGVudGlmaWVyXCJ9KTtcbjtcbmNvbnN0IGlzQXJyYXlCaW5kaW5nXzEyNTEgPSBSLndoZXJlRXEoe3R5cGU6IFwiQXJyYXlCaW5kaW5nXCJ9KTtcbjtcbmNvbnN0IGlzT2JqZWN0QmluZGluZ18xMjUyID0gUi53aGVyZUVxKHt0eXBlOiBcIk9iamVjdEJpbmRpbmdcIn0pO1xuO1xuY29uc3QgaXNCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXzEyNTMgPSBSLndoZXJlRXEoe3R5cGU6IFwiQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllclwifSk7XG47XG5jb25zdCBpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzEyNTQgPSBSLndoZXJlRXEoe3R5cGU6IFwiQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllclwifSk7XG47XG5jb25zdCBpc0NsYXNzRXhwcmVzc2lvbl8xMjU1ID0gUi53aGVyZUVxKHt0eXBlOiBcIkNsYXNzRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0NsYXNzRGVjbGFyYXRpb25fMTI1NiA9IFIud2hlcmVFcSh7dHlwZTogXCJDbGFzc0RlY2xhcmF0aW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ2xhc3NFbGVtZW50XzEyNTcgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ2xhc3NFbGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzTW9kdWxlXzEyNTggPSBSLndoZXJlRXEoe3R5cGU6IFwiTW9kdWxlXCJ9KTtcbjtcbmNvbnN0IGlzSW1wb3J0XzEyNTkgPSBSLndoZXJlRXEoe3R5cGU6IFwiSW1wb3J0XCJ9KTtcbjtcbmNvbnN0IGlzSW1wb3J0TmFtZXNwYWNlXzEyNjAgPSBSLndoZXJlRXEoe3R5cGU6IFwiSW1wb3J0TmFtZXNwYWNlXCJ9KTtcbjtcbmNvbnN0IGlzSW1wb3J0U3BlY2lmaWVyXzEyNjEgPSBSLndoZXJlRXEoe3R5cGU6IFwiSW1wb3J0U3BlY2lmaWVyXCJ9KTtcbjtcbmNvbnN0IGlzRXhwb3J0QWxsRnJvbV8xMjYyID0gUi53aGVyZUVxKHt0eXBlOiBcIkV4cG9ydEFsbEZyb21cIn0pO1xuO1xuY29uc3QgaXNFeHBvcnRGcm9tXzEyNjMgPSBSLndoZXJlRXEoe3R5cGU6IFwiRXhwb3J0RnJvbVwifSk7XG47XG5jb25zdCBpc0V4cG9ydF8xMjY0ID0gUi53aGVyZUVxKHt0eXBlOiBcIkV4cG9ydFwifSk7XG47XG5jb25zdCBpc0V4cG9ydERlZmF1bHRfMTI2NSA9IFIud2hlcmVFcSh7dHlwZTogXCJFeHBvcnREZWZhdWx0XCJ9KTtcbjtcbmNvbnN0IGlzRXhwb3J0U3BlY2lmaWVyXzEyNjYgPSBSLndoZXJlRXEoe3R5cGU6IFwiRXhwb3J0U3BlY2lmaWVyXCJ9KTtcbjtcbmNvbnN0IGlzTWV0aG9kXzEyNjcgPSBSLndoZXJlRXEoe3R5cGU6IFwiTWV0aG9kXCJ9KTtcbjtcbmNvbnN0IGlzR2V0dGVyXzEyNjggPSBSLndoZXJlRXEoe3R5cGU6IFwiR2V0dGVyXCJ9KTtcbjtcbmNvbnN0IGlzU2V0dGVyXzEyNjkgPSBSLndoZXJlRXEoe3R5cGU6IFwiU2V0dGVyXCJ9KTtcbjtcbmNvbnN0IGlzRGF0YVByb3BlcnR5XzEyNzAgPSBSLndoZXJlRXEoe3R5cGU6IFwiRGF0YVByb3BlcnR5XCJ9KTtcbjtcbmNvbnN0IGlzU2hvcnRoYW5kUHJvcGVydHlfMTI3MSA9IFIud2hlcmVFcSh7dHlwZTogXCJTaG9ydGhhbmRQcm9wZXJ0eVwifSk7XG47XG5jb25zdCBpc0NvbXB1dGVkUHJvcGVydHlOYW1lXzEyNzIgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ29tcHV0ZWRQcm9wZXJ0eU5hbWVcIn0pO1xuO1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eU5hbWVfMTI3MyA9IFIud2hlcmVFcSh7dHlwZTogXCJTdGF0aWNQcm9wZXJ0eU5hbWVcIn0pO1xuO1xuY29uc3QgaXNMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25fMTI3NCA9IFIud2hlcmVFcSh7dHlwZTogXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uXzEyNzUgPSBSLndoZXJlRXEoe3R5cGU6IFwiTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0xpdGVyYWxOdWxsRXhwcmVzc2lvbl8xMjc2ID0gUi53aGVyZUVxKHt0eXBlOiBcIkxpdGVyYWxOdWxsRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0xpdGVyYWxOdW1lcmljRXhwcmVzc2lvbl8xMjc3ID0gUi53aGVyZUVxKHt0eXBlOiBcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0xpdGVyYWxSZWdFeHBFeHByZXNzaW9uXzEyNzggPSBSLndoZXJlRXEoe3R5cGU6IFwiTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbl8xMjc5ID0gUi53aGVyZUVxKHt0eXBlOiBcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQXJyYXlFeHByZXNzaW9uXzEyODAgPSBSLndoZXJlRXEoe3R5cGU6IFwiQXJyYXlFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQXJyb3dFeHByZXNzaW9uXzEyODEgPSBSLndoZXJlRXEoe3R5cGU6IFwiQXJyb3dFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQXNzaWdubWVudEV4cHJlc3Npb25fMTI4MiA9IFIud2hlcmVFcSh7dHlwZTogXCJBc3NpZ25tZW50RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0JpbmFyeUV4cHJlc3Npb25fMTI4MyA9IFIud2hlcmVFcSh7dHlwZTogXCJCaW5hcnlFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ2FsbEV4cHJlc3Npb25fMTI4NCA9IFIud2hlcmVFcSh7dHlwZTogXCJDYWxsRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0NvbXB1dGVkQXNzaWdubWVudEV4cHJlc3Npb25fMTI4NSA9IFIud2hlcmVFcSh7dHlwZTogXCJDb21wdXRlZEFzc2lnbm1lbnRFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXzEyODYgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ29uZGl0aW9uYWxFeHByZXNzaW9uXzEyODcgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzRnVuY3Rpb25FeHByZXNzaW9uXzEyODggPSBSLndoZXJlRXEoe3R5cGU6IFwiRnVuY3Rpb25FeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzSWRlbnRpZmllckV4cHJlc3Npb25fMTI4OSA9IFIud2hlcmVFcSh7dHlwZTogXCJJZGVudGlmaWVyRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc05ld0V4cHJlc3Npb25fMTI5MCA9IFIud2hlcmVFcSh7dHlwZTogXCJOZXdFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzTmV3VGFyZ2V0RXhwcmVzc2lvbl8xMjkxID0gUi53aGVyZUVxKHt0eXBlOiBcIk5ld1RhcmdldEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNPYmplY3RFeHByZXNzaW9uXzEyOTIgPSBSLndoZXJlRXEoe3R5cGU6IFwiT2JqZWN0RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc1VuYXJ5RXhwcmVzc2lvbl8xMjkzID0gUi53aGVyZUVxKHt0eXBlOiBcIlVuYXJ5RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc1N0YXRpY01lbWJlckV4cHJlc3Npb25fMTI5NCA9IFIud2hlcmVFcSh7dHlwZTogXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzVGVtcGxhdGVFeHByZXNzaW9uXzEyOTUgPSBSLndoZXJlRXEoe3R5cGU6IFwiVGVtcGxhdGVFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzVGhpc0V4cHJlc3Npb25fMTI5NiA9IFIud2hlcmVFcSh7dHlwZTogXCJUaGlzRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc1VwZGF0ZUV4cHJlc3Npb25fMTI5NyA9IFIud2hlcmVFcSh7dHlwZTogXCJVcGRhdGVFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzWWllbGRFeHByZXNzaW9uXzEyOTggPSBSLndoZXJlRXEoe3R5cGU6IFwiWWllbGRFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXzEyOTkgPSBSLndoZXJlRXEoe3R5cGU6IFwiWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQmxvY2tTdGF0ZW1lbnRfMTMwMCA9IFIud2hlcmVFcSh7dHlwZTogXCJCbG9ja1N0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc0JyZWFrU3RhdGVtZW50XzEzMDEgPSBSLndoZXJlRXEoe3R5cGU6IFwiQnJlYWtTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNDb250aW51ZVN0YXRlbWVudF8xMzAyID0gUi53aGVyZUVxKHt0eXBlOiBcIkNvbnRpbnVlU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvbl8xMzAzID0gUi53aGVyZUVxKHt0eXBlOiBcIkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNEZWJ1Z2dlclN0YXRlbWVudF8xMzA0ID0gUi53aGVyZUVxKHt0eXBlOiBcIkRlYnVnZ2VyU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzRG9XaGlsZVN0YXRlbWVudF8xMzA1ID0gUi53aGVyZUVxKHt0eXBlOiBcIkRvV2hpbGVTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNFbXB0eVN0YXRlbWVudF8xMzA2ID0gUi53aGVyZUVxKHt0eXBlOiBcIkVtcHR5U3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzRXhwcmVzc2lvblN0YXRlbWVudF8xMzA3ID0gUi53aGVyZUVxKHt0eXBlOiBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNGb3JJblN0YXRlbWVudF8xMzA4ID0gUi53aGVyZUVxKHt0eXBlOiBcIkZvckluU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzRm9yT2ZTdGF0ZW1lbnRfMTMwOSA9IFIud2hlcmVFcSh7dHlwZTogXCJGb3JPZlN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc0ZvclN0YXRlbWVudF8xMzEwID0gUi53aGVyZUVxKHt0eXBlOiBcIkZvclN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc0lmU3RhdGVtZW50XzEzMTEgPSBSLndoZXJlRXEoe3R5cGU6IFwiSWZTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNMYWJlbGVkU3RhdGVtZW50XzEzMTIgPSBSLndoZXJlRXEoe3R5cGU6IFwiTGFiZWxlZFN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1JldHVyblN0YXRlbWVudF8xMzEzID0gUi53aGVyZUVxKHt0eXBlOiBcIlJldHVyblN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1N3aXRjaFN0YXRlbWVudF8xMzE0ID0gUi53aGVyZUVxKHt0eXBlOiBcIlN3aXRjaFN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1N3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0XzEzMTUgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRcIn0pO1xuO1xuY29uc3QgaXNUaHJvd1N0YXRlbWVudF8xMzE2ID0gUi53aGVyZUVxKHt0eXBlOiBcIlRocm93U3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzVHJ5Q2F0Y2hTdGF0ZW1lbnRfMTMxNyA9IFIud2hlcmVFcSh7dHlwZTogXCJUcnlDYXRjaFN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1RyeUZpbmFsbHlTdGF0ZW1lbnRfMTMxOCA9IFIud2hlcmVFcSh7dHlwZTogXCJUcnlGaW5hbGx5U3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudF8xMzE5ID0gUi53aGVyZUVxKHt0eXBlOiBcIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNXaGlsZVN0YXRlbWVudF8xMzIwID0gUi53aGVyZUVxKHt0eXBlOiBcIldoaWxlU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzV2l0aFN0YXRlbWVudF8xMzIxID0gUi53aGVyZUVxKHt0eXBlOiBcIldpdGhTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNQcmFnbWFfMTMyMiA9IFIud2hlcmVFcSh7dHlwZTogXCJQcmFnbWFcIn0pO1xuO1xuY29uc3QgaXNCbG9ja18xMzIzID0gUi53aGVyZUVxKHt0eXBlOiBcIkJsb2NrXCJ9KTtcbjtcbmNvbnN0IGlzQ2F0Y2hDbGF1c2VfMTMyNCA9IFIud2hlcmVFcSh7dHlwZTogXCJDYXRjaENsYXVzZVwifSk7XG47XG5jb25zdCBpc0RpcmVjdGl2ZV8xMzI1ID0gUi53aGVyZUVxKHt0eXBlOiBcIkRpcmVjdGl2ZVwifSk7XG47XG5jb25zdCBpc0Zvcm1hbFBhcmFtZXRlcnNfMTMyNiA9IFIud2hlcmVFcSh7dHlwZTogXCJGb3JtYWxQYXJhbWV0ZXJzXCJ9KTtcbjtcbmNvbnN0IGlzRnVuY3Rpb25Cb2R5XzEzMjcgPSBSLndoZXJlRXEoe3R5cGU6IFwiRnVuY3Rpb25Cb2R5XCJ9KTtcbjtcbmNvbnN0IGlzRnVuY3Rpb25EZWNsYXJhdGlvbl8xMzI4ID0gUi53aGVyZUVxKHt0eXBlOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0pO1xuO1xuY29uc3QgaXNTY3JpcHRfMTMyOSA9IFIud2hlcmVFcSh7dHlwZTogXCJTY3JpcHRcIn0pO1xuO1xuY29uc3QgaXNTcHJlYWRFbGVtZW50XzEzMzAgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3ByZWFkRWxlbWVudFwifSk7XG47XG5jb25zdCBpc1N1cGVyXzEzMzEgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3VwZXJcIn0pO1xuO1xuY29uc3QgaXNTd2l0Y2hDYXNlXzEzMzIgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3dpdGNoQ2FzZVwifSk7XG47XG5jb25zdCBpc1N3aXRjaERlZmF1bHRfMTMzMyA9IFIud2hlcmVFcSh7dHlwZTogXCJTd2l0Y2hEZWZhdWx0XCJ9KTtcbjtcbmNvbnN0IGlzVGVtcGxhdGVFbGVtZW50XzEzMzQgPSBSLndoZXJlRXEoe3R5cGU6IFwiVGVtcGxhdGVFbGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzU3ludGF4VGVtcGxhdGVfMTMzNSA9IFIud2hlcmVFcSh7dHlwZTogXCJTeW50YXhUZW1wbGF0ZVwifSk7XG47XG5jb25zdCBpc1ZhcmlhYmxlRGVjbGFyYXRpb25fMTMzNiA9IFIud2hlcmVFcSh7dHlwZTogXCJWYXJpYWJsZURlY2xhcmF0aW9uXCJ9KTtcbjtcbmNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdG9yXzEzMzcgPSBSLndoZXJlRXEoe3R5cGU6IFwiVmFyaWFibGVEZWNsYXJhdG9yXCJ9KTtcbjtcbmNvbnN0IGlzRU9GXzEzMzggPSBSLndoZXJlRXEoe3R5cGU6IFwiRU9GXCJ9KTtcbjtcbmNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb25fMTMzOSA9IFIuYm90aChpc1ZhcmlhYmxlRGVjbGFyYXRpb25fMTMzNiwgUi53aGVyZUVxKHtraW5kOiBcInN5bnRheFwifSkpO1xuO1xuY29uc3QgaXNTeW50YXhyZWNEZWNsYXJhdGlvbl8xMzQwID0gUi5ib3RoKGlzVmFyaWFibGVEZWNsYXJhdGlvbl8xMzM2LCBSLndoZXJlRXEoe2tpbmQ6IFwic3ludGF4cmVjXCJ9KSk7XG47XG5jb25zdCBpc0Z1bmN0aW9uVGVybV8xMzQxID0gUi5laXRoZXIoaXNGdW5jdGlvbkRlY2xhcmF0aW9uXzEzMjgsIGlzRnVuY3Rpb25FeHByZXNzaW9uXzEyODgpO1xuO1xuY29uc3QgaXNGdW5jdGlvbldpdGhOYW1lXzEzNDIgPSBSLmFuZChpc0Z1bmN0aW9uVGVybV8xMzQxLCBSLmNvbXBsZW1lbnQoUi53aGVyZSh7bmFtZTogUi5pc05pbH0pKSk7XG47XG5jb25zdCBpc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzEzNDMgPSBSLndoZXJlRXEoe3R5cGU6IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNFeHBvcnRTeW50YXhfMTM0NCA9IFIuYm90aChpc0V4cG9ydF8xMjY0LCBleHBfMTM2OSA9PiBSLm9yKGlzU3ludGF4RGVjbGFyYXRpb25fMTMzOShleHBfMTM2OS5kZWNsYXJhdGlvbiksIGlzU3ludGF4cmVjRGVjbGFyYXRpb25fMTM0MChleHBfMTM2OS5kZWNsYXJhdGlvbikpKTtcbjtcbmNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb25TdGF0ZW1lbnRfMTM0NSA9IFIuYm90aChpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfMTMxOSwgZGVjbF8xMzcwID0+IGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbl8xMzQ2KGRlY2xfMTM3MC5kZWNsYXJhdGlvbikpO1xuO1xuY29uc3QgaXNDb21waWxldGltZURlY2xhcmF0aW9uXzEzNDYgPSBSLmVpdGhlcihpc1N5bnRheERlY2xhcmF0aW9uXzEzMzksIGlzU3ludGF4cmVjRGVjbGFyYXRpb25fMTM0MCk7XG47XG5jb25zdCBpc0NvbXBpbGV0aW1lU3RhdGVtZW50XzEzNDcgPSB0ZXJtXzEzNzEgPT4ge1xuICByZXR1cm4gdGVybV8xMzcxIGluc3RhbmNlb2YgVGVybSAmJiBpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfMTMxOSh0ZXJtXzEzNzEpICYmIGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbl8xMzQ2KHRlcm1fMTM3MS5kZWNsYXJhdGlvbik7XG59O1xuO1xuY29uc3QgaXNJbXBvcnREZWNsYXJhdGlvbl8xMzQ4ID0gUi5laXRoZXIoaXNJbXBvcnRfMTI1OSwgaXNJbXBvcnROYW1lc3BhY2VfMTI2MCk7XG47XG5leHBvcnQge2lzQmluZGluZ1dpdGhEZWZhdWx0XzEyNDkgYXMgaXNCaW5kaW5nV2l0aERlZmF1bHR9O1xuZXhwb3J0IHtpc0JpbmRpbmdJZGVudGlmaWVyXzEyNTAgYXMgaXNCaW5kaW5nSWRlbnRpZmllcn07XG5leHBvcnQge2lzQXJyYXlCaW5kaW5nXzEyNTEgYXMgaXNBcnJheUJpbmRpbmd9O1xuZXhwb3J0IHtpc09iamVjdEJpbmRpbmdfMTI1MiBhcyBpc09iamVjdEJpbmRpbmd9O1xuZXhwb3J0IHtpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJfMTI1MyBhcyBpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJ9O1xuZXhwb3J0IHtpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzEyNTQgYXMgaXNCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eX07XG5leHBvcnQge2lzQ2xhc3NFeHByZXNzaW9uXzEyNTUgYXMgaXNDbGFzc0V4cHJlc3Npb259O1xuZXhwb3J0IHtpc0NsYXNzRGVjbGFyYXRpb25fMTI1NiBhcyBpc0NsYXNzRGVjbGFyYXRpb259O1xuZXhwb3J0IHtpc0NsYXNzRWxlbWVudF8xMjU3IGFzIGlzQ2xhc3NFbGVtZW50fTtcbmV4cG9ydCB7aXNNb2R1bGVfMTI1OCBhcyBpc01vZHVsZX07XG5leHBvcnQge2lzSW1wb3J0XzEyNTkgYXMgaXNJbXBvcnR9O1xuZXhwb3J0IHtpc0ltcG9ydE5hbWVzcGFjZV8xMjYwIGFzIGlzSW1wb3J0TmFtZXNwYWNlfTtcbmV4cG9ydCB7aXNJbXBvcnRTcGVjaWZpZXJfMTI2MSBhcyBpc0ltcG9ydFNwZWNpZmllcn07XG5leHBvcnQge2lzRXhwb3J0QWxsRnJvbV8xMjYyIGFzIGlzRXhwb3J0QWxsRnJvbX07XG5leHBvcnQge2lzRXhwb3J0RnJvbV8xMjYzIGFzIGlzRXhwb3J0RnJvbX07XG5leHBvcnQge2lzRXhwb3J0XzEyNjQgYXMgaXNFeHBvcnR9O1xuZXhwb3J0IHtpc0V4cG9ydERlZmF1bHRfMTI2NSBhcyBpc0V4cG9ydERlZmF1bHR9O1xuZXhwb3J0IHtpc0V4cG9ydFNwZWNpZmllcl8xMjY2IGFzIGlzRXhwb3J0U3BlY2lmaWVyfTtcbmV4cG9ydCB7aXNNZXRob2RfMTI2NyBhcyBpc01ldGhvZH07XG5leHBvcnQge2lzR2V0dGVyXzEyNjggYXMgaXNHZXR0ZXJ9O1xuZXhwb3J0IHtpc1NldHRlcl8xMjY5IGFzIGlzU2V0dGVyfTtcbmV4cG9ydCB7aXNEYXRhUHJvcGVydHlfMTI3MCBhcyBpc0RhdGFQcm9wZXJ0eX07XG5leHBvcnQge2lzU2hvcnRoYW5kUHJvcGVydHlfMTI3MSBhcyBpc1Nob3J0aGFuZFByb3BlcnR5fTtcbmV4cG9ydCB7aXNDb21wdXRlZFByb3BlcnR5TmFtZV8xMjcyIGFzIGlzQ29tcHV0ZWRQcm9wZXJ0eU5hbWV9O1xuZXhwb3J0IHtpc1N0YXRpY1Byb3BlcnR5TmFtZV8xMjczIGFzIGlzU3RhdGljUHJvcGVydHlOYW1lfTtcbmV4cG9ydCB7aXNMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25fMTI3NCBhcyBpc0xpdGVyYWxCb29sZWFuRXhwcmVzc2lvbn07XG5leHBvcnQge2lzTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbl8xMjc1IGFzIGlzTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbn07XG5leHBvcnQge2lzTGl0ZXJhbE51bGxFeHByZXNzaW9uXzEyNzYgYXMgaXNMaXRlcmFsTnVsbEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0xpdGVyYWxOdW1lcmljRXhwcmVzc2lvbl8xMjc3IGFzIGlzTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNMaXRlcmFsUmVnRXhwRXhwcmVzc2lvbl8xMjc4IGFzIGlzTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0xpdGVyYWxTdHJpbmdFeHByZXNzaW9uXzEyNzkgYXMgaXNMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbn07XG5leHBvcnQge2lzQXJyYXlFeHByZXNzaW9uXzEyODAgYXMgaXNBcnJheUV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0Fycm93RXhwcmVzc2lvbl8xMjgxIGFzIGlzQXJyb3dFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNBc3NpZ25tZW50RXhwcmVzc2lvbl8xMjgyIGFzIGlzQXNzaWdubWVudEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0JpbmFyeUV4cHJlc3Npb25fMTI4MyBhcyBpc0JpbmFyeUV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0NhbGxFeHByZXNzaW9uXzEyODQgYXMgaXNDYWxsRXhwcmVzc2lvbn07XG5leHBvcnQge2lzQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbl8xMjg1IGFzIGlzQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbn07XG5leHBvcnQge2lzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXzEyODYgYXMgaXNDb21wdXRlZE1lbWJlckV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0NvbmRpdGlvbmFsRXhwcmVzc2lvbl8xMjg3IGFzIGlzQ29uZGl0aW9uYWxFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNGdW5jdGlvbkV4cHJlc3Npb25fMTI4OCBhcyBpc0Z1bmN0aW9uRXhwcmVzc2lvbn07XG5leHBvcnQge2lzSWRlbnRpZmllckV4cHJlc3Npb25fMTI4OSBhcyBpc0lkZW50aWZpZXJFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNOZXdFeHByZXNzaW9uXzEyOTAgYXMgaXNOZXdFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNOZXdUYXJnZXRFeHByZXNzaW9uXzEyOTEgYXMgaXNOZXdUYXJnZXRFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNPYmplY3RFeHByZXNzaW9uXzEyOTIgYXMgaXNPYmplY3RFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNVbmFyeUV4cHJlc3Npb25fMTI5MyBhcyBpc1VuYXJ5RXhwcmVzc2lvbn07XG5leHBvcnQge2lzU3RhdGljTWVtYmVyRXhwcmVzc2lvbl8xMjk0IGFzIGlzU3RhdGljTWVtYmVyRXhwcmVzc2lvbn07XG5leHBvcnQge2lzVGVtcGxhdGVFeHByZXNzaW9uXzEyOTUgYXMgaXNUZW1wbGF0ZUV4cHJlc3Npb259O1xuZXhwb3J0IHtpc1RoaXNFeHByZXNzaW9uXzEyOTYgYXMgaXNUaGlzRXhwcmVzc2lvbn07XG5leHBvcnQge2lzVXBkYXRlRXhwcmVzc2lvbl8xMjk3IGFzIGlzVXBkYXRlRXhwcmVzc2lvbn07XG5leHBvcnQge2lzWWllbGRFeHByZXNzaW9uXzEyOTggYXMgaXNZaWVsZEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc1lpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbl8xMjk5IGFzIGlzWWllbGRHZW5lcmF0b3JFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNCbG9ja1N0YXRlbWVudF8xMzAwIGFzIGlzQmxvY2tTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0JyZWFrU3RhdGVtZW50XzEzMDEgYXMgaXNCcmVha1N0YXRlbWVudH07XG5leHBvcnQge2lzQ29udGludWVTdGF0ZW1lbnRfMTMwMiBhcyBpc0NvbnRpbnVlU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzEzMDMgYXMgaXNDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNEZWJ1Z2dlclN0YXRlbWVudF8xMzA0IGFzIGlzRGVidWdnZXJTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0RvV2hpbGVTdGF0ZW1lbnRfMTMwNSBhcyBpc0RvV2hpbGVTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0VtcHR5U3RhdGVtZW50XzEzMDYgYXMgaXNFbXB0eVN0YXRlbWVudH07XG5leHBvcnQge2lzRXhwcmVzc2lvblN0YXRlbWVudF8xMzA3IGFzIGlzRXhwcmVzc2lvblN0YXRlbWVudH07XG5leHBvcnQge2lzRm9ySW5TdGF0ZW1lbnRfMTMwOCBhcyBpc0ZvckluU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNGb3JPZlN0YXRlbWVudF8xMzA5IGFzIGlzRm9yT2ZTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0ZvclN0YXRlbWVudF8xMzEwIGFzIGlzRm9yU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNJZlN0YXRlbWVudF8xMzExIGFzIGlzSWZTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0xhYmVsZWRTdGF0ZW1lbnRfMTMxMiBhcyBpc0xhYmVsZWRTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc1JldHVyblN0YXRlbWVudF8xMzEzIGFzIGlzUmV0dXJuU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNTd2l0Y2hTdGF0ZW1lbnRfMTMxNCBhcyBpc1N3aXRjaFN0YXRlbWVudH07XG5leHBvcnQge2lzU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRfMTMxNSBhcyBpc1N3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0fTtcbmV4cG9ydCB7aXNUaHJvd1N0YXRlbWVudF8xMzE2IGFzIGlzVGhyb3dTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc1RyeUNhdGNoU3RhdGVtZW50XzEzMTcgYXMgaXNUcnlDYXRjaFN0YXRlbWVudH07XG5leHBvcnQge2lzVHJ5RmluYWxseVN0YXRlbWVudF8xMzE4IGFzIGlzVHJ5RmluYWxseVN0YXRlbWVudH07XG5leHBvcnQge2lzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudF8xMzE5IGFzIGlzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudH07XG5leHBvcnQge2lzV2hpbGVTdGF0ZW1lbnRfMTMyMCBhcyBpc1doaWxlU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNXaXRoU3RhdGVtZW50XzEzMjEgYXMgaXNXaXRoU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNQcmFnbWFfMTMyMiBhcyBpc1ByYWdtYX07XG5leHBvcnQge2lzQmxvY2tfMTMyMyBhcyBpc0Jsb2NrfTtcbmV4cG9ydCB7aXNDYXRjaENsYXVzZV8xMzI0IGFzIGlzQ2F0Y2hDbGF1c2V9O1xuZXhwb3J0IHtpc0RpcmVjdGl2ZV8xMzI1IGFzIGlzRGlyZWN0aXZlfTtcbmV4cG9ydCB7aXNGb3JtYWxQYXJhbWV0ZXJzXzEzMjYgYXMgaXNGb3JtYWxQYXJhbWV0ZXJzfTtcbmV4cG9ydCB7aXNGdW5jdGlvbkJvZHlfMTMyNyBhcyBpc0Z1bmN0aW9uQm9keX07XG5leHBvcnQge2lzRnVuY3Rpb25EZWNsYXJhdGlvbl8xMzI4IGFzIGlzRnVuY3Rpb25EZWNsYXJhdGlvbn07XG5leHBvcnQge2lzU2NyaXB0XzEzMjkgYXMgaXNTY3JpcHR9O1xuZXhwb3J0IHtpc1NwcmVhZEVsZW1lbnRfMTMzMCBhcyBpc1NwcmVhZEVsZW1lbnR9O1xuZXhwb3J0IHtpc1N1cGVyXzEzMzEgYXMgaXNTdXBlcn07XG5leHBvcnQge2lzU3dpdGNoQ2FzZV8xMzMyIGFzIGlzU3dpdGNoQ2FzZX07XG5leHBvcnQge2lzU3dpdGNoRGVmYXVsdF8xMzMzIGFzIGlzU3dpdGNoRGVmYXVsdH07XG5leHBvcnQge2lzVGVtcGxhdGVFbGVtZW50XzEzMzQgYXMgaXNUZW1wbGF0ZUVsZW1lbnR9O1xuZXhwb3J0IHtpc1N5bnRheFRlbXBsYXRlXzEzMzUgYXMgaXNTeW50YXhUZW1wbGF0ZX07XG5leHBvcnQge2lzVmFyaWFibGVEZWNsYXJhdGlvbl8xMzM2IGFzIGlzVmFyaWFibGVEZWNsYXJhdGlvbn07XG5leHBvcnQge2lzVmFyaWFibGVEZWNsYXJhdG9yXzEzMzcgYXMgaXNWYXJpYWJsZURlY2xhcmF0b3J9O1xuZXhwb3J0IHtpc0VPRl8xMzM4IGFzIGlzRU9GfTtcbmV4cG9ydCB7aXNTeW50YXhEZWNsYXJhdGlvbl8xMzM5IGFzIGlzU3ludGF4RGVjbGFyYXRpb259O1xuZXhwb3J0IHtpc1N5bnRheHJlY0RlY2xhcmF0aW9uXzEzNDAgYXMgaXNTeW50YXhyZWNEZWNsYXJhdGlvbn07XG5leHBvcnQge2lzRnVuY3Rpb25UZXJtXzEzNDEgYXMgaXNGdW5jdGlvblRlcm19O1xuZXhwb3J0IHtpc0Z1bmN0aW9uV2l0aE5hbWVfMTM0MiBhcyBpc0Z1bmN0aW9uV2l0aE5hbWV9O1xuZXhwb3J0IHtpc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzEzNDMgYXMgaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbn07XG5leHBvcnQge2lzRXhwb3J0U3ludGF4XzEzNDQgYXMgaXNFeHBvcnRTeW50YXh9O1xuZXhwb3J0IHtpc1N5bnRheERlY2xhcmF0aW9uU3RhdGVtZW50XzEzNDUgYXMgaXNTeW50YXhEZWNsYXJhdGlvblN0YXRlbWVudH07XG5leHBvcnQge2lzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbl8xMzQ2IGFzIGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbn07XG5leHBvcnQge2lzQ29tcGlsZXRpbWVTdGF0ZW1lbnRfMTM0NyBhcyBpc0NvbXBpbGV0aW1lU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNJbXBvcnREZWNsYXJhdGlvbl8xMzQ4IGFzIGlzSW1wb3J0RGVjbGFyYXRpb259Il19 - -/***/ }, -/* 29 */ -/***/ function(module, exports) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: true - }); - function mixin_1457(target_1458, source_1459) { - class F extends target_1458 {} - Object.getOwnPropertyNames(source_1459.prototype).forEach(name_1460 => { - if (name_1460 !== "constructor") { - let newProp = Object.getOwnPropertyDescriptor(source_1459.prototype, name_1460); - Object.defineProperty(F.prototype, name_1460, newProp); - } - }); - return F; - } - exports.mixin = mixin_1457; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsU0FBUyxVQUFULENBQW9CLFdBQXBCLEVBQWlDLFdBQWpDLEVBQThDO0FBQzVDLFFBQU0sQ0FBTixTQUFnQixXQUFoQixDQUE0QjtBQUM1QixTQUFPLG1CQUFQLENBQTJCLFlBQVksU0FBdkMsRUFBa0QsT0FBbEQsQ0FBMEQsYUFBYTtBQUNyRSxRQUFJLGNBQWMsYUFBbEIsRUFBaUM7QUFDL0IsVUFBSSxVQUFVLE9BQU8sd0JBQVAsQ0FBZ0MsWUFBWSxTQUE1QyxFQUF1RCxTQUF2RCxDQUFkO0FBQ0EsYUFBTyxjQUFQLENBQXNCLEVBQUUsU0FBeEIsRUFBbUMsU0FBbkMsRUFBOEMsT0FBOUM7QUFDRDtBQUNGLEdBTEQ7QUFNQSxTQUFPLENBQVA7QUFDRDtRQUNxQixLLEdBQWQsVSIsImZpbGUiOiJ1dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG1peGluXzE0NTcodGFyZ2V0XzE0NTgsIHNvdXJjZV8xNDU5KSB7XG4gIGNsYXNzIEYgZXh0ZW5kcyB0YXJnZXRfMTQ1OCB7fVxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VfMTQ1OS5wcm90b3R5cGUpLmZvckVhY2gobmFtZV8xNDYwID0+IHtcbiAgICBpZiAobmFtZV8xNDYwICE9PSBcImNvbnN0cnVjdG9yXCIpIHtcbiAgICAgIGxldCBuZXdQcm9wID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VfMTQ1OS5wcm90b3R5cGUsIG5hbWVfMTQ2MCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsIG5hbWVfMTQ2MCwgbmV3UHJvcCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIEY7XG59XG5leHBvcnQge21peGluXzE0NTcgYXMgbWl4aW59Il19 + /** + * Returns a new object that does not contain a `prop` property. + * + * @func + * @memberOf R + * @category Object + * @sig String -> {k: v} -> {k: v} + * @param {String} prop the name of the property to dissociate + * @param {Object} obj the object to clone + * @return {Object} a new object similar to the original but without the specified property + * @see R.assoc + * @example + * + * R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3} + */ + var dissoc = _curry2(function dissoc(prop, obj) { + var result = {}; + for (var p in obj) { + if (p !== prop) { + result[p] = obj[p]; + } + } + return result; + }); -/***/ }, -/* 30 */ -/***/ function(module, exports) { + /** + * Makes a shallow clone of an object, omitting the property at the + * given path. Note that this copies and flattens prototype properties + * onto the new object as well. All non-primitive properties are copied + * by reference. + * + * @func + * @memberOf R + * @category Object + * @sig [String] -> {k: v} -> {k: v} + * @param {Array} path the path to set + * @param {Object} obj the object to clone + * @return {Object} a new object without the property at path + * @see R.assocPath + * @example + * + * R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}} + */ + var dissocPath = _curry2(function dissocPath(path, obj) { + switch (path.length) { + case 0: + return obj; + case 1: + return dissoc(path[0], obj); + default: + var head = path[0]; + var tail = _slice(path, 1); + return obj[head] == null ? obj : assoc(head, dissocPath(tail, obj[head]), obj); + } + }); - "use strict"; + /** + * Divides two numbers. Equivalent to `a / b`. + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number -> Number + * @param {Number} a The first value. + * @param {Number} b The second value. + * @return {Number} The result of `a / b`. + * @see R.multiply + * @example + * + * R.divide(71, 100); //=> 0.71 + * + * var half = R.divide(R.__, 2); + * half(42); //=> 21 + * + * var reciprocal = R.divide(1); + * reciprocal(4); //=> 0.25 + */ + var divide = _curry2(function divide(a, b) { + return a / b; + }); - Object.defineProperty(exports, "__esModule", { - value: true - }); - const Term_1157 = Object.create(Object.prototype, { spec: { value: {}, writable: true, configurable: false, enumerable: true }, fields: { value: [], writable: false, configurable: false, enumerable: true } }); - const BindingWithDefault_1158 = Object.create(Term_1157, { fields: { value: ["binding", "init"], writable: false, configurable: false, enumerable: true } }); - BindingWithDefault_1158.spec.BindingWithDefault = BindingWithDefault_1158; - const BindingIdentifier_1159 = Object.create(Term_1157, { fields: { value: ["name"], writable: false, configurable: false, enumerable: true } }); - BindingIdentifier_1159.spec.BindingIdentifier = BindingIdentifier_1159; - const ArrayBinding_1160 = Object.create(Term_1157, { fields: { value: ["elements", "restElement"], writable: false, configurable: false, enumerable: true } }); - ArrayBinding_1160.spec.ArrayBinding = ArrayBinding_1160; - const ObjectBinding_1161 = Object.create(Term_1157, { fields: { value: ["properties"], writable: false, configurable: false, enumerable: true } }); - ObjectBinding_1161.spec.ObjectBinding = ObjectBinding_1161; - const BindingPropertyIdentifier_1162 = Object.create(Term_1157, { fields: { value: ["binding", "init"], writable: false, configurable: false, enumerable: true } }); - BindingPropertyIdentifier_1162.spec.BindingPropertyIdentifier = BindingPropertyIdentifier_1162; - const BindingPropertyProperty_1163 = Object.create(Term_1157, { fields: { value: ["name", "binding"], writable: false, configurable: false, enumerable: true } }); - BindingPropertyProperty_1163.spec.BindingPropertyProperty = BindingPropertyProperty_1163; - const Statement_1164 = Object.create(Term_1157, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - Statement_1164.spec.Statement = Statement_1164; - const Expression_1165 = Object.create(Term_1157, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - Expression_1165.spec.Expression = Expression_1165; - const ClassExpression_1166 = Object.create(Expression_1165, { fields: { value: ["name", "super", "elements"], writable: false, configurable: false, enumerable: true } }); - ClassExpression_1166.spec.ClassExpression = ClassExpression_1166; - const ClassDeclaration_1167 = Object.create(Statement_1164, { fields: { value: ["name", "super", "elements"], writable: false, configurable: false, enumerable: true } }); - ClassDeclaration_1167.spec.ClassDeclaration = ClassDeclaration_1167; - const ClassElement_1168 = Object.create(Term_1157, { fields: { value: ["isStatic", "method"], writable: false, configurable: false, enumerable: true } }); - ClassElement_1168.spec.ClassElement = ClassElement_1168; - const Module_1169 = Object.create(Term_1157, { fields: { value: ["directives", "items"], writable: false, configurable: false, enumerable: true } }); - Module_1169.spec.Module = Module_1169; - const Import_1170 = Object.create(Term_1157, { fields: { value: ["moduleSpecifier", "defaultBinding", "namedImports", "forSyntax"], writable: false, configurable: false, enumerable: true } }); - Import_1170.spec.Import = Import_1170; - const ImportNamespace_1171 = Object.create(Term_1157, { fields: { value: ["moduleSpecifier", "defaultBinding", "namespaceBinding"], writable: false, configurable: false, enumerable: true } }); - ImportNamespace_1171.spec.ImportNamespace = ImportNamespace_1171; - const ImportSpecifier_1172 = Object.create(Term_1157, { fields: { value: ["name", "binding"], writable: false, configurable: false, enumerable: true } }); - ImportSpecifier_1172.spec.ImportSpecifier = ImportSpecifier_1172; - const ExportAllFrom_1173 = Object.create(Term_1157, { fields: { value: ["moduleSpecifier"], writable: false, configurable: false, enumerable: true } }); - ExportAllFrom_1173.spec.ExportAllFrom = ExportAllFrom_1173; - const ExportFrom_1174 = Object.create(Term_1157, { fields: { value: ["namedExports", "moduleSpecifier"], writable: false, configurable: false, enumerable: true } }); - ExportFrom_1174.spec.ExportFrom = ExportFrom_1174; - const Export_1175 = Object.create(Term_1157, { fields: { value: ["declaration"], writable: false, configurable: false, enumerable: true } }); - Export_1175.spec.Export = Export_1175; - const ExportDefault_1176 = Object.create(Term_1157, { fields: { value: ["body"], writable: false, configurable: false, enumerable: true } }); - ExportDefault_1176.spec.ExportDefault = ExportDefault_1176; - const ExportSpecifier_1177 = Object.create(Term_1157, { fields: { value: ["name", "exportedName"], writable: false, configurable: false, enumerable: true } }); - ExportSpecifier_1177.spec.ExportSpecifier = ExportSpecifier_1177; - const Method_1178 = Object.create(Term_1157, { fields: { value: ["name", "body", "isGenerator", "params"], writable: false, configurable: false, enumerable: true } }); - Method_1178.spec.Method = Method_1178; - const Getter_1179 = Object.create(Term_1157, { fields: { value: ["name", "body"], writable: false, configurable: false, enumerable: true } }); - Getter_1179.spec.Getter = Getter_1179; - const Setter_1180 = Object.create(Term_1157, { fields: { value: ["name", "body", "param"], writable: false, configurable: false, enumerable: true } }); - Setter_1180.spec.Setter = Setter_1180; - const DataProperty_1181 = Object.create(Term_1157, { fields: { value: ["name", "expression"], writable: false, configurable: false, enumerable: true } }); - DataProperty_1181.spec.DataProperty = DataProperty_1181; - const ShorthandProperty_1182 = Object.create(Term_1157, { fields: { value: ["expression"], writable: false, configurable: false, enumerable: true } }); - ShorthandProperty_1182.spec.ShorthandProperty = ShorthandProperty_1182; - const StaticPropertyName_1183 = Object.create(Term_1157, { fields: { value: ["value"], writable: false, configurable: false, enumerable: true } }); - StaticPropertyName_1183.spec.StaticPropertyName = StaticPropertyName_1183; - const LiteralBooleanExpression_1184 = Object.create(Expression_1165, { fields: { value: ["value"], writable: false, configurable: false, enumerable: true } }); - LiteralBooleanExpression_1184.spec.LiteralBooleanExpression = LiteralBooleanExpression_1184; - const LiteralInfinityExpression_1185 = Object.create(Expression_1165, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - LiteralInfinityExpression_1185.spec.LiteralInfinityExpression = LiteralInfinityExpression_1185; - const LiteralNullExpression_1186 = Object.create(Expression_1165, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - LiteralNullExpression_1186.spec.LiteralNullExpression = LiteralNullExpression_1186; - const LiteralNumericExpression_1187 = Object.create(Expression_1165, { fields: { value: ["value"], writable: false, configurable: false, enumerable: true } }); - LiteralNumericExpression_1187.spec.LiteralNumericExpression = LiteralNumericExpression_1187; - const LiteralRegExpExpression_1188 = Object.create(Expression_1165, { fields: { value: ["pattern", "flags"], writable: false, configurable: false, enumerable: true } }); - LiteralRegExpExpression_1188.spec.LiteralRegExpExpression = LiteralRegExpExpression_1188; - const LiteralStringExpression_1189 = Object.create(Expression_1165, { fields: { value: ["value"], writable: false, configurable: false, enumerable: true } }); - LiteralStringExpression_1189.spec.LiteralStringExpression = LiteralStringExpression_1189; - const ArrayExpression_1190 = Object.create(Expression_1165, { fields: { value: ["elements"], writable: false, configurable: false, enumerable: true } }); - ArrayExpression_1190.spec.ArrayExpression = ArrayExpression_1190; - const ArrowExpression_1191 = Object.create(Expression_1165, { fields: { value: ["params", "body"], writable: false, configurable: false, enumerable: true } }); - ArrowExpression_1191.spec.ArrowExpression = ArrowExpression_1191; - const AssignmentExpression_1192 = Object.create(Expression_1165, { fields: { value: ["binding", "expression"], writable: false, configurable: false, enumerable: true } }); - AssignmentExpression_1192.spec.AssignmentExpression = AssignmentExpression_1192; - const BinaryExpression_1193 = Object.create(Expression_1165, { fields: { value: ["operator", "left", "right"], writable: false, configurable: false, enumerable: true } }); - BinaryExpression_1193.spec.BinaryExpression = BinaryExpression_1193; - const CallExpression_1194 = Object.create(Expression_1165, { fields: { value: ["callee", "arguments"], writable: false, configurable: false, enumerable: true } }); - CallExpression_1194.spec.CallExpression = CallExpression_1194; - const ComputedAssignmentExpression_1195 = Object.create(Expression_1165, { fields: { value: ["operator", "binding", "expression"], writable: false, configurable: false, enumerable: true } }); - ComputedAssignmentExpression_1195.spec.ComputedAssignmentExpression = ComputedAssignmentExpression_1195; - const ComputedMemberExpression_1196 = Object.create(Expression_1165, { fields: { value: ["object", "expression"], writable: false, configurable: false, enumerable: true } }); - ComputedMemberExpression_1196.spec.ComputedMemberExpression = ComputedMemberExpression_1196; - const ConditionalExpression_1197 = Object.create(Expression_1165, { fields: { value: ["test", "consequent", "alternate"], writable: false, configurable: false, enumerable: true } }); - ConditionalExpression_1197.spec.ConditionalExpression = ConditionalExpression_1197; - const FunctionExpression_1198 = Object.create(Expression_1165, { fields: { value: ["name", "isGenerator", "params", "body"], writable: false, configurable: false, enumerable: true } }); - FunctionExpression_1198.spec.FunctionExpression = FunctionExpression_1198; - const IdentifierExpression_1199 = Object.create(Expression_1165, { fields: { value: ["name"], writable: false, configurable: false, enumerable: true } }); - IdentifierExpression_1199.spec.IdentifierExpression = IdentifierExpression_1199; - const NewExpression_1200 = Object.create(Expression_1165, { fields: { value: ["callee", "arguments"], writable: false, configurable: false, enumerable: true } }); - NewExpression_1200.spec.NewExpression = NewExpression_1200; - const NewTargetExpression_1201 = Object.create(Expression_1165, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - NewTargetExpression_1201.spec.NewTargetExpression = NewTargetExpression_1201; - const ObjectExpression_1202 = Object.create(Expression_1165, { fields: { value: ["properties"], writable: false, configurable: false, enumerable: true } }); - ObjectExpression_1202.spec.ObjectExpression = ObjectExpression_1202; - const UnaryExpression_1203 = Object.create(Expression_1165, { fields: { value: ["operator", "operand"], writable: false, configurable: false, enumerable: true } }); - UnaryExpression_1203.spec.UnaryExpression = UnaryExpression_1203; - const StaticMemberExpression_1204 = Object.create(Expression_1165, { fields: { value: ["object", "property"], writable: false, configurable: false, enumerable: true } }); - StaticMemberExpression_1204.spec.StaticMemberExpression = StaticMemberExpression_1204; - const TemplateExpression_1205 = Object.create(Expression_1165, { fields: { value: ["tag", "elements"], writable: false, configurable: false, enumerable: true } }); - TemplateExpression_1205.spec.TemplateExpression = TemplateExpression_1205; - const ThisExpression_1206 = Object.create(Expression_1165, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - ThisExpression_1206.spec.ThisExpression = ThisExpression_1206; - const UpdateExpression_1207 = Object.create(Expression_1165, { fields: { value: ["isPrefix", "operator", "operand"], writable: false, configurable: false, enumerable: true } }); - UpdateExpression_1207.spec.UpdateExpression = UpdateExpression_1207; - const YieldExpression_1208 = Object.create(Expression_1165, { fields: { value: ["expression"], writable: false, configurable: false, enumerable: true } }); - YieldExpression_1208.spec.YieldExpression = YieldExpression_1208; - const YieldGeneratorExpression_1209 = Object.create(Expression_1165, { fields: { value: ["expression"], writable: false, configurable: false, enumerable: true } }); - YieldGeneratorExpression_1209.spec.YieldGeneratorExpression = YieldGeneratorExpression_1209; - const ParenthesizedExpression_1210 = Object.create(Expression_1165, { fields: { value: ["inner"], writable: false, configurable: false, enumerable: true } }); - ParenthesizedExpression_1210.spec.ParenthesizedExpression = ParenthesizedExpression_1210; - const BlockStatement_1211 = Object.create(Statement_1164, { fields: { value: ["block"], writable: false, configurable: false, enumerable: true } }); - BlockStatement_1211.spec.BlockStatement = BlockStatement_1211; - const BreakStatement_1212 = Object.create(Statement_1164, { fields: { value: ["label"], writable: false, configurable: false, enumerable: true } }); - BreakStatement_1212.spec.BreakStatement = BreakStatement_1212; - const ContinueStatement_1213 = Object.create(Statement_1164, { fields: { value: ["label"], writable: false, configurable: false, enumerable: true } }); - ContinueStatement_1213.spec.ContinueStatement = ContinueStatement_1213; - const CompoundAssignmentExpression_1214 = Object.create(Statement_1164, { fields: { value: ["binding", "operator", "expression"], writable: false, configurable: false, enumerable: true } }); - CompoundAssignmentExpression_1214.spec.CompoundAssignmentExpression = CompoundAssignmentExpression_1214; - const DebuggerStatement_1215 = Object.create(Statement_1164, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - DebuggerStatement_1215.spec.DebuggerStatement = DebuggerStatement_1215; - const DoWhileStatement_1216 = Object.create(Statement_1164, { fields: { value: ["test", "body"], writable: false, configurable: false, enumerable: true } }); - DoWhileStatement_1216.spec.DoWhileStatement = DoWhileStatement_1216; - const EmptyStatement_1217 = Object.create(Statement_1164, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - EmptyStatement_1217.spec.EmptyStatement = EmptyStatement_1217; - const ExpressionStatement_1218 = Object.create(Statement_1164, { fields: { value: ["expression"], writable: false, configurable: false, enumerable: true } }); - ExpressionStatement_1218.spec.ExpressionStatement = ExpressionStatement_1218; - const ForInStatement_1219 = Object.create(Statement_1164, { fields: { value: ["left", "right", "body"], writable: false, configurable: false, enumerable: true } }); - ForInStatement_1219.spec.ForInStatement = ForInStatement_1219; - const ForOfStatement_1220 = Object.create(Statement_1164, { fields: { value: ["left", "right", "body"], writable: false, configurable: false, enumerable: true } }); - ForOfStatement_1220.spec.ForOfStatement = ForOfStatement_1220; - const ForStatement_1221 = Object.create(Statement_1164, { fields: { value: ["init", "test", "update", "body"], writable: false, configurable: false, enumerable: true } }); - ForStatement_1221.spec.ForStatement = ForStatement_1221; - const IfStatement_1222 = Object.create(Statement_1164, { fields: { value: ["test", "consequent", "alternate"], writable: false, configurable: false, enumerable: true } }); - IfStatement_1222.spec.IfStatement = IfStatement_1222; - const LabeledStatement_1223 = Object.create(Statement_1164, { fields: { value: ["label", "body"], writable: false, configurable: false, enumerable: true } }); - LabeledStatement_1223.spec.LabeledStatement = LabeledStatement_1223; - const ReturnStatement_1224 = Object.create(Statement_1164, { fields: { value: ["expression"], writable: false, configurable: false, enumerable: true } }); - ReturnStatement_1224.spec.ReturnStatement = ReturnStatement_1224; - const SwitchStatement_1225 = Object.create(Statement_1164, { fields: { value: ["discriminant", "cases"], writable: false, configurable: false, enumerable: true } }); - SwitchStatement_1225.spec.SwitchStatement = SwitchStatement_1225; - const SwitchStatementWithDefault_1226 = Object.create(Statement_1164, { fields: { value: ["discriminant", "preDefaultCases", "defaultCase", "postDefaultCases"], writable: false, configurable: false, enumerable: true } }); - SwitchStatementWithDefault_1226.spec.SwitchStatementWithDefault = SwitchStatementWithDefault_1226; - const ThrowStatement_1227 = Object.create(Statement_1164, { fields: { value: ["expression"], writable: false, configurable: false, enumerable: true } }); - ThrowStatement_1227.spec.ThrowStatement = ThrowStatement_1227; - const TryCatchStatement_1228 = Object.create(Statement_1164, { fields: { value: ["body", "catchClause"], writable: false, configurable: false, enumerable: true } }); - TryCatchStatement_1228.spec.TryCatchStatement = TryCatchStatement_1228; - const TryFinallyStatement_1229 = Object.create(Statement_1164, { fields: { value: ["body", "catchClause", "finalizer"], writable: false, configurable: false, enumerable: true } }); - TryFinallyStatement_1229.spec.TryFinallyStatement = TryFinallyStatement_1229; - const VariableDeclarationStatement_1230 = Object.create(Statement_1164, { fields: { value: ["declaration"], writable: false, configurable: false, enumerable: true } }); - VariableDeclarationStatement_1230.spec.VariableDeclarationStatement = VariableDeclarationStatement_1230; - const WithStatement_1231 = Object.create(Statement_1164, { fields: { value: ["object", "body"], writable: false, configurable: false, enumerable: true } }); - WithStatement_1231.spec.WithStatement = WithStatement_1231; - const WhileStatement_1232 = Object.create(Statement_1164, { fields: { value: ["test", "body"], writable: false, configurable: false, enumerable: true } }); - WhileStatement_1232.spec.WhileStatement = WhileStatement_1232; - const Pragma_1233 = Object.create(Term_1157, { fields: { value: ["kind", "items"], writable: false, configurable: false, enumerable: true } }); - Pragma_1233.spec.Pragma = Pragma_1233; - const Block_1234 = Object.create(Term_1157, { fields: { value: ["statements"], writable: false, configurable: false, enumerable: true } }); - Block_1234.spec.Block = Block_1234; - const CatchClause_1235 = Object.create(Term_1157, { fields: { value: ["binding", "body"], writable: false, configurable: false, enumerable: true } }); - CatchClause_1235.spec.CatchClause = CatchClause_1235; - const Directive_1236 = Object.create(Term_1157, { fields: { value: ["rawValue"], writable: false, configurable: false, enumerable: true } }); - Directive_1236.spec.Directive = Directive_1236; - const FormalParameters_1237 = Object.create(Term_1157, { fields: { value: ["items", "rest"], writable: false, configurable: false, enumerable: true } }); - FormalParameters_1237.spec.FormalParameters = FormalParameters_1237; - const FunctionBody_1238 = Object.create(Term_1157, { fields: { value: ["directives", "statements"], writable: false, configurable: false, enumerable: true } }); - FunctionBody_1238.spec.FunctionBody = FunctionBody_1238; - const FunctionDeclaration_1239 = Object.create(Statement_1164, { fields: { value: ["name", "isGenerator", "params", "body"], writable: false, configurable: false, enumerable: true } }); - FunctionDeclaration_1239.spec.FunctionDeclaration = FunctionDeclaration_1239; - const Script_1240 = Object.create(Term_1157, { fields: { value: ["directives", "statements"], writable: false, configurable: false, enumerable: true } }); - Script_1240.spec.Script = Script_1240; - const SpreadElement_1241 = Object.create(Term_1157, { fields: { value: ["expression"], writable: false, configurable: false, enumerable: true } }); - SpreadElement_1241.spec.SpreadElement = SpreadElement_1241; - const Super_1242 = Object.create(Term_1157, { fields: { value: [], writable: false, configurable: false, enumerable: true } }); - Super_1242.spec.Super = Super_1242; - const SwitchCase_1243 = Object.create(Term_1157, { fields: { value: ["test", "consequent"], writable: false, configurable: false, enumerable: true } }); - SwitchCase_1243.spec.SwitchCase = SwitchCase_1243; - const SwitchDefault_1244 = Object.create(Term_1157, { fields: { value: ["consequent"], writable: false, configurable: false, enumerable: true } }); - SwitchDefault_1244.spec.SwitchDefault = SwitchDefault_1244; - const TemplateElement_1245 = Object.create(Term_1157, { fields: { value: ["rawValue"], writable: false, configurable: false, enumerable: true } }); - TemplateElement_1245.spec.TemplateElement = TemplateElement_1245; - const SyntaxTemplate_1246 = Object.create(Term_1157, { fields: { value: ["template"], writable: false, configurable: false, enumerable: true } }); - SyntaxTemplate_1246.spec.SyntaxTemplate = SyntaxTemplate_1246; - const VariableDeclaration_1247 = Object.create(Term_1157, { fields: { value: ["kind", "declarators"], writable: false, configurable: false, enumerable: true } }); - VariableDeclaration_1247.spec.VariableDeclaration = VariableDeclaration_1247; - const VariableDeclarator_1248 = Object.create(Term_1157, { fields: { value: ["binding", "init"], writable: false, configurable: false, enumerable: true } }); - VariableDeclarator_1248.spec.VariableDeclarator = VariableDeclarator_1248; - exports.default = Term_1157; - //# sourceMappingURL=data:application/json;base64,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QTlCLEdBQW9ELHdCQUFwRDtBQUNBLE1BQU0sMEJBQTBCLE9BQU8sTUFBUCxDQUFjLFNBQWQsRUFBeUIsRUFBQyxRQUFRLEVBQUMsT0FBTyxDQUFDLFNBQUQsRUFBWSxNQUFaLENBQVIsRUFBNkIsVUFBVSxLQUF2QyxFQUE4QyxjQUFjLEtBQTVELEVBQW1FLFlBQVksSUFBL0UsRUFBVCxFQUF6QixDQUFoQztBQUNBLHdCQUF3QixJQUF4QixDQUE2QixrQkFBN0IsR0FBa0QsdUJBQWxEO2tCQUNlLFMiLCJmaWxlIjoidGVybS1zcGVjLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgVGVybV8xMTU3ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QucHJvdG90eXBlLCB7c3BlYzoge3ZhbHVlOiB7fSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9LCBmaWVsZHM6IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbmNvbnN0IEJpbmRpbmdXaXRoRGVmYXVsdF8xMTU4ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiYmluZGluZ1wiLCBcImluaXRcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkJpbmRpbmdXaXRoRGVmYXVsdF8xMTU4LnNwZWMuQmluZGluZ1dpdGhEZWZhdWx0ID0gQmluZGluZ1dpdGhEZWZhdWx0XzExNTg7XG5jb25zdCBCaW5kaW5nSWRlbnRpZmllcl8xMTU5ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wibmFtZVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQmluZGluZ0lkZW50aWZpZXJfMTE1OS5zcGVjLkJpbmRpbmdJZGVudGlmaWVyID0gQmluZGluZ0lkZW50aWZpZXJfMTE1OTtcbmNvbnN0IEFycmF5QmluZGluZ18xMTYwID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZWxlbWVudHNcIiwgXCJyZXN0RWxlbWVudFwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQXJyYXlCaW5kaW5nXzExNjAuc3BlYy5BcnJheUJpbmRpbmcgPSBBcnJheUJpbmRpbmdfMTE2MDtcbmNvbnN0IE9iamVjdEJpbmRpbmdfMTE2MSA9IE9iamVjdC5jcmVhdGUoVGVybV8xMTU3LCB7ZmllbGRzOiB7dmFsdWU6IFtcInByb3BlcnRpZXNcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbk9iamVjdEJpbmRpbmdfMTE2MS5zcGVjLk9iamVjdEJpbmRpbmcgPSBPYmplY3RCaW5kaW5nXzExNjE7XG5jb25zdCBCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXzExNjIgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJiaW5kaW5nXCIsIFwiaW5pdFwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcl8xMTYyLnNwZWMuQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllciA9IEJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJfMTE2MjtcbmNvbnN0IEJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzExNjMgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJuYW1lXCIsIFwiYmluZGluZ1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQmluZGluZ1Byb3BlcnR5UHJvcGVydHlfMTE2My5zcGVjLkJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5ID0gQmluZGluZ1Byb3BlcnR5UHJvcGVydHlfMTE2MztcbmNvbnN0IFN0YXRlbWVudF8xMTY0ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN0YXRlbWVudF8xMTY0LnNwZWMuU3RhdGVtZW50ID0gU3RhdGVtZW50XzExNjQ7XG5jb25zdCBFeHByZXNzaW9uXzExNjUgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvbl8xMTY1LnNwZWMuRXhwcmVzc2lvbiA9IEV4cHJlc3Npb25fMTE2NTtcbmNvbnN0IENsYXNzRXhwcmVzc2lvbl8xMTY2ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wibmFtZVwiLCBcInN1cGVyXCIsIFwiZWxlbWVudHNcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkNsYXNzRXhwcmVzc2lvbl8xMTY2LnNwZWMuQ2xhc3NFeHByZXNzaW9uID0gQ2xhc3NFeHByZXNzaW9uXzExNjY7XG5jb25zdCBDbGFzc0RlY2xhcmF0aW9uXzExNjcgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcIm5hbWVcIiwgXCJzdXBlclwiLCBcImVsZW1lbnRzXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5DbGFzc0RlY2xhcmF0aW9uXzExNjcuc3BlYy5DbGFzc0RlY2xhcmF0aW9uID0gQ2xhc3NEZWNsYXJhdGlvbl8xMTY3O1xuY29uc3QgQ2xhc3NFbGVtZW50XzExNjggPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJpc1N0YXRpY1wiLCBcIm1ldGhvZFwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQ2xhc3NFbGVtZW50XzExNjguc3BlYy5DbGFzc0VsZW1lbnQgPSBDbGFzc0VsZW1lbnRfMTE2ODtcbmNvbnN0IE1vZHVsZV8xMTY5ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZGlyZWN0aXZlc1wiLCBcIml0ZW1zXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5Nb2R1bGVfMTE2OS5zcGVjLk1vZHVsZSA9IE1vZHVsZV8xMTY5O1xuY29uc3QgSW1wb3J0XzExNzAgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJtb2R1bGVTcGVjaWZpZXJcIiwgXCJkZWZhdWx0QmluZGluZ1wiLCBcIm5hbWVkSW1wb3J0c1wiLCBcImZvclN5bnRheFwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuSW1wb3J0XzExNzAuc3BlYy5JbXBvcnQgPSBJbXBvcnRfMTE3MDtcbmNvbnN0IEltcG9ydE5hbWVzcGFjZV8xMTcxID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wibW9kdWxlU3BlY2lmaWVyXCIsIFwiZGVmYXVsdEJpbmRpbmdcIiwgXCJuYW1lc3BhY2VCaW5kaW5nXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5JbXBvcnROYW1lc3BhY2VfMTE3MS5zcGVjLkltcG9ydE5hbWVzcGFjZSA9IEltcG9ydE5hbWVzcGFjZV8xMTcxO1xuY29uc3QgSW1wb3J0U3BlY2lmaWVyXzExNzIgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJuYW1lXCIsIFwiYmluZGluZ1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuSW1wb3J0U3BlY2lmaWVyXzExNzIuc3BlYy5JbXBvcnRTcGVjaWZpZXIgPSBJbXBvcnRTcGVjaWZpZXJfMTE3MjtcbmNvbnN0IEV4cG9ydEFsbEZyb21fMTE3MyA9IE9iamVjdC5jcmVhdGUoVGVybV8xMTU3LCB7ZmllbGRzOiB7dmFsdWU6IFtcIm1vZHVsZVNwZWNpZmllclwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwb3J0QWxsRnJvbV8xMTczLnNwZWMuRXhwb3J0QWxsRnJvbSA9IEV4cG9ydEFsbEZyb21fMTE3MztcbmNvbnN0IEV4cG9ydEZyb21fMTE3NCA9IE9iamVjdC5jcmVhdGUoVGVybV8xMTU3LCB7ZmllbGRzOiB7dmFsdWU6IFtcIm5hbWVkRXhwb3J0c1wiLCBcIm1vZHVsZVNwZWNpZmllclwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwb3J0RnJvbV8xMTc0LnNwZWMuRXhwb3J0RnJvbSA9IEV4cG9ydEZyb21fMTE3NDtcbmNvbnN0IEV4cG9ydF8xMTc1ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZGVjbGFyYXRpb25cIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkV4cG9ydF8xMTc1LnNwZWMuRXhwb3J0ID0gRXhwb3J0XzExNzU7XG5jb25zdCBFeHBvcnREZWZhdWx0XzExNzYgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJib2R5XCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHBvcnREZWZhdWx0XzExNzYuc3BlYy5FeHBvcnREZWZhdWx0ID0gRXhwb3J0RGVmYXVsdF8xMTc2O1xuY29uc3QgRXhwb3J0U3BlY2lmaWVyXzExNzcgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJuYW1lXCIsIFwiZXhwb3J0ZWROYW1lXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5FeHBvcnRTcGVjaWZpZXJfMTE3Ny5zcGVjLkV4cG9ydFNwZWNpZmllciA9IEV4cG9ydFNwZWNpZmllcl8xMTc3O1xuY29uc3QgTWV0aG9kXzExNzggPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJuYW1lXCIsIFwiYm9keVwiLCBcImlzR2VuZXJhdG9yXCIsIFwicGFyYW1zXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5NZXRob2RfMTE3OC5zcGVjLk1ldGhvZCA9IE1ldGhvZF8xMTc4O1xuY29uc3QgR2V0dGVyXzExNzkgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJuYW1lXCIsIFwiYm9keVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuR2V0dGVyXzExNzkuc3BlYy5HZXR0ZXIgPSBHZXR0ZXJfMTE3OTtcbmNvbnN0IFNldHRlcl8xMTgwID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wibmFtZVwiLCBcImJvZHlcIiwgXCJwYXJhbVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU2V0dGVyXzExODAuc3BlYy5TZXR0ZXIgPSBTZXR0ZXJfMTE4MDtcbmNvbnN0IERhdGFQcm9wZXJ0eV8xMTgxID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wibmFtZVwiLCBcImV4cHJlc3Npb25cIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkRhdGFQcm9wZXJ0eV8xMTgxLnNwZWMuRGF0YVByb3BlcnR5ID0gRGF0YVByb3BlcnR5XzExODE7XG5jb25zdCBTaG9ydGhhbmRQcm9wZXJ0eV8xMTgyID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZXhwcmVzc2lvblwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU2hvcnRoYW5kUHJvcGVydHlfMTE4Mi5zcGVjLlNob3J0aGFuZFByb3BlcnR5ID0gU2hvcnRoYW5kUHJvcGVydHlfMTE4MjtcbmNvbnN0IFN0YXRpY1Byb3BlcnR5TmFtZV8xMTgzID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1widmFsdWVcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN0YXRpY1Byb3BlcnR5TmFtZV8xMTgzLnNwZWMuU3RhdGljUHJvcGVydHlOYW1lID0gU3RhdGljUHJvcGVydHlOYW1lXzExODM7XG5jb25zdCBMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25fMTE4NCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcInZhbHVlXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5MaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25fMTE4NC5zcGVjLkxpdGVyYWxCb29sZWFuRXhwcmVzc2lvbiA9IExpdGVyYWxCb29sZWFuRXhwcmVzc2lvbl8xMTg0O1xuY29uc3QgTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbl8xMTg1ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW10sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkxpdGVyYWxJbmZpbml0eUV4cHJlc3Npb25fMTE4NS5zcGVjLkxpdGVyYWxJbmZpbml0eUV4cHJlc3Npb24gPSBMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uXzExODU7XG5jb25zdCBMaXRlcmFsTnVsbEV4cHJlc3Npb25fMTE4NiA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5MaXRlcmFsTnVsbEV4cHJlc3Npb25fMTE4Ni5zcGVjLkxpdGVyYWxOdWxsRXhwcmVzc2lvbiA9IExpdGVyYWxOdWxsRXhwcmVzc2lvbl8xMTg2O1xuY29uc3QgTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uXzExODcgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMTE2NSwge2ZpZWxkczoge3ZhbHVlOiBbXCJ2YWx1ZVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uXzExODcuc3BlYy5MaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24gPSBMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb25fMTE4NztcbmNvbnN0IExpdGVyYWxSZWdFeHBFeHByZXNzaW9uXzExODggPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMTE2NSwge2ZpZWxkczoge3ZhbHVlOiBbXCJwYXR0ZXJuXCIsIFwiZmxhZ3NcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkxpdGVyYWxSZWdFeHBFeHByZXNzaW9uXzExODguc3BlYy5MaXRlcmFsUmVnRXhwRXhwcmVzc2lvbiA9IExpdGVyYWxSZWdFeHBFeHByZXNzaW9uXzExODg7XG5jb25zdCBMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbl8xMTg5ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1widmFsdWVcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXzExODkuc3BlYy5MaXRlcmFsU3RyaW5nRXhwcmVzc2lvbiA9IExpdGVyYWxTdHJpbmdFeHByZXNzaW9uXzExODk7XG5jb25zdCBBcnJheUV4cHJlc3Npb25fMTE5MCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcImVsZW1lbnRzXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5BcnJheUV4cHJlc3Npb25fMTE5MC5zcGVjLkFycmF5RXhwcmVzc2lvbiA9IEFycmF5RXhwcmVzc2lvbl8xMTkwO1xuY29uc3QgQXJyb3dFeHByZXNzaW9uXzExOTEgPSBPYmplY3QuY3JlYXRlKEV4cHJlc3Npb25fMTE2NSwge2ZpZWxkczoge3ZhbHVlOiBbXCJwYXJhbXNcIiwgXCJib2R5XCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5BcnJvd0V4cHJlc3Npb25fMTE5MS5zcGVjLkFycm93RXhwcmVzc2lvbiA9IEFycm93RXhwcmVzc2lvbl8xMTkxO1xuY29uc3QgQXNzaWdubWVudEV4cHJlc3Npb25fMTE5MiA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcImJpbmRpbmdcIiwgXCJleHByZXNzaW9uXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5Bc3NpZ25tZW50RXhwcmVzc2lvbl8xMTkyLnNwZWMuQXNzaWdubWVudEV4cHJlc3Npb24gPSBBc3NpZ25tZW50RXhwcmVzc2lvbl8xMTkyO1xuY29uc3QgQmluYXJ5RXhwcmVzc2lvbl8xMTkzID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkJpbmFyeUV4cHJlc3Npb25fMTE5My5zcGVjLkJpbmFyeUV4cHJlc3Npb24gPSBCaW5hcnlFeHByZXNzaW9uXzExOTM7XG5jb25zdCBDYWxsRXhwcmVzc2lvbl8xMTk0ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5DYWxsRXhwcmVzc2lvbl8xMTk0LnNwZWMuQ2FsbEV4cHJlc3Npb24gPSBDYWxsRXhwcmVzc2lvbl8xMTk0O1xuY29uc3QgQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbl8xMTk1ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wib3BlcmF0b3JcIiwgXCJiaW5kaW5nXCIsIFwiZXhwcmVzc2lvblwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbl8xMTk1LnNwZWMuQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbiA9IENvbXB1dGVkQXNzaWdubWVudEV4cHJlc3Npb25fMTE5NTtcbmNvbnN0IENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbl8xMTk2ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wib2JqZWN0XCIsIFwiZXhwcmVzc2lvblwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXzExOTYuc3BlYy5Db21wdXRlZE1lbWJlckV4cHJlc3Npb24gPSBDb21wdXRlZE1lbWJlckV4cHJlc3Npb25fMTE5NjtcbmNvbnN0IENvbmRpdGlvbmFsRXhwcmVzc2lvbl8xMTk3ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkNvbmRpdGlvbmFsRXhwcmVzc2lvbl8xMTk3LnNwZWMuQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uXzExOTc7XG5jb25zdCBGdW5jdGlvbkV4cHJlc3Npb25fMTE5OCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcIm5hbWVcIiwgXCJpc0dlbmVyYXRvclwiLCBcInBhcmFtc1wiLCBcImJvZHlcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkZ1bmN0aW9uRXhwcmVzc2lvbl8xMTk4LnNwZWMuRnVuY3Rpb25FeHByZXNzaW9uID0gRnVuY3Rpb25FeHByZXNzaW9uXzExOTg7XG5jb25zdCBJZGVudGlmaWVyRXhwcmVzc2lvbl8xMTk5ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wibmFtZVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuSWRlbnRpZmllckV4cHJlc3Npb25fMTE5OS5zcGVjLklkZW50aWZpZXJFeHByZXNzaW9uID0gSWRlbnRpZmllckV4cHJlc3Npb25fMTE5OTtcbmNvbnN0IE5ld0V4cHJlc3Npb25fMTIwMCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuTmV3RXhwcmVzc2lvbl8xMjAwLnNwZWMuTmV3RXhwcmVzc2lvbiA9IE5ld0V4cHJlc3Npb25fMTIwMDtcbmNvbnN0IE5ld1RhcmdldEV4cHJlc3Npb25fMTIwMSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5OZXdUYXJnZXRFeHByZXNzaW9uXzEyMDEuc3BlYy5OZXdUYXJnZXRFeHByZXNzaW9uID0gTmV3VGFyZ2V0RXhwcmVzc2lvbl8xMjAxO1xuY29uc3QgT2JqZWN0RXhwcmVzc2lvbl8xMjAyID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wicHJvcGVydGllc1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuT2JqZWN0RXhwcmVzc2lvbl8xMjAyLnNwZWMuT2JqZWN0RXhwcmVzc2lvbiA9IE9iamVjdEV4cHJlc3Npb25fMTIwMjtcbmNvbnN0IFVuYXJ5RXhwcmVzc2lvbl8xMjAzID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wib3BlcmF0b3JcIiwgXCJvcGVyYW5kXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5VbmFyeUV4cHJlc3Npb25fMTIwMy5zcGVjLlVuYXJ5RXhwcmVzc2lvbiA9IFVuYXJ5RXhwcmVzc2lvbl8xMjAzO1xuY29uc3QgU3RhdGljTWVtYmVyRXhwcmVzc2lvbl8xMjA0ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wib2JqZWN0XCIsIFwicHJvcGVydHlcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN0YXRpY01lbWJlckV4cHJlc3Npb25fMTIwNC5zcGVjLlN0YXRpY01lbWJlckV4cHJlc3Npb24gPSBTdGF0aWNNZW1iZXJFeHByZXNzaW9uXzEyMDQ7XG5jb25zdCBUZW1wbGF0ZUV4cHJlc3Npb25fMTIwNSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcInRhZ1wiLCBcImVsZW1lbnRzXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UZW1wbGF0ZUV4cHJlc3Npb25fMTIwNS5zcGVjLlRlbXBsYXRlRXhwcmVzc2lvbiA9IFRlbXBsYXRlRXhwcmVzc2lvbl8xMjA1O1xuY29uc3QgVGhpc0V4cHJlc3Npb25fMTIwNiA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5UaGlzRXhwcmVzc2lvbl8xMjA2LnNwZWMuVGhpc0V4cHJlc3Npb24gPSBUaGlzRXhwcmVzc2lvbl8xMjA2O1xuY29uc3QgVXBkYXRlRXhwcmVzc2lvbl8xMjA3ID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wiaXNQcmVmaXhcIiwgXCJvcGVyYXRvclwiLCBcIm9wZXJhbmRcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblVwZGF0ZUV4cHJlc3Npb25fMTIwNy5zcGVjLlVwZGF0ZUV4cHJlc3Npb24gPSBVcGRhdGVFeHByZXNzaW9uXzEyMDc7XG5jb25zdCBZaWVsZEV4cHJlc3Npb25fMTIwOCA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcImV4cHJlc3Npb25cIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbllpZWxkRXhwcmVzc2lvbl8xMjA4LnNwZWMuWWllbGRFeHByZXNzaW9uID0gWWllbGRFeHByZXNzaW9uXzEyMDg7XG5jb25zdCBZaWVsZEdlbmVyYXRvckV4cHJlc3Npb25fMTIwOSA9IE9iamVjdC5jcmVhdGUoRXhwcmVzc2lvbl8xMTY1LCB7ZmllbGRzOiB7dmFsdWU6IFtcImV4cHJlc3Npb25cIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbllpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbl8xMjA5LnNwZWMuWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uID0gWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXzEyMDk7XG5jb25zdCBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xMjEwID0gT2JqZWN0LmNyZWF0ZShFeHByZXNzaW9uXzExNjUsIHtmaWVsZHM6IHt2YWx1ZTogW1wiaW5uZXJcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzEyMTAuc3BlYy5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzEyMTA7XG5jb25zdCBCbG9ja1N0YXRlbWVudF8xMjExID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXCJibG9ja1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuQmxvY2tTdGF0ZW1lbnRfMTIxMS5zcGVjLkJsb2NrU3RhdGVtZW50ID0gQmxvY2tTdGF0ZW1lbnRfMTIxMTtcbmNvbnN0IEJyZWFrU3RhdGVtZW50XzEyMTIgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcImxhYmVsXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5CcmVha1N0YXRlbWVudF8xMjEyLnNwZWMuQnJlYWtTdGF0ZW1lbnQgPSBCcmVha1N0YXRlbWVudF8xMjEyO1xuY29uc3QgQ29udGludWVTdGF0ZW1lbnRfMTIxMyA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzExNjQsIHtmaWVsZHM6IHt2YWx1ZTogW1wibGFiZWxcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkNvbnRpbnVlU3RhdGVtZW50XzEyMTMuc3BlYy5Db250aW51ZVN0YXRlbWVudCA9IENvbnRpbnVlU3RhdGVtZW50XzEyMTM7XG5jb25zdCBDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzEyMTQgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcImJpbmRpbmdcIiwgXCJvcGVyYXRvclwiLCBcImV4cHJlc3Npb25cIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb25fMTIxNC5zcGVjLkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb24gPSBDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzEyMTQ7XG5jb25zdCBEZWJ1Z2dlclN0YXRlbWVudF8xMjE1ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRGVidWdnZXJTdGF0ZW1lbnRfMTIxNS5zcGVjLkRlYnVnZ2VyU3RhdGVtZW50ID0gRGVidWdnZXJTdGF0ZW1lbnRfMTIxNTtcbmNvbnN0IERvV2hpbGVTdGF0ZW1lbnRfMTIxNiA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzExNjQsIHtmaWVsZHM6IHt2YWx1ZTogW1widGVzdFwiLCBcImJvZHlcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkRvV2hpbGVTdGF0ZW1lbnRfMTIxNi5zcGVjLkRvV2hpbGVTdGF0ZW1lbnQgPSBEb1doaWxlU3RhdGVtZW50XzEyMTY7XG5jb25zdCBFbXB0eVN0YXRlbWVudF8xMjE3ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRW1wdHlTdGF0ZW1lbnRfMTIxNy5zcGVjLkVtcHR5U3RhdGVtZW50ID0gRW1wdHlTdGF0ZW1lbnRfMTIxNztcbmNvbnN0IEV4cHJlc3Npb25TdGF0ZW1lbnRfMTIxOCA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzExNjQsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZXhwcmVzc2lvblwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRXhwcmVzc2lvblN0YXRlbWVudF8xMjE4LnNwZWMuRXhwcmVzc2lvblN0YXRlbWVudCA9IEV4cHJlc3Npb25TdGF0ZW1lbnRfMTIxODtcbmNvbnN0IEZvckluU3RhdGVtZW50XzEyMTkgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkZvckluU3RhdGVtZW50XzEyMTkuc3BlYy5Gb3JJblN0YXRlbWVudCA9IEZvckluU3RhdGVtZW50XzEyMTk7XG5jb25zdCBGb3JPZlN0YXRlbWVudF8xMjIwID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5Gb3JPZlN0YXRlbWVudF8xMjIwLnNwZWMuRm9yT2ZTdGF0ZW1lbnQgPSBGb3JPZlN0YXRlbWVudF8xMjIwO1xuY29uc3QgRm9yU3RhdGVtZW50XzEyMjEgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcImluaXRcIiwgXCJ0ZXN0XCIsIFwidXBkYXRlXCIsIFwiYm9keVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRm9yU3RhdGVtZW50XzEyMjEuc3BlYy5Gb3JTdGF0ZW1lbnQgPSBGb3JTdGF0ZW1lbnRfMTIyMTtcbmNvbnN0IElmU3RhdGVtZW50XzEyMjIgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcInRlc3RcIiwgXCJjb25zZXF1ZW50XCIsIFwiYWx0ZXJuYXRlXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5JZlN0YXRlbWVudF8xMjIyLnNwZWMuSWZTdGF0ZW1lbnQgPSBJZlN0YXRlbWVudF8xMjIyO1xuY29uc3QgTGFiZWxlZFN0YXRlbWVudF8xMjIzID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXCJsYWJlbFwiLCBcImJvZHlcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkxhYmVsZWRTdGF0ZW1lbnRfMTIyMy5zcGVjLkxhYmVsZWRTdGF0ZW1lbnQgPSBMYWJlbGVkU3RhdGVtZW50XzEyMjM7XG5jb25zdCBSZXR1cm5TdGF0ZW1lbnRfMTIyNCA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzExNjQsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZXhwcmVzc2lvblwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuUmV0dXJuU3RhdGVtZW50XzEyMjQuc3BlYy5SZXR1cm5TdGF0ZW1lbnQgPSBSZXR1cm5TdGF0ZW1lbnRfMTIyNDtcbmNvbnN0IFN3aXRjaFN0YXRlbWVudF8xMjI1ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXCJkaXNjcmltaW5hbnRcIiwgXCJjYXNlc1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3dpdGNoU3RhdGVtZW50XzEyMjUuc3BlYy5Td2l0Y2hTdGF0ZW1lbnQgPSBTd2l0Y2hTdGF0ZW1lbnRfMTIyNTtcbmNvbnN0IFN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0XzEyMjYgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcImRpc2NyaW1pbmFudFwiLCBcInByZURlZmF1bHRDYXNlc1wiLCBcImRlZmF1bHRDYXNlXCIsIFwicG9zdERlZmF1bHRDYXNlc1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRfMTIyNi5zcGVjLlN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0ID0gU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRfMTIyNjtcbmNvbnN0IFRocm93U3RhdGVtZW50XzEyMjcgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcImV4cHJlc3Npb25cIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRocm93U3RhdGVtZW50XzEyMjcuc3BlYy5UaHJvd1N0YXRlbWVudCA9IFRocm93U3RhdGVtZW50XzEyMjc7XG5jb25zdCBUcnlDYXRjaFN0YXRlbWVudF8xMjI4ID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXCJib2R5XCIsIFwiY2F0Y2hDbGF1c2VcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblRyeUNhdGNoU3RhdGVtZW50XzEyMjguc3BlYy5UcnlDYXRjaFN0YXRlbWVudCA9IFRyeUNhdGNoU3RhdGVtZW50XzEyMjg7XG5jb25zdCBUcnlGaW5hbGx5U3RhdGVtZW50XzEyMjkgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcImJvZHlcIiwgXCJjYXRjaENsYXVzZVwiLCBcImZpbmFsaXplclwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVHJ5RmluYWxseVN0YXRlbWVudF8xMjI5LnNwZWMuVHJ5RmluYWxseVN0YXRlbWVudCA9IFRyeUZpbmFsbHlTdGF0ZW1lbnRfMTIyOTtcbmNvbnN0IFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfMTIzMCA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzExNjQsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZGVjbGFyYXRpb25cIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfMTIzMC5zcGVjLlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XzEyMzA7XG5jb25zdCBXaXRoU3RhdGVtZW50XzEyMzEgPSBPYmplY3QuY3JlYXRlKFN0YXRlbWVudF8xMTY0LCB7ZmllbGRzOiB7dmFsdWU6IFtcIm9iamVjdFwiLCBcImJvZHlcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbldpdGhTdGF0ZW1lbnRfMTIzMS5zcGVjLldpdGhTdGF0ZW1lbnQgPSBXaXRoU3RhdGVtZW50XzEyMzE7XG5jb25zdCBXaGlsZVN0YXRlbWVudF8xMjMyID0gT2JqZWN0LmNyZWF0ZShTdGF0ZW1lbnRfMTE2NCwge2ZpZWxkczoge3ZhbHVlOiBbXCJ0ZXN0XCIsIFwiYm9keVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuV2hpbGVTdGF0ZW1lbnRfMTIzMi5zcGVjLldoaWxlU3RhdGVtZW50ID0gV2hpbGVTdGF0ZW1lbnRfMTIzMjtcbmNvbnN0IFByYWdtYV8xMjMzID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wia2luZFwiLCBcIml0ZW1zXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5QcmFnbWFfMTIzMy5zcGVjLlByYWdtYSA9IFByYWdtYV8xMjMzO1xuY29uc3QgQmxvY2tfMTIzNCA9IE9iamVjdC5jcmVhdGUoVGVybV8xMTU3LCB7ZmllbGRzOiB7dmFsdWU6IFtcInN0YXRlbWVudHNcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkJsb2NrXzEyMzQuc3BlYy5CbG9jayA9IEJsb2NrXzEyMzQ7XG5jb25zdCBDYXRjaENsYXVzZV8xMjM1ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiYmluZGluZ1wiLCBcImJvZHlcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcbkNhdGNoQ2xhdXNlXzEyMzUuc3BlYy5DYXRjaENsYXVzZSA9IENhdGNoQ2xhdXNlXzEyMzU7XG5jb25zdCBEaXJlY3RpdmVfMTIzNiA9IE9iamVjdC5jcmVhdGUoVGVybV8xMTU3LCB7ZmllbGRzOiB7dmFsdWU6IFtcInJhd1ZhbHVlXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5EaXJlY3RpdmVfMTIzNi5zcGVjLkRpcmVjdGl2ZSA9IERpcmVjdGl2ZV8xMjM2O1xuY29uc3QgRm9ybWFsUGFyYW1ldGVyc18xMjM3ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiaXRlbXNcIiwgXCJyZXN0XCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5Gb3JtYWxQYXJhbWV0ZXJzXzEyMzcuc3BlYy5Gb3JtYWxQYXJhbWV0ZXJzID0gRm9ybWFsUGFyYW1ldGVyc18xMjM3O1xuY29uc3QgRnVuY3Rpb25Cb2R5XzEyMzggPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJkaXJlY3RpdmVzXCIsIFwic3RhdGVtZW50c1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRnVuY3Rpb25Cb2R5XzEyMzguc3BlYy5GdW5jdGlvbkJvZHkgPSBGdW5jdGlvbkJvZHlfMTIzODtcbmNvbnN0IEZ1bmN0aW9uRGVjbGFyYXRpb25fMTIzOSA9IE9iamVjdC5jcmVhdGUoU3RhdGVtZW50XzExNjQsIHtmaWVsZHM6IHt2YWx1ZTogW1wibmFtZVwiLCBcImlzR2VuZXJhdG9yXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuRnVuY3Rpb25EZWNsYXJhdGlvbl8xMjM5LnNwZWMuRnVuY3Rpb25EZWNsYXJhdGlvbiA9IEZ1bmN0aW9uRGVjbGFyYXRpb25fMTIzOTtcbmNvbnN0IFNjcmlwdF8xMjQwID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiZGlyZWN0aXZlc1wiLCBcInN0YXRlbWVudHNcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblNjcmlwdF8xMjQwLnNwZWMuU2NyaXB0ID0gU2NyaXB0XzEyNDA7XG5jb25zdCBTcHJlYWRFbGVtZW50XzEyNDEgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJleHByZXNzaW9uXCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TcHJlYWRFbGVtZW50XzEyNDEuc3BlYy5TcHJlYWRFbGVtZW50ID0gU3ByZWFkRWxlbWVudF8xMjQxO1xuY29uc3QgU3VwZXJfMTI0MiA9IE9iamVjdC5jcmVhdGUoVGVybV8xMTU3LCB7ZmllbGRzOiB7dmFsdWU6IFtdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5TdXBlcl8xMjQyLnNwZWMuU3VwZXIgPSBTdXBlcl8xMjQyO1xuY29uc3QgU3dpdGNoQ2FzZV8xMjQzID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblN3aXRjaENhc2VfMTI0My5zcGVjLlN3aXRjaENhc2UgPSBTd2l0Y2hDYXNlXzEyNDM7XG5jb25zdCBTd2l0Y2hEZWZhdWx0XzEyNDQgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJjb25zZXF1ZW50XCJdLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWV9fSk7XG5Td2l0Y2hEZWZhdWx0XzEyNDQuc3BlYy5Td2l0Y2hEZWZhdWx0ID0gU3dpdGNoRGVmYXVsdF8xMjQ0O1xuY29uc3QgVGVtcGxhdGVFbGVtZW50XzEyNDUgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJyYXdWYWx1ZVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVGVtcGxhdGVFbGVtZW50XzEyNDUuc3BlYy5UZW1wbGF0ZUVsZW1lbnQgPSBUZW1wbGF0ZUVsZW1lbnRfMTI0NTtcbmNvbnN0IFN5bnRheFRlbXBsYXRlXzEyNDYgPSBPYmplY3QuY3JlYXRlKFRlcm1fMTE1Nywge2ZpZWxkczoge3ZhbHVlOiBbXCJ0ZW1wbGF0ZVwiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuU3ludGF4VGVtcGxhdGVfMTI0Ni5zcGVjLlN5bnRheFRlbXBsYXRlID0gU3ludGF4VGVtcGxhdGVfMTI0NjtcbmNvbnN0IFZhcmlhYmxlRGVjbGFyYXRpb25fMTI0NyA9IE9iamVjdC5jcmVhdGUoVGVybV8xMTU3LCB7ZmllbGRzOiB7dmFsdWU6IFtcImtpbmRcIiwgXCJkZWNsYXJhdG9yc1wiXSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlfX0pO1xuVmFyaWFibGVEZWNsYXJhdGlvbl8xMjQ3LnNwZWMuVmFyaWFibGVEZWNsYXJhdGlvbiA9IFZhcmlhYmxlRGVjbGFyYXRpb25fMTI0NztcbmNvbnN0IFZhcmlhYmxlRGVjbGFyYXRvcl8xMjQ4ID0gT2JqZWN0LmNyZWF0ZShUZXJtXzExNTcsIHtmaWVsZHM6IHt2YWx1ZTogW1wiYmluZGluZ1wiLCBcImluaXRcIl0sIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX19KTtcblZhcmlhYmxlRGVjbGFyYXRvcl8xMjQ4LnNwZWMuVmFyaWFibGVEZWNsYXJhdG9yID0gVmFyaWFibGVEZWNsYXJhdG9yXzEyNDg7XG5leHBvcnQgZGVmYXVsdCBUZXJtXzExNTc7XG4iXX0= + /** + * Returns a new list containing all but last the`n` elements of a given list, + * passing each value from the right to the supplied predicate function, skipping + * elements while the predicate function returns `true`. The predicate function + * is passed one argument: (value)*. + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> [a] + * @param {Function} fn The function called per iteration. + * @param {Array} list The collection to iterate over. + * @return {Array} A new array. + * @see R.takeLastWhile + * @example + * + * var lteThree = function(x) { + * return x <= 3; + * }; + * + * R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2] + */ + var dropLastWhile = _curry2(function dropLastWhile(pred, list) { + var idx = list.length - 1; + while (idx >= 0 && pred(list[idx])) { + idx -= 1; + } + return _slice(list, 0, idx + 1); + }); -/***/ }, -/* 31 */ -/***/ function(module, exports, __webpack_require__) { + /** + * A function wrapping calls to the two functions in an `||` operation, returning the result of the first + * function if it is truth-y and the result of the second function otherwise. Note that this is + * short-circuited, meaning that the second function will not be invoked if the first returns a truth-y + * value. + * + * @func + * @memberOf R + * @category Logic + * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean) + * @param {Function} f a predicate + * @param {Function} g another predicate + * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together. + * @see R.or + * @example + * + * var gt10 = function(x) { return x > 10; }; + * var even = function(x) { return x % 2 === 0 }; + * var f = R.either(gt10, even); + * f(101); //=> true + * f(8); //=> true + */ + var either = _curry2(function either(f, g) { + return function _either() { + return f.apply(this, arguments) || g.apply(this, arguments); + }; + }); - "use strict"; + /** + * Returns the empty value of its argument's type. Ramda defines the empty + * value of Array (`[]`), Object (`{}`), and String (`''`). Other types are + * supported if they define `.empty` and/or `.prototype.empty`. + * + * @func + * @memberOf R + * @category Function + * @sig a -> a + * @param {*} x + * @return {*} + * @example + * + * R.empty(Just(42)); //=> Nothing() + * R.empty([1, 2, 3]); //=> [] + * R.empty('unicorns'); //=> '' + * R.empty({x: 1, y: 2}); //=> {} + */ + var empty = _curry1(function empty(x) { + if (x != null && typeof x.empty === 'function') { + return x.empty(); + } else if (x != null && typeof x.constructor != null && typeof x.constructor.empty === 'function') { + return x.constructor.empty(); + } else { + switch (Object.prototype.toString.call(x)) { + case '[object Array]': + return []; + case '[object Object]': + return {}; + case '[object String]': + return ''; + } + } + }); - Object.defineProperty(exports, "__esModule", { - value: true - }); + /** + * Creates a new object by recursively evolving a shallow copy of `object`, according to the + * `transformation` functions. All non-primitive properties are copied by reference. + * + * A `tranformation` function will not be invoked if its corresponding key does not exist in + * the evolved object. + * + * @func + * @memberOf R + * @category Object + * @sig {k: (v -> v)} -> {k: v} -> {k: v} + * @param {Object} transformations The object specifying transformation functions to apply + * to the object. + * @param {Object} object The object to be transformed. + * @return {Object} The transformed object. + * @example + * + * var tomato = {firstName: ' Tomato ', data: {elapsed: 100, remaining: 1400}, id:123}; + * var transformations = { + * firstName: R.trim, + * lastName: R.trim, // Will not get invoked. + * data: {elapsed: R.add(1), remaining: R.add(-1)} + * }; + * R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123} + */ + var evolve = _curry2(function evolve(transformations, object) { + var transformation, key, type, result = {}; + for (key in object) { + transformation = transformations[key]; + type = typeof transformation; + result[key] = type === 'function' ? transformation(object[key]) : type === 'object' ? evolve(transformations[key], object[key]) : object[key]; + } + return result; + }); - var _transforms = __webpack_require__(32); + /** + * Creates a new object out of a list key-value pairs. + * + * @func + * @memberOf R + * @category List + * @sig [[k,v]] -> {k: v} + * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object. + * @return {Object} The object made by pairing up `keys` and `values`. + * @see R.toPairs + * @example + * + * R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3} + */ + var fromPairs = _curry1(function fromPairs(pairs) { + var idx = 0, len = pairs.length, out = {}; + while (idx < len) { + if (_isArray(pairs[idx]) && pairs[idx].length) { + out[pairs[idx][0]] = pairs[idx][1]; + } + idx += 1; + } + return out; + }); - class Env { - constructor() { - this.map = new Map(); - this.map.set("function", _transforms.FunctionDeclTransform); - this.map.set("var", _transforms.VariableDeclTransform); - this.map.set("let", _transforms.LetDeclTransform); - this.map.set("const", _transforms.ConstDeclTransform); - this.map.set("syntaxQuote", _transforms.SyntaxQuoteTransform); - this.map.set("syntaxrec", _transforms.SyntaxrecDeclTransform); - this.map.set("syntax", _transforms.SyntaxDeclTransform); - this.map.set("return", _transforms.ReturnStatementTransform); - this.map.set("while", _transforms.WhileTransform); - this.map.set("if", _transforms.IfTransform); - this.map.set("for", _transforms.ForTransform); - this.map.set("switch", _transforms.SwitchTransform); - this.map.set("break", _transforms.BreakTransform); - this.map.set("continue", _transforms.ContinueTransform); - this.map.set("do", _transforms.DoTransform); - this.map.set("debugger", _transforms.DebuggerTransform); - this.map.set("with", _transforms.WithTransform); - this.map.set("try", _transforms.TryTransform); - this.map.set("throw", _transforms.ThrowTransform); - this.map.set("new", _transforms.NewTransform); - } - has(key_332) { - return this.map.has(key_332); - } - get(key_333) { - return this.map.get(key_333); - } - set(key_334, val_335) { - return this.map.set(key_334, val_335); - } - } - exports.default = Env; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2Vudi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDZSxNQUFNLEdBQU4sQ0FBVTtBQUN2QixnQkFBYztBQUNaLFNBQUssR0FBTCxHQUFXLElBQUksR0FBSixFQUFYO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFVBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsS0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsYUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxXQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFFBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsUUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxPQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLElBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsS0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxRQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsVUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxJQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFVBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsTUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsS0FBYjtBQUNEO0FBQ0QsTUFBSSxPQUFKLEVBQWE7QUFDWCxXQUFPLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxPQUFiLENBQVA7QUFDRDtBQUNELE1BQUksT0FBSixFQUFhO0FBQ1gsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYixDQUFQO0FBQ0Q7QUFDRCxNQUFJLE9BQUosRUFBYSxPQUFiLEVBQXNCO0FBQ3BCLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWIsRUFBc0IsT0FBdEIsQ0FBUDtBQUNEO0FBaENzQjtrQkFBSixHIiwiZmlsZSI6ImVudi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RnVuY3Rpb25EZWNsVHJhbnNmb3JtLCBWYXJpYWJsZURlY2xUcmFuc2Zvcm0sIExldERlY2xUcmFuc2Zvcm0sIENvbnN0RGVjbFRyYW5zZm9ybSwgU3ludGF4RGVjbFRyYW5zZm9ybSwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSwgU3ludGF4UXVvdGVUcmFuc2Zvcm0sIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSwgSWZUcmFuc2Zvcm0sIEZvclRyYW5zZm9ybSwgU3dpdGNoVHJhbnNmb3JtLCBCcmVha1RyYW5zZm9ybSwgQ29udGludWVUcmFuc2Zvcm0sIERvVHJhbnNmb3JtLCBEZWJ1Z2dlclRyYW5zZm9ybSwgV2l0aFRyYW5zZm9ybSwgVHJ5VHJhbnNmb3JtLCBUaHJvd1RyYW5zZm9ybSwgTmV3VHJhbnNmb3JtLCBXaGlsZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW52IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwO1xuICAgIHRoaXMubWFwLnNldChcImZ1bmN0aW9uXCIsIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwidmFyXCIsIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwibGV0XCIsIExldERlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImNvbnN0XCIsIENvbnN0RGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwic3ludGF4UXVvdGVcIiwgU3ludGF4UXVvdGVUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInN5bnRheHJlY1wiLCBTeW50YXhyZWNEZWNsVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJzeW50YXhcIiwgU3ludGF4RGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwicmV0dXJuXCIsIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwid2hpbGVcIiwgV2hpbGVUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImlmXCIsIElmVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJmb3JcIiwgRm9yVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJzd2l0Y2hcIiwgU3dpdGNoVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJicmVha1wiLCBCcmVha1RyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiY29udGludWVcIiwgQ29udGludWVUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImRvXCIsIERvVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJkZWJ1Z2dlclwiLCBEZWJ1Z2dlclRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwid2l0aFwiLCBXaXRoVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJ0cnlcIiwgVHJ5VHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJ0aHJvd1wiLCBUaHJvd1RyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwibmV3XCIsIE5ld1RyYW5zZm9ybSk7XG4gIH1cbiAgaGFzKGtleV8zMzIpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleV8zMzIpO1xuICB9XG4gIGdldChrZXlfMzMzKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXlfMzMzKTtcbiAgfVxuICBzZXQoa2V5XzMzNCwgdmFsXzMzNSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoa2V5XzMzNCwgdmFsXzMzNSk7XG4gIH1cbn1cbiJdfQ== + /** + * Returns `true` if the first argument is greater than the second; + * `false` otherwise. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord a => a -> a -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} + * @see R.lt + * @example + * + * R.gt(2, 1); //=> true + * R.gt(2, 2); //=> false + * R.gt(2, 3); //=> false + * R.gt('a', 'z'); //=> false + * R.gt('z', 'a'); //=> true + */ + var gt = _curry2(function gt(a, b) { + return a > b; + }); -/***/ }, -/* 32 */ -/***/ function(module, exports) { + /** + * Returns `true` if the first argument is greater than or equal to the second; + * `false` otherwise. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord a => a -> a -> Boolean + * @param {Number} a + * @param {Number} b + * @return {Boolean} + * @see R.lte + * @example + * + * R.gte(2, 1); //=> true + * R.gte(2, 2); //=> true + * R.gte(2, 3); //=> false + * R.gte('a', 'z'); //=> false + * R.gte('z', 'a'); //=> true + */ + var gte = _curry2(function gte(a, b) { + return a >= b; + }); - "use strict"; + /** + * Returns whether or not an object has an own property with + * the specified name + * + * @func + * @memberOf R + * @category Object + * @sig s -> {s: x} -> Boolean + * @param {String} prop The name of the property to check for. + * @param {Object} obj The object to query. + * @return {Boolean} Whether the property exists. + * @example + * + * var hasName = R.has('name'); + * hasName({name: 'alice'}); //=> true + * hasName({name: 'bob'}); //=> true + * hasName({}); //=> false + * + * var point = {x: 0, y: 0}; + * var pointHas = R.has(R.__, point); + * pointHas('x'); //=> true + * pointHas('y'); //=> true + * pointHas('z'); //=> false + */ + var has = _curry2(_has); - Object.defineProperty(exports, "__esModule", { - value: true - }); - class FunctionDeclTransform_1433 {} - class VariableDeclTransform_1434 {} - class NewTransform_1435 {} - class ThrowTransform_1436 {} - class LetDeclTransform_1437 {} - class ConstDeclTransform_1438 {} - class TryTransform_1439 {} - class WhileTransform_1440 {} - class IfTransform_1441 {} - class ForTransform_1442 {} - class SwitchTransform_1443 {} - class BreakTransform_1444 {} - class ContinueTransform_1445 {} - class DoTransform_1446 {} - class WithTransform_1447 {} - class DebuggerTransform_1448 {} - class SyntaxrecDeclTransform_1449 {} - class SyntaxDeclTransform_1450 {} - class SyntaxQuoteTransform_1451 {} - class ReturnStatementTransform_1452 {} - class VarBindingTransform_1453 { - constructor(id_1455) { - this.id = id_1455; - } - } - class CompiletimeTransform_1454 { - constructor(value_1456) { - this.value = value_1456; - } - } - exports.FunctionDeclTransform = FunctionDeclTransform_1433; - exports.VariableDeclTransform = VariableDeclTransform_1434; - exports.NewTransform = NewTransform_1435; - exports.ThrowTransform = ThrowTransform_1436; - exports.LetDeclTransform = LetDeclTransform_1437; - exports.ConstDeclTransform = ConstDeclTransform_1438; - exports.TryTransform = TryTransform_1439; - exports.WhileTransform = WhileTransform_1440; - exports.IfTransform = IfTransform_1441; - exports.ForTransform = ForTransform_1442; - exports.SwitchTransform = SwitchTransform_1443; - exports.BreakTransform = BreakTransform_1444; - exports.ContinueTransform = ContinueTransform_1445; - exports.DoTransform = DoTransform_1446; - exports.WithTransform = WithTransform_1447; - exports.DebuggerTransform = DebuggerTransform_1448; - exports.SyntaxrecDeclTransform = SyntaxrecDeclTransform_1449; - exports.SyntaxDeclTransform = SyntaxDeclTransform_1450; - exports.SyntaxQuoteTransform = SyntaxQuoteTransform_1451; - exports.ReturnStatementTransform = ReturnStatementTransform_1452; - exports.VarBindingTransform = VarBindingTransform_1453; - exports.CompiletimeTransform = CompiletimeTransform_1454; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3RyYW5zZm9ybXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxNQUFNLDBCQUFOLENBQWlDO0FBQ2pDLE1BQU0sMEJBQU4sQ0FBaUM7QUFDakMsTUFBTSxpQkFBTixDQUF3QjtBQUN4QixNQUFNLG1CQUFOLENBQTBCO0FBQzFCLE1BQU0scUJBQU4sQ0FBNEI7QUFDNUIsTUFBTSx1QkFBTixDQUE4QjtBQUM5QixNQUFNLGlCQUFOLENBQXdCO0FBQ3hCLE1BQU0sbUJBQU4sQ0FBMEI7QUFDMUIsTUFBTSxnQkFBTixDQUF1QjtBQUN2QixNQUFNLGlCQUFOLENBQXdCO0FBQ3hCLE1BQU0sb0JBQU4sQ0FBMkI7QUFDM0IsTUFBTSxtQkFBTixDQUEwQjtBQUMxQixNQUFNLHNCQUFOLENBQTZCO0FBQzdCLE1BQU0sZ0JBQU4sQ0FBdUI7QUFDdkIsTUFBTSxrQkFBTixDQUF5QjtBQUN6QixNQUFNLHNCQUFOLENBQTZCO0FBQzdCLE1BQU0sMkJBQU4sQ0FBa0M7QUFDbEMsTUFBTSx3QkFBTixDQUErQjtBQUMvQixNQUFNLHlCQUFOLENBQWdDO0FBQ2hDLE1BQU0sNkJBQU4sQ0FBb0M7QUFDcEMsTUFBTSx3QkFBTixDQUErQjtBQUM3QixjQUFZLE9BQVosRUFBcUI7QUFDbkIsU0FBSyxFQUFMLEdBQVUsT0FBVjtBQUNEO0FBSDRCO0FBSy9CLE1BQU0seUJBQU4sQ0FBZ0M7QUFDOUIsY0FBWSxVQUFaLEVBQXdCO0FBQ3RCLFNBQUssS0FBTCxHQUFhLFVBQWI7QUFDRDtBQUg2QjtRQUtNLHFCLEdBQTlCLDBCO1FBQzhCLHFCLEdBQTlCLDBCO1FBQ3FCLFksR0FBckIsaUI7UUFDdUIsYyxHQUF2QixtQjtRQUN5QixnQixHQUF6QixxQjtRQUMyQixrQixHQUEzQix1QjtRQUNxQixZLEdBQXJCLGlCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDb0IsVyxHQUFwQixnQjtRQUNxQixZLEdBQXJCLGlCO1FBQ3dCLGUsR0FBeEIsb0I7UUFDdUIsYyxHQUF2QixtQjtRQUMwQixpQixHQUExQixzQjtRQUNvQixXLEdBQXBCLGdCO1FBQ3NCLGEsR0FBdEIsa0I7UUFDMEIsaUIsR0FBMUIsc0I7UUFDK0Isc0IsR0FBL0IsMkI7UUFDNEIsbUIsR0FBNUIsd0I7UUFDNkIsb0IsR0FBN0IseUI7UUFDaUMsd0IsR0FBakMsNkI7UUFDNEIsbUIsR0FBNUIsd0I7UUFDNkIsb0IsR0FBN0IseUIiLCJmaWxlIjoidHJhbnNmb3Jtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybV8xNDMzIHt9XG5jbGFzcyBWYXJpYWJsZURlY2xUcmFuc2Zvcm1fMTQzNCB7fVxuY2xhc3MgTmV3VHJhbnNmb3JtXzE0MzUge31cbmNsYXNzIFRocm93VHJhbnNmb3JtXzE0MzYge31cbmNsYXNzIExldERlY2xUcmFuc2Zvcm1fMTQzNyB7fVxuY2xhc3MgQ29uc3REZWNsVHJhbnNmb3JtXzE0Mzgge31cbmNsYXNzIFRyeVRyYW5zZm9ybV8xNDM5IHt9XG5jbGFzcyBXaGlsZVRyYW5zZm9ybV8xNDQwIHt9XG5jbGFzcyBJZlRyYW5zZm9ybV8xNDQxIHt9XG5jbGFzcyBGb3JUcmFuc2Zvcm1fMTQ0MiB7fVxuY2xhc3MgU3dpdGNoVHJhbnNmb3JtXzE0NDMge31cbmNsYXNzIEJyZWFrVHJhbnNmb3JtXzE0NDQge31cbmNsYXNzIENvbnRpbnVlVHJhbnNmb3JtXzE0NDUge31cbmNsYXNzIERvVHJhbnNmb3JtXzE0NDYge31cbmNsYXNzIFdpdGhUcmFuc2Zvcm1fMTQ0NyB7fVxuY2xhc3MgRGVidWdnZXJUcmFuc2Zvcm1fMTQ0OCB7fVxuY2xhc3MgU3ludGF4cmVjRGVjbFRyYW5zZm9ybV8xNDQ5IHt9XG5jbGFzcyBTeW50YXhEZWNsVHJhbnNmb3JtXzE0NTAge31cbmNsYXNzIFN5bnRheFF1b3RlVHJhbnNmb3JtXzE0NTEge31cbmNsYXNzIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybV8xNDUyIHt9XG5jbGFzcyBWYXJCaW5kaW5nVHJhbnNmb3JtXzE0NTMge1xuICBjb25zdHJ1Y3RvcihpZF8xNDU1KSB7XG4gICAgdGhpcy5pZCA9IGlkXzE0NTU7XG4gIH1cbn1cbmNsYXNzIENvbXBpbGV0aW1lVHJhbnNmb3JtXzE0NTQge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZV8xNDU2KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXzE0NTY7XG4gIH1cbn1cbmV4cG9ydCB7RnVuY3Rpb25EZWNsVHJhbnNmb3JtXzE0MzMgYXMgRnVuY3Rpb25EZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7VmFyaWFibGVEZWNsVHJhbnNmb3JtXzE0MzQgYXMgVmFyaWFibGVEZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7TmV3VHJhbnNmb3JtXzE0MzUgYXMgTmV3VHJhbnNmb3JtfTtcbmV4cG9ydCB7VGhyb3dUcmFuc2Zvcm1fMTQzNiBhcyBUaHJvd1RyYW5zZm9ybX07XG5leHBvcnQge0xldERlY2xUcmFuc2Zvcm1fMTQzNyBhcyBMZXREZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7Q29uc3REZWNsVHJhbnNmb3JtXzE0MzggYXMgQ29uc3REZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7VHJ5VHJhbnNmb3JtXzE0MzkgYXMgVHJ5VHJhbnNmb3JtfTtcbmV4cG9ydCB7V2hpbGVUcmFuc2Zvcm1fMTQ0MCBhcyBXaGlsZVRyYW5zZm9ybX07XG5leHBvcnQge0lmVHJhbnNmb3JtXzE0NDEgYXMgSWZUcmFuc2Zvcm19O1xuZXhwb3J0IHtGb3JUcmFuc2Zvcm1fMTQ0MiBhcyBGb3JUcmFuc2Zvcm19O1xuZXhwb3J0IHtTd2l0Y2hUcmFuc2Zvcm1fMTQ0MyBhcyBTd2l0Y2hUcmFuc2Zvcm19O1xuZXhwb3J0IHtCcmVha1RyYW5zZm9ybV8xNDQ0IGFzIEJyZWFrVHJhbnNmb3JtfTtcbmV4cG9ydCB7Q29udGludWVUcmFuc2Zvcm1fMTQ0NSBhcyBDb250aW51ZVRyYW5zZm9ybX07XG5leHBvcnQge0RvVHJhbnNmb3JtXzE0NDYgYXMgRG9UcmFuc2Zvcm19O1xuZXhwb3J0IHtXaXRoVHJhbnNmb3JtXzE0NDcgYXMgV2l0aFRyYW5zZm9ybX07XG5leHBvcnQge0RlYnVnZ2VyVHJhbnNmb3JtXzE0NDggYXMgRGVidWdnZXJUcmFuc2Zvcm19O1xuZXhwb3J0IHtTeW50YXhyZWNEZWNsVHJhbnNmb3JtXzE0NDkgYXMgU3ludGF4cmVjRGVjbFRyYW5zZm9ybX07XG5leHBvcnQge1N5bnRheERlY2xUcmFuc2Zvcm1fMTQ1MCBhcyBTeW50YXhEZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7U3ludGF4UXVvdGVUcmFuc2Zvcm1fMTQ1MSBhcyBTeW50YXhRdW90ZVRyYW5zZm9ybX07XG5leHBvcnQge1JldHVyblN0YXRlbWVudFRyYW5zZm9ybV8xNDUyIGFzIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybX07XG5leHBvcnQge1ZhckJpbmRpbmdUcmFuc2Zvcm1fMTQ1MyBhcyBWYXJCaW5kaW5nVHJhbnNmb3JtfTtcbmV4cG9ydCB7Q29tcGlsZXRpbWVUcmFuc2Zvcm1fMTQ1NCBhcyBDb21waWxldGltZVRyYW5zZm9ybX0iXX0= + /** + * Returns whether or not an object or its prototype chain has + * a property with the specified name + * + * @func + * @memberOf R + * @category Object + * @sig s -> {s: x} -> Boolean + * @param {String} prop The name of the property to check for. + * @param {Object} obj The object to query. + * @return {Boolean} Whether the property exists. + * @example + * + * function Rectangle(width, height) { + * this.width = width; + * this.height = height; + * } + * Rectangle.prototype.area = function() { + * return this.width * this.height; + * }; + * + * var square = new Rectangle(2, 2); + * R.hasIn('width', square); //=> true + * R.hasIn('area', square); //=> true + */ + var hasIn = _curry2(function hasIn(prop, obj) { + return prop in obj; + }); -/***/ }, -/* 33 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Returns true if its arguments are identical, false otherwise. Values are + * identical if they reference the same memory. `NaN` is identical to `NaN`; + * `0` and `-0` are not identical. + * + * @func + * @memberOf R + * @category Relation + * @sig a -> a -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} + * @example + * + * var o = {}; + * R.identical(o, o); //=> true + * R.identical(1, 1); //=> true + * R.identical(1, '1'); //=> false + * R.identical([], []); //=> false + * R.identical(0, -0); //=> false + * R.identical(NaN, NaN); //=> true + */ + // SameValue algorithm + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + // Step 6.a: NaN == NaN + var identical = _curry2(function identical(a, b) { + // SameValue algorithm + if (a === b) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return a !== 0 || 1 / a === 1 / b; + } else { + // Step 6.a: NaN == NaN + return a !== a && b !== b; + } + }); - "use strict"; + /** + * A function that does nothing but return the parameter supplied to it. Good as a default + * or placeholder function. + * + * @func + * @memberOf R + * @category Function + * @sig a -> a + * @param {*} x The value to return. + * @return {*} The input value, `x`. + * @example + * + * R.identity(1); //=> 1 + * + * var obj = {}; + * R.identity(obj) === obj; //=> true + */ + var identity = _curry1(_identity); - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.MonoidalReducer = exports.CloneReducer = undefined; - exports.default = reduce; - - var _cloneReducer = __webpack_require__(34); + /** + * Creates a function that will process either the `onTrue` or the `onFalse` function depending + * upon the result of the `condition` predicate. + * + * @func + * @memberOf R + * @category Logic + * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *) + * @param {Function} condition A predicate function + * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value. + * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value. + * @return {Function} A new unary function that will process either the `onTrue` or the `onFalse` + * function depending upon the result of the `condition` predicate. + * @example + * + * // Flatten all arrays in the list but leave other values alone. + * var flattenArrays = R.map(R.ifElse(Array.isArray, R.flatten, R.identity)); + * + * flattenArrays([[0], [[10], [8]], 1234, {}]); //=> [[0], [10, 8], 1234, {}] + * flattenArrays([[[10], 123], [8, [10]], "hello"]); //=> [[10, 123], [8, 10], "hello"] + */ + var ifElse = _curry3(function ifElse(condition, onTrue, onFalse) { + return curryN(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() { + return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments); + }); + }); - Object.defineProperty(exports, "CloneReducer", { - enumerable: true, - get: function get() { - return _cloneReducer.default; - } - }); + /** + * Increments its argument. + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number + * @param {Number} n + * @return {Number} + * @see R.dec + * @example + * + * R.inc(42); //=> 43 + */ + var inc = add(1); - var _monoidalReducer = __webpack_require__(36); + /** + * Inserts the supplied element into the list, at index `index`. _Note + * that this is not destructive_: it returns a copy of the list with the changes. + * No lists have been harmed in the application of this function. + * + * @func + * @memberOf R + * @category List + * @sig Number -> a -> [a] -> [a] + * @param {Number} index The position to insert the element + * @param {*} elt The element to insert into the Array + * @param {Array} list The list to insert into + * @return {Array} A new Array with `elt` inserted at `index`. + * @example + * + * R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4] + */ + var insert = _curry3(function insert(idx, elt, list) { + idx = idx < list.length && idx >= 0 ? idx : list.length; + var result = _slice(list); + result.splice(idx, 0, elt); + return result; + }); - Object.defineProperty(exports, "MonoidalReducer", { - enumerable: true, - get: function get() { - return _monoidalReducer.default; - } - }); + /** + * Inserts the sub-list into the list, at index `index`. _Note that this + * is not destructive_: it returns a copy of the list with the changes. + * No lists have been harmed in the application of this function. + * + * @func + * @memberOf R + * @category List + * @sig Number -> [a] -> [a] -> [a] + * @param {Number} index The position to insert the sub-list + * @param {Array} elts The sub-list to insert into the Array + * @param {Array} list The list to insert the sub-list into + * @return {Array} A new Array with `elts` inserted starting at `index`. + * @example + * + * R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4] + */ + var insertAll = _curry3(function insertAll(idx, elts, list) { + idx = idx < list.length && idx >= 0 ? idx : list.length; + return _concat(_concat(_slice(list, 0, idx), elts), _slice(list, idx)); + }); - var _shiftSpec = __webpack_require__(35); + /** + * See if an object (`val`) is an instance of the supplied constructor. + * This function will check up the inheritance chain, if any. + * + * @func + * @memberOf R + * @category Type + * @sig (* -> {*}) -> a -> Boolean + * @param {Object} ctor A constructor + * @param {*} val The value to test + * @return {Boolean} + * @example + * + * R.is(Object, {}); //=> true + * R.is(Number, 1); //=> true + * R.is(Object, 1); //=> false + * R.is(String, 's'); //=> true + * R.is(String, new String('')); //=> true + * R.is(Object, new String('')); //=> true + * R.is(Object, 's'); //=> false + * R.is(Number, {}); //=> false + */ + var is = _curry2(function is(Ctor, val) { + return val != null && val.constructor === Ctor || val instanceof Ctor; + }); - var _shiftSpec2 = _interopRequireDefault(_shiftSpec); + /** + * Tests whether or not an object is similar to an array. + * + * @func + * @memberOf R + * @category Type + * @category List + * @sig * -> Boolean + * @param {*} x The object to test. + * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise. + * @example + * + * R.isArrayLike([]); //=> true + * R.isArrayLike(true); //=> false + * R.isArrayLike({}); //=> false + * R.isArrayLike({length: 10}); //=> false + * R.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true + */ + var isArrayLike = _curry1(function isArrayLike(x) { + if (_isArray(x)) { + return true; + } + if (!x) { + return false; + } + if (typeof x !== 'object') { + return false; + } + if (x instanceof String) { + return false; + } + if (x.nodeType === 1) { + return !!x.length; + } + if (x.length === 0) { + return true; + } + if (x.length > 0) { + return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1); + } + return false; + }); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * Reports whether the list has zero elements. + * + * @func + * @memberOf R + * @category Logic + * @sig [a] -> Boolean + * @param {Array} list + * @return {Boolean} + * @example + * + * R.isEmpty([1, 2, 3]); //=> false + * R.isEmpty([]); //=> true + * R.isEmpty(''); //=> true + * R.isEmpty(null); //=> false + * R.isEmpty(R.keys({})); //=> true + * R.isEmpty({}); //=> false ({} does not have a length property) + * R.isEmpty({length: 0}); //=> true + */ + var isEmpty = _curry1(function isEmpty(list) { + return Object(list).length === 0; + }); - function transformWithSpec(transformer, node, spec) { - switch (spec.typeName) { - case "Enum": - case "String": - case "Number": - case "Boolean": - case "SourceSpan": - return node; - case "Const": - // TODO: checked version - return transformWithSpec(transformer, node, spec.argument); - case "Maybe": - return node && transformWithSpec(transformer, node, spec.argument); - case "List": - return node.map(function (e) { - return transformWithSpec(transformer, e, spec.argument); - }); - case "Union": - // TODO: checked version - return transformWithSpec(transformer, node, _shiftSpec2.default[node.type]); - default: - var state = {}; - spec.fields.forEach(function (field) { - var v = transformWithSpec(transformer, node[field.name], field.type); - state[field.name] = v == null ? null : v; - }); - if (typeof transformer["reduce" + node.type] !== "function") { - throw new Error("Encountered " + node.type + ", which the provided reducer does not handle."); - } - return transformer["reduce" + node.type](node, state); - } - } /** - * 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. - */ + /** + * Checks if the input value is `null` or `undefined`. + * + * @func + * @memberOf R + * @category Type + * @sig * -> Boolean + * @param {*} x The value to test. + * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`. + * @example + * + * R.isNil(null); //=> true + * R.isNil(undefined); //=> true + * R.isNil(0); //=> false + * R.isNil([]); //=> false + */ + var isNil = _curry1(function isNil(x) { + return x == null; + }); - function reduce(reducer, reducible) { - return transformWithSpec(reducer, reducible, _shiftSpec2.default[reducible.type]); - } + /** + * Returns a list containing the names of all the enumerable own + * properties of the supplied object. + * Note that the order of the output array is not guaranteed to be + * consistent across different JS platforms. + * + * @func + * @memberOf R + * @category Object + * @sig {k: v} -> [k] + * @param {Object} obj The object to extract properties from + * @return {Array} An array of the object's own properties. + * @example + * + * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c'] + */ + // cover IE < 9 keys issues + var keys = function () { + // cover IE < 9 keys issues + var hasEnumBug = !{ toString: null }.propertyIsEnumerable('toString'); + var nonEnumerableProps = [ + 'constructor', + 'valueOf', + 'isPrototypeOf', + 'toString', + 'propertyIsEnumerable', + 'hasOwnProperty', + 'toLocaleString' + ]; + var contains = function contains(list, item) { + var idx = 0; + while (idx < list.length) { + if (list[idx] === item) { + return true; + } + idx += 1; + } + return false; + }; + return typeof Object.keys === 'function' ? _curry1(function keys(obj) { + return Object(obj) !== obj ? [] : Object.keys(obj); + }) : _curry1(function keys(obj) { + if (Object(obj) !== obj) { + return []; + } + var prop, ks = [], nIdx; + for (prop in obj) { + if (_has(prop, obj)) { + ks[ks.length] = prop; + } + } + if (hasEnumBug) { + nIdx = nonEnumerableProps.length - 1; + while (nIdx >= 0) { + prop = nonEnumerableProps[nIdx]; + if (_has(prop, obj) && !contains(ks, prop)) { + ks[ks.length] = prop; + } + nIdx -= 1; + } + } + return ks; + }); + }(); -/***/ }, -/* 34 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Returns a list containing the names of all the + * properties of the supplied object, including prototype properties. + * Note that the order of the output array is not guaranteed to be + * consistent across different JS platforms. + * + * @func + * @memberOf R + * @category Object + * @sig {k: v} -> [k] + * @param {Object} obj The object to extract properties from + * @return {Array} An array of the object's own and prototype properties. + * @example + * + * var F = function() { this.x = 'X'; }; + * F.prototype.y = 'Y'; + * var f = new F(); + * R.keysIn(f); //=> ['x', 'y'] + */ + var keysIn = _curry1(function keysIn(obj) { + var prop, ks = []; + for (prop in obj) { + ks[ks.length] = prop; + } + return ks; + }); - "use strict"; + /** + * Returns the number of elements in the array by returning `list.length`. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> Number + * @param {Array} list The array to inspect. + * @return {Number} The length of the array. + * @example + * + * R.length([]); //=> 0 + * R.length([1, 2, 3]); //=> 3 + */ + var length = _curry1(function length(list) { + return list != null && is(Number, list.length) ? list.length : NaN; + }); - Object.defineProperty(exports, "__esModule", { - value: true - }); + /** + * Returns `true` if the first argument is less than the second; + * `false` otherwise. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord a => a -> a -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} + * @see R.gt + * @example + * + * R.lt(2, 1); //=> false + * R.lt(2, 2); //=> false + * R.lt(2, 3); //=> true + * R.lt('a', 'z'); //=> true + * R.lt('z', 'a'); //=> false + */ + var lt = _curry2(function lt(a, b) { + return a < b; + }); - var _shiftSpec = __webpack_require__(35); + /** + * Returns `true` if the first argument is less than or equal to the second; + * `false` otherwise. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord a => a -> a -> Boolean + * @param {Number} a + * @param {Number} b + * @return {Boolean} + * @see R.gte + * @example + * + * R.lte(2, 1); //=> false + * R.lte(2, 2); //=> true + * R.lte(2, 3); //=> true + * R.lte('a', 'z'); //=> true + * R.lte('z', 'a'); //=> false + */ + var lte = _curry2(function lte(a, b) { + return a <= b; + }); - var _shiftSpec2 = _interopRequireDefault(_shiftSpec); + /** + * The mapAccum function behaves like a combination of map and reduce; it applies a + * function to each element of a list, passing an accumulating parameter from left to + * right, and returning a final value of this accumulator together with the new list. + * + * The iterator function receives two arguments, *acc* and *value*, and should return + * a tuple *[acc, value]*. + * + * @func + * @memberOf R + * @category List + * @sig (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]) + * @param {Function} fn The function to be called on every element of the input `list`. + * @param {*} acc The accumulator value. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. + * @example + * + * var digits = ['1', '2', '3', '4']; + * var append = function(a, b) { + * return [a + b, a + b]; + * } + * + * R.mapAccum(append, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']] + */ + var mapAccum = _curry3(function mapAccum(fn, acc, list) { + var idx = 0, len = list.length, result = [], tuple = [acc]; + while (idx < len) { + tuple = fn(tuple[0], list[idx]); + result[idx] = tuple[1]; + idx += 1; + } + return [ + tuple[0], + result + ]; + }); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * The mapAccumRight function behaves like a combination of map and reduce; it applies a + * function to each element of a list, passing an accumulating parameter from right + * to left, and returning a final value of this accumulator together with the new list. + * + * Similar to `mapAccum`, except moves through the input list from the right to the + * left. + * + * The iterator function receives two arguments, *acc* and *value*, and should return + * a tuple *[acc, value]*. + * + * @func + * @memberOf R + * @category List + * @sig (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]) + * @param {Function} fn The function to be called on every element of the input `list`. + * @param {*} acc The accumulator value. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. + * @example + * + * var digits = ['1', '2', '3', '4']; + * var append = function(a, b) { + * return [a + b, a + b]; + * } + * + * R.mapAccumRight(append, 0, digits); //=> ['04321', ['04321', '0432', '043', '04']] + */ + var mapAccumRight = _curry3(function mapAccumRight(fn, acc, list) { + var idx = list.length - 1, result = [], tuple = [acc]; + while (idx >= 0) { + tuple = fn(tuple[0], list[idx]); + result[idx] = tuple[1]; + idx -= 1; + } + return [ + tuple[0], + result + ]; + }); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** - * 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. - */ + /** + * Tests a regular expression against a String. Note that this function + * will return an empty array when there are no matches. This differs + * from [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match) + * which returns `null` when there are no matches. + * + * @func + * @memberOf R + * @see R.test + * @category String + * @sig RegExp -> String -> [String | Undefined] + * @param {RegExp} rx A regular expression. + * @param {String} str The string to match against + * @return {Array} The list of matches or empty array. + * @example + * + * R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na'] + * R.match(/a/, 'b'); //=> [] + * R.match(/a/, null); //=> TypeError: null does not have a method named "match" + */ + var match = _curry2(function match(rx, str) { + return str.match(rx) || []; + }); - var CloneReducer = function CloneReducer() { - _classCallCheck(this, CloneReducer); - }; + /** + * mathMod behaves like the modulo operator should mathematically, unlike the `%` + * operator (and by extension, R.modulo). So while "-17 % 5" is -2, + * mathMod(-17, 5) is 3. mathMod requires Integer arguments, and returns NaN + * when the modulus is zero or negative. + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number -> Number + * @param {Number} m The dividend. + * @param {Number} p the modulus. + * @return {Number} The result of `b mod a`. + * @example + * + * R.mathMod(-17, 5); //=> 3 + * R.mathMod(17, 5); //=> 2 + * R.mathMod(17, -5); //=> NaN + * R.mathMod(17, 0); //=> NaN + * R.mathMod(17.2, 5); //=> NaN + * R.mathMod(17, 5.3); //=> NaN + * + * var clock = R.mathMod(R.__, 12); + * clock(15); //=> 3 + * clock(24); //=> 0 + * + * var seventeenMod = R.mathMod(17); + * seventeenMod(3); //=> 2 + * seventeenMod(4); //=> 1 + * seventeenMod(10); //=> 7 + */ + var mathMod = _curry2(function mathMod(m, p) { + if (!_isInteger(m)) { + return NaN; + } + if (!_isInteger(p) || p < 1) { + return NaN; + } + return (m % p + p) % p; + }); - exports.default = CloneReducer; + /** + * Returns the larger of its two arguments. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord a => a -> a -> a + * @param {*} a + * @param {*} b + * @return {*} + * @see R.maxBy, R.min + * @example + * + * R.max(789, 123); //=> 789 + * R.max('a', 'b'); //=> 'b' + */ + var max = _curry2(function max(a, b) { + return b > a ? b : a; + }); - for (var typeName in _shiftSpec2.default) { - var type = _shiftSpec2.default[typeName]; - Object.defineProperty(CloneReducer.prototype, "reduce" + typeName, { - value: function value(node, state) { - return state; - } - }); - } + /** + * Takes a function and two values, and returns whichever value produces + * the larger result when passed to the provided function. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord b => (a -> b) -> a -> a -> a + * @param {Function} f + * @param {*} a + * @param {*} b + * @return {*} + * @see R.max, R.minBy + * @example + * + * R.maxBy(function(n) { return n * n; }, -3, 2); //=> -3 + */ + var maxBy = _curry3(function maxBy(f, a, b) { + return f(b) > f(a) ? b : a; + }); -/***/ }, -/* 35 */ -/***/ function(module, exports) { + /** + * Create a new object with the own properties of `a` + * merged with the own properties of object `b`. + * + * @func + * @memberOf R + * @category Object + * @sig {k: v} -> {k: v} -> {k: v} + * @param {Object} a + * @param {Object} b + * @return {Object} + * @example + * + * R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); + * //=> { 'name': 'fred', 'age': 40 } + * + * var resetToDefault = R.merge(R.__, {x: 0}); + * resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2} + */ + var merge = _curry2(function merge(a, b) { + var result = {}; + var ks = keys(a); + var idx = 0; + while (idx < ks.length) { + result[ks[idx]] = a[ks[idx]]; + idx += 1; + } + ks = keys(b); + idx = 0; + while (idx < ks.length) { + result[ks[idx]] = b[ks[idx]]; + idx += 1; + } + return result; + }); - // Generated by src/generate-spec.js. + /** + * Returns the smaller of its two arguments. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord a => a -> a -> a + * @param {*} a + * @param {*} b + * @return {*} + * @see R.minBy, R.max + * @example + * + * R.min(789, 123); //=> 123 + * R.min('a', 'b'); //=> 'a' + */ + var min = _curry2(function min(a, b) { + return b < a ? b : a; + }); - /** - * Copyright 2015 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. - */ + /** + * Takes a function and two values, and returns whichever value produces + * the smaller result when passed to the provided function. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord b => (a -> b) -> a -> a -> a + * @param {Function} f + * @param {*} a + * @param {*} b + * @return {*} + * @see R.min, R.maxBy + * @example + * + * R.minBy(function(n) { return n * n; }, -3, 2); //=> 2 + */ + var minBy = _curry3(function minBy(f, a, b) { + return f(b) < f(a) ? b : a; + }); - // Hack to make Babel6 import this as a module. - Object.defineProperty(exports, "__esModule", { - value: true - }); + /** + * Divides the second parameter by the first and returns the remainder. + * Note that this functions preserves the JavaScript-style behavior for + * modulo. For mathematical modulo see `mathMod` + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number -> Number + * @param {Number} a The value to the divide. + * @param {Number} b The pseudo-modulus + * @return {Number} The result of `b % a`. + * @see R.mathMod + * @example + * + * R.modulo(17, 3); //=> 2 + * // JS behavior: + * R.modulo(-17, 3); //=> -2 + * R.modulo(17, -3); //=> 2 + * + * var isOdd = R.modulo(R.__, 2); + * isOdd(42); //=> 0 + * isOdd(21); //=> 1 + */ + var modulo = _curry2(function modulo(a, b) { + return a % b; + }); - // Meta data generated from spec.idl. - exports.default = (function() { - var SPEC = {}; + /** + * Multiplies two numbers. Equivalent to `a * b` but curried. + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number -> Number + * @param {Number} a The first value. + * @param {Number} b The second value. + * @return {Number} The result of `a * b`. + * @see R.divide + * @example + * + * var double = R.multiply(2); + * var triple = R.multiply(3); + * double(3); //=> 6 + * triple(4); //=> 12 + * R.multiply(2, 5); //=> 10 + */ + var multiply = _curry2(function multiply(a, b) { + return a * b; + }); - var BOOLEAN = { typeName: "Boolean" }; - var DOUBLE = { typeName: "Number" }; - var STRING = { typeName: "String" }; - function Maybe(arg) { return { typeName: "Maybe", argument: arg }; } - function List(arg) { return { typeName: "List", argument: arg }; } - function Const(arg) { return { typeName: "Const", argument: arg }; } - function Union() { return { typeName: "Union", arguments: [].slice.call(arguments, 0) }; } + /** + * Wraps a function of any arity (including nullary) in a function that accepts exactly `n` + * parameters. Any extraneous parameters will not be passed to the supplied function. + * + * @func + * @memberOf R + * @category Function + * @sig Number -> (* -> a) -> (* -> a) + * @param {Number} n The desired arity of the new function. + * @param {Function} fn The function to wrap. + * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of + * arity `n`. + * @example + * + * var takesTwoArgs = function(a, b) { + * return [a, b]; + * }; + * takesTwoArgs.length; //=> 2 + * takesTwoArgs(1, 2); //=> [1, 2] + * + * var takesOneArg = R.nAry(1, takesTwoArgs); + * takesOneArg.length; //=> 1 + * // Only `n` arguments are passed to the wrapped function + * takesOneArg(1, 2); //=> [1, undefined] + */ + var nAry = _curry2(function nAry(n, fn) { + switch (n) { + case 0: + return function () { + return fn.call(this); + }; + case 1: + return function (a0) { + return fn.call(this, a0); + }; + case 2: + return function (a0, a1) { + return fn.call(this, a0, a1); + }; + case 3: + return function (a0, a1, a2) { + return fn.call(this, a0, a1, a2); + }; + case 4: + return function (a0, a1, a2, a3) { + return fn.call(this, a0, a1, a2, a3); + }; + case 5: + return function (a0, a1, a2, a3, a4) { + return fn.call(this, a0, a1, a2, a3, a4); + }; + case 6: + return function (a0, a1, a2, a3, a4, a5) { + return fn.call(this, a0, a1, a2, a3, a4, a5); + }; + case 7: + return function (a0, a1, a2, a3, a4, a5, a6) { + return fn.call(this, a0, a1, a2, a3, a4, a5, a6); + }; + case 8: + return function (a0, a1, a2, a3, a4, a5, a6, a7) { + return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7); + }; + case 9: + return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) { + return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8); + }; + case 10: + return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); + }; + default: + throw new Error('First argument to nAry must be a non-negative integer no greater than ten'); + } + }); - var TYPE_INDICATOR = { - typeName: "Enum", - values: ["ArrayBinding", "ArrayExpression", "ArrowExpression", "AssignmentExpression", "BinaryExpression", "BindingIdentifier", "BindingProperty", "BindingPropertyIdentifier", "BindingPropertyProperty", "BindingWithDefault", "Block", "BlockStatement", "BreakStatement", "CallExpression", "CatchClause", "Class", "ClassDeclaration", "ClassElement", "ClassExpression", "CompoundAssignmentExpression", "ComputedMemberExpression", "ComputedPropertyName", "ConditionalExpression", "ContinueStatement", "DataProperty", "DebuggerStatement", "Directive", "DoWhileStatement", "EmptyStatement", "Export", "ExportAllFrom", "ExportDeclaration", "ExportDefault", "ExportFrom", "ExportSpecifier", "Expression", "ExpressionStatement", "ForInStatement", "ForOfStatement", "ForStatement", "FormalParameters", "Function", "FunctionBody", "FunctionDeclaration", "FunctionExpression", "Getter", "IdentifierExpression", "IfStatement", "Import", "ImportDeclaration", "ImportNamespace", "ImportSpecifier", "IterationStatement", "LabeledStatement", "LiteralBooleanExpression", "LiteralInfinityExpression", "LiteralNullExpression", "LiteralNumericExpression", "LiteralRegExpExpression", "LiteralStringExpression", "MemberExpression", "Method", "MethodDefinition", "Module", "NamedObjectProperty", "NewExpression", "NewTargetExpression", "Node", "ObjectBinding", "ObjectExpression", "ObjectProperty", "PropertyName", "ReturnStatement", "Script", "Setter", "ShorthandProperty", "SourceLocation", "SourceSpan", "SpreadElement", "Statement", "StaticMemberExpression", "StaticPropertyName", "Super", "SwitchCase", "SwitchDefault", "SwitchStatement", "SwitchStatementWithDefault", "TemplateElement", "TemplateExpression", "ThisExpression", "ThrowStatement", "TryCatchStatement", "TryFinallyStatement", "UnaryExpression", "UpdateExpression", "VariableDeclaration", "VariableDeclarationStatement", "VariableDeclarator", "WhileStatement", "WithStatement", "YieldExpression", "YieldGeneratorExpression"] - }; + /** + * Negates its argument. + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number + * @param {Number} n + * @return {Number} + * @example + * + * R.negate(42); //=> -42 + */ + var negate = _curry1(function negate(n) { + return -n; + }); - var VariableDeclarationKind = { - typeName: "Enum", - values: ["var", "let", "const"] - }; + /** + * A function that returns the `!` of its argument. It will return `true` when + * passed false-y value, and `false` when passed a truth-y one. + * + * @func + * @memberOf R + * @category Logic + * @sig * -> Boolean + * @param {*} a any value + * @return {Boolean} the logical inverse of passed argument. + * @see R.complement + * @example + * + * R.not(true); //=> false + * R.not(false); //=> true + * R.not(0); => true + * R.not(1); => false + */ + var not = _curry1(function not(a) { + return !a; + }); - var CompoundAssignmentOperator = { - typeName: "Enum", - values: ["+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "|=", "^=", "&="] - }; + /** + * Returns the nth element of the given list or string. + * If n is negative the element at index length + n is returned. + * + * @func + * @memberOf R + * @category List + * @sig Number -> [a] -> a | Undefined + * @sig Number -> String -> String + * @param {Number} offset + * @param {*} list + * @return {*} + * @example + * + * var list = ['foo', 'bar', 'baz', 'quux']; + * R.nth(1, list); //=> 'bar' + * R.nth(-1, list); //=> 'quux' + * R.nth(-99, list); //=> undefined + * + * R.nth('abc', 2); //=> 'c' + * R.nth('abc', 3); //=> '' + */ + var nth = _curry2(function nth(offset, list) { + var idx = offset < 0 ? list.length + offset : offset; + return _isString(list) ? list.charAt(idx) : list[idx]; + }); - var BinaryOperator = { - typeName: "Enum", - values: ["==", "!=", "===", "!==", "<", "<=", ">", ">=", "in", "instanceof", "<<", ">>", ">>>", "+", "-", "*", "/", "%", ",", "||", "&&", "|", "^", "&"] - }; + /** + * Returns a function which returns its nth argument. + * + * @func + * @memberOf R + * @category Function + * @sig Number -> *... -> * + * @param {Number} n + * @return {Function} + * @example + * + * R.nthArg(1)('a', 'b', 'c'); //=> 'b' + * R.nthArg(-1)('a', 'b', 'c'); //=> 'c' + */ + var nthArg = _curry1(function nthArg(n) { + return function () { + return nth(n, arguments); + }; + }); - var UnaryOperator = { - typeName: "Enum", - values: ["+", "-", "!", "~", "typeof", "void", "delete"] - }; + /** + * Returns the nth character of the given string. + * + * @func + * @memberOf R + * @category String + * @sig Number -> String -> String + * @param {Number} n + * @param {String} str + * @return {String} + * @deprecated since v0.16.0 + * @example + * + * R.nthChar(2, 'Ramda'); //=> 'm' + * R.nthChar(-2, 'Ramda'); //=> 'd' + */ + var nthChar = _curry2(function nthChar(n, str) { + return str.charAt(n < 0 ? str.length + n : n); + }); - var UpdateOperator = { - typeName: "Enum", - values: ["++", "--"] - }; + /** + * Returns the character code of the nth character of the given string. + * + * @func + * @memberOf R + * @category String + * @sig Number -> String -> Number + * @param {Number} n + * @param {String} str + * @return {Number} + * @deprecated since v0.16.0 + * @example + * + * R.nthCharCode(2, 'Ramda'); //=> 'm'.charCodeAt(0) + * R.nthCharCode(-2, 'Ramda'); //=> 'd'.charCodeAt(0) + */ + var nthCharCode = _curry2(function nthCharCode(n, str) { + return str.charCodeAt(n < 0 ? str.length + n : n); + }); - var SourceLocation = SPEC.SourceLocation = {}; - var SourceSpan = SPEC.SourceSpan = {}; - var BindingWithDefault = SPEC.BindingWithDefault = {}; - var BindingIdentifier = SPEC.BindingIdentifier = {}; - var ArrayBinding = SPEC.ArrayBinding = {}; - var ObjectBinding = SPEC.ObjectBinding = {}; - var BindingPropertyIdentifier = SPEC.BindingPropertyIdentifier = {}; - var BindingPropertyProperty = SPEC.BindingPropertyProperty = {}; - var ClassExpression = SPEC.ClassExpression = {}; - var ClassDeclaration = SPEC.ClassDeclaration = {}; - var ClassElement = SPEC.ClassElement = {}; - var Module = SPEC.Module = {}; - var Import = SPEC.Import = {}; - var ImportNamespace = SPEC.ImportNamespace = {}; - var ImportSpecifier = SPEC.ImportSpecifier = {}; - var ExportAllFrom = SPEC.ExportAllFrom = {}; - var ExportFrom = SPEC.ExportFrom = {}; - var Export = SPEC.Export = {}; - var ExportDefault = SPEC.ExportDefault = {}; - var ExportSpecifier = SPEC.ExportSpecifier = {}; - var Method = SPEC.Method = {}; - var Getter = SPEC.Getter = {}; - var Setter = SPEC.Setter = {}; - var DataProperty = SPEC.DataProperty = {}; - var ShorthandProperty = SPEC.ShorthandProperty = {}; - var ComputedPropertyName = SPEC.ComputedPropertyName = {}; - var StaticPropertyName = SPEC.StaticPropertyName = {}; - var LiteralBooleanExpression = SPEC.LiteralBooleanExpression = {}; - var LiteralInfinityExpression = SPEC.LiteralInfinityExpression = {}; - var LiteralNullExpression = SPEC.LiteralNullExpression = {}; - var LiteralNumericExpression = SPEC.LiteralNumericExpression = {}; - var LiteralRegExpExpression = SPEC.LiteralRegExpExpression = {}; - var LiteralStringExpression = SPEC.LiteralStringExpression = {}; - var ArrayExpression = SPEC.ArrayExpression = {}; - var ArrowExpression = SPEC.ArrowExpression = {}; - var AssignmentExpression = SPEC.AssignmentExpression = {}; - var BinaryExpression = SPEC.BinaryExpression = {}; - var CallExpression = SPEC.CallExpression = {}; - var CompoundAssignmentExpression = SPEC.CompoundAssignmentExpression = {}; - var ComputedMemberExpression = SPEC.ComputedMemberExpression = {}; - var ConditionalExpression = SPEC.ConditionalExpression = {}; - var FunctionExpression = SPEC.FunctionExpression = {}; - var IdentifierExpression = SPEC.IdentifierExpression = {}; - var NewExpression = SPEC.NewExpression = {}; - var NewTargetExpression = SPEC.NewTargetExpression = {}; - var ObjectExpression = SPEC.ObjectExpression = {}; - var UnaryExpression = SPEC.UnaryExpression = {}; - var StaticMemberExpression = SPEC.StaticMemberExpression = {}; - var TemplateExpression = SPEC.TemplateExpression = {}; - var ThisExpression = SPEC.ThisExpression = {}; - var UpdateExpression = SPEC.UpdateExpression = {}; - var YieldExpression = SPEC.YieldExpression = {}; - var YieldGeneratorExpression = SPEC.YieldGeneratorExpression = {}; - var BlockStatement = SPEC.BlockStatement = {}; - var BreakStatement = SPEC.BreakStatement = {}; - var ContinueStatement = SPEC.ContinueStatement = {}; - var DebuggerStatement = SPEC.DebuggerStatement = {}; - var DoWhileStatement = SPEC.DoWhileStatement = {}; - var EmptyStatement = SPEC.EmptyStatement = {}; - var ExpressionStatement = SPEC.ExpressionStatement = {}; - var ForInStatement = SPEC.ForInStatement = {}; - var ForOfStatement = SPEC.ForOfStatement = {}; - var ForStatement = SPEC.ForStatement = {}; - var IfStatement = SPEC.IfStatement = {}; - var LabeledStatement = SPEC.LabeledStatement = {}; - var ReturnStatement = SPEC.ReturnStatement = {}; - var SwitchStatement = SPEC.SwitchStatement = {}; - var SwitchStatementWithDefault = SPEC.SwitchStatementWithDefault = {}; - var ThrowStatement = SPEC.ThrowStatement = {}; - var TryCatchStatement = SPEC.TryCatchStatement = {}; - var TryFinallyStatement = SPEC.TryFinallyStatement = {}; - var VariableDeclarationStatement = SPEC.VariableDeclarationStatement = {}; - var WhileStatement = SPEC.WhileStatement = {}; - var WithStatement = SPEC.WithStatement = {}; - var Block = SPEC.Block = {}; - var CatchClause = SPEC.CatchClause = {}; - var Directive = SPEC.Directive = {}; - var FormalParameters = SPEC.FormalParameters = {}; - var FunctionBody = SPEC.FunctionBody = {}; - var FunctionDeclaration = SPEC.FunctionDeclaration = {}; - var Script = SPEC.Script = {}; - var SpreadElement = SPEC.SpreadElement = {}; - var Super = SPEC.Super = {}; - var SwitchCase = SPEC.SwitchCase = {}; - var SwitchDefault = SPEC.SwitchDefault = {}; - var TemplateElement = SPEC.TemplateElement = {}; - var VariableDeclaration = SPEC.VariableDeclaration = {}; - var VariableDeclarator = SPEC.VariableDeclarator = {}; - - var Class = Union(ClassExpression, ClassDeclaration); - var BindingProperty = Union(BindingPropertyIdentifier, BindingPropertyProperty); - var ExportDeclaration = Union(ExportAllFrom, ExportFrom, Export, ExportDefault); - var ImportDeclaration = Union(Import, ImportNamespace); - var MethodDefinition = Union(Method, Getter, Setter); - var NamedObjectProperty = Union(MethodDefinition, DataProperty); - var ObjectProperty = Union(NamedObjectProperty, ShorthandProperty); - var PropertyName = Union(ComputedPropertyName, StaticPropertyName); - var MemberExpression = Union(ComputedMemberExpression, StaticMemberExpression); - var Expression = Union(MemberExpression, ClassExpression, LiteralBooleanExpression, LiteralInfinityExpression, LiteralNullExpression, LiteralNumericExpression, LiteralRegExpExpression, LiteralStringExpression, ArrayExpression, ArrowExpression, AssignmentExpression, BinaryExpression, CallExpression, CompoundAssignmentExpression, ConditionalExpression, FunctionExpression, IdentifierExpression, NewExpression, NewTargetExpression, ObjectExpression, UnaryExpression, TemplateExpression, ThisExpression, UpdateExpression, YieldExpression, YieldGeneratorExpression); - var IterationStatement = Union(DoWhileStatement, ForInStatement, ForOfStatement, ForStatement, WhileStatement); - var Statement = Union(IterationStatement, ClassDeclaration, BlockStatement, BreakStatement, ContinueStatement, DebuggerStatement, EmptyStatement, ExpressionStatement, IfStatement, LabeledStatement, ReturnStatement, SwitchStatement, SwitchStatementWithDefault, ThrowStatement, TryCatchStatement, TryFinallyStatement, VariableDeclarationStatement, WithStatement, FunctionDeclaration); - var Node = Union(Statement, Expression, PropertyName, ObjectProperty, ImportDeclaration, ExportDeclaration, BindingWithDefault, BindingIdentifier, ArrayBinding, ObjectBinding, BindingProperty, ClassElement, Module, ImportSpecifier, ExportSpecifier, Block, CatchClause, Directive, FormalParameters, FunctionBody, Script, SpreadElement, Super, SwitchCase, SwitchDefault, TemplateElement, VariableDeclaration, VariableDeclarator); - var Function = Union(FunctionExpression, FunctionDeclaration); - - SourceLocation.typeName = "SourceLocation"; - SourceLocation.fields = [ - { name: "line", type: DOUBLE }, - { name: "column", type: DOUBLE }, - { name: "offset", type: DOUBLE }, - ]; + /** + * Returns a singleton array containing the value provided. + * + * Note this `of` is different from the ES6 `of`; See + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of + * + * @func + * @memberOf R + * @category Function + * @sig a -> [a] + * @param {*} x any value + * @return {Array} An array wrapping `x`. + * @example + * + * R.of(null); //=> [null] + * R.of([42]); //=> [[42]] + */ + var of = _curry1(function of(x) { + return [x]; + }); - SourceSpan.typeName = "SourceSpan"; - SourceSpan.fields = [ - { name: "source", type: Maybe(STRING) }, - { name: "start", type: SourceLocation }, - { name: "end", type: SourceLocation }, - ]; + /** + * Accepts a function `fn` and returns a function that guards invocation of `fn` such that + * `fn` can only ever be called once, no matter how many times the returned function is + * invoked. + * + * @func + * @memberOf R + * @category Function + * @sig (a... -> b) -> (a... -> b) + * @param {Function} fn The function to wrap in a call-only-once wrapper. + * @return {Function} The wrapped function. + * @example + * + * var addOneOnce = R.once(function(x){ return x + 1; }); + * addOneOnce(10); //=> 11 + * addOneOnce(addOneOnce(50)); //=> 11 + */ + var once = _curry1(function once(fn) { + var called = false, result; + return function () { + if (called) { + return result; + } + called = true; + result = fn.apply(this, arguments); + return result; + }; + }); - BindingWithDefault.typeName = "BindingWithDefault"; - BindingWithDefault.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "BindingWithDefault" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, - { name: "init", type: Expression }, - ]; + /** + * Returns the result of "setting" the portion of the given data structure + * focused by the given lens to the given value. + * + * @func + * @memberOf R + * @category Object + * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig Lens s a -> (a -> a) -> s -> s + * @param {Lens} lens + * @param {*} v + * @param {*} x + * @return {*} + * @see R.prop, R.lensIndex, R.lensProp + * @example + * + * var headLens = R.lensIndex(0); + * + * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz'] + */ + var over = function () { + var Identity = function (x) { + return { + value: x, + map: function (f) { + return Identity(f(x)); + } + }; + }; + return _curry3(function over(lens, f, x) { + return lens(function (y) { + return Identity(f(y)); + })(x).value; + }); + }(); - BindingIdentifier.typeName = "BindingIdentifier"; - BindingIdentifier.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "BindingIdentifier" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: STRING }, - ]; + /** + * Retrieve the value at a given path. + * + * @func + * @memberOf R + * @category Object + * @sig [String] -> {k: v} -> v | Undefined + * @param {Array} path The path to use. + * @return {*} The data at `path`. + * @example + * + * R.path(['a', 'b'], {a: {b: 2}}); //=> 2 + * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined + */ + var path = _curry2(function path(paths, obj) { + if (obj == null) { + return; + } else { + var val = obj; + for (var idx = 0, len = paths.length; idx < len && val != null; idx += 1) { + val = val[paths[idx]]; + } + return val; + } + }); - ArrayBinding.typeName = "ArrayBinding"; - ArrayBinding.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ArrayBinding" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "elements", type: List(Maybe(Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault))) }, - { name: "restElement", type: Maybe(Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression)) }, - ]; + /** + * Returns a partial copy of an object containing only the keys specified. If the key does not exist, the + * property is ignored. + * + * @func + * @memberOf R + * @category Object + * @sig [k] -> {k: v} -> {k: v} + * @param {Array} names an array of String property names to copy onto a new object + * @param {Object} obj The object to copy from + * @return {Object} A new object with only properties from `names` on it. + * @see R.omit + * @example + * + * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} + * R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1} + */ + var pick = _curry2(function pick(names, obj) { + var result = {}; + var idx = 0; + while (idx < names.length) { + if (names[idx] in obj) { + result[names[idx]] = obj[names[idx]]; + } + idx += 1; + } + return result; + }); - ObjectBinding.typeName = "ObjectBinding"; - ObjectBinding.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ObjectBinding" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "properties", type: List(BindingProperty) }, - ]; + /** + * Similar to `pick` except that this one includes a `key: undefined` pair for properties that don't exist. + * + * @func + * @memberOf R + * @category Object + * @sig [k] -> {k: v} -> {k: v} + * @param {Array} names an array of String property names to copy onto a new object + * @param {Object} obj The object to copy from + * @return {Object} A new object with only properties from `names` on it. + * @see R.pick + * @example + * + * R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4} + * R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined} + */ + var pickAll = _curry2(function pickAll(names, obj) { + var result = {}; + var idx = 0; + var len = names.length; + while (idx < len) { + var name = names[idx]; + result[name] = obj[name]; + idx += 1; + } + return result; + }); - BindingPropertyIdentifier.typeName = "BindingPropertyIdentifier"; - BindingPropertyIdentifier.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "BindingPropertyIdentifier" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "binding", type: BindingIdentifier }, - { name: "init", type: Maybe(Expression) }, - ]; + /** + * Returns a partial copy of an object containing only the keys that + * satisfy the supplied predicate. + * + * @func + * @memberOf R + * @category Object + * @sig (v, k -> Boolean) -> {k: v} -> {k: v} + * @param {Function} pred A predicate to determine whether or not a key + * should be included on the output object. + * @param {Object} obj The object to copy from + * @return {Object} A new object with only properties that satisfy `pred` + * on it. + * @see R.pick + * @example + * + * var isUpperCase = function(val, key) { return key.toUpperCase() === key; } + * R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4} + */ + var pickBy = _curry2(function pickBy(test, obj) { + var result = {}; + for (var prop in obj) { + if (test(obj[prop], prop, obj)) { + result[prop] = obj[prop]; + } + } + return result; + }); - BindingPropertyProperty.typeName = "BindingPropertyProperty"; - BindingPropertyProperty.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "BindingPropertyProperty" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: PropertyName }, - { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault) }, - ]; + /** + * Returns a new list with the given element at the front, followed by the contents of the + * list. + * + * @func + * @memberOf R + * @category List + * @sig a -> [a] -> [a] + * @param {*} el The item to add to the head of the output list. + * @param {Array} list The array to add to the tail of the output list. + * @return {Array} A new array. + * @see R.append + * @example + * + * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum'] + */ + var prepend = _curry2(function prepend(el, list) { + return _concat([el], list); + }); - ClassExpression.typeName = "ClassExpression"; - ClassExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ClassExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: Maybe(BindingIdentifier) }, - { name: "super", type: Maybe(Expression) }, - { name: "elements", type: List(ClassElement) }, - ]; + /** + * Returns a function that when supplied an object returns the indicated property of that object, if it exists. + * + * @func + * @memberOf R + * @category Object + * @sig s -> {s: a} -> a | Undefined + * @param {String} p The property name + * @param {Object} obj The object to query + * @return {*} The value at `obj.p`. + * @example + * + * R.prop('x', {x: 100}); //=> 100 + * R.prop('x', {}); //=> undefined + */ + var prop = _curry2(function prop(p, obj) { + return obj[p]; + }); - ClassDeclaration.typeName = "ClassDeclaration"; - ClassDeclaration.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ClassDeclaration" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: BindingIdentifier }, - { name: "super", type: Maybe(Expression) }, - { name: "elements", type: List(ClassElement) }, - ]; + /** + * If the given, non-null object has an own property with the specified name, + * returns the value of that property. + * Otherwise returns the provided default value. + * + * @func + * @memberOf R + * @category Object + * @sig a -> String -> Object -> a + * @param {*} val The default value. + * @param {String} p The name of the property to return. + * @param {Object} obj The object to query. + * @return {*} The value of given property of the supplied object or the default value. + * @example + * + * var alice = { + * name: 'ALICE', + * age: 101 + * }; + * var favorite = R.prop('favoriteLibrary'); + * var favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary'); + * + * favorite(alice); //=> undefined + * favoriteWithDefault(alice); //=> 'Ramda' + */ + var propOr = _curry3(function propOr(val, p, obj) { + return obj != null && _has(p, obj) ? obj[p] : val; + }); - ClassElement.typeName = "ClassElement"; - ClassElement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ClassElement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "isStatic", type: BOOLEAN }, - { name: "method", type: MethodDefinition }, - ]; + /** + * Returns `true` if the specified object property satisfies the given + * predicate; `false` otherwise. + * + * @func + * @memberOf R + * @category Logic + * @sig (a -> Boolean) -> String -> {String: a} -> Boolean + * @param {Function} pred + * @param {String} name + * @param {*} obj + * @return {Boolean} + * @see R.propEq + * @see R.propIs + * @example + * + * R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true + */ + var propSatisfies = _curry3(function propSatisfies(pred, name, obj) { + return pred(obj[name]); + }); - Module.typeName = "Module"; - Module.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Module" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "directives", type: List(Directive) }, - { name: "items", type: List(Union(ImportDeclaration, ExportDeclaration, Statement)) }, - ]; + /** + * Acts as multiple `prop`: array of keys in, array of values out. Preserves order. + * + * @func + * @memberOf R + * @category Object + * @sig [k] -> {k: v} -> [v] + * @param {Array} ps The property names to fetch + * @param {Object} obj The object to query + * @return {Array} The corresponding values or partially applied function. + * @example + * + * R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2] + * R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2] + * + * var fullName = R.compose(R.join(' '), R.props(['first', 'last'])); + * fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth' + */ + var props = _curry2(function props(ps, obj) { + var len = ps.length; + var out = []; + var idx = 0; + while (idx < len) { + out[idx] = obj[ps[idx]]; + idx += 1; + } + return out; + }); - Import.typeName = "Import"; - Import.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Import" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "moduleSpecifier", type: STRING }, - { name: "defaultBinding", type: Maybe(BindingIdentifier) }, - { name: "namedImports", type: List(ImportSpecifier) }, - ]; + /** + * Returns a list of numbers from `from` (inclusive) to `to` + * (exclusive). + * + * @func + * @memberOf R + * @category List + * @sig Number -> Number -> [Number] + * @param {Number} from The first number in the list. + * @param {Number} to One more than the last number in the list. + * @return {Array} The list of numbers in tthe set `[a, b)`. + * @example + * + * R.range(1, 5); //=> [1, 2, 3, 4] + * R.range(50, 53); //=> [50, 51, 52] + */ + var range = _curry2(function range(from, to) { + if (!(_isNumber(from) && _isNumber(to))) { + throw new TypeError('Both arguments to range must be numbers'); + } + var result = []; + var n = from; + while (n < to) { + result.push(n); + n += 1; + } + return result; + }); - ImportNamespace.typeName = "ImportNamespace"; - ImportNamespace.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ImportNamespace" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "moduleSpecifier", type: STRING }, - { name: "defaultBinding", type: Maybe(BindingIdentifier) }, - { name: "namespaceBinding", type: BindingIdentifier }, - ]; - - ImportSpecifier.typeName = "ImportSpecifier"; - ImportSpecifier.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ImportSpecifier" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: Maybe(STRING) }, - { name: "binding", type: BindingIdentifier }, - ]; - - ExportAllFrom.typeName = "ExportAllFrom"; - ExportAllFrom.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ExportAllFrom" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "moduleSpecifier", type: STRING }, - ]; - - ExportFrom.typeName = "ExportFrom"; - ExportFrom.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ExportFrom" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "namedExports", type: List(ExportSpecifier) }, - { name: "moduleSpecifier", type: Maybe(STRING) }, - ]; - - Export.typeName = "Export"; - Export.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Export" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "declaration", type: Union(FunctionDeclaration, ClassDeclaration, VariableDeclaration) }, - ]; + /** + * Returns a single item by iterating through the list, successively calling the iterator + * function and passing it an accumulator value and the current value from the array, and + * then passing the result to the next call. + * + * Similar to `reduce`, except moves through the input list from the right to the left. + * + * The iterator function receives two values: *(acc, value)* + * + * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse arrays), unlike + * the native `Array.prototype.reduce` method. For more details on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description + * + * @func + * @memberOf R + * @category List + * @sig (a,b -> a) -> a -> [b] -> a + * @param {Function} fn The iterator function. Receives two values, the accumulator and the + * current element from the array. + * @param {*} acc The accumulator value. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. + * @example + * + * var pairs = [ ['a', 1], ['b', 2], ['c', 3] ]; + * var flattenPairs = function(acc, pair) { + * return acc.concat(pair); + * }; + * + * R.reduceRight(flattenPairs, [], pairs); //=> [ 'c', 3, 'b', 2, 'a', 1 ] + */ + var reduceRight = _curry3(function reduceRight(fn, acc, list) { + var idx = list.length - 1; + while (idx >= 0) { + acc = fn(acc, list[idx]); + idx -= 1; + } + return acc; + }); - ExportDefault.typeName = "ExportDefault"; - ExportDefault.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ExportDefault" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "body", type: Union(FunctionDeclaration, ClassDeclaration, Expression) }, - ]; + /** + * Returns a value wrapped to indicate that it is the final value of the + * reduce and transduce functions. The returned value + * should be considered a black box: the internal structure is not + * guaranteed to be stable. + * + * Note: this optimization is unavailable to functions not explicitly listed + * above. For instance, it is not currently supported by reduceIndexed, + * reduceRight, or reduceRightIndexed. + * + * @func + * @memberOf R + * @category List + * @see R.reduce, R.transduce + * @sig a -> * + * @param {*} x The final value of the reduce. + * @return {*} The wrapped value. + * @example + * + * R.reduce( + * R.pipe(R.add, R.ifElse(R.lte(10), R.reduced, R.identity)), + * 0, + * [1, 2, 3, 4, 5]) // 10 + */ + var reduced = _curry1(_reduced); - ExportSpecifier.typeName = "ExportSpecifier"; - ExportSpecifier.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ExportSpecifier" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: Maybe(STRING) }, - { name: "exportedName", type: STRING }, - ]; + /** + * Removes the sub-list of `list` starting at index `start` and containing + * `count` elements. _Note that this is not destructive_: it returns a + * copy of the list with the changes. + * No lists have been harmed in the application of this function. + * + * @func + * @memberOf R + * @category List + * @sig Number -> Number -> [a] -> [a] + * @param {Number} start The position to start removing elements + * @param {Number} count The number of elements to remove + * @param {Array} list The list to remove from + * @return {Array} A new Array with `count` elements from `start` removed. + * @example + * + * R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8] + */ + var remove = _curry3(function remove(start, count, list) { + return _concat(_slice(list, 0, Math.min(start, list.length)), _slice(list, Math.min(list.length, start + count))); + }); - Method.typeName = "Method"; - Method.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Method" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: PropertyName }, - { name: "isGenerator", type: BOOLEAN }, - { name: "params", type: FormalParameters }, - { name: "body", type: FunctionBody }, - ]; + /** + * Replace a substring or regex match in a string with a replacement. + * + * @func + * @memberOf R + * @category String + * @sig RegExp|String -> String -> String -> String + * @param {RegExp|String} pattern A regular expression or a substring to match. + * @param {String} replacement The string to replace the matches with. + * @param {String} str The String to do the search and replacement in. + * @return {String} The result. + * @example + * + * R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo' + * R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo' + * + * // Use the "g" (global) flag to replace all occurrences: + * R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar' + */ + var replace = _curry3(function replace(regex, replacement, str) { + return str.replace(regex, replacement); + }); - Getter.typeName = "Getter"; - Getter.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Getter" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: PropertyName }, - { name: "body", type: FunctionBody }, - ]; + /** + * Returns a new list with the same elements as the original list, just + * in the reverse order. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [a] + * @param {Array} list The list to reverse. + * @return {Array} A copy of the list in reverse order. + * @example + * + * R.reverse([1, 2, 3]); //=> [3, 2, 1] + * R.reverse([1, 2]); //=> [2, 1] + * R.reverse([1]); //=> [1] + * R.reverse([]); //=> [] + */ + var reverse = _curry1(function reverse(list) { + return _slice(list).reverse(); + }); - Setter.typeName = "Setter"; - Setter.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Setter" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: PropertyName }, - { name: "param", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault) }, - { name: "body", type: FunctionBody }, - ]; + /** + * Scan is similar to reduce, but returns a list of successively reduced values from the left + * + * @func + * @memberOf R + * @category List + * @sig (a,b -> a) -> a -> [b] -> [a] + * @param {Function} fn The iterator function. Receives two values, the accumulator and the + * current element from the array + * @param {*} acc The accumulator value. + * @param {Array} list The list to iterate over. + * @return {Array} A list of all intermediately reduced values. + * @example + * + * var numbers = [1, 2, 3, 4]; + * var factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24] + */ + var scan = _curry3(function scan(fn, acc, list) { + var idx = 0, len = list.length, result = [acc]; + while (idx < len) { + acc = fn(acc, list[idx]); + result[idx + 1] = acc; + idx += 1; + } + return result; + }); - DataProperty.typeName = "DataProperty"; - DataProperty.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "DataProperty" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: PropertyName }, - { name: "expression", type: Expression }, - ]; + /** + * Returns the result of "setting" the portion of the given data structure + * focused by the given lens to the given value. + * + * @func + * @memberOf R + * @category Object + * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig Lens s a -> a -> s -> s + * @param {Lens} lens + * @param {*} v + * @param {*} x + * @return {*} + * @see R.prop, R.lensIndex, R.lensProp + * @example + * + * var xLens = R.lensProp('x'); + * + * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} + * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2} + */ + var set = _curry3(function set(lens, v, x) { + return over(lens, always(v), x); + }); - ShorthandProperty.typeName = "ShorthandProperty"; - ShorthandProperty.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ShorthandProperty" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: STRING }, - ]; + /** + * Returns a copy of the list, sorted according to the comparator function, which should accept two values at a + * time and return a negative number if the first value is smaller, a positive number if it's larger, and zero + * if they are equal. Please note that this is a **copy** of the list. It does not modify the original. + * + * @func + * @memberOf R + * @category List + * @sig (a,a -> Number) -> [a] -> [a] + * @param {Function} comparator A sorting function :: a -> b -> Int + * @param {Array} list The list to sort + * @return {Array} a new array with its elements sorted by the comparator function. + * @example + * + * var diff = function(a, b) { return a - b; }; + * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7] + */ + var sort = _curry2(function sort(comparator, list) { + return _slice(list).sort(comparator); + }); - ComputedPropertyName.typeName = "ComputedPropertyName"; - ComputedPropertyName.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ComputedPropertyName" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "expression", type: Expression }, - ]; + /** + * Sorts the list according to the supplied function. + * + * @func + * @memberOf R + * @category Relation + * @sig Ord b => (a -> b) -> [a] -> [a] + * @param {Function} fn + * @param {Array} list The list to sort. + * @return {Array} A new list sorted by the keys generated by `fn`. + * @example + * + * var sortByFirstItem = R.sortBy(prop(0)); + * var sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name'))); + * var pairs = [[-1, 1], [-2, 2], [-3, 3]]; + * sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]] + * var alice = { + * name: 'ALICE', + * age: 101 + * }; + * var bob = { + * name: 'Bob', + * age: -10 + * }; + * var clara = { + * name: 'clara', + * age: 314.159 + * }; + * var people = [clara, bob, alice]; + * sortByNameCaseInsensitive(people); //=> [alice, bob, clara] + */ + var sortBy = _curry2(function sortBy(fn, list) { + return _slice(list).sort(function (a, b) { + var aa = fn(a); + var bb = fn(b); + return aa < bb ? -1 : aa > bb ? 1 : 0; + }); + }); - StaticPropertyName.typeName = "StaticPropertyName"; - StaticPropertyName.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "StaticPropertyName" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "value", type: STRING }, - ]; + /** + * Subtracts two numbers. Equivalent to `a - b` but curried. + * + * @func + * @memberOf R + * @category Math + * @sig Number -> Number -> Number + * @param {Number} a The first value. + * @param {Number} b The second value. + * @return {Number} The result of `a - b`. + * @see R.add + * @example + * + * R.subtract(10, 8); //=> 2 + * + * var minus5 = R.subtract(R.__, 5); + * minus5(17); //=> 12 + * + * var complementaryAngle = R.subtract(90); + * complementaryAngle(30); //=> 60 + * complementaryAngle(72); //=> 18 + */ + var subtract = _curry2(function subtract(a, b) { + return a - b; + }); - LiteralBooleanExpression.typeName = "LiteralBooleanExpression"; - LiteralBooleanExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralBooleanExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "value", type: BOOLEAN }, - ]; + /** + * Returns a new list containing the last `n` elements of a given list, passing each value + * to the supplied predicate function, and terminating when the predicate function returns + * `false`. Excludes the element that caused the predicate function to fail. The predicate + * function is passed one argument: *(value)*. + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> [a] + * @param {Function} fn The function called per iteration. + * @param {Array} list The collection to iterate over. + * @return {Array} A new array. + * @see R.dropLastWhile + * @example + * + * var isNotOne = function(x) { + * return !(x === 1); + * }; + * + * R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4] + */ + var takeLastWhile = _curry2(function takeLastWhile(fn, list) { + var idx = list.length - 1; + while (idx >= 0 && fn(list[idx])) { + idx -= 1; + } + return _slice(list, idx + 1, Infinity); + }); - LiteralInfinityExpression.typeName = "LiteralInfinityExpression"; - LiteralInfinityExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralInfinityExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - ]; + /** + * Runs the given function with the supplied object, then returns the object. + * + * @func + * @memberOf R + * @category Function + * @sig (a -> *) -> a -> a + * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away. + * @param {*} x + * @return {*} `x`. + * @example + * + * var sayX = function(x) { console.log('x is ' + x); }; + * R.tap(sayX, 100); //=> 100 + * //-> 'x is 100' + */ + var tap = _curry2(function tap(fn, x) { + fn(x); + return x; + }); - LiteralNullExpression.typeName = "LiteralNullExpression"; - LiteralNullExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralNullExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - ]; + /** + * Determines whether a given string matches a given regular expression. + * + * @func + * @memberOf R + * @see R.match + * @category String + * @sig RegExp -> String -> Boolean + * @param {RegExp} pattern + * @param {String} str + * @return {Boolean} + * @example + * + * R.test(/^x/, 'xyz'); //=> true + * R.test(/^y/, 'xyz'); //=> false + */ + var test = _curry2(function test(pattern, str) { + return _cloneRegExp(pattern).test(str); + }); - LiteralNumericExpression.typeName = "LiteralNumericExpression"; - LiteralNumericExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralNumericExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "value", type: DOUBLE }, - ]; + /** + * Calls an input function `n` times, returning an array containing the results of those + * function calls. + * + * `fn` is passed one argument: The current value of `n`, which begins at `0` and is + * gradually incremented to `n - 1`. + * + * @func + * @memberOf R + * @category List + * @sig (i -> a) -> i -> [a] + * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`. + * @param {Number} n A value between `0` and `n - 1`. Increments after each function call. + * @return {Array} An array containing the return values of all calls to `fn`. + * @example + * + * R.times(R.identity, 5); //=> [0, 1, 2, 3, 4] + */ + var times = _curry2(function times(fn, n) { + var len = Number(n); + var list = new Array(len); + var idx = 0; + while (idx < len) { + list[idx] = fn(idx); + idx += 1; + } + return list; + }); - LiteralRegExpExpression.typeName = "LiteralRegExpExpression"; - LiteralRegExpExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralRegExpExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "pattern", type: STRING }, - { name: "flags", type: STRING }, - ]; + /** + * Converts an object into an array of key, value arrays. + * Only the object's own properties are used. + * Note that the order of the output array is not guaranteed to be + * consistent across different JS platforms. + * + * @func + * @memberOf R + * @category Object + * @sig {String: *} -> [[String,*]] + * @param {Object} obj The object to extract from + * @return {Array} An array of key, value arrays from the object's own properties. + * @see R.fromPairs + * @example + * + * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]] + */ + var toPairs = _curry1(function toPairs(obj) { + var pairs = []; + for (var prop in obj) { + if (_has(prop, obj)) { + pairs[pairs.length] = [ + prop, + obj[prop] + ]; + } + } + return pairs; + }); - LiteralStringExpression.typeName = "LiteralStringExpression"; - LiteralStringExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "LiteralStringExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "value", type: STRING }, - ]; - - ArrayExpression.typeName = "ArrayExpression"; - ArrayExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ArrayExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "elements", type: List(Maybe(Union(SpreadElement, Expression))) }, - ]; - - ArrowExpression.typeName = "ArrowExpression"; - ArrowExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ArrowExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "params", type: FormalParameters }, - { name: "body", type: Union(FunctionBody, Expression) }, - ]; - - AssignmentExpression.typeName = "AssignmentExpression"; - AssignmentExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "AssignmentExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, - { name: "expression", type: Expression }, - ]; - - BinaryExpression.typeName = "BinaryExpression"; - BinaryExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "BinaryExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "operator", type: BinaryOperator }, - { name: "left", type: Expression }, - { name: "right", type: Expression }, - ]; + /** + * Converts an object into an array of key, value arrays. + * The object's own properties and prototype properties are used. + * Note that the order of the output array is not guaranteed to be + * consistent across different JS platforms. + * + * @func + * @memberOf R + * @category Object + * @sig {String: *} -> [[String,*]] + * @param {Object} obj The object to extract from + * @return {Array} An array of key, value arrays from the object's own + * and prototype properties. + * @example + * + * var F = function() { this.x = 'X'; }; + * F.prototype.y = 'Y'; + * var f = new F(); + * R.toPairsIn(f); //=> [['x','X'], ['y','Y']] + */ + var toPairsIn = _curry1(function toPairsIn(obj) { + var pairs = []; + for (var prop in obj) { + pairs[pairs.length] = [ + prop, + obj[prop] + ]; + } + return pairs; + }); - CallExpression.typeName = "CallExpression"; - CallExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "CallExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "callee", type: Union(Expression, Super) }, - { name: "arguments", type: List(Union(SpreadElement, Expression)) }, - ]; + /** + * Removes (strips) whitespace from both ends of the string. + * + * @func + * @memberOf R + * @category String + * @sig String -> String + * @param {String} str The string to trim. + * @return {String} Trimmed version of `str`. + * @example + * + * R.trim(' xyz '); //=> 'xyz' + * R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z'] + */ + var trim = function () { + var ws = '\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + '\u2029\uFEFF'; + var zeroWidth = '\u200B'; + var hasProtoTrim = typeof String.prototype.trim === 'function'; + if (!hasProtoTrim || (ws.trim() || !zeroWidth.trim())) { + return _curry1(function trim(str) { + var beginRx = new RegExp('^[' + ws + '][' + ws + ']*'); + var endRx = new RegExp('[' + ws + '][' + ws + ']*$'); + return str.replace(beginRx, '').replace(endRx, ''); + }); + } else { + return _curry1(function trim(str) { + return str.trim(); + }); + } + }(); - CompoundAssignmentExpression.typeName = "CompoundAssignmentExpression"; - CompoundAssignmentExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "CompoundAssignmentExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "operator", type: CompoundAssignmentOperator }, - { name: "binding", type: Union(BindingIdentifier, MemberExpression) }, - { name: "expression", type: Expression }, - ]; + /** + * Gives a single-word string description of the (native) type of a value, returning such + * answers as 'Object', 'Number', 'Array', or 'Null'. Does not attempt to distinguish user + * Object types any further, reporting them all as 'Object'. + * + * @func + * @memberOf R + * @category Type + * @sig (* -> {*}) -> String + * @param {*} val The value to test + * @return {String} + * @example + * + * R.type({}); //=> "Object" + * R.type(1); //=> "Number" + * R.type(false); //=> "Boolean" + * R.type('s'); //=> "String" + * R.type(null); //=> "Null" + * R.type([]); //=> "Array" + * R.type(/[A-z]/); //=> "RegExp" + */ + var type = _curry1(function type(val) { + return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1); + }); - ComputedMemberExpression.typeName = "ComputedMemberExpression"; - ComputedMemberExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ComputedMemberExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "object", type: Union(Expression, Super) }, - { name: "expression", type: Expression }, - ]; + /** + * Takes a function `fn`, which takes a single array argument, and returns + * a function which: + * + * - takes any number of positional arguments; + * - passes these arguments to `fn` as an array; and + * - returns the result. + * + * In other words, R.unapply derives a variadic function from a function + * which takes an array. R.unapply is the inverse of R.apply. + * + * @func + * @memberOf R + * @category Function + * @sig ([*...] -> a) -> (*... -> a) + * @param {Function} fn + * @return {Function} + * @see R.apply + * @example + * + * R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]' + */ + var unapply = _curry1(function unapply(fn) { + return function () { + return fn(_slice(arguments)); + }; + }); - ConditionalExpression.typeName = "ConditionalExpression"; - ConditionalExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ConditionalExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "test", type: Expression }, - { name: "consequent", type: Expression }, - { name: "alternate", type: Expression }, - ]; + /** + * Wraps a function of any arity (including nullary) in a function that accepts exactly 1 + * parameter. Any extraneous parameters will not be passed to the supplied function. + * + * @func + * @memberOf R + * @category Function + * @sig (* -> b) -> (a -> b) + * @param {Function} fn The function to wrap. + * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of + * arity 1. + * @example + * + * var takesTwoArgs = function(a, b) { + * return [a, b]; + * }; + * takesTwoArgs.length; //=> 2 + * takesTwoArgs(1, 2); //=> [1, 2] + * + * var takesOneArg = R.unary(takesTwoArgs); + * takesOneArg.length; //=> 1 + * // Only 1 argument is passed to the wrapped function + * takesOneArg(1, 2); //=> [1, undefined] + */ + var unary = _curry1(function unary(fn) { + return nAry(1, fn); + }); - FunctionExpression.typeName = "FunctionExpression"; - FunctionExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "FunctionExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "isGenerator", type: BOOLEAN }, - { name: "name", type: Maybe(BindingIdentifier) }, - { name: "params", type: FormalParameters }, - { name: "body", type: FunctionBody }, - ]; + /** + * Returns a function of arity `n` from a (manually) curried function. + * + * @func + * @memberOf R + * @category Function + * @sig Number -> (a -> b) -> (a -> c) + * @param {Number} length The arity for the returned function. + * @param {Function} fn The function to uncurry. + * @return {Function} A new function. + * @see R.curry + * @example + * + * var addFour = function(a) { + * return function(b) { + * return function(c) { + * return function(d) { + * return a + b + c + d; + * }; + * }; + * }; + * }; + * + * var uncurriedAddFour = R.uncurryN(4, addFour); + * curriedAddFour(1, 2, 3, 4); //=> 10 + */ + var uncurryN = _curry2(function uncurryN(depth, fn) { + return curryN(depth, function () { + var currentDepth = 1; + var value = fn; + var idx = 0; + var endIdx; + while (currentDepth <= depth && typeof value === 'function') { + endIdx = currentDepth === depth ? arguments.length : idx + value.length; + value = value.apply(this, _slice(arguments, idx, endIdx)); + currentDepth += 1; + idx = endIdx; + } + return value; + }); + }); - IdentifierExpression.typeName = "IdentifierExpression"; - IdentifierExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "IdentifierExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "name", type: STRING }, - ]; + /** + * Builds a list from a seed value. Accepts an iterator function, which returns either false + * to stop iteration or an array of length 2 containing the value to add to the resulting + * list and the seed to be used in the next call to the iterator function. + * + * The iterator function receives one argument: *(seed)*. + * + * @func + * @memberOf R + * @category List + * @sig (a -> [b]) -> * -> [b] + * @param {Function} fn The iterator function. receives one argument, `seed`, and returns + * either false to quit iteration or an array of length two to proceed. The element + * at index 0 of this array will be added to the resulting array, and the element + * at index 1 will be passed to the next call to `fn`. + * @param {*} seed The seed value. + * @return {Array} The final list. + * @example + * + * var f = function(n) { return n > 50 ? false : [-n, n + 10] }; + * R.unfold(f, 10); //=> [-10, -20, -30, -40, -50] + */ + var unfold = _curry2(function unfold(fn, seed) { + var pair = fn(seed); + var result = []; + while (pair && pair.length) { + result[result.length] = pair[0]; + pair = fn(pair[1]); + } + return result; + }); - NewExpression.typeName = "NewExpression"; - NewExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "NewExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "callee", type: Expression }, - { name: "arguments", type: List(Union(SpreadElement, Expression)) }, - ]; + /** + * Returns a new list containing only one copy of each element in the original list, based + * upon the value returned by applying the supplied predicate to two list elements. Prefers + * the first item if two items compare equal based on the predicate. + * + * @func + * @memberOf R + * @category List + * @sig (a, a -> Boolean) -> [a] -> [a] + * @param {Function} pred A predicate used to test whether two items are equal. + * @param {Array} list The array to consider. + * @return {Array} The list of unique items. + * @example + * + * var strEq = function(a, b) { return String(a) === String(b); }; + * R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2] + * R.uniqWith(strEq)([{}, {}]); //=> [{}] + * R.uniqWith(strEq)([1, '1', 1]); //=> [1] + * R.uniqWith(strEq)(['1', 1, 1]); //=> ['1'] + */ + var uniqWith = _curry2(function uniqWith(pred, list) { + var idx = 0, len = list.length; + var result = [], item; + while (idx < len) { + item = list[idx]; + if (!_containsWith(pred, item, result)) { + result[result.length] = item; + } + idx += 1; + } + return result; + }); - NewTargetExpression.typeName = "NewTargetExpression"; - NewTargetExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "NewTargetExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - ]; + /** + * Returns a new copy of the array with the element at the + * provided index replaced with the given value. + * @see R.adjust + * + * @func + * @memberOf R + * @category List + * @sig Number -> a -> [a] -> [a] + * @param {Number} idx The index to update. + * @param {*} x The value to exist at the given index of the returned array. + * @param {Array|Arguments} list The source array-like object to be updated. + * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`. + * @example + * + * R.update(1, 11, [0, 1, 2]); //=> [0, 11, 2] + * R.update(1)(11)([0, 1, 2]); //=> [0, 11, 2] + */ + var update = _curry3(function update(idx, x, list) { + return adjust(always(x), idx, list); + }); - ObjectExpression.typeName = "ObjectExpression"; - ObjectExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ObjectExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "properties", type: List(ObjectProperty) }, - ]; + /** + * Returns a list of all the enumerable own properties of the supplied object. + * Note that the order of the output array is not guaranteed across + * different JS platforms. + * + * @func + * @memberOf R + * @category Object + * @sig {k: v} -> [v] + * @param {Object} obj The object to extract values from + * @return {Array} An array of the values of the object's own properties. + * @example + * + * R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3] + */ + var values = _curry1(function values(obj) { + var props = keys(obj); + var len = props.length; + var vals = []; + var idx = 0; + while (idx < len) { + vals[idx] = obj[props[idx]]; + idx += 1; + } + return vals; + }); - UnaryExpression.typeName = "UnaryExpression"; - UnaryExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "UnaryExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "operator", type: UnaryOperator }, - { name: "operand", type: Expression }, - ]; + /** + * Returns a list of all the properties, including prototype properties, + * of the supplied object. + * Note that the order of the output array is not guaranteed to be + * consistent across different JS platforms. + * + * @func + * @memberOf R + * @category Object + * @sig {k: v} -> [v] + * @param {Object} obj The object to extract values from + * @return {Array} An array of the values of the object's own and prototype properties. + * @example + * + * var F = function() { this.x = 'X'; }; + * F.prototype.y = 'Y'; + * var f = new F(); + * R.valuesIn(f); //=> ['X', 'Y'] + */ + var valuesIn = _curry1(function valuesIn(obj) { + var prop, vs = []; + for (prop in obj) { + vs[vs.length] = obj[prop]; + } + return vs; + }); - StaticMemberExpression.typeName = "StaticMemberExpression"; - StaticMemberExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "StaticMemberExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "object", type: Union(Expression, Super) }, - { name: "property", type: STRING }, - ]; + /** + * Returns a "view" of the given data structure, determined by the given lens. + * The lens's focus determines which portion of the data structure is visible. + * + * @func + * @memberOf R + * @category Object + * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig Lens s a -> s -> a + * @param {Lens} lens + * @param {*} x + * @return {*} + * @see R.prop, R.lensIndex, R.lensProp + * @example + * + * var xLens = R.lensProp('x'); + * + * R.view(xLens, {x: 1, y: 2}); //=> 1 + * R.view(xLens, {x: 4, y: 2}); //=> 4 + */ + var view = function () { + var Const = function (x) { + return { + value: x, + map: function () { + return this; + } + }; + }; + return _curry2(function view(lens, x) { + return lens(Const)(x).value; + }); + }(); - TemplateExpression.typeName = "TemplateExpression"; - TemplateExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "TemplateExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "tag", type: Maybe(Expression) }, - { name: "elements", type: List(Union(Expression, TemplateElement)) }, - ]; + /** + * Takes a spec object and a test object; returns true if the test satisfies + * the spec. Each of the spec's own properties must be a predicate function. + * Each predicate is applied to the value of the corresponding property of + * the test object. `where` returns true if all the predicates return true, + * false otherwise. + * + * `where` is well suited to declaratively expressing constraints for other + * functions such as `filter` and `find`. + * + * @func + * @memberOf R + * @category Object + * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean + * @param {Object} spec + * @param {Object} testObj + * @return {Boolean} + * @example + * + * // pred :: Object -> Boolean + * var pred = R.where({ + * a: R.equals('foo'), + * b: R.complement(R.equals('bar')), + * x: R.gt(_, 10), + * y: R.lt(_, 20) + * }); + * + * pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true + * pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false + * pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false + * pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false + * pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false + */ + var where = _curry2(function where(spec, testObj) { + for (var prop in spec) { + if (_has(prop, spec) && !spec[prop](testObj[prop])) { + return false; + } + } + return true; + }); - ThisExpression.typeName = "ThisExpression"; - ThisExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ThisExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - ]; - - UpdateExpression.typeName = "UpdateExpression"; - UpdateExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "UpdateExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "isPrefix", type: BOOLEAN }, - { name: "operator", type: UpdateOperator }, - { name: "operand", type: Union(BindingIdentifier, MemberExpression) }, - ]; - - YieldExpression.typeName = "YieldExpression"; - YieldExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "YieldExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "expression", type: Maybe(Expression) }, - ]; - - YieldGeneratorExpression.typeName = "YieldGeneratorExpression"; - YieldGeneratorExpression.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "YieldGeneratorExpression" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "expression", type: Expression }, - ]; - - BlockStatement.typeName = "BlockStatement"; - BlockStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "BlockStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "block", type: Block }, - ]; - - BreakStatement.typeName = "BreakStatement"; - BreakStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "BreakStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "label", type: Maybe(STRING) }, - ]; - - ContinueStatement.typeName = "ContinueStatement"; - ContinueStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ContinueStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "label", type: Maybe(STRING) }, - ]; + /** + * Wrap a function inside another to allow you to make adjustments to the parameters, or do + * other processing either before the internal function is called or with its results. + * + * @func + * @memberOf R + * @category Function + * @sig (a... -> b) -> ((a... -> b) -> a... -> c) -> (a... -> c) + * @param {Function} fn The function to wrap. + * @param {Function} wrapper The wrapper function. + * @return {Function} The wrapped function. + * @example + * + * var greet = function(name) {return 'Hello ' + name;}; + * + * var shoutedGreet = R.wrap(greet, function(gr, name) { + * return gr(name).toUpperCase(); + * }); + * shoutedGreet("Kathy"); //=> "HELLO KATHY" + * + * var shortenedGreet = R.wrap(greet, function(gr, name) { + * return gr(name.substring(0, 3)); + * }); + * shortenedGreet("Robert"); //=> "Hello Rob" + */ + var wrap = _curry2(function wrap(fn, wrapper) { + return curryN(fn.length, function () { + return wrapper.apply(this, _concat([fn], arguments)); + }); + }); - DebuggerStatement.typeName = "DebuggerStatement"; - DebuggerStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "DebuggerStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - ]; + /** + * Creates a new list out of the two supplied by creating each possible + * pair from the lists. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [b] -> [[a,b]] + * @param {Array} as The first list. + * @param {Array} bs The second list. + * @return {Array} The list made by combining each possible pair from + * `as` and `bs` into pairs (`[a, b]`). + * @example + * + * R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] + */ + // = xprodWith(prepend); (takes about 3 times as long...) + var xprod = _curry2(function xprod(a, b) { + // = xprodWith(prepend); (takes about 3 times as long...) + var idx = 0; + var ilen = a.length; + var j; + var jlen = b.length; + var result = []; + while (idx < ilen) { + j = 0; + while (j < jlen) { + result[result.length] = [ + a[idx], + b[j] + ]; + j += 1; + } + idx += 1; + } + return result; + }); - DoWhileStatement.typeName = "DoWhileStatement"; - DoWhileStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "DoWhileStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "body", type: Statement }, - { name: "test", type: Expression }, - ]; + /** + * Creates a new list out of the two supplied by pairing up + * equally-positioned items from both lists. The returned list is + * truncated to the length of the shorter of the two input lists. + * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [b] -> [[a,b]] + * @param {Array} list1 The first array to consider. + * @param {Array} list2 The second array to consider. + * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`. + * @example + * + * R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']] + */ + var zip = _curry2(function zip(a, b) { + var rv = []; + var idx = 0; + var len = Math.min(a.length, b.length); + while (idx < len) { + rv[idx] = [ + a[idx], + b[idx] + ]; + idx += 1; + } + return rv; + }); - EmptyStatement.typeName = "EmptyStatement"; - EmptyStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "EmptyStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - ]; + /** + * Creates a new object out of a list of keys and a list of values. + * + * @func + * @memberOf R + * @category List + * @sig [String] -> [*] -> {String: *} + * @param {Array} keys The array that will be properties on the output object. + * @param {Array} values The list of values on the output object. + * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`. + * @example + * + * R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3} + */ + var zipObj = _curry2(function zipObj(keys, values) { + var idx = 0, len = keys.length, out = {}; + while (idx < len) { + out[keys[idx]] = values[idx]; + idx += 1; + } + return out; + }); - ExpressionStatement.typeName = "ExpressionStatement"; - ExpressionStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ExpressionStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "expression", type: Expression }, - ]; + /** + * Creates a new list out of the two supplied by applying the function to + * each equally-positioned pair in the lists. The returned list is + * truncated to the length of the shorter of the two input lists. + * + * @function + * @memberOf R + * @category List + * @sig (a,b -> c) -> [a] -> [b] -> [c] + * @param {Function} fn The function used to combine the two elements into one value. + * @param {Array} list1 The first array to consider. + * @param {Array} list2 The second array to consider. + * @return {Array} The list made by combining same-indexed elements of `list1` and `list2` + * using `fn`. + * @example + * + * var f = function(x, y) { + * // ... + * }; + * R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']); + * //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')] + */ + var zipWith = _curry3(function zipWith(fn, a, b) { + var rv = [], idx = 0, len = Math.min(a.length, b.length); + while (idx < len) { + rv[idx] = fn(a[idx], b[idx]); + idx += 1; + } + return rv; + }); - ForInStatement.typeName = "ForInStatement"; - ForInStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ForInStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "left", type: Union(VariableDeclaration, ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, - { name: "right", type: Expression }, - { name: "body", type: Statement }, - ]; + /** + * A function that always returns `false`. Any passed in parameters are ignored. + * + * @func + * @memberOf R + * @category Function + * @sig * -> false + * @return {Boolean} false + * @see R.always, R.T + * @example + * + * R.F(); //=> false + */ + var F = always(false); - ForOfStatement.typeName = "ForOfStatement"; - ForOfStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ForOfStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "left", type: Union(VariableDeclaration, ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, - { name: "right", type: Expression }, - { name: "body", type: Statement }, - ]; + /** + * A function that always returns `true`. Any passed in parameters are ignored. + * + * @func + * @memberOf R + * @category Function + * @sig * -> true + * @return {Boolean} `true`. + * @see R.always, R.F + * @example + * + * R.T(); //=> true + */ + var T = always(true); - ForStatement.typeName = "ForStatement"; - ForStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ForStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "init", type: Maybe(Union(VariableDeclaration, Expression)) }, - { name: "test", type: Maybe(Expression) }, - { name: "update", type: Maybe(Expression) }, - { name: "body", type: Statement }, - ]; + /** + * Similar to hasMethod, this checks whether a function has a [methodname] + * function. If it isn't an array it will execute that function otherwise it will + * default to the ramda implementation. + * + * @private + * @param {Function} fn ramda implemtation + * @param {String} methodname property to check for a custom implementation + * @return {Object} Whatever the return value of the method is. + */ + var _checkForMethod = function _checkForMethod(methodname, fn) { + return function () { + var length = arguments.length; + if (length === 0) { + return fn(); + } + var obj = arguments[length - 1]; + return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, _slice(arguments, 0, length - 1)); + }; + }; - IfStatement.typeName = "IfStatement"; - IfStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "IfStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "test", type: Expression }, - { name: "consequent", type: Statement }, - { name: "alternate", type: Maybe(Statement) }, - ]; + /** + * Copies an object. + * + * @private + * @param {*} value The value to be copied + * @param {Array} refFrom Array containing the source references + * @param {Array} refTo Array containing the copied source references + * @return {*} The copied value. + */ + var _clone = function _clone(value, refFrom, refTo) { + var copy = function copy(copiedValue) { + var len = refFrom.length; + var idx = 0; + while (idx < len) { + if (value === refFrom[idx]) { + return refTo[idx]; + } + idx += 1; + } + refFrom[idx + 1] = value; + refTo[idx + 1] = copiedValue; + for (var key in value) { + copiedValue[key] = _clone(value[key], refFrom, refTo); + } + return copiedValue; + }; + switch (type(value)) { + case 'Object': + return copy({}); + case 'Array': + return copy([]); + case 'Date': + return new Date(value); + case 'RegExp': + return _cloneRegExp(value); + default: + return value; + } + }; - LabeledStatement.typeName = "LabeledStatement"; - LabeledStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "LabeledStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "label", type: STRING }, - { name: "body", type: Statement }, - ]; + var _createPartialApplicator = function _createPartialApplicator(concat) { + return function (fn) { + var args = _slice(arguments, 1); + return _arity(Math.max(0, fn.length - args.length), function () { + return fn.apply(this, concat(args, arguments)); + }); + }; + }; - ReturnStatement.typeName = "ReturnStatement"; - ReturnStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ReturnStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "expression", type: Maybe(Expression) }, - ]; + /** + * Returns a function that dispatches with different strategies based on the + * object in list position (last argument). If it is an array, executes [fn]. + * Otherwise, if it has a function with [methodname], it will execute that + * function (functor case). Otherwise, if it is a transformer, uses transducer + * [xf] to return a new transformer (transducer case). Otherwise, it will + * default to executing [fn]. + * + * @private + * @param {String} methodname property to check for a custom implementation + * @param {Function} xf transducer to initialize if object is transformer + * @param {Function} fn default ramda implementation + * @return {Function} A function that dispatches on object in list position + */ + var _dispatchable = function _dispatchable(methodname, xf, fn) { + return function () { + var length = arguments.length; + if (length === 0) { + return fn(); + } + var obj = arguments[length - 1]; + if (!_isArray(obj)) { + var args = _slice(arguments, 0, length - 1); + if (typeof obj[methodname] === 'function') { + return obj[methodname].apply(obj, args); + } + if (_isTransformer(obj)) { + var transducer = xf.apply(null, args); + return transducer(obj); + } + } + return fn.apply(this, arguments); + }; + }; - SwitchStatement.typeName = "SwitchStatement"; - SwitchStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "discriminant", type: Expression }, - { name: "cases", type: List(SwitchCase) }, - ]; + // The algorithm used to handle cyclic structures is + // inspired by underscore's isEqual + // RegExp equality algorithm: http://stackoverflow.com/a/10776635 + var _equals = function _equals(a, b, stackA, stackB) { + var typeA = type(a); + if (typeA !== type(b)) { + return false; + } + if (typeA === 'Boolean' || typeA === 'Number' || typeA === 'String') { + return typeof a === 'object' ? typeof b === 'object' && identical(a.valueOf(), b.valueOf()) : identical(a, b); + } + if (identical(a, b)) { + return true; + } + if (typeA === 'RegExp') { + // RegExp equality algorithm: http://stackoverflow.com/a/10776635 + return a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode; + } + if (Object(a) === a) { + if (typeA === 'Date' && a.getTime() !== b.getTime()) { + return false; + } + var keysA = keys(a); + if (keysA.length !== keys(b).length) { + return false; + } + var idx = stackA.length - 1; + while (idx >= 0) { + if (stackA[idx] === a) { + return stackB[idx] === b; + } + idx -= 1; + } + stackA[stackA.length] = a; + stackB[stackB.length] = b; + idx = keysA.length - 1; + while (idx >= 0) { + var key = keysA[idx]; + if (!_has(key, b) || !_equals(b[key], a[key], stackA, stackB)) { + return false; + } + idx -= 1; + } + stackA.pop(); + stackB.pop(); + return true; + } + return false; + }; - SwitchStatementWithDefault.typeName = "SwitchStatementWithDefault"; - SwitchStatementWithDefault.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchStatementWithDefault" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "discriminant", type: Expression }, - { name: "preDefaultCases", type: List(SwitchCase) }, - { name: "defaultCase", type: SwitchDefault }, - { name: "postDefaultCases", type: List(SwitchCase) }, - ]; + /** + * Private function that determines whether or not a provided object has a given method. + * Does not ignore methods stored on the object's prototype chain. Used for dynamically + * dispatching Ramda methods to non-Array objects. + * + * @private + * @param {String} methodName The name of the method to check for. + * @param {Object} obj The object to test. + * @return {Boolean} `true` has a given method, `false` otherwise. + * @example + * + * var person = { name: 'John' }; + * person.shout = function() { alert(this.name); }; + * + * _hasMethod('shout', person); //=> true + * _hasMethod('foo', person); //=> false + */ + var _hasMethod = function _hasMethod(methodName, obj) { + return obj != null && !_isArray(obj) && typeof obj[methodName] === 'function'; + }; - ThrowStatement.typeName = "ThrowStatement"; - ThrowStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "ThrowStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "expression", type: Expression }, - ]; + /** + * `_makeFlat` is a helper function that returns a one-level or fully recursive function + * based on the flag passed in. + * + * @private + */ + var _makeFlat = function _makeFlat(recursive) { + return function flatt(list) { + var value, result = [], idx = 0, j, ilen = list.length, jlen; + while (idx < ilen) { + if (isArrayLike(list[idx])) { + value = recursive ? flatt(list[idx]) : list[idx]; + j = 0; + jlen = value.length; + while (j < jlen) { + result[result.length] = value[j]; + j += 1; + } + } else { + result[result.length] = list[idx]; + } + idx += 1; + } + return result; + }; + }; - TryCatchStatement.typeName = "TryCatchStatement"; - TryCatchStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "TryCatchStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "body", type: Block }, - { name: "catchClause", type: CatchClause }, - ]; - - TryFinallyStatement.typeName = "TryFinallyStatement"; - TryFinallyStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "TryFinallyStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "body", type: Block }, - { name: "catchClause", type: Maybe(CatchClause) }, - { name: "finalizer", type: Block }, - ]; + var _reduce = function () { + function _arrayReduce(xf, acc, list) { + var idx = 0, len = list.length; + while (idx < len) { + acc = xf['@@transducer/step'](acc, list[idx]); + if (acc && acc['@@transducer/reduced']) { + acc = acc['@@transducer/value']; + break; + } + idx += 1; + } + return xf['@@transducer/result'](acc); + } + function _iterableReduce(xf, acc, iter) { + var step = iter.next(); + while (!step.done) { + acc = xf['@@transducer/step'](acc, step.value); + if (acc && acc['@@transducer/reduced']) { + acc = acc['@@transducer/value']; + break; + } + step = iter.next(); + } + return xf['@@transducer/result'](acc); + } + function _methodReduce(xf, acc, obj) { + return xf['@@transducer/result'](obj.reduce(bind(xf['@@transducer/step'], xf), acc)); + } + var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator'; + return function _reduce(fn, acc, list) { + if (typeof fn === 'function') { + fn = _xwrap(fn); + } + if (isArrayLike(list)) { + return _arrayReduce(fn, acc, list); + } + if (typeof list.reduce === 'function') { + return _methodReduce(fn, acc, list); + } + if (list[symIterator] != null) { + return _iterableReduce(fn, acc, list[symIterator]()); + } + if (typeof list.next === 'function') { + return _iterableReduce(fn, acc, list); + } + throw new TypeError('reduce: list must be array or iterable'); + }; + }(); - VariableDeclarationStatement.typeName = "VariableDeclarationStatement"; - VariableDeclarationStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "VariableDeclarationStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "declaration", type: VariableDeclaration }, - ]; + var _stepCat = function () { + var _stepCatArray = { + '@@transducer/init': Array, + '@@transducer/step': function (xs, x) { + return _concat(xs, [x]); + }, + '@@transducer/result': _identity + }; + var _stepCatString = { + '@@transducer/init': String, + '@@transducer/step': function (a, b) { + return a + b; + }, + '@@transducer/result': _identity + }; + var _stepCatObject = { + '@@transducer/init': Object, + '@@transducer/step': function (result, input) { + return merge(result, isArrayLike(input) ? createMapEntry(input[0], input[1]) : input); + }, + '@@transducer/result': _identity + }; + return function _stepCat(obj) { + if (_isTransformer(obj)) { + return obj; + } + if (isArrayLike(obj)) { + return _stepCatArray; + } + if (typeof obj === 'string') { + return _stepCatString; + } + if (typeof obj === 'object') { + return _stepCatObject; + } + throw new Error('Cannot create transformer for ' + obj); + }; + }(); - WhileStatement.typeName = "WhileStatement"; - WhileStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "WhileStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "test", type: Expression }, - { name: "body", type: Statement }, - ]; + var _xall = function () { + function XAll(f, xf) { + this.xf = xf; + this.f = f; + this.all = true; + } + XAll.prototype['@@transducer/init'] = _xfBase.init; + XAll.prototype['@@transducer/result'] = function (result) { + if (this.all) { + result = this.xf['@@transducer/step'](result, true); + } + return this.xf['@@transducer/result'](result); + }; + XAll.prototype['@@transducer/step'] = function (result, input) { + if (!this.f(input)) { + this.all = false; + result = _reduced(this.xf['@@transducer/step'](result, false)); + } + return result; + }; + return _curry2(function _xall(f, xf) { + return new XAll(f, xf); + }); + }(); - WithStatement.typeName = "WithStatement"; - WithStatement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "WithStatement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "object", type: Expression }, - { name: "body", type: Statement }, - ]; + var _xany = function () { + function XAny(f, xf) { + this.xf = xf; + this.f = f; + this.any = false; + } + XAny.prototype['@@transducer/init'] = _xfBase.init; + XAny.prototype['@@transducer/result'] = function (result) { + if (!this.any) { + result = this.xf['@@transducer/step'](result, false); + } + return this.xf['@@transducer/result'](result); + }; + XAny.prototype['@@transducer/step'] = function (result, input) { + if (this.f(input)) { + this.any = true; + result = _reduced(this.xf['@@transducer/step'](result, true)); + } + return result; + }; + return _curry2(function _xany(f, xf) { + return new XAny(f, xf); + }); + }(); - Block.typeName = "Block"; - Block.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Block" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "statements", type: List(Statement) }, - ]; + var _xdrop = function () { + function XDrop(n, xf) { + this.xf = xf; + this.n = n; + } + XDrop.prototype['@@transducer/init'] = _xfBase.init; + XDrop.prototype['@@transducer/result'] = _xfBase.result; + XDrop.prototype['@@transducer/step'] = function (result, input) { + if (this.n > 0) { + this.n -= 1; + return result; + } + return this.xf['@@transducer/step'](result, input); + }; + return _curry2(function _xdrop(n, xf) { + return new XDrop(n, xf); + }); + }(); - CatchClause.typeName = "CatchClause"; - CatchClause.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "CatchClause" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, - { name: "body", type: Block }, - ]; + var _xdropWhile = function () { + function XDropWhile(f, xf) { + this.xf = xf; + this.f = f; + } + XDropWhile.prototype['@@transducer/init'] = _xfBase.init; + XDropWhile.prototype['@@transducer/result'] = _xfBase.result; + XDropWhile.prototype['@@transducer/step'] = function (result, input) { + if (this.f) { + if (this.f(input)) { + return result; + } + this.f = null; + } + return this.xf['@@transducer/step'](result, input); + }; + return _curry2(function _xdropWhile(f, xf) { + return new XDropWhile(f, xf); + }); + }(); - Directive.typeName = "Directive"; - Directive.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Directive" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "rawValue", type: STRING }, - ]; + var _xgroupBy = function () { + function XGroupBy(f, xf) { + this.xf = xf; + this.f = f; + this.inputs = {}; + } + XGroupBy.prototype['@@transducer/init'] = _xfBase.init; + XGroupBy.prototype['@@transducer/result'] = function (result) { + var key; + for (key in this.inputs) { + if (_has(key, this.inputs)) { + result = this.xf['@@transducer/step'](result, this.inputs[key]); + if (result['@@transducer/reduced']) { + result = result['@@transducer/value']; + break; + } + } + } + return this.xf['@@transducer/result'](result); + }; + XGroupBy.prototype['@@transducer/step'] = function (result, input) { + var key = this.f(input); + this.inputs[key] = this.inputs[key] || [ + key, + [] + ]; + this.inputs[key][1] = append(input, this.inputs[key][1]); + return result; + }; + return _curry2(function _xgroupBy(f, xf) { + return new XGroupBy(f, xf); + }); + }(); - FormalParameters.typeName = "FormalParameters"; - FormalParameters.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "FormalParameters" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "items", type: List(Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression, BindingWithDefault)) }, - { name: "rest", type: Maybe(BindingIdentifier) }, - ]; + /** + * Creates a new list iteration function from an existing one by adding two new parameters + * to its callback function: the current index, and the entire list. + * + * This would turn, for instance, Ramda's simple `map` function into one that more closely + * resembles `Array.prototype.map`. Note that this will only work for functions in which + * the iteration callback function is the first parameter, and where the list is the last + * parameter. (This latter might be unimportant if the list parameter is not used.) + * + * @func + * @memberOf R + * @category Function + * @category List + * @sig ((a ... -> b) ... -> [a] -> *) -> (a ..., Int, [a] -> b) ... -> [a] -> *) + * @param {Function} fn A list iteration function that does not pass index or list to its callback + * @return {Function} An altered list iteration function that passes (item, index, list) to its callback + * @example + * + * var mapIndexed = R.addIndex(R.map); + * mapIndexed(function(val, idx) {return idx + '-' + val;}, ['f', 'o', 'o', 'b', 'a', 'r']); + * //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r'] + */ + var addIndex = _curry1(function addIndex(fn) { + return curryN(fn.length, function () { + var idx = 0; + var origFn = arguments[0]; + var list = arguments[arguments.length - 1]; + var args = _slice(arguments); + args[0] = function () { + var result = origFn.apply(this, _concat(arguments, [ + idx, + list + ])); + idx += 1; + return result; + }; + return fn.apply(this, args); + }); + }); - FunctionBody.typeName = "FunctionBody"; - FunctionBody.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "FunctionBody" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "directives", type: List(Directive) }, - { name: "statements", type: List(Statement) }, - ]; + /** + * Returns `true` if all elements of the list match the predicate, `false` if there are any + * that don't. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is satisfied by every element, `false` + * otherwise. + * @see R.any, R.none + * @example + * + * var lessThan2 = R.flip(R.lt)(2); + * var lessThan3 = R.flip(R.lt)(3); + * R.all(lessThan2)([1, 2]); //=> false + * R.all(lessThan3)([1, 2]); //=> true + */ + var all = _curry2(_dispatchable('all', _xall, function all(fn, list) { + var idx = 0; + while (idx < list.length) { + if (!fn(list[idx])) { + return false; + } + idx += 1; + } + return true; + })); - FunctionDeclaration.typeName = "FunctionDeclaration"; - FunctionDeclaration.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "FunctionDeclaration" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "isGenerator", type: BOOLEAN }, - { name: "name", type: BindingIdentifier }, - { name: "params", type: FormalParameters }, - { name: "body", type: FunctionBody }, - ]; + /** + * A function that returns the first argument if it's falsy otherwise the second + * argument. Note that this is NOT short-circuited, meaning that if expressions + * are passed they are both evaluated. + * + * Dispatches to the `and` method of the first argument if applicable. + * + * @func + * @memberOf R + * @category Logic + * @sig * -> * -> * + * @param {*} a any value + * @param {*} b any other value + * @return {*} the first argument if falsy otherwise the second argument. + * @see R.both + * @example + * + * R.and(false, true); //=> false + * R.and(0, []); //=> 0 + * R.and(null, ''); => null + */ + var and = _curry2(function and(a, b) { + return _hasMethod('and', a) ? a.and(b) : a && b; + }); - Script.typeName = "Script"; - Script.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Script" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "directives", type: List(Directive) }, - { name: "statements", type: List(Statement) }, - ]; + /** + * Returns `true` if at least one of elements of the list match the predicate, `false` + * otherwise. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false` + * otherwise. + * @see R.all, R.none + * @example + * + * var lessThan0 = R.flip(R.lt)(0); + * var lessThan2 = R.flip(R.lt)(2); + * R.any(lessThan0)([1, 2]); //=> false + * R.any(lessThan2)([1, 2]); //=> true + */ + var any = _curry2(_dispatchable('any', _xany, function any(fn, list) { + var idx = 0; + while (idx < list.length) { + if (fn(list[idx])) { + return true; + } + idx += 1; + } + return false; + })); - SpreadElement.typeName = "SpreadElement"; - SpreadElement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "SpreadElement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "expression", type: Expression }, - ]; + /** + * Wraps a function of any arity (including nullary) in a function that accepts exactly 2 + * parameters. Any extraneous parameters will not be passed to the supplied function. + * + * @func + * @memberOf R + * @category Function + * @sig (* -> c) -> (a, b -> c) + * @param {Function} fn The function to wrap. + * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of + * arity 2. + * @example + * + * var takesThreeArgs = function(a, b, c) { + * return [a, b, c]; + * }; + * takesThreeArgs.length; //=> 3 + * takesThreeArgs(1, 2, 3); //=> [1, 2, 3] + * + * var takesTwoArgs = R.binary(takesThreeArgs); + * takesTwoArgs.length; //=> 2 + * // Only 2 arguments are passed to the wrapped function + * takesTwoArgs(1, 2, 3); //=> [1, 2, undefined] + */ + var binary = _curry1(function binary(fn) { + return nAry(2, fn); + }); - Super.typeName = "Super"; - Super.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "Super" }, - { name: "loc", type: Maybe(SourceSpan) }, - ]; + /** + * Creates a deep copy of the value which may contain (nested) `Array`s and + * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are + * not copied, but assigned by their reference. + * + * @func + * @memberOf R + * @category Object + * @sig {*} -> {*} + * @param {*} value The object or array to clone + * @return {*} A new object or array. + * @example + * + * var objects = [{}, {}, {}]; + * var objectsClone = R.clone(objects); + * objects[0] === objectsClone[0]; //=> false + */ + var clone = _curry1(function clone(value) { + return _clone(value, [], []); + }); - SwitchCase.typeName = "SwitchCase"; - SwitchCase.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchCase" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "test", type: Expression }, - { name: "consequent", type: List(Statement) }, - ]; + /** + * Returns a new list consisting of the elements of the first list followed by the elements + * of the second. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [a] -> [a] + * @param {Array} list1 The first list to merge. + * @param {Array} list2 The second set to merge. + * @return {Array} A new array consisting of the contents of `list1` followed by the + * contents of `list2`. If, instead of an Array for `list1`, you pass an + * object with a `concat` method on it, `concat` will call `list1.concat` + * and pass it the value of `list2`. + * + * @example + * + * R.concat([], []); //=> [] + * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3] + * R.concat('ABC', 'DEF'); // 'ABCDEF' + */ + var concat = _curry2(function concat(set1, set2) { + if (_isArray(set2)) { + return _concat(set1, set2); + } else if (_hasMethod('concat', set1)) { + return set1.concat(set2); + } else { + throw new TypeError('can\'t concat ' + typeof set1); + } + }); - SwitchDefault.typeName = "SwitchDefault"; - SwitchDefault.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "SwitchDefault" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "consequent", type: List(Statement) }, - ]; - - TemplateElement.typeName = "TemplateElement"; - TemplateElement.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "TemplateElement" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "rawValue", type: STRING }, - ]; - - VariableDeclaration.typeName = "VariableDeclaration"; - VariableDeclaration.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "VariableDeclaration" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "kind", type: VariableDeclarationKind }, - { name: "declarators", type: List(VariableDeclarator) }, - ]; - - VariableDeclarator.typeName = "VariableDeclarator"; - VariableDeclarator.fields = [ - { name: "type", type: Const(TYPE_INDICATOR), value: "VariableDeclarator" }, - { name: "loc", type: Maybe(SourceSpan) }, - { name: "binding", type: Union(ObjectBinding, ArrayBinding, BindingIdentifier, MemberExpression) }, - { name: "init", type: Maybe(Expression) }, - ]; - - return SPEC; - }()); - - -/***/ }, -/* 36 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - 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; }; }(); - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; /** - * 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. - */ - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _shiftSpec = __webpack_require__(35); - - var _shiftSpec2 = _interopRequireDefault(_shiftSpec); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * Returns a curried equivalent of the provided function. The curried + * function has two unusual capabilities. First, its arguments needn't + * be provided one at a time. If `f` is a ternary function and `g` is + * `R.curry(f)`, the following are equivalent: + * + * - `g(1)(2)(3)` + * - `g(1)(2, 3)` + * - `g(1, 2)(3)` + * - `g(1, 2, 3)` + * + * Secondly, the special placeholder value `R.__` may be used to specify + * "gaps", allowing partial application of any combination of arguments, + * regardless of their positions. If `g` is as above and `_` is `R.__`, + * the following are equivalent: + * + * - `g(1, 2, 3)` + * - `g(_, 2, 3)(1)` + * - `g(_, _, 3)(1)(2)` + * - `g(_, _, 3)(1, 2)` + * - `g(_, 2)(1)(3)` + * - `g(_, 2)(1, 3)` + * - `g(_, 2)(_, 3)(1)` + * + * @func + * @memberOf R + * @category Function + * @sig (* -> a) -> (* -> a) + * @param {Function} fn The function to curry. + * @return {Function} A new, curried function. + * @see R.curryN + * @example + * + * var addFourNumbers = function(a, b, c, d) { + * return a + b + c + d; + * }; + * + * var curriedAddFourNumbers = R.curry(addFourNumbers); + * var f = curriedAddFourNumbers(1, 2); + * var g = f(3); + * g(4); //=> 10 + */ + var curry = _curry1(function curry(fn) { + return curryN(fn.length, fn); + }); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + /** + * Returns a new list containing the last `n` elements of a given list, passing each value + * to the supplied predicate function, skipping elements while the predicate function returns + * `true`. The predicate function is passed one argument: *(value)*. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> [a] + * @param {Function} fn The function called per iteration. + * @param {Array} list The collection to iterate over. + * @return {Array} A new array. + * @see R.takeWhile + * @example + * + * var lteTwo = function(x) { + * return x <= 2; + * }; + * + * R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1] + */ + var dropWhile = _curry2(_dispatchable('dropWhile', _xdropWhile, function dropWhile(pred, list) { + var idx = 0, len = list.length; + while (idx < len && pred(list[idx])) { + idx += 1; + } + return _slice(list, idx); + })); - var methods = {}; + /** + * Returns `true` if its arguments are equivalent, `false` otherwise. + * Dispatches to an `equals` method if present. Handles cyclical data + * structures. + * + * @func + * @memberOf R + * @category Relation + * @sig a -> b -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} + * @example + * + * R.equals(1, 1); //=> true + * R.equals(1, '1'); //=> false + * R.equals([1, 2, 3], [1, 2, 3]); //=> true + * + * var a = {}; a.v = a; + * var b = {}; b.v = b; + * R.equals(a, b); //=> true + */ + var equals = _curry2(function equals(a, b) { + return _hasMethod('equals', a) ? a.equals(b) : _hasMethod('equals', b) ? b.equals(a) : _equals(a, b, [], []); + }); - function id(x) { - return x; - } + /** + * Returns a new list containing only those items that match a given predicate function. + * The predicate function is passed one argument: *(value)*. + * + * Note that `R.filter` does not skip deleted or unassigned indices, unlike the native + * `Array.prototype.filter` method. For more details on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Description + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> [a] + * @param {Function} fn The function called per iteration. + * @param {Array} list The collection to iterate over. + * @return {Array} The new filtered array. + * @see R.reject + * @example + * + * var isEven = function(n) { + * return n % 2 === 0; + * }; + * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4] + */ + var filter = _curry2(_dispatchable('filter', _xfilter, _filter)); - function handlerForFieldOfType(type) { - switch (type.typeName) { - case "Enum": - case "String": - case "Boolean": - case "Number": - case "SourceSpan": - return null; - case "Const": - return handlerForFieldOfType(type.argument); - case "Maybe": - { - var _ret = function () { - var subHandler = handlerForFieldOfType(type.argument); - if (subHandler == null) return { - v: null - }; - return { - v: function v(t) { - return t == null ? this.identity : subHandler.call(this, t); + /** + * Returns the first element of the list which matches the predicate, or `undefined` if no + * element matches. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> a | undefined + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Object} The element found, or `undefined`. + * @example + * + * var xs = [{a: 1}, {a: 2}, {a: 3}]; + * R.find(R.propEq('a', 2))(xs); //=> {a: 2} + * R.find(R.propEq('a', 4))(xs); //=> undefined + */ + var find = _curry2(_dispatchable('find', _xfind, function find(fn, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + if (fn(list[idx])) { + return list[idx]; } - }; - }(); - - if ((typeof _ret === "undefined" ? "undefined" : _typeof(_ret)) === "object") return _ret.v; - } - case "List": - { - var _ret2 = function () { - var subHandler = handlerForFieldOfType(type.argument); - if (subHandler == null) return { - v: null - }; - return { - v: function v(t) { - var _this = this; + idx += 1; + } + })); - return this.fold(t.map(function (x) { - return subHandler.call(_this, x); - })); + /** + * Returns the index of the first element of the list which matches the predicate, or `-1` + * if no element matches. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> Number + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Number} The index of the element found, or `-1`. + * @example + * + * var xs = [{a: 1}, {a: 2}, {a: 3}]; + * R.findIndex(R.propEq('a', 2))(xs); //=> 1 + * R.findIndex(R.propEq('a', 4))(xs); //=> -1 + */ + var findIndex = _curry2(_dispatchable('findIndex', _xfindIndex, function findIndex(fn, list) { + var idx = 0; + var len = list.length; + while (idx < len) { + if (fn(list[idx])) { + return idx; } - }; - }(); + idx += 1; + } + return -1; + })); - if ((typeof _ret2 === "undefined" ? "undefined" : _typeof(_ret2)) === "object") return _ret2.v; - } - default: - return id; - } - } + /** + * Returns the last element of the list which matches the predicate, or `undefined` if no + * element matches. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> a | undefined + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Object} The element found, or `undefined`. + * @example + * + * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; + * R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1} + * R.findLast(R.propEq('a', 4))(xs); //=> undefined + */ + var findLast = _curry2(_dispatchable('findLast', _xfindLast, function findLast(fn, list) { + var idx = list.length - 1; + while (idx >= 0) { + if (fn(list[idx])) { + return list[idx]; + } + idx -= 1; + } + })); - var _loop = function _loop(typeName) { - var type = _shiftSpec2.default[typeName]; + /** + * Returns the index of the last element of the list which matches the predicate, or + * `-1` if no element matches. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> Number + * @param {Function} fn The predicate function used to determine if the element is the + * desired one. + * @param {Array} list The array to consider. + * @return {Number} The index of the element found, or `-1`. + * @example + * + * var xs = [{a: 1, b: 0}, {a:1, b: 1}]; + * R.findLastIndex(R.propEq('a', 1))(xs); //=> 1 + * R.findLastIndex(R.propEq('a', 4))(xs); //=> -1 + */ + var findLastIndex = _curry2(_dispatchable('findLastIndex', _xfindLastIndex, function findLastIndex(fn, list) { + var idx = list.length - 1; + while (idx >= 0) { + if (fn(list[idx])) { + return idx; + } + idx -= 1; + } + return -1; + })); - var handlers = {}; - type.fields.forEach(function (field) { - var handler = handlerForFieldOfType(field.type); - if (handler != null) handlers[field.name] = handler; - }); - var fieldNames = Object.keys(handlers); + /** + * Returns a new list by pulling every item out of it (and all its sub-arrays) and putting + * them in a new array, depth-first. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [b] + * @param {Array} list The array to consider. + * @return {Array} The flattened list. + * @see R.unnest + * @example + * + * R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]); + * //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + */ + var flatten = _curry1(_makeFlat(true)); - methods["reduce" + typeName] = { - value: function value(node, state) { - var _this3 = this; + /** + * Returns a new function much like the supplied one, except that the first two arguments' + * order is reversed. + * + * @func + * @memberOf R + * @category Function + * @sig (a -> b -> c -> ... -> z) -> (b -> a -> c -> ... -> z) + * @param {Function} fn The function to invoke with its first two parameters reversed. + * @return {*} The result of invoking `fn` with its first two parameters' order reversed. + * @example + * + * var mergeThree = function(a, b, c) { + * return ([]).concat(a, b, c); + * }; + * + * mergeThree(1, 2, 3); //=> [1, 2, 3] + * + * R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3] + */ + var flip = _curry1(function flip(fn) { + return curry(function (a, b) { + var args = _slice(arguments); + args[0] = b; + args[1] = a; + return fn.apply(this, args); + }); + }); - return this.fold(fieldNames.map(function (fieldName) { - return handlers[fieldName].call(_this3, state[fieldName]); - })); - } - }; - }; + /** + * Iterate over an input `list`, calling a provided function `fn` for each element in the + * list. + * + * `fn` receives one argument: *(value)*. + * + * Note: `R.forEach` does not skip deleted or unassigned indices (sparse arrays), unlike + * the native `Array.prototype.forEach` method. For more details on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description + * + * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns the original + * array. In some libraries this function is named `each`. + * + * @func + * @memberOf R + * @category List + * @sig (a -> *) -> [a] -> [a] + * @param {Function} fn The function to invoke. Receives one argument, `value`. + * @param {Array} list The list to iterate over. + * @return {Array} The original list. + * @example + * + * var printXPlusFive = function(x) { console.log(x + 5); }; + * R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3] + * //-> 6 + * //-> 7 + * //-> 8 + */ + var forEach = _curry2(_checkForMethod('forEach', function forEach(fn, list) { + var len = list.length; + var idx = 0; + while (idx < len) { + fn(list[idx]); + idx += 1; + } + return list; + })); - for (var typeName in _shiftSpec2.default) { - _loop(typeName); - } + /** + * Returns a list of function names of object's own functions + * + * @func + * @memberOf R + * @category Object + * @sig {*} -> [String] + * @param {Object} obj The objects with functions in it + * @return {Array} A list of the object's own properties that map to functions. + * @example + * + * R.functions(R); // returns list of ramda's own function names + * + * var F = function() { this.x = function(){}; this.y = 1; } + * F.prototype.z = function() {}; + * F.prototype.a = 100; + * R.functions(new F()); //=> ["x"] + */ + var functions = _curry1(_functionsWith(keys)); - var MonoidalReducer = function () { - function MonoidalReducer(monoid) { - _classCallCheck(this, MonoidalReducer); + /** + * Returns a list of function names of object's own and prototype functions + * + * @func + * @memberOf R + * @category Object + * @sig {*} -> [String] + * @param {Object} obj The objects with functions in it + * @return {Array} A list of the object's own properties and prototype + * properties that map to functions. + * @example + * + * R.functionsIn(R); // returns list of ramda's own and prototype function names + * + * var F = function() { this.x = function(){}; this.y = 1; } + * F.prototype.z = function() {}; + * F.prototype.a = 100; + * R.functionsIn(new F()); //=> ["x", "z"] + */ + var functionsIn = _curry1(_functionsWith(keysIn)); - this.identity = monoid.empty(); - var concat = monoid.prototype && monoid.prototype.concat || monoid.concat; - this.append = function (a, b) { - return concat.call(a, b); - }; - } + /** + * Splits a list into sub-lists stored in an object, based on the result of calling a String-returning function + * on each element, and grouping the results according to values returned. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> String) -> [a] -> {String: [a]} + * @param {Function} fn Function :: a -> String + * @param {Array} list The array to group + * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements + * that produced that key when passed to `fn`. + * @example + * + * var byGrade = R.groupBy(function(student) { + * var score = student.score; + * return score < 65 ? 'F' : + * score < 70 ? 'D' : + * score < 80 ? 'C' : + * score < 90 ? 'B' : 'A'; + * }); + * var students = [{name: 'Abby', score: 84}, + * {name: 'Eddy', score: 58}, + * // ... + * {name: 'Jack', score: 69}]; + * byGrade(students); + * // { + * // 'A': [{name: 'Dianne', score: 99}], + * // 'B': [{name: 'Abby', score: 84}] + * // // ..., + * // 'F': [{name: 'Eddy', score: 58}] + * // } + */ + var groupBy = _curry2(_dispatchable('groupBy', _xgroupBy, function groupBy(fn, list) { + return _reduce(function (acc, elt) { + var key = fn(elt); + acc[key] = append(elt, acc[key] || (acc[key] = [])); + return acc; + }, {}, list); + })); - _createClass(MonoidalReducer, [{ - key: "fold", - value: function fold(list, a) { - var _this2 = this; + /** + * Returns the first element of the given list or string. In some libraries + * this function is named `first`. + * + * @func + * @memberOf R + * @category List + * @see R.tail, R.init, R.last + * @sig [a] -> a | Undefined + * @sig String -> String + * @param {*} list + * @return {*} + * @example + * + * R.head(['fi', 'fo', 'fum']); //=> 'fi' + * R.head([]); //=> undefined + * + * R.head('abc'); //=> 'a' + * R.head(''); //=> '' + */ + var head = nth(0); - return list.reduce(function (memo, x) { - return _this2.append(memo, x); - }, a == null ? this.identity : a); - } - }]); + /** + * Combines two lists into a set (i.e. no duplicates) composed of those + * elements common to both lists. Duplication is determined according + * to the value returned by applying the supplied predicate to two list + * elements. + * + * @func + * @memberOf R + * @category Relation + * @sig (a,a -> Boolean) -> [a] -> [a] -> [a] + * @param {Function} pred A predicate function that determines whether + * the two supplied elements are equal. + * @param {Array} list1 One list of items to compare + * @param {Array} list2 A second list of items to compare + * @see R.intersection + * @return {Array} A new list containing those elements common to both lists. + * @example + * + * var buffaloSpringfield = [ + * {id: 824, name: 'Richie Furay'}, + * {id: 956, name: 'Dewey Martin'}, + * {id: 313, name: 'Bruce Palmer'}, + * {id: 456, name: 'Stephen Stills'}, + * {id: 177, name: 'Neil Young'} + * ]; + * var csny = [ + * {id: 204, name: 'David Crosby'}, + * {id: 456, name: 'Stephen Stills'}, + * {id: 539, name: 'Graham Nash'}, + * {id: 177, name: 'Neil Young'} + * ]; + * + * var sameId = function(o1, o2) {return o1.id === o2.id;}; + * + * R.intersectionWith(sameId, buffaloSpringfield, csny); + * //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}] + */ + var intersectionWith = _curry3(function intersectionWith(pred, list1, list2) { + var results = [], idx = 0; + while (idx < list1.length) { + if (_containsWith(pred, list1[idx], list2)) { + results[results.length] = list1[idx]; + } + idx += 1; + } + return uniqWith(pred, results); + }); - return MonoidalReducer; - }(); + /** + * Creates a new list with the separator interposed between elements. + * + * @func + * @memberOf R + * @category List + * @sig a -> [a] -> [a] + * @param {*} separator The element to add to the list. + * @param {Array} list The list to be interposed. + * @return {Array} The new list. + * @example + * + * R.intersperse('n', ['ba', 'a', 'a']); //=> ['ba', 'n', 'a', 'n', 'a'] + */ + var intersperse = _curry2(_checkForMethod('intersperse', function intersperse(separator, list) { + var out = []; + var idx = 0; + var length = list.length; + while (idx < length) { + if (idx === length - 1) { + out.push(list[idx]); + } else { + out.push(list[idx], separator); + } + idx += 1; + } + return out; + })); - exports.default = MonoidalReducer; + /** + * Transforms the items of the list with the transducer and appends the transformed items to + * the accumulator using an appropriate iterator function based on the accumulator type. + * + * The accumulator can be an array, string, object or a transformer. Iterated items will + * be appended to arrays and concatenated to strings. Objects will be merged directly or 2-item + * arrays will be merged as key, value pairs. + * + * The accumulator can also be a transformer object that provides a 2-arity reducing iterator + * function, step, 0-arity initial value function, init, and 1-arity result extraction function + * result. The step function is used as the iterator function in reduce. The result function is + * used to convert the final accumulator into the return type and in most cases is R.identity. + * The init function is used to provide the initial accumulator. + * + * The iteration is performed with R.reduce after initializing the transducer. + * + * @func + * @memberOf R + * @category List + * @sig a -> (b -> b) -> [c] -> a + * @param {*} acc The initial accumulator value. + * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. + * @example + * + * var numbers = [1, 2, 3, 4]; + * var transducer = R.compose(R.map(R.add(1)), R.take(2)); + * + * R.into([], transducer, numbers); //=> [2, 3] + * + * var intoArray = R.into([]); + * intoArray(transducer, numbers); //=> [2, 3] + */ + var into = _curry3(function into(acc, xf, list) { + return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), acc, list); + }); - Object.defineProperties(MonoidalReducer.prototype, methods); + /** + * Same as R.invertObj, however this accounts for objects + * with duplicate values by putting the values into an + * array. + * + * @func + * @memberOf R + * @category Object + * @sig {s: x} -> {x: [ s, ... ]} + * @param {Object} obj The object or array to invert + * @return {Object} out A new object with keys + * in an array. + * @example + * + * var raceResultsByFirstName = { + * first: 'alice', + * second: 'jake', + * third: 'alice', + * }; + * R.invert(raceResultsByFirstName); + * //=> { 'alice': ['first', 'third'], 'jake':['second'] } + */ + var invert = _curry1(function invert(obj) { + var props = keys(obj); + var len = props.length; + var idx = 0; + var out = {}; + while (idx < len) { + var key = props[idx]; + var val = obj[key]; + var list = _has(val, out) ? out[val] : out[val] = []; + list[list.length] = key; + idx += 1; + } + return out; + }); -/***/ }, -/* 37 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Returns a new object with the keys of the given object + * as values, and the values of the given object as keys. + * + * @func + * @memberOf R + * @category Object + * @sig {s: x} -> {x: s} + * @param {Object} obj The object or array to invert + * @return {Object} out A new object + * @example + * + * var raceResults = { + * first: 'alice', + * second: 'jake' + * }; + * R.invertObj(raceResults); + * //=> { 'alice': 'first', 'jake':'second' } + * + * // Alternatively: + * var raceResults = ['alice', 'jake']; + * R.invertObj(raceResults); + * //=> { 'alice': '0', 'jake':'1' } + */ + var invertObj = _curry1(function invertObj(obj) { + var props = keys(obj); + var len = props.length; + var idx = 0; + var out = {}; + while (idx < len) { + var key = props[idx]; + out[obj[key]] = key; + idx += 1; + } + return out; + }); - "use strict"; + /** + * Returns the last element of the given list or string. + * + * @func + * @memberOf R + * @category List + * @see R.init, R.head, R.tail + * @sig [a] -> a | Undefined + * @sig String -> String + * @param {*} list + * @return {*} + * @example + * + * R.last(['fi', 'fo', 'fum']); //=> 'fum' + * R.last([]); //=> undefined + * + * R.last('abc'); //=> 'c' + * R.last(''); //=> '' + */ + var last = nth(-1); - Object.defineProperty(exports, "__esModule", { - value: true - }); + /** + * Returns the position of the last occurrence of an item in + * an array, or -1 if the item is not included in the array. + * `R.equals` is used to determine equality. + * + * @func + * @memberOf R + * @category List + * @sig a -> [a] -> Number + * @param {*} target The item to find. + * @param {Array} xs The array to search in. + * @return {Number} the index of the target, or -1 if the target is not found. + * @see R.indexOf + * @example + * + * R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6 + * R.lastIndexOf(10, [1,2,3,4]); //=> -1 + */ + var lastIndexOf = _curry2(function lastIndexOf(target, xs) { + if (_hasMethod('lastIndexOf', xs)) { + return xs.lastIndexOf(target); + } else { + var idx = xs.length - 1; + while (idx >= 0) { + if (equals(xs[idx], target)) { + return idx; + } + idx -= 1; + } + return -1; + } + }); - var _terms = __webpack_require__(28); + /** + * Returns a new list, constructed by applying the supplied function to every element of the + * supplied list. + * + * Note: `R.map` does not skip deleted or unassigned indices (sparse arrays), unlike the + * native `Array.prototype.map` method. For more details on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Description + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> b) -> [a] -> [b] + * @param {Function} fn The function to be called on every element of the input `list`. + * @param {Array} list The list to be iterated over. + * @return {Array} The new list. + * @example + * + * var double = function(x) { + * return x * 2; + * }; + * + * R.map(double, [1, 2, 3]); //=> [2, 4, 6] + */ + var map = _curry2(_dispatchable('map', _xmap, _map)); - var _terms2 = _interopRequireDefault(_terms); + /** + * Map, but for objects. Creates an object with the same keys as `obj` and values + * generated by running each property of `obj` through `fn`. `fn` is passed one argument: + * *(value)*. + * + * @func + * @memberOf R + * @category Object + * @sig (v -> v) -> {k: v} -> {k: v} + * @param {Function} fn A function called for each property in `obj`. Its return value will + * become a new property on the return object. + * @param {Object} obj The object to iterate over. + * @return {Object} A new object with the same keys as `obj` and values that are the result + * of running each property through `fn`. + * @example + * + * var values = { x: 1, y: 2, z: 3 }; + * var double = function(num) { + * return num * 2; + * }; + * + * R.mapObj(double, values); //=> { x: 2, y: 4, z: 6 } + */ + var mapObj = _curry2(function mapObj(fn, obj) { + return _reduce(function (acc, key) { + acc[key] = fn(obj[key]); + return acc; + }, {}, keys(obj)); + }); - var _shiftReducer = __webpack_require__(33); + /** + * Like `mapObj`, but but passes additional arguments to the predicate function. The + * predicate function is passed three arguments: *(value, key, obj)*. + * + * @func + * @memberOf R + * @category Object + * @sig (v, k, {k: v} -> v) -> {k: v} -> {k: v} + * @param {Function} fn A function called for each property in `obj`. Its return value will + * become a new property on the return object. + * @param {Object} obj The object to iterate over. + * @return {Object} A new object with the same keys as `obj` and values that are the result + * of running each property through `fn`. + * @example + * + * var values = { x: 1, y: 2, z: 3 }; + * var prependKeyAndDouble = function(num, key, obj) { + * return key + (num * 2); + * }; + * + * R.mapObjIndexed(prependKeyAndDouble, values); //=> { x: 'x2', y: 'y4', z: 'z6' } + */ + var mapObjIndexed = _curry2(function mapObjIndexed(fn, obj) { + return _reduce(function (acc, key) { + acc[key] = fn(obj[key], key, obj); + return acc; + }, {}, keys(obj)); + }); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * Returns `true` if no elements of the list match the predicate, + * `false` otherwise. + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> Boolean + * @param {Function} fn The predicate function. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise. + * @see R.all, R.any + * @example + * + * R.none(R.isNaN, [1, 2, 3]); //=> true + * R.none(R.isNaN, [1, 2, 3, NaN]); //=> false + */ + var none = _curry2(_complement(_dispatchable('any', _xany, any))); - class ParseReducer extends _shiftReducer.CloneReducer { - constructor(context_573) { - super(); - this.context = context_573; - } - reduceModule(node_574, state_575) { - return new _terms2.default("Module", { directives: state_575.directives.toArray(), items: state_575.items.toArray() }); - } - reduceImport(node_576, state_577) { - let moduleSpecifier_578 = state_577.moduleSpecifier ? state_577.moduleSpecifier.val() : null; - return new _terms2.default("Import", { defaultBinding: state_577.defaultBinding, namedImports: state_577.namedImports.toArray(), moduleSpecifier: moduleSpecifier_578, forSyntax: node_576.forSyntax }); - } - reduceImportNamespace(node_579, state_580) { - let moduleSpecifier_581 = state_580.moduleSpecifier ? state_580.moduleSpecifier.val() : null; - return new _terms2.default("ImportNamespace", { defaultBinding: state_580.defaultBinding, namespaceBinding: state_580.namespaceBinding, moduleSpecifier: moduleSpecifier_581, forSyntax: node_579.forSyntax }); - } - reduceExport(node_582, state_583) { - return new _terms2.default("Export", { declaration: state_583.declaration }); - } - reduceExportAllFrom(node_584, state_585) { - let moduleSpecifier_586 = state_585.moduleSpecifier ? state_585.moduleSpecifier.val() : null; - return new _terms2.default("ExportAllFrom", { moduleSpecifier: moduleSpecifier_586 }); - } - reduceExportFrom(node_587, state_588) { - let moduleSpecifier_589 = state_588.moduleSpecifier ? state_588.moduleSpecifier.val() : null; - return new _terms2.default("ExportFrom", { moduleSpecifier: moduleSpecifier_589, namedExports: state_588.namedExports.toArray() }); - } - reduceExportSpecifier(node_590, state_591) { - let name_592 = state_591.name, - exportedName_593 = state_591.exportedName; - if (name_592 == null) { - name_592 = exportedName_593.resolve(this.context.phase); - exportedName_593 = exportedName_593.val(); - } else { - name_592 = name_592.resolve(this.context.phase); - exportedName_593 = exportedName_593.val(); - } - return new _terms2.default("ExportSpecifier", { name: name_592, exportedName: exportedName_593 }); - } - reduceImportSpecifier(node_594, state_595) { - let name_596 = state_595.name ? state_595.name.resolve(this.context.phase) : null; - return new _terms2.default("ImportSpecifier", { name: name_596, binding: state_595.binding }); - } - reduceIdentifierExpression(node_597, state_598) { - return new _terms2.default("IdentifierExpression", { name: node_597.name.resolve(this.context.phase) }); - } - reduceLiteralNumericExpression(node_599, state_600) { - return new _terms2.default("LiteralNumericExpression", { value: node_599.value.val() }); - } - reduceLiteralBooleanExpression(node_601, state_602) { - return new _terms2.default("LiteralBooleanExpression", { value: node_601.value.val() === "true" }); - } - reduceLiteralStringExpression(node_603, state_604) { - return new _terms2.default("LiteralStringExpression", { value: node_603.value.token.str }); - } - reduceCallExpression(node_605, state_606) { - return new _terms2.default("CallExpression", { callee: state_606.callee, arguments: state_606.arguments.toArray() }); - } - reduceFunctionBody(node_607, state_608) { - return new _terms2.default("FunctionBody", { directives: state_608.directives.toArray(), statements: state_608.statements.toArray() }); - } - reduceFormalParameters(node_609, state_610) { - return new _terms2.default("FormalParameters", { items: state_610.items.toArray(), rest: state_610.rest }); - } - reduceBindingIdentifier(node_611, state_612) { - return new _terms2.default("BindingIdentifier", { name: node_611.name.resolve(this.context.phase) }); - } - reduceBinaryExpression(node_613, state_614) { - return new _terms2.default("BinaryExpression", { left: state_614.left, operator: node_613.operator.val(), right: state_614.right }); - } - reduceObjectExpression(node_615, state_616) { - return new _terms2.default("ObjectExpression", { properties: state_616.properties.toArray() }); - } - reduceVariableDeclaration(node_617, state_618) { - return new _terms2.default("VariableDeclaration", { kind: state_618.kind, declarators: state_618.declarators.toArray() }); - } - reduceStaticPropertyName(node_619, state_620) { - return new _terms2.default("StaticPropertyName", { value: node_619.value.val().toString() }); - } - reduceArrayExpression(node_621, state_622) { - return new _terms2.default("ArrayExpression", { elements: state_622.elements.toArray() }); - } - reduceStaticMemberExpression(node_623, state_624) { - return new _terms2.default("StaticMemberExpression", { object: state_624.object, property: state_624.property.val() }); - } - } - exports.default = ParseReducer; - //# sourceMappingURL=data:application/json;base64,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aUJBQVQsRUFBNEIsRUFBQyxVQUFVLFVBQVUsUUFBVixDQUFtQixPQUFuQixFQUFYLEVBQTVCLENBQVA7QUFDRDtBQUNELCtCQUE2QixRQUE3QixFQUF1QyxTQUF2QyxFQUFrRDtBQUNoRCxXQUFPLG9CQUFTLHdCQUFULEVBQW1DLEVBQUMsUUFBUSxVQUFVLE1BQW5CLEVBQTJCLFVBQVUsVUFBVSxRQUFWLENBQW1CLEdBQW5CLEVBQXJDLEVBQW5DLENBQVA7QUFDRDtBQW5Gb0Q7a0JBQWxDLFkiLCJmaWxlIjoicGFyc2UtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge0Nsb25lUmVkdWNlcn0gZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlUmVkdWNlciBleHRlbmRzIENsb25lUmVkdWNlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHRfNTczKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XzU3MztcbiAgfVxuICByZWR1Y2VNb2R1bGUobm9kZV81NzQsIHN0YXRlXzU3NSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIk1vZHVsZVwiLCB7ZGlyZWN0aXZlczogc3RhdGVfNTc1LmRpcmVjdGl2ZXMudG9BcnJheSgpLCBpdGVtczogc3RhdGVfNTc1Lml0ZW1zLnRvQXJyYXkoKX0pO1xuICB9XG4gIHJlZHVjZUltcG9ydChub2RlXzU3Niwgc3RhdGVfNTc3KSB7XG4gICAgbGV0IG1vZHVsZVNwZWNpZmllcl81NzggPSBzdGF0ZV81NzcubW9kdWxlU3BlY2lmaWVyID8gc3RhdGVfNTc3Lm1vZHVsZVNwZWNpZmllci52YWwoKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSW1wb3J0XCIsIHtkZWZhdWx0QmluZGluZzogc3RhdGVfNTc3LmRlZmF1bHRCaW5kaW5nLCBuYW1lZEltcG9ydHM6IHN0YXRlXzU3Ny5uYW1lZEltcG9ydHMudG9BcnJheSgpLCBtb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81NzgsIGZvclN5bnRheDogbm9kZV81NzYuZm9yU3ludGF4fSk7XG4gIH1cbiAgcmVkdWNlSW1wb3J0TmFtZXNwYWNlKG5vZGVfNTc5LCBzdGF0ZV81ODApIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyXzU4MSA9IHN0YXRlXzU4MC5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZV81ODAubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnROYW1lc3BhY2VcIiwge2RlZmF1bHRCaW5kaW5nOiBzdGF0ZV81ODAuZGVmYXVsdEJpbmRpbmcsIG5hbWVzcGFjZUJpbmRpbmc6IHN0YXRlXzU4MC5uYW1lc3BhY2VCaW5kaW5nLCBtb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81ODEsIGZvclN5bnRheDogbm9kZV81NzkuZm9yU3ludGF4fSk7XG4gIH1cbiAgcmVkdWNlRXhwb3J0KG5vZGVfNTgyLCBzdGF0ZV81ODMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiBzdGF0ZV81ODMuZGVjbGFyYXRpb259KTtcbiAgfVxuICByZWR1Y2VFeHBvcnRBbGxGcm9tKG5vZGVfNTg0LCBzdGF0ZV81ODUpIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyXzU4NiA9IHN0YXRlXzU4NS5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZV81ODUubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRBbGxGcm9tXCIsIHttb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81ODZ9KTtcbiAgfVxuICByZWR1Y2VFeHBvcnRGcm9tKG5vZGVfNTg3LCBzdGF0ZV81ODgpIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyXzU4OSA9IHN0YXRlXzU4OC5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZV81ODgubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRGcm9tXCIsIHttb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81ODksIG5hbWVkRXhwb3J0czogc3RhdGVfNTg4Lm5hbWVkRXhwb3J0cy50b0FycmF5KCl9KTtcbiAgfVxuICByZWR1Y2VFeHBvcnRTcGVjaWZpZXIobm9kZV81OTAsIHN0YXRlXzU5MSkge1xuICAgIGxldCBuYW1lXzU5MiA9IHN0YXRlXzU5MS5uYW1lLCBleHBvcnRlZE5hbWVfNTkzID0gc3RhdGVfNTkxLmV4cG9ydGVkTmFtZTtcbiAgICBpZiAobmFtZV81OTIgPT0gbnVsbCkge1xuICAgICAgbmFtZV81OTIgPSBleHBvcnRlZE5hbWVfNTkzLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgIGV4cG9ydGVkTmFtZV81OTMgPSBleHBvcnRlZE5hbWVfNTkzLnZhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lXzU5MiA9IG5hbWVfNTkyLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgIGV4cG9ydGVkTmFtZV81OTMgPSBleHBvcnRlZE5hbWVfNTkzLnZhbCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRTcGVjaWZpZXJcIiwge25hbWU6IG5hbWVfNTkyLCBleHBvcnRlZE5hbWU6IGV4cG9ydGVkTmFtZV81OTN9KTtcbiAgfVxuICByZWR1Y2VJbXBvcnRTcGVjaWZpZXIobm9kZV81OTQsIHN0YXRlXzU5NSkge1xuICAgIGxldCBuYW1lXzU5NiA9IHN0YXRlXzU5NS5uYW1lID8gc3RhdGVfNTk1Lm5hbWUucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnRTcGVjaWZpZXJcIiwge25hbWU6IG5hbWVfNTk2LCBiaW5kaW5nOiBzdGF0ZV81OTUuYmluZGluZ30pO1xuICB9XG4gIHJlZHVjZUlkZW50aWZpZXJFeHByZXNzaW9uKG5vZGVfNTk3LCBzdGF0ZV81OTgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7bmFtZTogbm9kZV81OTcubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSl9KTtcbiAgfVxuICByZWR1Y2VMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24obm9kZV81OTksIHN0YXRlXzYwMCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwiLCB7dmFsdWU6IG5vZGVfNTk5LnZhbHVlLnZhbCgpfSk7XG4gIH1cbiAgcmVkdWNlTGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uKG5vZGVfNjAxLCBzdGF0ZV82MDIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIiwge3ZhbHVlOiBub2RlXzYwMS52YWx1ZS52YWwoKSA9PT0gXCJ0cnVlXCJ9KTtcbiAgfVxuICByZWR1Y2VMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbihub2RlXzYwMywgc3RhdGVfNjA0KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIiwge3ZhbHVlOiBub2RlXzYwMy52YWx1ZS50b2tlbi5zdHJ9KTtcbiAgfVxuICByZWR1Y2VDYWxsRXhwcmVzc2lvbihub2RlXzYwNSwgc3RhdGVfNjA2KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ2FsbEV4cHJlc3Npb25cIiwge2NhbGxlZTogc3RhdGVfNjA2LmNhbGxlZSwgYXJndW1lbnRzOiBzdGF0ZV82MDYuYXJndW1lbnRzLnRvQXJyYXkoKX0pO1xuICB9XG4gIHJlZHVjZUZ1bmN0aW9uQm9keShub2RlXzYwNywgc3RhdGVfNjA4KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRnVuY3Rpb25Cb2R5XCIsIHtkaXJlY3RpdmVzOiBzdGF0ZV82MDguZGlyZWN0aXZlcy50b0FycmF5KCksIHN0YXRlbWVudHM6IHN0YXRlXzYwOC5zdGF0ZW1lbnRzLnRvQXJyYXkoKX0pO1xuICB9XG4gIHJlZHVjZUZvcm1hbFBhcmFtZXRlcnMobm9kZV82MDksIHN0YXRlXzYxMCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge2l0ZW1zOiBzdGF0ZV82MTAuaXRlbXMudG9BcnJheSgpLCByZXN0OiBzdGF0ZV82MTAucmVzdH0pO1xuICB9XG4gIHJlZHVjZUJpbmRpbmdJZGVudGlmaWVyKG5vZGVfNjExLCBzdGF0ZV82MTIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogbm9kZV82MTEubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSl9KTtcbiAgfVxuICByZWR1Y2VCaW5hcnlFeHByZXNzaW9uKG5vZGVfNjEzLCBzdGF0ZV82MTQpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5hcnlFeHByZXNzaW9uXCIsIHtsZWZ0OiBzdGF0ZV82MTQubGVmdCwgb3BlcmF0b3I6IG5vZGVfNjEzLm9wZXJhdG9yLnZhbCgpLCByaWdodDogc3RhdGVfNjE0LnJpZ2h0fSk7XG4gIH1cbiAgcmVkdWNlT2JqZWN0RXhwcmVzc2lvbihub2RlXzYxNSwgc3RhdGVfNjE2KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7cHJvcGVydGllczogc3RhdGVfNjE2LnByb3BlcnRpZXMudG9BcnJheSgpfSk7XG4gIH1cbiAgcmVkdWNlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlXzYxNywgc3RhdGVfNjE4KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCB7a2luZDogc3RhdGVfNjE4LmtpbmQsIGRlY2xhcmF0b3JzOiBzdGF0ZV82MTguZGVjbGFyYXRvcnMudG9BcnJheSgpfSk7XG4gIH1cbiAgcmVkdWNlU3RhdGljUHJvcGVydHlOYW1lKG5vZGVfNjE5LCBzdGF0ZV82MjApIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTdGF0aWNQcm9wZXJ0eU5hbWVcIiwge3ZhbHVlOiBub2RlXzYxOS52YWx1ZS52YWwoKS50b1N0cmluZygpfSk7XG4gIH1cbiAgcmVkdWNlQXJyYXlFeHByZXNzaW9uKG5vZGVfNjIxLCBzdGF0ZV82MjIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUV4cHJlc3Npb25cIiwge2VsZW1lbnRzOiBzdGF0ZV82MjIuZWxlbWVudHMudG9BcnJheSgpfSk7XG4gIH1cbiAgcmVkdWNlU3RhdGljTWVtYmVyRXhwcmVzc2lvbihub2RlXzYyMywgc3RhdGVfNjI0KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7b2JqZWN0OiBzdGF0ZV82MjQub2JqZWN0LCBwcm9wZXJ0eTogc3RhdGVfNjI0LnByb3BlcnR5LnZhbCgpfSk7XG4gIH1cbn1cbiJdfQ== + /** + * A function that returns the first truthy of two arguments otherwise the + * last argument. Note that this is NOT short-circuited, meaning that if + * expressions are passed they are both evaluated. + * + * Dispatches to the `or` method of the first argument if applicable. + * + * @func + * @memberOf R + * @category Logic + * @sig * -> * -> * + * @param {*} a any value + * @param {*} b any other value + * @return {*} the first truthy argument, otherwise the last argument. + * @see R.either + * @example + * + * R.or(false, true); //=> true + * R.or(0, []); //=> [] + * R.or(null, ''); => '' + */ + var or = _curry2(function or(a, b) { + return _hasMethod('or', a) ? a.or(b) : a || b; + }); -/***/ }, -/* 38 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Accepts as its arguments a function and any number of values and returns a function that, + * when invoked, calls the original function with all of the values prepended to the + * original function's arguments list. In some libraries this function is named `applyLeft`. + * + * @func + * @memberOf R + * @category Function + * @sig (a -> b -> ... -> i -> j -> ... -> m -> n) -> a -> b-> ... -> i -> (j -> ... -> m -> n) + * @param {Function} fn The function to invoke. + * @param {...*} [args] Arguments to prepend to `fn` when the returned function is invoked. + * @return {Function} A new function wrapping `fn`. When invoked, it will call `fn` + * with `args` prepended to `fn`'s arguments list. + * @example + * + * var multiply = function(a, b) { return a * b; }; + * var double = R.partial(multiply, 2); + * double(2); //=> 4 + * + * var greet = function(salutation, title, firstName, lastName) { + * return salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; + * }; + * var sayHello = R.partial(greet, 'Hello'); + * var sayHelloToMs = R.partial(sayHello, 'Ms.'); + * sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!' + */ + var partial = curry(_createPartialApplicator(_concat)); - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.SemiOp = exports.CommaSep = exports.Semi = exports.Seq = exports.ContainsIn = exports.NoIn = exports.Brace = exports.Bracket = exports.Paren = exports.NumberCodeRep = exports.Token = exports.Empty = exports.CodeRep = exports.escapeStringLiteral = exports.getPrecedence = exports.Precedence = exports.Sep = exports.FormattedCodeGen = exports.ExtensibleCodeGen = exports.MinimalCodeGen = undefined; - exports.default = codeGen; - - var _minimalCodegen = __webpack_require__(39); - - Object.defineProperty(exports, "MinimalCodeGen", { - enumerable: true, - get: function get() { - return _minimalCodegen.default; - } - }); - - var _formattedCodegen = __webpack_require__(42); - - Object.defineProperty(exports, "ExtensibleCodeGen", { - enumerable: true, - get: function get() { - return _formattedCodegen.ExtensibleCodeGen; - } - }); - Object.defineProperty(exports, "FormattedCodeGen", { - enumerable: true, - get: function get() { - return _formattedCodegen.FormattedCodeGen; - } - }); - Object.defineProperty(exports, "Sep", { - enumerable: true, - get: function get() { - return _formattedCodegen.Sep; - } - }); - - var _coderep = __webpack_require__(41); - - Object.defineProperty(exports, "Precedence", { - enumerable: true, - get: function get() { - return _coderep.Precedence; - } - }); - Object.defineProperty(exports, "getPrecedence", { - enumerable: true, - get: function get() { - return _coderep.getPrecedence; - } - }); - Object.defineProperty(exports, "escapeStringLiteral", { - enumerable: true, - get: function get() { - return _coderep.escapeStringLiteral; - } - }); - Object.defineProperty(exports, "CodeRep", { - enumerable: true, - get: function get() { - return _coderep.CodeRep; - } - }); - Object.defineProperty(exports, "Empty", { - enumerable: true, - get: function get() { - return _coderep.Empty; - } - }); - Object.defineProperty(exports, "Token", { - enumerable: true, - get: function get() { - return _coderep.Token; - } - }); - Object.defineProperty(exports, "NumberCodeRep", { - enumerable: true, - get: function get() { - return _coderep.NumberCodeRep; - } - }); - Object.defineProperty(exports, "Paren", { - enumerable: true, - get: function get() { - return _coderep.Paren; - } - }); - Object.defineProperty(exports, "Bracket", { - enumerable: true, - get: function get() { - return _coderep.Bracket; - } - }); - Object.defineProperty(exports, "Brace", { - enumerable: true, - get: function get() { - return _coderep.Brace; - } - }); - Object.defineProperty(exports, "NoIn", { - enumerable: true, - get: function get() { - return _coderep.NoIn; - } - }); - Object.defineProperty(exports, "ContainsIn", { - enumerable: true, - get: function get() { - return _coderep.ContainsIn; - } - }); - Object.defineProperty(exports, "Seq", { - enumerable: true, - get: function get() { - return _coderep.Seq; - } - }); - Object.defineProperty(exports, "Semi", { - enumerable: true, - get: function get() { - return _coderep.Semi; - } - }); - Object.defineProperty(exports, "CommaSep", { - enumerable: true, - get: function get() { - return _coderep.CommaSep; - } - }); - Object.defineProperty(exports, "SemiOp", { - enumerable: true, - get: function get() { - return _coderep.SemiOp; - } - }); - - var _shiftReducer = __webpack_require__(33); - - var _shiftReducer2 = _interopRequireDefault(_shiftReducer); - - var _token_stream = __webpack_require__(43); - - var _minimalCodegen2 = _interopRequireDefault(_minimalCodegen); + /** + * Accepts as its arguments a function and any number of values and returns a function that, + * when invoked, calls the original function with all of the values appended to the original + * function's arguments list. + * + * Note that `partialRight` is the opposite of `partial`: `partialRight` fills `fn`'s arguments + * from the right to the left. In some libraries this function is named `applyRight`. + * + * @func + * @memberOf R + * @category Function + * @sig (a -> b-> ... -> i -> j -> ... -> m -> n) -> j -> ... -> m -> n -> (a -> b-> ... -> i) + * @param {Function} fn The function to invoke. + * @param {...*} [args] Arguments to append to `fn` when the returned function is invoked. + * @return {Function} A new function wrapping `fn`. When invoked, it will call `fn` with + * `args` appended to `fn`'s arguments list. + * @example + * + * var greet = function(salutation, title, firstName, lastName) { + * return salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!'; + * }; + * var greetMsJaneJones = R.partialRight(greet, 'Ms.', 'Jane', 'Jones'); + * + * greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!' + */ + var partialRight = curry(_createPartialApplicator(flip(_concat))); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * Takes a predicate and a list and returns the pair of lists of + * elements which do and do not satisfy the predicate, respectively. + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> [[a],[a]] + * @param {Function} pred A predicate to determine which array the element belongs to. + * @param {Array} list The array to partition. + * @return {Array} A nested array, containing first an array of elements that satisfied the predicate, + * and second an array of elements that did not satisfy. + * @example + * + * R.partition(R.contains('s'), ['sss', 'ttt', 'foo', 'bars']); + * //=> [ [ 'sss', 'bars' ], [ 'ttt', 'foo' ] ] + */ + var partition = _curry2(function partition(pred, list) { + return _reduce(function (acc, elt) { + var xs = acc[pred(elt) ? 0 : 1]; + xs[xs.length] = elt; + return acc; + }, [ + [], + [] + ], list); + }); - function codeGen(script) { - var generator = arguments.length <= 1 || arguments[1] === undefined ? new _minimalCodegen2.default() : arguments[1]; + /** + * Determines whether a nested path on an object has a specific value, + * in `R.equals` terms. Most likely used to filter a list. + * + * @func + * @memberOf R + * @category Relation + * @sig [String] -> * -> {String: *} -> Boolean + * @param {Array} path The path of the nested property to use + * @param {*} val The value to compare the nested property with + * @param {Object} obj The object to check the nested property in + * @return {Boolean} `true` if the value equals the nested object property, + * `false` otherwise. + * @example + * + * var user1 = { address: { zipCode: 90210 } }; + * var user2 = { address: { zipCode: 55555 } }; + * var user3 = { name: 'Bob' }; + * var users = [ user1, user2, user3 ]; + * var isFamous = R.pathEq(['address', 'zipCode'], 90210); + * R.filter(isFamous, users); //=> [ user1 ] + */ + var pathEq = _curry3(function pathEq(_path, val, obj) { + return equals(path(_path, obj), val); + }); - var ts = new _token_stream.TokenStream(); - var rep = (0, _shiftReducer2.default)(generator, script); - rep.emit(ts); - return ts.result; - } + /** + * Returns a new list by plucking the same named property off all objects in the list supplied. + * + * @func + * @memberOf R + * @category List + * @sig k -> [{k: v}] -> [v] + * @param {Number|String} key The key name to pluck off of each object. + * @param {Array} list The array to consider. + * @return {Array} The list of values for the given key. + * @example + * + * R.pluck('a')([{a: 1}, {a: 2}]); //=> [1, 2] + * R.pluck(0)([[1, 2], [3, 4]]); //=> [1, 3] + */ + var pluck = _curry2(function pluck(p, list) { + return map(prop(p), list); + }); -/***/ }, -/* 39 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Returns `true` if the specified object property is equal, in `R.equals` + * terms, to the given value; `false` otherwise. + * + * @func + * @memberOf R + * @category Relation + * @sig String -> a -> Object -> Boolean + * @param {String} name + * @param {*} val + * @param {*} obj + * @return {Boolean} + * @see R.equals, R.propSatisfies + * @example + * + * var abby = {name: 'Abby', age: 7, hair: 'blond'}; + * var fred = {name: 'Fred', age: 12, hair: 'brown'}; + * var rusty = {name: 'Rusty', age: 10, hair: 'brown'}; + * var alois = {name: 'Alois', age: 15, disposition: 'surly'}; + * var kids = [abby, fred, rusty, alois]; + * var hasBrownHair = R.propEq('hair', 'brown'); + * R.filter(hasBrownHair, kids); //=> [fred, rusty] + */ + var propEq = _curry3(function propEq(name, val, obj) { + return propSatisfies(equals(val), name, obj); + }); - "use strict"; + /** + * Returns `true` if the specified object property is of the given type; + * `false` otherwise. + * + * @func + * @memberOf R + * @category Type + * @sig Type -> String -> Object -> Boolean + * @param {Function} type + * @param {String} name + * @param {*} obj + * @return {Boolean} + * @see R.is + * @see R.propSatisfies + * @example + * + * R.propIs(Number, 'x', {x: 1, y: 2}); //=> true + * R.propIs(Number, 'x', {x: 'foo'}); //=> false + * R.propIs(Number, 'x', {}); //=> false + */ + var propIs = _curry3(function propIs(type, name, obj) { + return propSatisfies(is(type), name, 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; }; }(); + /** + * Returns a single item by iterating through the list, successively calling the iterator + * function and passing it an accumulator value and the current value from the array, and + * then passing the result to the next call. + * + * The iterator function receives two values: *(acc, value)*. It may use `R.reduced` to + * shortcut the iteration. + * + * Note: `R.reduce` does not skip deleted or unassigned indices (sparse arrays), unlike + * the native `Array.prototype.reduce` method. For more details on this behavior, see: + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description + * @see R.reduced + * + * @func + * @memberOf R + * @category List + * @sig (a,b -> a) -> a -> [b] -> a + * @param {Function} fn The iterator function. Receives two values, the accumulator and the + * current element from the array. + * @param {*} acc The accumulator value. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. + * @example + * + * var numbers = [1, 2, 3]; + * var add = function(a, b) { + * return a + b; + * }; + * + * R.reduce(add, 10, numbers); //=> 16 + */ + var reduce = _curry3(_reduce); - Object.defineProperty(exports, "__esModule", { - value: true - }); + /** + * Similar to `filter`, except that it keeps only values for which the given predicate + * function returns falsy. The predicate function is passed one argument: *(value)*. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> [a] + * @param {Function} fn The function called per iteration. + * @param {Array} list The collection to iterate over. + * @return {Array} The new filtered array. + * @see R.filter + * @example + * + * var isOdd = function(n) { + * return n % 2 === 1; + * }; + * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4] + */ + var reject = _curry2(function reject(fn, list) { + return filter(_complement(fn), list); + }); - var _objectAssign = __webpack_require__(40); + /** + * Returns a fixed list of size `n` containing a specified identical value. + * + * @func + * @memberOf R + * @category List + * @sig a -> n -> [a] + * @param {*} value The value to repeat. + * @param {Number} n The desired size of the output list. + * @return {Array} A new array containing `n` `value`s. + * @example + * + * R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi'] + * + * var obj = {}; + * var repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}] + * repeatedObjs[0] === repeatedObjs[1]; //=> true + */ + var repeat = _curry2(function repeat(value, n) { + return times(always(value), n); + }); - var _objectAssign2 = _interopRequireDefault(_objectAssign); + /** + * Returns the elements of the given list or string (or object with a `slice` + * method) from `fromIndex` (inclusive) to `toIndex` (exclusive). + * + * @func + * @memberOf R + * @category List + * @sig Number -> Number -> [a] -> [a] + * @sig Number -> Number -> String -> String + * @param {Number} fromIndex The start index (inclusive). + * @param {Number} toIndex The end index (exclusive). + * @param {*} list + * @return {*} + * @example + * + * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] + * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd'] + * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c'] + * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c'] + * R.slice(0, 3, 'ramda'); //=> 'ram' + */ + var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) { + return Array.prototype.slice.call(list, fromIndex, toIndex); + })); - var _esutils = __webpack_require__(6); + /** + * Splits a collection into slices of the specified length. + * + * @func + * @memberOf R + * @category List + * @sig Number -> [a] -> [[a]] + * @sig Number -> String -> [String] + * @param {Number} n + * @param {Array} list + * @return {Array} + * @example + * + * R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]] + * R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz'] + */ + var splitEvery = _curry2(function splitEvery(n, list) { + if (n <= 0) { + throw new Error('First argument to splitEvery must be a positive integer'); + } + var result = []; + var idx = 0; + while (idx < list.length) { + result.push(slice(idx, idx += n, list)); + } + return result; + }); - var _coderep = __webpack_require__(41); + /** + * Adds together all the elements of a list. + * + * @func + * @memberOf R + * @category Math + * @sig [Number] -> Number + * @param {Array} list An array of numbers + * @return {Number} The sum of all the numbers in the list. + * @see R.reduce + * @example + * + * R.sum([2,4,6,8,100,1]); //=> 121 + */ + var sum = reduce(add, 0); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** + * Returns all but the first element of the given list or string (or object + * with a `tail` method). + * + * @func + * @memberOf R + * @category List + * @see R.head, R.init, R.last + * @sig [a] -> [a] + * @sig String -> String + * @param {*} list + * @return {*} + * @example + * + * R.tail([1, 2, 3]); //=> [2, 3] + * R.tail([1, 2]); //=> [2] + * R.tail([1]); //=> [] + * R.tail([]); //=> [] + * + * R.tail('abc'); //=> 'bc' + * R.tail('ab'); //=> 'b' + * R.tail('a'); //=> '' + * R.tail(''); //=> '' + */ + var tail = _checkForMethod('tail', slice(1, Infinity)); - function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + /** + * Returns the first `n` elements of the given list, string, or + * transducer/transformer (or object with a `take` method). + * + * @func + * @memberOf R + * @category List + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n + * @param {*} list + * @return {*} + * @see R.drop + * @example + * + * R.take(1, ['foo', 'bar', 'baz']); //=> ['foo'] + * R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] + * R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.take(3, 'ramda'); //=> 'ram' + * + * var personnel = [ + * 'Dave Brubeck', + * 'Paul Desmond', + * 'Eugene Wright', + * 'Joe Morello', + * 'Gerry Mulligan', + * 'Bob Bates', + * 'Joe Dodge', + * 'Ron Crotty' + * ]; + * + * var takeFive = R.take(5); + * takeFive(personnel); + * //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan'] + */ + var take = _curry2(_dispatchable('take', _xtake, function take(n, xs) { + return slice(0, n < 0 ? Infinity : n, xs); + })); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function p(node, precedence, a) { - return (0, _coderep.getPrecedence)(node) < precedence ? paren(a) : a; - } - - function t(token) { - return new _coderep.Token(token); - } - - function paren(rep) { - return new _coderep.Paren(rep); - } + /** + * Returns a new list containing the first `n` elements of a given list, passing each value + * to the supplied predicate function, and terminating when the predicate function returns + * `false`. Excludes the element that caused the predicate function to fail. The predicate + * function is passed one argument: *(value)*. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a -> Boolean) -> [a] -> [a] + * @param {Function} fn The function called per iteration. + * @param {Array} list The collection to iterate over. + * @return {Array} A new array. + * @see R.dropWhile + * @example + * + * var isNotFour = function(x) { + * return !(x === 4); + * }; + * + * R.takeWhile(isNotFour, [1, 2, 3, 4]); //=> [1, 2, 3] + */ + var takeWhile = _curry2(_dispatchable('takeWhile', _xtakeWhile, function takeWhile(fn, list) { + var idx = 0, len = list.length; + while (idx < len && fn(list[idx])) { + idx += 1; + } + return _slice(list, 0, idx); + })); - function brace(rep) { - return new _coderep.Brace(rep); - } + /** + * Initializes a transducer using supplied iterator function. Returns a single item by + * iterating through the list, successively calling the transformed iterator function and + * passing it an accumulator value and the current value from the array, and then passing + * the result to the next call. + * + * The iterator function receives two values: *(acc, value)*. It will be wrapped as a + * transformer to initialize the transducer. A transformer can be passed directly in place + * of an iterator function. In both cases, iteration may be stopped early with the + * `R.reduced` function. + * + * A transducer is a function that accepts a transformer and returns a transformer and can + * be composed directly. + * + * A transformer is an an object that provides a 2-arity reducing iterator function, step, + * 0-arity initial value function, init, and 1-arity result extraction function, result. + * The step function is used as the iterator function in reduce. The result function is used + * to convert the final accumulator into the return type and in most cases is R.identity. + * The init function can be used to provide an initial accumulator, but is ignored by transduce. + * + * The iteration is performed with R.reduce after initializing the transducer. + * + * @func + * @memberOf R + * @category List + * @see R.reduce, R.reduced, R.into + * @sig (c -> c) -> (a,b -> a) -> a -> [b] -> a + * @param {Function} xf The transducer function. Receives a transformer and returns a transformer. + * @param {Function} fn The iterator function. Receives two values, the accumulator and the + * current element from the array. Wrapped as transformer, if necessary, and used to + * initialize the transducer + * @param {*} acc The initial accumulator value. + * @param {Array} list The list to iterate over. + * @return {*} The final, accumulated value. + * @example + * + * var numbers = [1, 2, 3, 4]; + * var transducer = R.compose(R.map(R.add(1)), R.take(2)); + * + * R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3] + */ + var transduce = curryN(4, function transduce(xf, fn, acc, list) { + return _reduce(xf(typeof fn === 'function' ? _xwrap(fn) : fn), acc, list); + }); - function bracket(rep) { - return new _coderep.Bracket(rep); - } + /** + * Combines two lists into a set (i.e. no duplicates) composed of the elements of each list. Duplication is + * determined according to the value returned by applying the supplied predicate to two list elements. + * + * @func + * @memberOf R + * @category Relation + * @sig (a,a -> Boolean) -> [a] -> [a] -> [a] + * @param {Function} pred A predicate used to test whether two items are equal. + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @return {Array} The first and second lists concatenated, with + * duplicates removed. + * @see R.union + * @example + * + * function cmp(x, y) { return x.a === y.a; } + * var l1 = [{a: 1}, {a: 2}]; + * var l2 = [{a: 1}, {a: 4}]; + * R.unionWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}] + */ + var unionWith = _curry3(function unionWith(pred, list1, list2) { + return uniqWith(pred, _concat(list1, list2)); + }); - function noIn(rep) { - return new _coderep.NoIn(rep); - } + /** + * Returns a new list containing only one copy of each element in the original list. + * `R.equals` is used to determine equality. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [a] + * @param {Array} list The array to consider. + * @return {Array} The list of unique items. + * @example + * + * R.uniq([1, 1, 2, 1]); //=> [1, 2] + * R.uniq([1, '1']); //=> [1, '1'] + * R.uniq([[42], [42]]); //=> [[42]] + */ + var uniq = uniqWith(equals); - function markContainsIn(state) { - return state.containsIn ? new _coderep.ContainsIn(state) : state; - } + /** + * Returns a new list by pulling every item at the first level of nesting out, and putting + * them in a new array. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [b] + * @param {Array} list The array to consider. + * @return {Array} The flattened list. + * @see R.flatten + * @example + * + * R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]] + * R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6] + */ + var unnest = _curry1(_makeFlat(false)); - function seq() { - for (var _len = arguments.length, reps = Array(_len), _key = 0; _key < _len; _key++) { - reps[_key] = arguments[_key]; - } + /** + * Accepts a function `fn` and any number of transformer functions and returns a new + * function. When the new function is invoked, it calls the function `fn` with parameters + * consisting of the result of calling each supplied handler on successive arguments to the + * new function. + * + * If more arguments are passed to the returned function than transformer functions, those + * arguments are passed directly to `fn` as additional parameters. If you expect additional + * arguments that don't need to be transformed, although you can ignore them, it's best to + * pass an identity function so that the new function reports the correct arity. + * + * @func + * @memberOf R + * @category Function + * @sig (x1 -> x2 -> ... -> z) -> ((a -> x1), (b -> x2), ...) -> (a -> b -> ... -> z) + * @param {Function} fn The function to wrap. + * @param {...Function} transformers A variable number of transformer functions + * @return {Function} The wrapped function. + * @example + * + * var double = function(y) { return y * 2; }; + * var square = function(x) { return x * x; }; + * var add = function(a, b) { return a + b; }; + * // Adds any number of arguments together + * var addAll = function() { + * return R.reduce(add, 0, arguments); + * }; + * + * // Basic example + * var addDoubleAndSquare = R.useWith(addAll, double, square); + * + * //≅ addAll(double(10), square(5)); + * addDoubleAndSquare(10, 5); //=> 45 + * + * // Example of passing more arguments than transformers + * //≅ addAll(double(10), square(5), 100); + * addDoubleAndSquare(10, 5, 100); //=> 145 + * + * // If there are extra _expected_ arguments that don't need to be transformed, although + * // you can ignore them, it might be best to pass in the identity function so that the new + * // function correctly reports arity. + * var addDoubleAndSquareWithExtraParams = R.useWith(addAll, double, square, R.identity); + * // addDoubleAndSquareWithExtraParams.length //=> 3 + * //≅ addAll(double(10), square(5), R.identity(100)); + * addDoubleAndSquare(10, 5, 100); //=> 145 + */ + /*, transformers */ + var useWith = curry(function useWith(fn) { + var transformers = _slice(arguments, 1); + var tlen = transformers.length; + return curry(_arity(tlen, function () { + var args = [], idx = 0; + while (idx < tlen) { + args[idx] = transformers[idx](arguments[idx]); + idx += 1; + } + return fn.apply(this, args.concat(_slice(arguments, tlen))); + })); + }); - return new _coderep.Seq(reps); - } + /** + * Takes a spec object and a test object; returns true if the test satisfies + * the spec, false otherwise. An object satisfies the spec if, for each of the + * spec's own properties, accessing that property of the object gives the same + * value (in `R.equals` terms) as accessing that property of the spec. + * + * `whereEq` is a specialization of [`where`](#where). + * + * @func + * @memberOf R + * @category Object + * @sig {String: *} -> {String: *} -> Boolean + * @param {Object} spec + * @param {Object} testObj + * @return {Boolean} + * @see R.where + * @example + * + * // pred :: Object -> Boolean + * var pred = R.whereEq({a: 1, b: 2}); + * + * pred({a: 1}); //=> false + * pred({a: 1, b: 2}); //=> true + * pred({a: 1, b: 2, c: 3}); //=> true + * pred({a: 1, b: 1}); //=> false + */ + var whereEq = _curry2(function whereEq(spec, testObj) { + return where(mapObj(equals, spec), testObj); + }); - function semi() { - return new _coderep.Semi(); - } + var _flatCat = function () { + var preservingReduced = function (xf) { + return { + '@@transducer/init': _xfBase.init, + '@@transducer/result': function (result) { + return xf['@@transducer/result'](result); + }, + '@@transducer/step': function (result, input) { + var ret = xf['@@transducer/step'](result, input); + return ret['@@transducer/reduced'] ? _forceReduced(ret) : ret; + } + }; + }; + return function _xcat(xf) { + var rxf = preservingReduced(xf); + return { + '@@transducer/init': _xfBase.init, + '@@transducer/result': function (result) { + return rxf['@@transducer/result'](result); + }, + '@@transducer/step': function (result, input) { + return !isArrayLike(input) ? _reduce(rxf, result, [input]) : _reduce(rxf, result, input); + } + }; + }; + }(); - function semiOp() { - return new _coderep.SemiOp(); - } + var _indexOf = function _indexOf(list, item, from) { + var idx = from; + while (idx < list.length) { + if (equals(list[idx], item)) { + return idx; + } + idx += 1; + } + return -1; + }; - function empty() { - return new _coderep.Empty(); - } + /** + * Create a predicate wrapper which will call a pick function (all/any) for each predicate + * + * @private + * @see R.all + * @see R.any + */ + // Call function immediately if given arguments + // Return a function which will call the predicates with the provided arguments + var _predicateWrap = function _predicateWrap(predPicker) { + return function (preds) { + var predIterator = function () { + var args = arguments; + return predPicker(function (predicate) { + return predicate.apply(null, args); + }, preds); + }; + return arguments.length > 1 ? // Call function immediately if given arguments + predIterator.apply(null, _slice(arguments, 1)) : // Return a function which will call the predicates with the provided arguments + _arity(Math.max.apply(Math, pluck('length', preds)), predIterator); + }; + }; - function commaSep(pieces) { - return new _coderep.CommaSep(pieces); - } + var _xchain = _curry2(function _xchain(f, xf) { + return map(f, _flatCat(xf)); + }); - function getAssignmentExpr(state) { - return state ? state.containsGroup ? paren(state) : state : empty(); - } + /** + * Given a list of predicates, returns a new predicate that will be true exactly when all of them are. + * + * @func + * @memberOf R + * @category Logic + * @sig [(*... -> Boolean)] -> (*... -> Boolean) + * @param {Array} list An array of predicate functions + * @param {*} optional Any arguments to pass into the predicates + * @return {Function} a function that applies its arguments to each of + * the predicates, returning `true` if all are satisfied. + * @see R.anyPass + * @example + * + * var gt10 = function(x) { return x > 10; }; + * var even = function(x) { return x % 2 === 0}; + * var f = R.allPass([gt10, even]); + * f(11); //=> false + * f(12); //=> true + */ + var allPass = _curry1(_predicateWrap(all)); - var MinimalCodeGen = function () { - function MinimalCodeGen() { - _classCallCheck(this, MinimalCodeGen); - } + /** + * Given a list of predicates returns a new predicate that will be true exactly when any one of them is. + * + * @func + * @memberOf R + * @category Logic + * @sig [(*... -> Boolean)] -> (*... -> Boolean) + * @param {Array} list An array of predicate functions + * @param {*} optional Any arguments to pass into the predicates + * @return {Function} A function that applies its arguments to each of the predicates, returning + * `true` if all are satisfied. + * @see R.allPass + * @example + * + * var gt10 = function(x) { return x > 10; }; + * var even = function(x) { return x % 2 === 0}; + * var f = R.anyPass([gt10, even]); + * f(11); //=> true + * f(8); //=> true + * f(9); //=> false + */ + var anyPass = _curry1(_predicateWrap(any)); - _createClass(MinimalCodeGen, [{ - key: "parenToAvoidBeingDirective", - value: function parenToAvoidBeingDirective(element, original) { - if (element && element.type === "ExpressionStatement" && element.expression.type === "LiteralStringExpression") { - return seq(paren(original.children[0]), semiOp()); - } - return original; - } - }, { - key: "reduceArrayExpression", - value: function reduceArrayExpression(node, _ref) { - var elements = _ref.elements; + /** + * ap applies a list of functions to a list of values. + * + * @func + * @memberOf R + * @category Function + * @sig [f] -> [a] -> [f a] + * @param {Array} fns An array of functions + * @param {Array} vs An array of values + * @return {Array} An array of results of applying each of `fns` to all of `vs` in turn. + * @example + * + * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6] + */ + var ap = _curry2(function ap(fns, vs) { + return _hasMethod('ap', fns) ? fns.ap(vs) : _reduce(function (acc, fn) { + return _concat(acc, map(fn, vs)); + }, [], fns); + }); - if (elements.length === 0) { - return bracket(empty()); - } + /** + * Returns the result of calling its first argument with the remaining + * arguments. This is occasionally useful as a converging function for + * `R.converge`: the left branch can produce a function while the right + * branch produces a value to be passed to that function as an argument. + * + * @func + * @memberOf R + * @category Function + * @sig (*... -> a),*... -> a + * @param {Function} fn The function to apply to the remaining arguments. + * @param {...*} args Any number of positional arguments. + * @return {*} + * @see R.apply + * @example + * + * var indentN = R.pipe(R.times(R.always(' ')), + * R.join(''), + * R.replace(/^(?!$)/gm)); + * + * var format = R.converge(R.call, + * R.pipe(R.prop('indent'), indentN), + * R.prop('value')); + * + * format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> ' foo\n bar\n baz\n' + */ + var call = curry(function call(fn) { + return fn.apply(this, _slice(arguments, 1)); + }); - var content = commaSep(elements.map(getAssignmentExpr)); - if (elements.length > 0 && elements[elements.length - 1] == null) { - content = seq(content, t(",")); - } - return bracket(content); - } - }, { - key: "reduceSpreadElement", - value: function reduceSpreadElement(node, _ref2) { - var expression = _ref2.expression; + /** + * `chain` maps a function over a list and concatenates the results. + * This implementation is compatible with the + * Fantasy-land Chain spec, and will work with types that implement that spec. + * `chain` is also known as `flatMap` in some libraries + * + * @func + * @memberOf R + * @category List + * @sig (a -> [b]) -> [a] -> [b] + * @param {Function} fn + * @param {Array} list + * @return {Array} + * @example + * + * var duplicate = function(n) { + * return [n, n]; + * }; + * R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3] + */ + var chain = _curry2(_dispatchable('chain', _xchain, function chain(fn, list) { + return unnest(map(fn, list)); + })); - return seq(t("..."), p(node.expression, _coderep.Precedence.Assignment, expression)); - } - }, { - key: "reduceAssignmentExpression", - value: function reduceAssignmentExpression(node, _ref3) { - var binding = _ref3.binding; - var expression = _ref3.expression; + /** + * Turns a list of Functors into a Functor of a list, applying + * a mapping function to the elements of the list along the way. + * + * @func + * @memberOf R + * @category List + * @see R.commute + * @sig Functor f => (f a -> f b) -> (x -> f x) -> [f a] -> f [b] + * @param {Function} fn The transformation function + * @param {Function} of A function that returns the data type to return + * @param {Array} list An array of functors of the same type + * @return {*} + * @example + * + * R.commuteMap(R.map(R.add(10)), R.of, [[1], [2, 3]]); //=> [[11, 12], [11, 13]] + * R.commuteMap(R.map(R.add(10)), R.of, [[1, 2], [3]]); //=> [[11, 13], [12, 13]] + * R.commuteMap(R.map(R.add(10)), R.of, [[1], [2], [3]]); //=> [[11, 12, 13]] + * R.commuteMap(R.map(R.add(10)), Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([11, 12, 13]) + * R.commuteMap(R.map(R.add(10)), Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() + */ + var commuteMap = _curry3(function commuteMap(fn, of, list) { + function consF(acc, ftor) { + return ap(map(append, fn(ftor)), acc); + } + return _reduce(consF, of([]), list); + }); - var leftCode = binding; - var rightCode = expression; - var containsIn = expression.containsIn; - var startsWithCurly = binding.startsWithCurly; - var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; - var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; - if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { - rightCode = paren(rightCode); - containsIn = false; - } - return (0, _objectAssign2.default)(seq(leftCode, t("="), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); - } - }, { - key: "reduceCompoundAssignmentExpression", - value: function reduceCompoundAssignmentExpression(node, _ref4) { - var binding = _ref4.binding; - var expression = _ref4.expression; + /** + * Wraps a constructor function inside a curried function that can be called with the same + * arguments and returns the same type. The arity of the function returned is specified + * to allow using variadic constructor functions. + * + * @func + * @memberOf R + * @category Function + * @sig Number -> (* -> {*}) -> (* -> {*}) + * @param {Number} n The arity of the constructor function. + * @param {Function} Fn The constructor function to wrap. + * @return {Function} A wrapped, curried constructor function. + * @example + * + * // Variadic constructor function + * var Widget = function() { + * this.children = Array.prototype.slice.call(arguments); + * // ... + * }; + * Widget.prototype = { + * // ... + * }; + * var allConfigs = [ + * // ... + * ]; + * R.map(R.constructN(1, Widget), allConfigs); // a list of Widgets + */ + var constructN = _curry2(function constructN(n, Fn) { + if (n > 10) { + throw new Error('Constructor with greater than ten arguments'); + } + if (n === 0) { + return function () { + return new Fn(); + }; + } + return curry(nAry(n, function ($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) { + switch (arguments.length) { + case 1: + return new Fn($0); + case 2: + return new Fn($0, $1); + case 3: + return new Fn($0, $1, $2); + case 4: + return new Fn($0, $1, $2, $3); + case 5: + return new Fn($0, $1, $2, $3, $4); + case 6: + return new Fn($0, $1, $2, $3, $4, $5); + case 7: + return new Fn($0, $1, $2, $3, $4, $5, $6); + case 8: + return new Fn($0, $1, $2, $3, $4, $5, $6, $7); + case 9: + return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8); + case 10: + return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9); + } + })); + }); - var leftCode = binding; - var rightCode = expression; - var containsIn = expression.containsIn; - var startsWithCurly = binding.startsWithCurly; - var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; - var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; - if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { - rightCode = paren(rightCode); - containsIn = false; - } - return (0, _objectAssign2.default)(seq(leftCode, t(node.operator), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); - } - }, { - key: "reduceBinaryExpression", - value: function reduceBinaryExpression(node, _ref5) { - var left = _ref5.left; - var right = _ref5.right; + /** + * Accepts at least three functions and returns a new function. When invoked, this new + * function will invoke the first function, `after`, passing as its arguments the + * results of invoking the subsequent functions with whatever arguments are passed to + * the new function. + * + * @func + * @memberOf R + * @category Function + * @sig (x1 -> x2 -> ... -> z) -> ((a -> b -> ... -> x1), (a -> b -> ... -> x2), ...) -> (a -> b -> ... -> z) + * @param {Function} after A function. `after` will be invoked with the return values of + * `fn1` and `fn2` as its arguments. + * @param {...Function} functions A variable number of functions. + * @return {Function} A new function. + * @example + * + * var add = function(a, b) { return a + b; }; + * var multiply = function(a, b) { return a * b; }; + * var subtract = function(a, b) { return a - b; }; + * + * //≅ multiply( add(1, 2), subtract(1, 2) ); + * R.converge(multiply, add, subtract)(1, 2); //=> -3 + * + * var add3 = function(a, b, c) { return a + b + c; }; + * R.converge(add3, multiply, add, subtract)(1, 2); //=> 4 + */ + var converge = curryN(3, function converge(after) { + var fns = _slice(arguments, 1); + return curryN(Math.max.apply(Math, pluck('length', fns)), function () { + var args = arguments; + var context = this; + return after.apply(context, _map(function (fn) { + return fn.apply(context, args); + }, fns)); + }); + }); - var leftCode = left; - var startsWithCurly = left.startsWithCurly; - var startsWithLetSquareBracket = left.startsWithLetSquareBracket; - var startsWithFunctionOrClass = left.startsWithFunctionOrClass; - var leftContainsIn = left.containsIn; - if ((0, _coderep.getPrecedence)(node.left) < (0, _coderep.getPrecedence)(node)) { - leftCode = paren(leftCode); - startsWithCurly = false; - startsWithLetSquareBracket = false; - startsWithFunctionOrClass = false; - leftContainsIn = false; - } - var rightCode = right; - var rightContainsIn = right.containsIn; - if ((0, _coderep.getPrecedence)(node.right) <= (0, _coderep.getPrecedence)(node)) { - rightCode = paren(rightCode); - rightContainsIn = false; - } - return (0, _objectAssign2.default)(seq(leftCode, t(node.operator), rightCode), { - containsIn: leftContainsIn || rightContainsIn || node.operator === "in", - containsGroup: node.operator == ",", - startsWithCurly: startsWithCurly, - startsWithLetSquareBracket: startsWithLetSquareBracket, - startsWithFunctionOrClass: startsWithFunctionOrClass - }); - } - }, { - key: "reduceBindingWithDefault", - value: function reduceBindingWithDefault(node, _ref6) { - var binding = _ref6.binding; - var init = _ref6.init; + /** + * Returns all but the first `n` elements of the given list, string, or + * transducer/transformer (or object with a `drop` method). + * + * @func + * @memberOf R + * @category List + * @see R.transduce + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n + * @param {*} list + * @return {*} + * @see R.take + * @example + * + * R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz'] + * R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz'] + * R.drop(3, ['foo', 'bar', 'baz']); //=> [] + * R.drop(4, ['foo', 'bar', 'baz']); //=> [] + * R.drop(3, 'ramda'); //=> 'da' + */ + var drop = _curry2(_dispatchable('drop', _xdrop, function drop(n, xs) { + return slice(Math.max(0, n), Infinity, xs); + })); - return seq(binding, t("="), init); - } - }, { - key: "reduceBindingIdentifier", - value: function reduceBindingIdentifier(node) { - var a = t(node.name); - if (node.name === "let") { - a.startsWithLet = true; - } - return a; - } - }, { - key: "reduceArrayBinding", - value: function reduceArrayBinding(node, _ref7) { - var elements = _ref7.elements; - var restElement = _ref7.restElement; + /** + * Returns a list containing all but the last `n` elements of the given `list`. + * + * @func + * @memberOf R + * @category List + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n The number of elements of `xs` to skip. + * @param {Array} xs The collection to consider. + * @return {Array} + * @see R.takeLast + * @example + * + * R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar'] + * R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo'] + * R.dropLast(3, ['foo', 'bar', 'baz']); //=> [] + * R.dropLast(4, ['foo', 'bar', 'baz']); //=> [] + * R.dropLast(3, 'ramda'); //=> 'ra' + */ + var dropLast = _curry2(function dropLast(n, xs) { + return take(n < xs.length ? xs.length - n : 0, xs); + }); - var content = undefined; - if (elements.length === 0) { - content = restElement == null ? empty() : seq(t("..."), restElement); - } else { - elements = elements.concat(restElement == null ? [] : [seq(t("..."), restElement)]); - content = commaSep(elements.map(getAssignmentExpr)); - if (elements.length > 0 && elements[elements.length - 1] == null) { - content = seq(content, t(",")); + /** + * Returns a new list without any consecutively repeating elements. Equality is + * determined by applying the supplied predicate two consecutive elements. + * The first element in a series of equal element is the one being preserved. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig (a, a -> Boolean) -> [a] -> [a] + * @param {Function} pred A predicate used to test whether two items are equal. + * @param {Array} list The array to consider. + * @return {Array} `list` without repeating elements. + * @example + * + * function lengthEq(x, y) { return Math.abs(x) === Math.abs(y); }; + * var l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3]; + * R.dropRepeatsWith(lengthEq, l); //=> [1, 3, 4, -5, 3] + */ + var dropRepeatsWith = _curry2(_dispatchable('dropRepeatsWith', _xdropRepeatsWith, function dropRepeatsWith(pred, list) { + var result = []; + var idx = 1; + var len = list.length; + if (len !== 0) { + result[0] = list[0]; + while (idx < len) { + if (!pred(last(result), list[idx])) { + result[result.length] = list[idx]; + } + idx += 1; + } } - } - return bracket(content); - } - }, { - key: "reduceObjectBinding", - value: function reduceObjectBinding(node, _ref8) { - var properties = _ref8.properties; - - var state = brace(commaSep(properties)); - state.startsWithCurly = true; - return state; - } - }, { - key: "reduceBindingPropertyIdentifier", - value: function reduceBindingPropertyIdentifier(node, _ref9) { - var binding = _ref9.binding; - var init = _ref9.init; + return result; + })); - if (node.init == null) return binding; - return seq(binding, t("="), init); - } - }, { - key: "reduceBindingPropertyProperty", - value: function reduceBindingPropertyProperty(node, _ref10) { - var name = _ref10.name; - var binding = _ref10.binding; + /** + * Reports whether two objects have the same value, in `R.equals` terms, + * for the specified property. Useful as a curried predicate. + * + * @func + * @memberOf R + * @category Object + * @sig k -> {k: v} -> {k: v} -> Boolean + * @param {String} prop The name of the property to compare + * @param {Object} obj1 + * @param {Object} obj2 + * @return {Boolean} + * + * @example + * + * var o1 = { a: 1, b: 2, c: 3, d: 4 }; + * var o2 = { a: 10, b: 20, c: 3, d: 40 }; + * R.eqProps('a', o1, o2); //=> false + * R.eqProps('c', o1, o2); //=> true + */ + var eqProps = _curry3(function eqProps(prop, obj1, obj2) { + return equals(obj1[prop], obj2[prop]); + }); - return seq(name, t(":"), binding); - } - }, { - key: "reduceBlock", - value: function reduceBlock(node, _ref11) { - var statements = _ref11.statements; + /** + * Returns the position of the first occurrence of an item in an array, + * or -1 if the item is not included in the array. `R.equals` is used to + * determine equality. + * + * @func + * @memberOf R + * @category List + * @sig a -> [a] -> Number + * @param {*} target The item to find. + * @param {Array} xs The array to search in. + * @return {Number} the index of the target, or -1 if the target is not found. + * @see R.lastIndexOf + * @example + * + * R.indexOf(3, [1,2,3,4]); //=> 2 + * R.indexOf(10, [1,2,3,4]); //=> -1 + */ + var indexOf = _curry2(function indexOf(target, xs) { + return _hasMethod('indexOf', xs) ? xs.indexOf(target) : _indexOf(xs, target, 0); + }); - return brace(seq.apply(undefined, _toConsumableArray(statements))); - } - }, { - key: "reduceBlockStatement", - value: function reduceBlockStatement(node, _ref12) { - var block = _ref12.block; + /** + * Returns all but the last element of the given list or string. + * + * @func + * @memberOf R + * @category List + * @see R.last, R.head, R.tail + * @sig [a] -> [a] + * @sig String -> String + * @param {*} list + * @return {*} + * @example + * + * R.init([1, 2, 3]); //=> [1, 2] + * R.init([1, 2]); //=> [1] + * R.init([1]); //=> [] + * R.init([]); //=> [] + * + * R.init('abc'); //=> 'ab' + * R.init('ab'); //=> 'a' + * R.init('a'); //=> '' + * R.init(''); //=> '' + */ + var init = slice(0, -1); - return block; - } - }, { - key: "reduceBreakStatement", - value: function reduceBreakStatement(node, _ref13) { - var label = _ref13.label; + /** + * Returns `true` if all elements are unique, in `R.equals` terms, + * otherwise `false`. + * + * @func + * @memberOf R + * @category List + * @sig [a] -> Boolean + * @param {Array} list The array to consider. + * @return {Boolean} `true` if all elements are unique, else `false`. + * @example + * + * R.isSet(['1', 1]); //=> true + * R.isSet([1, 1]); //=> false + * R.isSet([[42], [42]]); //=> false + */ + var isSet = _curry1(function isSet(list) { + var len = list.length; + var idx = 0; + while (idx < len) { + if (_indexOf(list, list[idx], idx + 1) >= 0) { + return false; + } + idx += 1; + } + return true; + }); - return seq(t("break"), label ? t(label) : empty(), semiOp()); - } - }, { - key: "reduceCallExpression", - value: function reduceCallExpression(node, _ref14) { - var callee = _ref14.callee; - var args = _ref14.arguments; + /** + * Returns a lens for the given getter and setter functions. The getter "gets" + * the value of the focus; the setter "sets" the value of the focus. The setter + * should not mutate the data structure. + * + * @func + * @memberOf R + * @category Object + * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig (s -> a) -> ((a, s) -> s) -> Lens s a + * @param {Function} getter + * @param {Function} setter + * @return {Lens} + * @see R.view, R.set, R.over, R.lensIndex, R.lensProp + * @example + * + * var xLens = R.lens(R.prop('x'), R.assoc('x')); + * + * R.view(xLens, {x: 1, y: 2}); //=> 1 + * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} + * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} + */ + var lens = _curry2(function lens(getter, setter) { + return function (f) { + return function (s) { + return map(function (v) { + return setter(v, s); + }, f(getter(s))); + }; + }; + }); - return (0, _objectAssign2.default)(seq(p(node.callee, (0, _coderep.getPrecedence)(node), callee), paren(commaSep(args))), { - startsWithCurly: callee.startsWithCurly, - startsWithLetSquareBracket: callee.startsWithLetSquareBracket, - startsWithFunctionOrClass: callee.startsWithFunctionOrClass - }); - } - }, { - key: "reduceCatchClause", - value: function reduceCatchClause(node, _ref15) { - var binding = _ref15.binding; - var body = _ref15.body; + /** + * Returns a lens whose focus is the specified index. + * + * @func + * @memberOf R + * @category Object + * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig Number -> Lens s a + * @param {Number} n + * @return {Lens} + * @see R.view, R.set, R.over + * @example + * + * var headLens = R.lensIndex(0); + * + * R.view(headLens, ['a', 'b', 'c']); //=> 'a' + * R.set(headLens, 'x', ['a', 'b', 'c']); //=> ['x', 'b', 'c'] + * R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c'] + */ + var lensIndex = _curry1(function lensIndex(n) { + return lens(nth(n), update(n)); + }); - return seq(t("catch"), paren(binding), body); - } - }, { - key: "reduceClassDeclaration", - value: function reduceClassDeclaration(node, _ref16) { - var name = _ref16.name; - var _super = _ref16.super; - var elements = _ref16.elements; + /** + * Returns a lens whose focus is the specified property. + * + * @func + * @memberOf R + * @category Object + * @typedef Lens s a = Functor f => (a -> f a) -> s -> f s + * @sig String -> Lens s a + * @param {String} k + * @return {Lens} + * @see R.view, R.set, R.over + * @example + * + * var xLens = R.lensProp('x'); + * + * R.view(xLens, {x: 1, y: 2}); //=> 1 + * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2} + * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2} + */ + var lensProp = _curry1(function lensProp(k) { + return lens(prop(k), assoc(k)); + }); - var state = seq(t("class"), name); - if (_super != null) { - state = seq(state, t("extends"), _super); - } - state = seq.apply(undefined, [state, t("{")].concat(_toConsumableArray(elements), [t("}")])); - return state; - } - }, { - key: "reduceClassExpression", - value: function reduceClassExpression(node, _ref17) { - var name = _ref17.name; - var _super = _ref17.super; - var elements = _ref17.elements; - - var state = t("class"); - if (name != null) { - state = seq(state, name); - } - if (_super != null) { - state = seq(state, t("extends"), _super); - } - state = seq.apply(undefined, [state, t("{")].concat(_toConsumableArray(elements), [t("}")])); - state.startsWithFunctionOrClass = true; - return state; - } - }, { - key: "reduceClassElement", - value: function reduceClassElement(node, _ref18) { - var method = _ref18.method; - - if (!node.isStatic) return method; - return seq(t("static"), method); - } - }, { - key: "reduceComputedMemberExpression", - value: function reduceComputedMemberExpression(node, _ref19) { - var object = _ref19.object; - var expression = _ref19.expression; + /** + * "lifts" a function to be the specified arity, so that it may "map over" that many + * lists (or other Functors). + * + * @func + * @memberOf R + * @see R.lift + * @category Function + * @sig Number -> (*... -> *) -> ([*]... -> [*]) + * @param {Function} fn The function to lift into higher context + * @return {Function} The function `fn` applicable to mappable objects. + * @example + * + * var madd3 = R.liftN(3, R.curryN(3, function() { + * return R.reduce(R.add, 0, arguments); + * })); + * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7] + */ + var liftN = _curry2(function liftN(arity, fn) { + var lifted = curryN(arity, fn); + return curryN(arity, function () { + return _reduce(ap, map(lifted, arguments[0]), _slice(arguments, 1)); + }); + }); - var startsWithLetSquareBracket = object.startsWithLetSquareBracket || node.object.type === "IdentifierExpression" && node.object.name === "let"; - return (0, _objectAssign2.default)(seq(p(node.object, (0, _coderep.getPrecedence)(node), object), bracket(expression)), { - startsWithLet: object.startsWithLet, - startsWithLetSquareBracket: startsWithLetSquareBracket, - startsWithCurly: object.startsWithCurly, - startsWithFunctionOrClass: object.startsWithFunctionOrClass - }); - } - }, { - key: "reduceComputedPropertyName", - value: function reduceComputedPropertyName(node, _ref20) { - var expression = _ref20.expression; + /** + * Returns the mean of the given list of numbers. + * + * @func + * @memberOf R + * @category Math + * @sig [Number] -> Number + * @param {Array} list + * @return {Number} + * @example + * + * R.mean([2, 7, 9]); //=> 6 + * R.mean([]); //=> NaN + */ + var mean = _curry1(function mean(list) { + return sum(list) / list.length; + }); - return bracket(expression); - } - }, { - key: "reduceConditionalExpression", - value: function reduceConditionalExpression(node, _ref21) { - var test = _ref21.test; - var consequent = _ref21.consequent; - var alternate = _ref21.alternate; + /** + * Returns the median of the given list of numbers. + * + * @func + * @memberOf R + * @category Math + * @sig [Number] -> Number + * @param {Array} list + * @return {Number} + * @example + * + * R.median([2, 9, 7]); //=> 7 + * R.median([7, 2, 10, 9]); //=> 8 + * R.median([]); //=> NaN + */ + var median = _curry1(function median(list) { + var len = list.length; + if (len === 0) { + return NaN; + } + var width = 2 - len % 2; + var idx = (len - width) / 2; + return mean(_slice(list).sort(function (a, b) { + return a < b ? -1 : a > b ? 1 : 0; + }).slice(idx, idx + width)); + }); - var containsIn = test.containsIn || alternate.containsIn; - var startsWithCurly = test.startsWithCurly; - var startsWithLetSquareBracket = test.startsWithLetSquareBracket; - var startsWithFunctionOrClass = test.startsWithFunctionOrClass; - return (0, _objectAssign2.default)(seq(p(node.test, _coderep.Precedence.LogicalOR, test), t("?"), p(node.consequent, _coderep.Precedence.Assignment, consequent), t(":"), p(node.alternate, _coderep.Precedence.Assignment, alternate)), { - containsIn: containsIn, - startsWithCurly: startsWithCurly, - startsWithLetSquareBracket: startsWithLetSquareBracket, - startsWithFunctionOrClass: startsWithFunctionOrClass - }); - } - }, { - key: "reduceContinueStatement", - value: function reduceContinueStatement(node, _ref22) { - var label = _ref22.label; + /** + * Merges a list of objects together into one object. + * + * @func + * @memberOf R + * @category List + * @sig [{k: v}] -> {k: v} + * @param {Array} list An array of objects + * @return {Object} A merged object. + * @see R.reduce + * @example + * + * R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3} + * R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2} + */ + var mergeAll = _curry1(function mergeAll(list) { + return reduce(merge, {}, list); + }); - return seq(t("continue"), label ? t(label) : empty(), semiOp()); - } - }, { - key: "reduceDataProperty", - value: function reduceDataProperty(node, _ref23) { - var name = _ref23.name; - var expression = _ref23.expression; + /** + * Performs left-to-right function composition. The leftmost function may have + * any arity; the remaining functions must be unary. + * + * In some libraries this function is named `sequence`. + * + * @func + * @memberOf R + * @category Function + * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> (a -> b -> ... -> n -> z) + * @param {...Function} functions + * @return {Function} + * @see R.compose + * @example + * + * var f = R.pipe(Math.pow, R.negate, R.inc); + * + * f(3, 4); // -(3^4) + 1 + */ + var pipe = function pipe() { + if (arguments.length === 0) { + throw new Error('pipe requires at least one argument'); + } + return curryN(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments))); + }; - return seq(name, t(":"), getAssignmentExpr(expression)); - } - }, { - key: "reduceDebuggerStatement", - value: function reduceDebuggerStatement(node) { - return seq(t("debugger"), semiOp()); - } - }, { - key: "reduceDoWhileStatement", - value: function reduceDoWhileStatement(node, _ref24) { - var body = _ref24.body; - var test = _ref24.test; + /** + * Performs left-to-right composition of one or more Promise-returning + * functions. The leftmost function may have any arity; the remaining + * functions must be unary. + * + * @func + * @memberOf R + * @category Function + * @sig ((a -> Promise b), (b -> Promise c), ..., (y -> Promise z)) -> (a -> Promise z) + * @param {...Function} functions + * @return {Function} + * @see R.composeP + * @example + * + * // followersForUser :: String -> Promise [User] + * var followersForUser = R.pipeP(db.getUserById, db.getFollowers); + */ + var pipeP = function pipeP() { + if (arguments.length === 0) { + throw new Error('pipeP requires at least one argument'); + } + return curryN(arguments[0].length, reduce(_pipeP, arguments[0], tail(arguments))); + }; - return seq(t("do"), body, t("while"), paren(test), semiOp()); - } - }, { - key: "reduceEmptyStatement", - value: function reduceEmptyStatement(node) { - return semi(); - } - }, { - key: "reduceExpressionStatement", - value: function reduceExpressionStatement(node, _ref25) { - var expression = _ref25.expression; + /** + * Multiplies together all the elements of a list. + * + * @func + * @memberOf R + * @category Math + * @sig [Number] -> Number + * @param {Array} list An array of numbers + * @return {Number} The product of all the numbers in the list. + * @see R.reduce + * @example + * + * R.product([2,4,6,8,100,1]); //=> 38400 + */ + var product = reduce(multiply, 1); - var needsParens = expression.startsWithCurly || expression.startsWithLetSquareBracket || expression.startsWithFunctionOrClass; - return seq(needsParens ? paren(expression) : expression, semiOp()); - } - }, { - key: "reduceForInStatement", - value: function reduceForInStatement(node, _ref26) { - var left = _ref26.left; - var right = _ref26.right; - var body = _ref26.body; + /** + * Reasonable analog to SQL `select` statement. + * + * @func + * @memberOf R + * @category Object + * @category Relation + * @sig [k] -> [{k: v}] -> [{k: v}] + * @param {Array} props The property names to project + * @param {Array} objs The objects to query + * @return {Array} An array of objects with just the `props` properties. + * @example + * + * var abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2}; + * var fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7}; + * var kids = [abby, fred]; + * R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}] + */ + // passing `identity` gives correct arity + var project = useWith(_map, pickAll, identity); - var leftP = left; - switch (node.left.type) { - case "VariableDeclaration": - leftP = noIn(markContainsIn(left)); - break; - case "BindingIdentifier": - if (node.left.name === "let") { - leftP = paren(left); - } - break; - } - return (0, _objectAssign2.default)(seq(t("for"), paren(seq(leftP, t("in"), right)), body), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceForOfStatement", - value: function reduceForOfStatement(node, _ref27) { - var left = _ref27.left; - var right = _ref27.right; - var body = _ref27.body; + /** + * Returns a new list containing the last `n` elements of the given list. + * If `n > list.length`, returns a list of `list.length` elements. + * + * @func + * @memberOf R + * @category List + * @sig Number -> [a] -> [a] + * @sig Number -> String -> String + * @param {Number} n The number of elements to return. + * @param {Array} xs The collection to consider. + * @return {Array} + * @see R.dropLast + * @example + * + * R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz'] + * R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['for', 'baz'] + * R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz'] + * R.takeLast(3, 'ramda'); //=> 'mda' + */ + var takeLast = _curry2(function takeLast(n, xs) { + return drop(n >= 0 ? xs.length - n : 0, xs); + }); - left = node.left.type === "VariableDeclaration" ? noIn(markContainsIn(left)) : left; - return (0, _objectAssign2.default)(seq(t("for"), paren(seq(left.startsWithLet ? paren(left) : left, t("of"), right)), body), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceForStatement", - value: function reduceForStatement(node, _ref28) { - var init = _ref28.init; - var test = _ref28.test; - var update = _ref28.update; - var body = _ref28.body; + var _contains = function _contains(a, list) { + return _indexOf(list, a, 0) >= 0; + }; - return (0, _objectAssign2.default)(seq(t("for"), paren(seq(init ? noIn(markContainsIn(init)) : empty(), semi(), test || empty(), semi(), update || empty())), body), { - endsWithMissingElse: body.endsWithMissingElse - }); - } - }, { - key: "reduceFunctionBody", - value: function reduceFunctionBody(node, _ref29) { - var directives = _ref29.directives; - var statements = _ref29.statements; + // mapPairs :: (Object, [String]) -> [String] + // Function, RegExp, user-defined types + var _toString = function _toString(x, seen) { + var recur = function recur(y) { + var xs = seen.concat([x]); + return _contains(y, xs) ? '' : _toString(y, xs); + }; + // mapPairs :: (Object, [String]) -> [String] + var mapPairs = function (obj, keys) { + return _map(function (k) { + return _quote(k) + ': ' + recur(obj[k]); + }, keys.slice().sort()); + }; + switch (Object.prototype.toString.call(x)) { + case '[object Arguments]': + return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))'; + case '[object Array]': + return '[' + _map(recur, x).concat(mapPairs(x, reject(test(/^\d+$/), keys(x)))).join(', ') + ']'; + case '[object Boolean]': + return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString(); + case '[object Date]': + return 'new Date(' + _quote(_toISOString(x)) + ')'; + case '[object Null]': + return 'null'; + case '[object Number]': + return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10); + case '[object String]': + return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x); + case '[object Undefined]': + return 'undefined'; + default: + return typeof x.constructor === 'function' && x.constructor.name !== 'Object' && typeof x.toString === 'function' && x.toString() !== '[object Object]' ? x.toString() : // Function, RegExp, user-defined types + '{' + mapPairs(x, keys(x)).join(', ') + '}'; + } + }; - if (statements.length) { - statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); - } - return seq.apply(undefined, _toConsumableArray(directives).concat(_toConsumableArray(statements))); - } - }, { - key: "reduceFunctionDeclaration", - value: function reduceFunctionDeclaration(node, _ref30) { - var name = _ref30.name; - var params = _ref30.params; - var body = _ref30.body; + /** + * Turns a list of Functors into a Functor of a list. + * + * @func + * @memberOf R + * @category List + * @see R.commuteMap + * @sig Functor f => (x -> f x) -> [f a] -> f [a] + * @param {Function} of A function that returns the data type to return + * @param {Array} list An array of functors of the same type + * @return {*} + * @example + * + * R.commute(R.of, [[1], [2, 3]]); //=> [[1, 2], [1, 3]] + * R.commute(R.of, [[1, 2], [3]]); //=> [[1, 3], [2, 3]] + * R.commute(R.of, [[1], [2], [3]]); //=> [[1, 2, 3]] + * R.commute(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3]) + * R.commute(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing() + */ + var commute = commuteMap(identity); - return seq(t("function"), node.isGenerator ? t("*") : empty(), node.name.name === "*default*" ? empty() : name, paren(params), brace(body)); - } - }, { - key: "reduceFunctionExpression", - value: function reduceFunctionExpression(node, _ref31) { - var name = _ref31.name; - var params = _ref31.params; - var body = _ref31.body; + /** + * Performs right-to-left function composition. The rightmost function may have + * any arity; the remaining functions must be unary. + * + * @func + * @memberOf R + * @category Function + * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> (a -> b -> ... -> n -> z) + * @param {...Function} functions + * @return {Function} + * @see R.pipe + * @example + * + * var f = R.compose(R.inc, R.negate, Math.pow); + * + * f(3, 4); // -(3^4) + 1 + */ + var compose = function compose() { + if (arguments.length === 0) { + throw new Error('compose requires at least one argument'); + } + return pipe.apply(this, reverse(arguments)); + }; - var state = seq(t("function"), node.isGenerator ? t("*") : empty(), name ? name : empty(), paren(params), brace(body)); - state.startsWithFunctionOrClass = true; - return state; - } - }, { - key: "reduceFormalParameters", - value: function reduceFormalParameters(node, _ref32) { - var items = _ref32.items; - var rest = _ref32.rest; + /** + * Returns the right-to-left Kleisli composition of the provided functions, + * each of which must return a value of a type supported by [`chain`](#chain). + * + * `R.composeK(h, g, f)` is equivalent to `R.compose(R.chain(h), R.chain(g), R.chain(f))`. + * + * @func + * @memberOf R + * @category Function + * @see R.pipeK + * @sig Chain m => ((y -> m z), (x -> m y), ..., (a -> m b)) -> (m a -> m z) + * @param {...Function} + * @return {Function} + * @example + * + * // parseJson :: String -> Maybe * + * // get :: String -> Object -> Maybe * + * + * // getStateCode :: Maybe String -> Maybe String + * var getStateCode = R.composeK( + * R.compose(Maybe.of, R.toUpper), + * get('state'), + * get('address'), + * get('user'), + * parseJson + * ); + * + * getStateCode(Maybe.of('{"user":{"address":{"state":"ny"}}}')); + * //=> Just('NY') + * getStateCode(Maybe.of('[Invalid JSON]')); + * //=> Nothing() + */ + var composeK = function composeK() { + return arguments.length === 0 ? identity : compose.apply(this, map(chain, arguments)); + }; - return commaSep(items.concat(rest == null ? [] : [seq(t("..."), rest)])); - } - }, { - key: "reduceArrowExpression", - value: function reduceArrowExpression(node, _ref33) { - var params = _ref33.params; - var body = _ref33.body; + /** + * Performs right-to-left composition of one or more Promise-returning + * functions. The rightmost function may have any arity; the remaining + * functions must be unary. + * + * @func + * @memberOf R + * @category Function + * @sig ((y -> Promise z), (x -> Promise y), ..., (a -> Promise b)) -> (a -> Promise z) + * @param {...Function} functions + * @return {Function} + * @see R.pipeP + * @example + * + * // followersForUser :: String -> Promise [User] + * var followersForUser = R.composeP(db.getFollowers, db.getUserById); + */ + var composeP = function composeP() { + if (arguments.length === 0) { + throw new Error('composeP requires at least one argument'); + } + return pipeP.apply(this, reverse(arguments)); + }; - if (node.params.rest != null || node.params.items.length !== 1 || node.params.items[0].type !== "BindingIdentifier") { - params = paren(params); - } - if (node.body.type === "FunctionBody") { - body = brace(body); - } else if (body.startsWithCurly) { - body = paren(body); - } - return seq(params, t("=>"), p(node.body, _coderep.Precedence.Assignment, body)); - } - }, { - key: "reduceGetter", - value: function reduceGetter(node, _ref34) { - var name = _ref34.name; - var body = _ref34.body; - - return seq(t("get"), name, paren(empty()), brace(body)); - } - }, { - key: "reduceIdentifierExpression", - value: function reduceIdentifierExpression(node) { - var a = t(node.name); - if (node.name === "let") { - a.startsWithLet = true; - } - return a; - } - }, { - key: "reduceIfStatement", - value: function reduceIfStatement(node, _ref35) { - var test = _ref35.test; - var consequent = _ref35.consequent; - var alternate = _ref35.alternate; - - if (alternate && consequent.endsWithMissingElse) { - consequent = brace(consequent); - } - return (0, _objectAssign2.default)(seq(t("if"), paren(test), consequent, alternate ? seq(t("else"), alternate) : empty()), { endsWithMissingElse: alternate ? alternate.endsWithMissingElse : true }); - } - }, { - key: "reduceImport", - value: function reduceImport(node, _ref36) { - var defaultBinding = _ref36.defaultBinding; - var namedImports = _ref36.namedImports; - - var bindings = []; - if (defaultBinding != null) { - bindings.push(defaultBinding); - } - if (namedImports.length > 0) { - bindings.push(brace(commaSep(namedImports))); - } - if (bindings.length === 0) { - return seq(t("import"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); - } - return seq(t("import"), commaSep(bindings), t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); - } - }, { - key: "reduceImportNamespace", - value: function reduceImportNamespace(node, _ref37) { - var defaultBinding = _ref37.defaultBinding; - var namespaceBinding = _ref37.namespaceBinding; + /** + * Wraps a constructor function inside a curried function that can be called with the same + * arguments and returns the same type. + * + * @func + * @memberOf R + * @category Function + * @sig (* -> {*}) -> (* -> {*}) + * @param {Function} Fn The constructor function to wrap. + * @return {Function} A wrapped, curried constructor function. + * @example + * + * // Constructor function + * var Widget = function(config) { + * // ... + * }; + * Widget.prototype = { + * // ... + * }; + * var allConfigs = [ + * // ... + * ]; + * R.map(R.construct(Widget), allConfigs); // a list of Widgets + */ + var construct = _curry1(function construct(Fn) { + return constructN(Fn.length, Fn); + }); - return seq(t("import"), defaultBinding == null ? empty() : seq(defaultBinding, t(",")), t("*"), t("as"), namespaceBinding, t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); - } - }, { - key: "reduceImportSpecifier", - value: function reduceImportSpecifier(node, _ref38) { - var binding = _ref38.binding; + /** + * Returns `true` if the specified value is equal, in `R.equals` terms, + * to at least one element of the given list; `false` otherwise. + * + * @func + * @memberOf R + * @category List + * @sig a -> [a] -> Boolean + * @param {Object} a The item to compare against. + * @param {Array} list The array to consider. + * @return {Boolean} `true` if the item is in the list, `false` otherwise. + * + * @example + * + * R.contains(3, [1, 2, 3]); //=> true + * R.contains(4, [1, 2, 3]); //=> false + * R.contains([42], [[42]]); //=> true + */ + var contains = _curry2(_contains); - if (node.name == null) return binding; - return seq(t(node.name), t("as"), binding); - } - }, { - key: "reduceExportAllFrom", - value: function reduceExportAllFrom(node) { - return seq(t("export"), t("*"), t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp()); - } - }, { - key: "reduceExportFrom", - value: function reduceExportFrom(node, _ref39) { - var namedExports = _ref39.namedExports; + /** + * Finds the set (i.e. no duplicates) of all elements in the first list not contained in the second list. + * + * @func + * @memberOf R + * @category Relation + * @sig [a] -> [a] -> [a] + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @return {Array} The elements in `list1` that are not in `list2`. + * @see R.differenceWith + * @example + * + * R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2] + * R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5] + */ + var difference = _curry2(function difference(first, second) { + var out = []; + var idx = 0; + var firstLen = first.length; + while (idx < firstLen) { + if (!_contains(first[idx], second) && !_contains(first[idx], out)) { + out[out.length] = first[idx]; + } + idx += 1; + } + return out; + }); - return seq(t("export"), brace(commaSep(namedExports)), node.moduleSpecifier == null ? empty() : seq(t("from"), t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), semiOp())); - } - }, { - key: "reduceExport", - value: function reduceExport(node, _ref40) { - var declaration = _ref40.declaration; + /** + * Returns a new list without any consecutively repeating elements. + * `R.equals` is used to determine equality. + * + * Acts as a transducer if a transformer is given in list position. + * @see R.transduce + * + * @func + * @memberOf R + * @category List + * @sig [a] -> [a] + * @param {Array} list The array to consider. + * @return {Array} `list` without repeating elements. + * @example + * + * R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2] + */ + var dropRepeats = _curry1(_dispatchable('dropRepeats', _xdropRepeatsWith(equals), dropRepeatsWith(equals))); - switch (node.declaration.type) { - case "FunctionDeclaration": - case "ClassDeclaration": - break; - default: - declaration = seq(declaration, semiOp()); - } - return seq(t("export"), declaration); - } - }, { - key: "reduceExportDefault", - value: function reduceExportDefault(node, _ref41) { - var body = _ref41.body; + /** + * Combines two lists into a set (i.e. no duplicates) composed of those elements common to both lists. + * + * @func + * @memberOf R + * @category Relation + * @sig [a] -> [a] -> [a] + * @param {Array} list1 The first list. + * @param {Array} list2 The second list. + * @see R.intersectionWith + * @return {Array} The list of elements found in both `list1` and `list2`. + * @example + * + * R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3] + */ + var intersection = _curry2(function intersection(list1, list2) { + return uniq(_filter(flip(_contains)(list1), list2)); + }); - body = body.startsWithFunctionOrClass ? paren(body) : body; - switch (node.body.type) { - case "FunctionDeclaration": - case "ClassDeclaration": - break; - default: - body = seq(body, semiOp()); - } - return seq(t("export default"), body); - } - }, { - key: "reduceExportSpecifier", - value: function reduceExportSpecifier(node) { - if (node.name == null) return t(node.exportedName); - return seq(t(node.name), t("as"), t(node.exportedName)); - } - }, { - key: "reduceLabeledStatement", - value: function reduceLabeledStatement(node, _ref42) { - var label = _ref42.label; - var body = _ref42.body; + /** + * "lifts" a function of arity > 1 so that it may "map over" an Array or + * other Functor. + * + * @func + * @memberOf R + * @see R.liftN + * @category Function + * @sig (*... -> *) -> ([*]... -> [*]) + * @param {Function} fn The function to lift into higher context + * @return {Function} The function `fn` applicable to mappable objects. + * @example + * + * var madd3 = R.lift(R.curry(function(a, b, c) { + * return a + b + c; + * })); + * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7] + * + * var madd5 = R.lift(R.curry(function(a, b, c, d, e) { + * return a + b + c + d + e; + * })); + * madd5([1,2], [3], [4, 5], [6], [7, 8]); //=> [21, 22, 22, 23, 22, 23, 23, 24] + */ + var lift = _curry1(function lift(fn) { + return liftN(fn.length, fn); + }); - return (0, _objectAssign2.default)(seq(t(label + ":"), body), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceLiteralBooleanExpression", - value: function reduceLiteralBooleanExpression(node) { - return t(node.value.toString()); - } - }, { - key: "reduceLiteralNullExpression", - value: function reduceLiteralNullExpression(node) { - return t("null"); - } - }, { - key: "reduceLiteralInfinityExpression", - value: function reduceLiteralInfinityExpression(node) { - return t("2e308"); - } - }, { - key: "reduceLiteralNumericExpression", - value: function reduceLiteralNumericExpression(node) { - return new _coderep.NumberCodeRep(node.value); - } - }, { - key: "reduceLiteralRegExpExpression", - value: function reduceLiteralRegExpExpression(node) { - return t("/" + node.pattern + "/" + node.flags); - } - }, { - key: "reduceLiteralStringExpression", - value: function reduceLiteralStringExpression(node) { - return t((0, _coderep.escapeStringLiteral)(node.value)); - } - }, { - key: "reduceMethod", - value: function reduceMethod(node, _ref43) { - var name = _ref43.name; - var params = _ref43.params; - var body = _ref43.body; + /** + * Returns a partial copy of an object omitting the keys specified. + * + * @func + * @memberOf R + * @category Object + * @sig [String] -> {String: *} -> {String: *} + * @param {Array} names an array of String property names to omit from the new object + * @param {Object} obj The object to copy from + * @return {Object} A new object with properties from `names` not on it. + * @see R.pick + * @example + * + * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3} + */ + var omit = _curry2(function omit(names, obj) { + var result = {}; + for (var prop in obj) { + if (!_contains(prop, names)) { + result[prop] = obj[prop]; + } + } + return result; + }); - return seq(node.isGenerator ? t("*") : empty(), name, paren(params), brace(body)); - } - }, { - key: "reduceModule", - value: function reduceModule(node, _ref44) { - var directives = _ref44.directives; - var items = _ref44.items; + /** + * Returns the left-to-right Kleisli composition of the provided functions, + * each of which must return a value of a type supported by [`chain`](#chain). + * + * `R.pipeK(f, g, h)` is equivalent to `R.pipe(R.chain(f), R.chain(g), R.chain(h))`. + * + * @func + * @memberOf R + * @category Function + * @see R.composeK + * @sig Chain m => ((a -> m b), (b -> m c), ..., (y -> m z)) -> (m a -> m z) + * @param {...Function} + * @return {Function} + * @example + * + * // parseJson :: String -> Maybe * + * // get :: String -> Object -> Maybe * + * + * // getStateCode :: Maybe String -> Maybe String + * var getStateCode = R.pipeK( + * parseJson, + * get('user'), + * get('address'), + * get('state'), + * R.compose(Maybe.of, R.toUpper) + * ); + * + * getStateCode(Maybe.of('{"user":{"address":{"state":"ny"}}}')); + * //=> Just('NY') + * getStateCode(Maybe.of('[Invalid JSON]')); + * //=> Nothing() + */ + var pipeK = function pipeK() { + return composeK.apply(this, reverse(arguments)); + }; - if (items.length) { - items[0] = this.parenToAvoidBeingDirective(node.items[0], items[0]); - } - return seq.apply(undefined, _toConsumableArray(directives).concat(_toConsumableArray(items))); - } - }, { - key: "reduceNewExpression", - value: function reduceNewExpression(node, _ref45) { - var callee = _ref45.callee; - var args = _ref45.arguments; + /** + * Returns the string representation of the given value. `eval`'ing the output + * should result in a value equivalent to the input value. Many of the built-in + * `toString` methods do not satisfy this requirement. + * + * If the given value is an `[object Object]` with a `toString` method other + * than `Object.prototype.toString`, this method is invoked with no arguments + * to produce the return value. This means user-defined constructor functions + * can provide a suitable `toString` method. For example: + * + * function Point(x, y) { + * this.x = x; + * this.y = y; + * } + * + * Point.prototype.toString = function() { + * return 'new Point(' + this.x + ', ' + this.y + ')'; + * }; + * + * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)' + * + * @func + * @memberOf R + * @category String + * @sig * -> String + * @param {*} val + * @return {String} + * @example + * + * R.toString(42); //=> '42' + * R.toString('abc'); //=> '"abc"' + * R.toString([1, 2, 3]); //=> '[1, 2, 3]' + * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}' + * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")' + */ + var toString = _curry1(function toString(val) { + return _toString(val, []); + }); - var calleeRep = (0, _coderep.getPrecedence)(node.callee) == _coderep.Precedence.Call ? paren(callee) : p(node.callee, (0, _coderep.getPrecedence)(node), callee); - return seq(t("new"), calleeRep, args.length === 0 ? empty() : paren(commaSep(args))); - } - }, { - key: "reduceNewTargetExpression", - value: function reduceNewTargetExpression() { - return t("new.target"); - } - }, { - key: "reduceObjectExpression", - value: function reduceObjectExpression(node, _ref46) { - var properties = _ref46.properties; + /** + * Combines two lists into a set (i.e. no duplicates) composed of the + * elements of each list. + * + * @func + * @memberOf R + * @category Relation + * @sig [a] -> [a] -> [a] + * @param {Array} as The first list. + * @param {Array} bs The second list. + * @return {Array} The first and second lists concatenated, with + * duplicates removed. + * @example + * + * R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4] + */ + var union = _curry2(compose(uniq, _concat)); - var state = brace(commaSep(properties)); - state.startsWithCurly = true; - return state; - } - }, { - key: "reduceUpdateExpression", - value: function reduceUpdateExpression(node, _ref47) { - var operand = _ref47.operand; + /** + * Returns a new list containing only one copy of each element in the + * original list, based upon the value returned by applying the supplied + * function to each list element. Prefers the first item if the supplied + * function produces the same value on two items. `R.equals` is used for + * comparison. + * + * @func + * @memberOf R + * @category List + * @sig (a -> b) -> [a] -> [a] + * @param {Function} fn A function used to produce a value to use during comparisons. + * @param {Array} list The array to consider. + * @return {Array} The list of unique items. + * @example + * + * R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10] + */ + var uniqBy = _curry2(function uniqBy(fn, list) { + var idx = 0, applied = [], result = [], appliedItem, item; + while (idx < list.length) { + item = list[idx]; + appliedItem = fn(item); + if (!_contains(appliedItem, applied)) { + result.push(item); + applied.push(appliedItem); + } + idx += 1; + } + return result; + }); - if (node.isPrefix) { - return this.reduceUnaryExpression.apply(this, arguments); - } else { - return (0, _objectAssign2.default)(seq(p(node.operand, _coderep.Precedence.New, operand), t(node.operator)), { - startsWithCurly: operand.startsWithCurly, - startsWithLetSquareBracket: operand.startsWithLetSquareBracket, - startsWithFunctionOrClass: operand.startsWithFunctionOrClass + /** + * Turns a named method with a specified arity into a function + * that can be called directly supplied with arguments and a target object. + * + * The returned function is curried and accepts `arity + 1` parameters where + * the final parameter is the target object. + * + * @func + * @memberOf R + * @category Function + * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *) + * @param {Number} arity Number of arguments the returned function should take + * before the target object. + * @param {Function} method Name of the method to call. + * @return {Function} A new curried function. + * @example + * + * var sliceFrom = R.invoker(1, 'slice'); + * sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm' + * var sliceFrom6 = R.invoker(2, 'slice')(6); + * sliceFrom6(8, 'abcdefghijklm'); //=> 'gh' + */ + var invoker = _curry2(function invoker(arity, method) { + return curryN(arity + 1, function () { + var target = arguments[arity]; + if (target != null && is(Function, target[method])) { + return target[method].apply(target, _slice(arguments, 0, arity)); + } + throw new TypeError(toString(target) + ' does not have a method named "' + method + '"'); }); - } - } - }, { - key: "reduceUnaryExpression", - value: function reduceUnaryExpression(node, _ref48) { - var operand = _ref48.operand; + }); - return seq(t(node.operator), p(node.operand, (0, _coderep.getPrecedence)(node), operand)); - } - }, { - key: "reduceReturnStatement", - value: function reduceReturnStatement(node, _ref49) { - var expression = _ref49.expression; + /** + * Returns a string made by inserting the `separator` between each + * element and concatenating all the elements into a single string. + * + * @func + * @memberOf R + * @category List + * @sig String -> [a] -> String + * @param {Number|String} separator The string used to separate the elements. + * @param {Array} xs The elements to join into a string. + * @return {String} str The string made by concatenating `xs` with `separator`. + * @see R.split + * @example + * + * var spacer = R.join(' '); + * spacer(['a', 2, 3.4]); //=> 'a 2 3.4' + * R.join('|', [1, 2, 3]); //=> '1|2|3' + */ + var join = invoker(1, 'join'); - return seq(t("return"), expression || empty(), semiOp()); - } - }, { - key: "reduceScript", - value: function reduceScript(node, _ref50) { - var directives = _ref50.directives; - var statements = _ref50.statements; + /** + * Creates a new function that, when invoked, caches the result of calling `fn` for a given + * argument set and returns the result. Subsequent calls to the memoized `fn` with the same + * argument set will not result in an additional call to `fn`; instead, the cached result + * for that set of arguments will be returned. + * + * @func + * @memberOf R + * @category Function + * @sig (*... -> a) -> (*... -> a) + * @param {Function} fn The function to memoize. + * @return {Function} Memoized version of `fn`. + * @example + * + * var count = 0; + * var factorial = R.memoize(function(n) { + * count += 1; + * return R.product(R.range(1, n + 1)); + * }); + * factorial(5); //=> 120 + * factorial(5); //=> 120 + * factorial(5); //=> 120 + * count; //=> 1 + */ + var memoize = _curry1(function memoize(fn) { + var cache = {}; + return function () { + var key = toString(arguments); + if (!_has(key, cache)) { + cache[key] = fn.apply(this, arguments); + } + return cache[key]; + }; + }); - if (statements.length) { - statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); - } - return seq.apply(undefined, _toConsumableArray(directives).concat(_toConsumableArray(statements))); - } - }, { - key: "reduceSetter", - value: function reduceSetter(node, _ref51) { - var name = _ref51.name; - var param = _ref51.param; - var body = _ref51.body; + /** + * Splits a string into an array of strings based on the given + * separator. + * + * @func + * @memberOf R + * @category String + * @sig String -> String -> [String] + * @param {String} sep The separator string. + * @param {String} str The string to separate into an array. + * @return {Array} The array of strings from `str` separated by `str`. + * @see R.join + * @example + * + * var pathComponents = R.split('/'); + * R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node'] + * + * R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd'] + */ + var split = invoker(1, 'split'); - return seq(t("set"), name, paren(param), brace(body)); - } - }, { - key: "reduceShorthandProperty", - value: function reduceShorthandProperty(node) { - return t(node.name); - } - }, { - key: "reduceStaticMemberExpression", - value: function reduceStaticMemberExpression(node, _ref52) { - var object = _ref52.object; - var property = _ref52.property; + /** + * The lower case version of a string. + * + * @func + * @memberOf R + * @category String + * @sig String -> String + * @param {String} str The string to lower case. + * @return {String} The lower case version of `str`. + * @see R.toUpper + * @example + * + * R.toLower('XYZ'); //=> 'xyz' + */ + var toLower = invoker(0, 'toLowerCase'); - var state = seq(p(node.object, (0, _coderep.getPrecedence)(node), object), t("."), t(property)); - state.startsWithLet = object.startsWithLet; - state.startsWithCurly = object.startsWithCurly; - state.startsWithLetSquareBracket = object.startsWithLetSquareBracket; - state.startsWithFunctionOrClass = object.startsWithFunctionOrClass; - return state; - } - }, { - key: "reduceStaticPropertyName", - value: function reduceStaticPropertyName(node) { - var n; - if (_esutils.keyword.isIdentifierNameES6(node.value)) { - return t(node.value); - } else if (n = parseFloat(node.value), n === n) { - return new _coderep.NumberCodeRep(n); - } - return t((0, _coderep.escapeStringLiteral)(node.value)); - } - }, { - key: "reduceSuper", - value: function reduceSuper() { - return t("super"); - } - }, { - key: "reduceSwitchCase", - value: function reduceSwitchCase(node, _ref53) { - var test = _ref53.test; - var consequent = _ref53.consequent; + /** + * The upper case version of a string. + * + * @func + * @memberOf R + * @category String + * @sig String -> String + * @param {String} str The string to upper case. + * @return {String} The upper case version of `str`. + * @see R.toLower + * @example + * + * R.toUpper('abc'); //=> 'ABC' + */ + var toUpper = invoker(0, 'toUpperCase'); - return seq(t("case"), test, t(":"), seq.apply(undefined, _toConsumableArray(consequent))); - } - }, { - key: "reduceSwitchDefault", - value: function reduceSwitchDefault(node, _ref54) { - var consequent = _ref54.consequent; + var R = { + F: F, + T: T, + __: __, + add: add, + addIndex: addIndex, + adjust: adjust, + all: all, + allPass: allPass, + always: always, + and: and, + any: any, + anyPass: anyPass, + ap: ap, + aperture: aperture, + append: append, + apply: apply, + assoc: assoc, + assocPath: assocPath, + binary: binary, + bind: bind, + both: both, + call: call, + chain: chain, + clone: clone, + commute: commute, + commuteMap: commuteMap, + comparator: comparator, + complement: complement, + compose: compose, + composeK: composeK, + composeP: composeP, + concat: concat, + cond: cond, + construct: construct, + constructN: constructN, + contains: contains, + containsWith: containsWith, + converge: converge, + countBy: countBy, + createMapEntry: createMapEntry, + curry: curry, + curryN: curryN, + dec: dec, + defaultTo: defaultTo, + difference: difference, + differenceWith: differenceWith, + dissoc: dissoc, + dissocPath: dissocPath, + divide: divide, + drop: drop, + dropLast: dropLast, + dropLastWhile: dropLastWhile, + dropRepeats: dropRepeats, + dropRepeatsWith: dropRepeatsWith, + dropWhile: dropWhile, + either: either, + empty: empty, + eqProps: eqProps, + equals: equals, + evolve: evolve, + filter: filter, + find: find, + findIndex: findIndex, + findLast: findLast, + findLastIndex: findLastIndex, + flatten: flatten, + flip: flip, + forEach: forEach, + fromPairs: fromPairs, + functions: functions, + functionsIn: functionsIn, + groupBy: groupBy, + gt: gt, + gte: gte, + has: has, + hasIn: hasIn, + head: head, + identical: identical, + identity: identity, + ifElse: ifElse, + inc: inc, + indexOf: indexOf, + init: init, + insert: insert, + insertAll: insertAll, + intersection: intersection, + intersectionWith: intersectionWith, + intersperse: intersperse, + into: into, + invert: invert, + invertObj: invertObj, + invoker: invoker, + is: is, + isArrayLike: isArrayLike, + isEmpty: isEmpty, + isNil: isNil, + isSet: isSet, + join: join, + keys: keys, + keysIn: keysIn, + last: last, + lastIndexOf: lastIndexOf, + length: length, + lens: lens, + lensIndex: lensIndex, + lensProp: lensProp, + lift: lift, + liftN: liftN, + lt: lt, + lte: lte, + map: map, + mapAccum: mapAccum, + mapAccumRight: mapAccumRight, + mapObj: mapObj, + mapObjIndexed: mapObjIndexed, + match: match, + mathMod: mathMod, + max: max, + maxBy: maxBy, + mean: mean, + median: median, + memoize: memoize, + merge: merge, + mergeAll: mergeAll, + min: min, + minBy: minBy, + modulo: modulo, + multiply: multiply, + nAry: nAry, + negate: negate, + none: none, + not: not, + nth: nth, + nthArg: nthArg, + nthChar: nthChar, + nthCharCode: nthCharCode, + of: of, + omit: omit, + once: once, + or: or, + over: over, + partial: partial, + partialRight: partialRight, + partition: partition, + path: path, + pathEq: pathEq, + pick: pick, + pickAll: pickAll, + pickBy: pickBy, + pipe: pipe, + pipeK: pipeK, + pipeP: pipeP, + pluck: pluck, + prepend: prepend, + product: product, + project: project, + prop: prop, + propEq: propEq, + propIs: propIs, + propOr: propOr, + propSatisfies: propSatisfies, + props: props, + range: range, + reduce: reduce, + reduceRight: reduceRight, + reduced: reduced, + reject: reject, + remove: remove, + repeat: repeat, + replace: replace, + reverse: reverse, + scan: scan, + set: set, + slice: slice, + sort: sort, + sortBy: sortBy, + split: split, + splitEvery: splitEvery, + subtract: subtract, + sum: sum, + tail: tail, + take: take, + takeLast: takeLast, + takeLastWhile: takeLastWhile, + takeWhile: takeWhile, + tap: tap, + test: test, + times: times, + toLower: toLower, + toPairs: toPairs, + toPairsIn: toPairsIn, + toString: toString, + toUpper: toUpper, + transduce: transduce, + trim: trim, + type: type, + unapply: unapply, + unary: unary, + uncurryN: uncurryN, + unfold: unfold, + union: union, + unionWith: unionWith, + uniq: uniq, + uniqBy: uniqBy, + uniqWith: uniqWith, + unnest: unnest, + update: update, + useWith: useWith, + values: values, + valuesIn: valuesIn, + view: view, + where: where, + whereEq: whereEq, + wrap: wrap, + xprod: xprod, + zip: zip, + zipObj: zipObj, + zipWith: zipWith + }; - return seq(t("default:"), seq.apply(undefined, _toConsumableArray(consequent))); - } - }, { - key: "reduceSwitchStatement", - value: function reduceSwitchStatement(node, _ref55) { - var discriminant = _ref55.discriminant; - var cases = _ref55.cases; + /* TEST_ENTRY_POINT */ - return seq(t("switch"), paren(discriminant), brace(seq.apply(undefined, _toConsumableArray(cases)))); - } - }, { - key: "reduceSwitchStatementWithDefault", - value: function reduceSwitchStatementWithDefault(node, _ref56) { - var discriminant = _ref56.discriminant; - var preDefaultCases = _ref56.preDefaultCases; - var defaultCase = _ref56.defaultCase; - var postDefaultCases = _ref56.postDefaultCases; + if (true) { + module.exports = R; + } else if (typeof define === 'function' && define.amd) { + define(function() { return R; }); + } else { + this.R = R; + } - return seq(t("switch"), paren(discriminant), brace(seq.apply(undefined, _toConsumableArray(preDefaultCases).concat([defaultCase], _toConsumableArray(postDefaultCases))))); - } - }, { - key: "reduceTemplateExpression", - value: function reduceTemplateExpression(node, _ref57) { - var tag = _ref57.tag; - var elements = _ref57.elements; + }.call(this)); - var state = node.tag == null ? empty() : p(node.tag, (0, _coderep.getPrecedence)(node), tag); - var templateData = ""; - state = seq(state, t("`")); - for (var i = 0, l = node.elements.length; i < l; ++i) { - if (node.elements[i].type === "TemplateElement") { - var d = ""; - if (i > 0) d += "}"; - d += node.elements[i].rawValue; - if (i < l - 1) d += "${"; - state = seq(state, t(d)); - } else { - state = seq(state, elements[i]); - } - } - state = seq(state, t("`")); - if (node.tag != null) { - state.startsWithCurly = tag.startsWithCurly; - state.startsWithLetSquareBracket = tag.startsWithLetSquareBracket; - state.startsWithFunctionOrClass = tag.startsWithFunctionOrClass; - } - return state; - } - }, { - key: "reduceTemplateElement", - value: function reduceTemplateElement(node) { - return t(node.rawValue); - } - }, { - key: "reduceThisExpression", - value: function reduceThisExpression(node) { - return t("this"); - } - }, { - key: "reduceThrowStatement", - value: function reduceThrowStatement(node, _ref58) { - var expression = _ref58.expression; - return seq(t("throw"), expression, semiOp()); - } - }, { - key: "reduceTryCatchStatement", - value: function reduceTryCatchStatement(node, _ref59) { - var body = _ref59.body; - var catchClause = _ref59.catchClause; +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { - return seq(t("try"), body, catchClause); - } - }, { - key: "reduceTryFinallyStatement", - value: function reduceTryFinallyStatement(node, _ref60) { - var body = _ref60.body; - var catchClause = _ref60.catchClause; - var finalizer = _ref60.finalizer; + var _equals = __webpack_require__(26).equals; - return seq(t("try"), body, catchClause || empty(), t("finally"), finalizer); - } - }, { - key: "reduceYieldExpression", - value: function reduceYieldExpression(node, _ref61) { - var expression = _ref61.expression; - if (node.expression == null) return t("yield"); - return seq(t("yield"), p(node.expression, (0, _coderep.getPrecedence)(node), expression)); - } - }, { - key: "reduceYieldGeneratorExpression", - value: function reduceYieldGeneratorExpression(node, _ref62) { - var expression = _ref62.expression; + module.exports = { - return seq(t("yield"), t("*"), p(node.expression, (0, _coderep.getPrecedence)(node), expression)); - } - }, { - key: "reduceDirective", - value: function reduceDirective(node) { - var delim = /^(?:[^"\\]|\\.)*$/.test(node.rawValue) ? "\"" : "'"; - return seq(t(delim + node.rawValue + delim), semiOp()); - } - }, { - key: "reduceVariableDeclaration", - value: function reduceVariableDeclaration(node, _ref63) { - var declarators = _ref63.declarators; + baseMap: function(f) { + return f(this.value); + }, - return seq(t(node.kind), commaSep(declarators)); - } - }, { - key: "reduceVariableDeclarationStatement", - value: function reduceVariableDeclarationStatement(node, _ref64) { - var declaration = _ref64.declaration; - - return seq(declaration, semiOp()); - } - }, { - key: "reduceVariableDeclarator", - value: function reduceVariableDeclarator(node, _ref65) { - var binding = _ref65.binding; - var init = _ref65.init; - - var containsIn = init && init.containsIn && !init.containsGroup; - if (init) { - if (init.containsGroup) { - init = paren(init); - } else { - init = markContainsIn(init); - } - } - return (0, _objectAssign2.default)(init == null ? binding : seq(binding, t("="), init), { containsIn: containsIn }); - } - }, { - key: "reduceWhileStatement", - value: function reduceWhileStatement(node, _ref66) { - var test = _ref66.test; - var body = _ref66.body; - - return (0, _objectAssign2.default)(seq(t("while"), paren(test), body), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceWithStatement", - value: function reduceWithStatement(node, _ref67) { - var object = _ref67.object; - var body = _ref67.body; + getEquals: function(constructor) { + return function equals(that) { + return that instanceof constructor && _equals(this.value, that.value); + }; + }, - return (0, _objectAssign2.default)(seq(t("with"), paren(object), body), { endsWithMissingElse: body.endsWithMissingElse }); + extend: function(Child, Parent) { + function Ctor() { + this.constructor = Child; } - }]); + Ctor.prototype = Parent.prototype; + Child.prototype = new Ctor(); + Child.super_ = Parent.prototype; + }, - return MinimalCodeGen; - }(); + identity: function(x) { return x; }, - exports.default = MinimalCodeGen; + notImplemented: function(str) { + return function() { + throw new Error(str + ' is not implemented'); + }; + }, -/***/ }, -/* 40 */ -/***/ function(module, exports) { + notCallable: function(fn) { + return function() { + throw new Error(fn + ' cannot be called directly'); + }; + }, - 'use strict'; - var propIsEnumerable = Object.prototype.propertyIsEnumerable; + returnThis: function() { return this; } - function ToObject(val) { - if (val == null) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } + }; - return Object(val); - } - function ownEnumerableKeys(obj) { - var keys = Object.getOwnPropertyNames(obj); +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { - if (Object.getOwnPropertySymbols) { - keys = keys.concat(Object.getOwnPropertySymbols(obj)); - } + var R = __webpack_require__(26); - return keys.filter(function (key) { - return propIsEnumerable.call(obj, key); - }); + // `f` is a function that takes two function arguments: `reject` (failure) and `resolve` (success) + function Future(f) { + if (!(this instanceof Future)) { + return new Future(f); + } + this._fork = f; } - module.exports = Object.assign || function (target, source) { - var from; - var keys; - var to = ToObject(target); - - for (var s = 1; s < arguments.length; s++) { - from = arguments[s]; - keys = ownEnumerableKeys(Object(from)); - - for (var i = 0; i < keys.length; i++) { - to[keys[i]] = from[keys[i]]; - } - } - - return to; + Future.prototype.fork = function(reject, resolve) { + try { + this._fork(reject, resolve); + } catch(e) { + reject(e); + } }; + // functor + Future.prototype.map = function(f) { + return this.chain(function(a) { return Future.of(f(a)); }); + }; -/***/ }, -/* 41 */ -/***/ function(module, exports) { + // apply + Future.prototype.ap = function(m) { + var self = this; - "use strict"; + return new Future(function(rej, res) { + var applyFn, val; + var doReject = R.once(rej); - 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 resolveIfDone() { + if (applyFn != null && val != null) { + return res(applyFn(val)); + } + } - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.getPrecedence = getPrecedence; - exports.escapeStringLiteral = escapeStringLiteral; + self.fork(doReject, function(fn) { + applyFn = fn; + resolveIfDone(); + }); - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + m.fork(doReject, function(v) { + val = v; + resolveIfDone(); + }); - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + }); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + }; - var Precedence = { - Sequence: 0, - Yield: 1, - Assignment: 1, - Conditional: 2, - ArrowFunction: 2, - LogicalOR: 3, - LogicalAND: 4, - BitwiseOR: 5, - BitwiseXOR: 6, - BitwiseAND: 7, - Equality: 8, - Relational: 9, - BitwiseSHIFT: 10, - Additive: 11, - Multiplicative: 12, - Prefix: 13, - Postfix: 14, - New: 15, - Call: 16, - TaggedTemplate: 17, - Member: 18, - Primary: 19 + // applicative + Future.of = function(x) { + // should include a default rejection? + return new Future(function(_, resolve) { return resolve(x); }); }; - exports.Precedence = Precedence; + Future.prototype.of = Future.of; - var BinaryPrecedence = { - ",": Precedence.Sequence, - "||": Precedence.LogicalOR, - "&&": Precedence.LogicalAND, - "|": Precedence.BitwiseOR, - "^": Precedence.BitwiseXOR, - "&": Precedence.BitwiseAND, - "==": Precedence.Equality, - "!=": Precedence.Equality, - "===": Precedence.Equality, - "!==": Precedence.Equality, - "<": Precedence.Relational, - ">": Precedence.Relational, - "<=": Precedence.Relational, - ">=": Precedence.Relational, - "in": Precedence.Relational, - "instanceof": Precedence.Relational, - "<<": Precedence.BitwiseSHIFT, - ">>": Precedence.BitwiseSHIFT, - ">>>": Precedence.BitwiseSHIFT, - "+": Precedence.Additive, - "-": Precedence.Additive, - "*": Precedence.Multiplicative, - "%": Precedence.Multiplicative, - "/": Precedence.Multiplicative + // chain + // f must be a function which returns a value + // f must return a value of the same Chain + // chain must return a value of the same Chain + //:: Future a, b => (b -> Future c) -> Future c + Future.prototype.chain = function(f) { // Sorella's: + return new Future(function(reject, resolve) { + return this.fork(function(a) { return reject(a); }, + function(b) { return f(b).fork(reject, resolve); }); + }.bind(this)); }; - function getPrecedence(node) { - switch (node.type) { - case "ArrayExpression": - case "FunctionExpression": - case "IdentifierExpression": - case "LiteralBooleanExpression": - case "LiteralNullExpression": - case "LiteralNumericExpression": - case "LiteralInfinityExpression": - case "LiteralRegExpExpression": - case "LiteralStringExpression": - case "ObjectExpression": - case "ThisExpression": - return Precedence.Primary; + // chainReject + // Like chain but operates on the reject instead of the resolve case. + //:: Future a, b => (a -> Future c) -> Future c + Future.prototype.chainReject = function(f) { + return new Future(function(reject, resolve) { + return this.fork(function(a) { return f(a).fork(reject, resolve); }, + function(b) { return resolve(b); + }); + }.bind(this)); + }; - case "ArrowExpression": - case "AssignmentExpression": - case "CompoundAssignmentExpression": - case "YieldExpression": - case "YieldGeneratorExpression": - return Precedence.Assignment; + // monad + // A value that implements the Monad specification must also implement the Applicative and Chain specifications. + // see above. - case "ConditionalExpression": - return Precedence.Conditional; + Future.prototype.bimap = function(errFn, successFn) { + var self = this; + return new Future(function(reject, resolve) { + self.fork(function(err) { + reject(errFn(err)); + }, function(val) { + resolve(successFn(val)); + }); + }); + }; - case "ComputedMemberExpression": - case "StaticMemberExpression": - switch (node.object.type) { - case "CallExpression": - case "ComputedMemberExpression": - case "StaticMemberExpression": - case "TemplateExpression": - return getPrecedence(node.object); - default: - return Precedence.Member; - } + Future.reject = function(val) { + return new Future(function(reject) { + reject(val); + }); + }; - case "TemplateExpression": - if (node.tag == null) return Precedence.Member; - switch (node.tag.type) { - case "CallExpression": - case "ComputedMemberExpression": - case "StaticMemberExpression": - case "TemplateExpression": - return getPrecedence(node.tag); - default: - return Precedence.Member; - } + Future.prototype.toString = function() { + return 'Future(' + R.toString(this._fork) + ')'; + }; - case "BinaryExpression": - return BinaryPrecedence[node.operator]; + Future.cache = function(f) { + var status = 'IDLE'; + var listeners = []; + var cachedValue; - case "CallExpression": - return Precedence.Call; - case "NewExpression": - return node.arguments.length === 0 ? Precedence.New : Precedence.Member; - case "UpdateExpression": - return node.isPrefix ? Precedence.Prefix : Precedence.Postfix; - case "UnaryExpression": - return Precedence.Prefix; - } - } + var handleCompletion = R.curry(function(newStatus, cb, val) { + status = newStatus; + cachedValue = val; + cb(val); + R.forEach(function(listener) { + listener[status](cachedValue); + }, listeners); + }); - function escapeStringLiteral(stringValue) { - var result = ""; - var nSingle = 0, - nDouble = 0; - for (var i = 0, l = stringValue.length; i < l; ++i) { - var ch = stringValue[i]; - if (ch === "\"") { - ++nDouble; - } else if (ch === "'") { - ++nSingle; - } - } - var delim = nDouble > nSingle ? "'" : "\""; - result += delim; - for (var i = 0; i < stringValue.length; i++) { - var ch = stringValue.charAt(i); - switch (ch) { - case delim: - result += "\\" + delim; - break; - case "\b": - result += "\\b"; - break; - case "\t": - result += "\\t"; - break; - case "\n": - result += "\\n"; - break; - case "\u000b": - result += "\\v"; - break; - case "\f": - result += "\\f"; - break; - case "\r": - result += "\\r"; - break; - case "\\": - result += "\\\\"; - break; - case "\u2028": - result += "\\u2028"; - break; - case "\u2029": - result += "\\u2029"; - break; - default: - result += ch; - break; - } + function addListeners(reject, resolve) { + listeners.push({ REJECTED: reject, RESOLVED: resolve } ); } - result += delim; - return result; - } - - var CodeRep = exports.CodeRep = function () { - function CodeRep() { - _classCallCheck(this, CodeRep); - this.containsIn = false; - this.containsGroup = false; - // restricted lookaheads: {, function, class, let, let [ - this.startsWithCurly = false; - this.startsWithFunctionOrClass = false; - this.startsWithLet = false; - this.startsWithLetSquareBracket = false; - this.endsWithMissingElse = false; + function doResolve(reject, resolve) { + status = 'PENDING'; + return f.fork( + handleCompletion('REJECTED', reject), + handleCompletion('RESOLVED', resolve) + ); } - _createClass(CodeRep, [{ - key: "forEach", - value: function forEach(f) { - // Call a function on every CodeRep represented by this node. Always calls f on a node and then its children, so if you're careful you can modify a node's children online. - f(this); - } - }]); + return new Future(function(reject, resolve) { - return CodeRep; - }(); + switch(status) { + case 'IDLE': doResolve(reject, resolve); break; + case 'PENDING': addListeners(reject, resolve); break; + case 'REJECTED': reject(cachedValue); break; + case 'RESOLVED': resolve(cachedValue); break; + } - var Empty = exports.Empty = function (_CodeRep) { - _inherits(Empty, _CodeRep); + }); + }; - function Empty() { - _classCallCheck(this, Empty); + module.exports = Future; - return _possibleConstructorReturn(this, Object.getPrototypeOf(Empty).call(this)); - } - _createClass(Empty, [{ - key: "emit", - value: function emit() {} - }]); +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { - return Empty; - }(CodeRep); + var R = __webpack_require__(26); - var Token = exports.Token = function (_CodeRep2) { - _inherits(Token, _CodeRep2); + var util = __webpack_require__(27); - function Token(token) { - _classCallCheck(this, Token); - var _this2 = _possibleConstructorReturn(this, Object.getPrototypeOf(Token).call(this)); + /** + * A data type that holds a value and exposes a monadic api. + */ - _this2.token = token; - return _this2; + /** + * Constructs a new `Identity[a]` data type that holds a single + * value `a`. + * @param {*} a Value of any type + * @sig a -> Identity[a] + */ + function Identity(x) { + if (!(this instanceof Identity)) { + return new Identity(x); } + this.value = x; + } - _createClass(Token, [{ - key: "emit", - value: function emit(ts) { - ts.put(this.token); - } - }]); + /** + * Applicative specification. Creates a new `Identity[a]` holding the value `a`. + * @param {*} a Value of any type + * @returns Identity[a] + * @sig a -> Identity[a] + */ + Identity.of = function(x) { + return new Identity(x); + }; + Identity.prototype.of = Identity.of; - return Token; - }(CodeRep); + /** + * Functor specification. Creates a new `Identity[a]` mapping function `f` onto + * `a` returning any value b. + * @param {Function} f Maps `a` to any value `b` + * @returns Identity[b] + * @sig @Identity[a] => (a -> b) -> Identity[b] + */ + Identity.prototype.map = function(f) { + return new Identity(f(this.value)); + }; - var NumberCodeRep = exports.NumberCodeRep = function (_CodeRep3) { - _inherits(NumberCodeRep, _CodeRep3); + /** + * Apply specification. Applies the function inside the `Identity[a]` + * type to another applicative type. + * @param {Applicative[a]} app Applicative that will apply its function + * @returns Applicative[b] + * @sig (Identity[a -> b], f: Applicative[_]) => f[a] -> f[b] + */ + Identity.prototype.ap = function(app) { + return app.map(this.value); + }; - function NumberCodeRep(number) { - _classCallCheck(this, NumberCodeRep); + /** + * Chain specification. Transforms the value of the `Identity[a]` + * type using an unary function to monads. The `Identity[a]` type + * should contain a function, otherwise an error is thrown. + * + * @param {Function} fn Transforms `a` into a `Monad[b]` + * @returns Monad[b] + * @sig (Identity[a], m: Monad[_]) => (a -> m[b]) -> m[b] + */ + Identity.prototype.chain = function(fn) { + return fn(this.value); + }; - var _this3 = _possibleConstructorReturn(this, Object.getPrototypeOf(NumberCodeRep).call(this)); + /** + * Returns the value of `Identity[a]` + * + * @returns a + * @sig (Identity[a]) => a + */ + Identity.prototype.get = function() { + return this.value; + }; - _this3.number = number; - return _this3; - } + // equality method to enable testing + Identity.prototype.equals = util.getEquals(Identity); - _createClass(NumberCodeRep, [{ - key: "emit", - value: function emit(ts) { - ts.putNumber(this.number); - } - }]); + Identity.prototype.toString = function() { + return 'Identity(' + R.toString(this.value) + ')'; + }; - return NumberCodeRep; - }(CodeRep); + module.exports = Identity; - var Paren = exports.Paren = function (_CodeRep4) { - _inherits(Paren, _CodeRep4); - function Paren(expr) { - _classCallCheck(this, Paren); +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { - var _this4 = _possibleConstructorReturn(this, Object.getPrototypeOf(Paren).call(this)); + var R = __webpack_require__(26); - _this4.expr = expr; - return _this4; - } + module.exports = IO; - _createClass(Paren, [{ - key: "emit", - value: function emit(ts) { - ts.put("("); - this.expr.emit(ts, false); - ts.put(")"); - } - }, { - key: "forEach", - value: function forEach(f) { - f(this); - this.expr.forEach(f); - } - }]); + var compose = R.compose; - return Paren; - }(CodeRep); + function IO(fn) { + if (!(this instanceof IO)) { + return new IO(fn); + } + this.fn = fn; + } - var Bracket = exports.Bracket = function (_CodeRep5) { - _inherits(Bracket, _CodeRep5); + // `f` must return an IO + IO.prototype.chain = function(f) { + var io = this; + return new IO(function() { + var next = f(io.fn.apply(io, arguments)); + return next.fn.apply(next, arguments); + }); + }; - function Bracket(expr) { - _classCallCheck(this, Bracket); + IO.prototype.map = function(f) { + var io = this; + return new IO(compose(f, io.fn)); + }; - var _this5 = _possibleConstructorReturn(this, Object.getPrototypeOf(Bracket).call(this)); + // `this` IO must wrap a function `f` that takes an IO (`thatIo`) as input + // `f` must return an IO + IO.prototype.ap = function(thatIo) { + return this.chain(function(f) { + return thatIo.map(f); + }); + }; - _this5.expr = expr; - return _this5; - } + IO.runIO = function(io) { + return io.runIO.apply(io, [].slice.call(arguments, 1)); + }; - _createClass(Bracket, [{ - key: "emit", - value: function emit(ts) { - ts.put("["); - this.expr.emit(ts, false); - ts.put("]"); - } - }, { - key: "forEach", - value: function forEach(f) { - f(this); - this.expr.forEach(f); - } - }]); + IO.prototype.runIO = function() { + return this.fn.apply(this, arguments); + }; - return Bracket; - }(CodeRep); + IO.prototype.of = function(x) { + return new IO(function() { return x; }); + }; - var Brace = exports.Brace = function (_CodeRep6) { - _inherits(Brace, _CodeRep6); + IO.of = IO.prototype.of; - function Brace(expr) { - _classCallCheck(this, Brace); + IO.prototype.toString = function() { + return 'IO(' + R.toString(this.fn) + ')'; + }; - var _this6 = _possibleConstructorReturn(this, Object.getPrototypeOf(Brace).call(this)); - _this6.expr = expr; - return _this6; - } +/***/ }, +/* 31 */ +/***/ function(module, exports, __webpack_require__) { - _createClass(Brace, [{ - key: "emit", - value: function emit(ts) { - ts.put("{"); - this.expr.emit(ts, false); - ts.put("}"); - } - }, { - key: "forEach", - value: function forEach(f) { - f(this); - this.expr.forEach(f); - } - }]); + var R = __webpack_require__(26); - return Brace; - }(CodeRep); + module.exports = R.curryN(3, function lift2(f, a1, a2) { + return a1.map(f).ap(a2); + }); - var NoIn = exports.NoIn = function (_CodeRep7) { - _inherits(NoIn, _CodeRep7); - function NoIn(expr) { - _classCallCheck(this, NoIn); +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { - var _this7 = _possibleConstructorReturn(this, Object.getPrototypeOf(NoIn).call(this)); + var R = __webpack_require__(26); - _this7.expr = expr; - return _this7; - } + module.exports = R.curryN(4, function lift3(f, a1, a2, a3) { + return a1.map(f).ap(a2).ap(a3); + }); - _createClass(NoIn, [{ - key: "emit", - value: function emit(ts) { - this.expr.emit(ts, true); - } - }, { - key: "forEach", - value: function forEach(f) { - f(this); - this.expr.forEach(f); - } - }]); - return NoIn; - }(CodeRep); +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { - var ContainsIn = exports.ContainsIn = function (_CodeRep8) { - _inherits(ContainsIn, _CodeRep8); + var R = __webpack_require__(26); - function ContainsIn(expr) { - _classCallCheck(this, ContainsIn); + var util = __webpack_require__(27); - var _this8 = _possibleConstructorReturn(this, Object.getPrototypeOf(ContainsIn).call(this)); + function Maybe(x) { + return x == null ? _nothing : Maybe.Just(x); + } - _this8.expr = expr; - return _this8; - } + function _Just(x) { + this.value = x; + } + util.extend(_Just, Maybe); - _createClass(ContainsIn, [{ - key: "emit", - value: function emit(ts, noIn) { - if (noIn) { - ts.put("("); - this.expr.emit(ts, false); - ts.put(")"); - } else { - this.expr.emit(ts, false); - } - } - }, { - key: "forEach", - value: function forEach(f) { - f(this); - this.expr.forEach(f); - } - }]); + function _Nothing() {} + util.extend(_Nothing, Maybe); - return ContainsIn; - }(CodeRep); + var _nothing = new _Nothing(); - var Seq = exports.Seq = function (_CodeRep9) { - _inherits(Seq, _CodeRep9); + Maybe.Nothing = function() { + return _nothing; + }; - function Seq(children) { - _classCallCheck(this, Seq); + Maybe.Just = function(x) { + return new _Just(x); + }; - var _this9 = _possibleConstructorReturn(this, Object.getPrototypeOf(Seq).call(this)); + Maybe.of = Maybe.Just; - _this9.children = children; - return _this9; - } + Maybe.prototype.of = Maybe.Just; - _createClass(Seq, [{ - key: "emit", - value: function emit(ts, noIn) { - this.children.forEach(function (cr) { - return cr.emit(ts, noIn); - }); - } - }, { - key: "forEach", - value: function forEach(f) { - f(this); - this.children.forEach(function (x) { - return x.forEach(f); - }); - } - }]); + Maybe.isJust = function(x) { + return x instanceof _Just; + }; - return Seq; - }(CodeRep); + Maybe.isNothing = function(x) { + return x === _nothing; + }; - var Semi = exports.Semi = function (_Token) { - _inherits(Semi, _Token); + Maybe.maybe = R.curry(function(nothingVal, justFn, m) { + return m.reduce(function(_, x) { + return justFn(x); + }, nothingVal); + }); - function Semi() { - _classCallCheck(this, Semi); + // functor + _Just.prototype.map = function(f) { + return this.of(f(this.value)); + }; - return _possibleConstructorReturn(this, Object.getPrototypeOf(Semi).call(this, ";")); - } + _Nothing.prototype.map = util.returnThis; - return Semi; - }(Token); + // apply + // takes a Maybe that wraps a function (`app`) and applies its `map` + // method to this Maybe's value, which must be a function. + _Just.prototype.ap = function(m) { + return m.map(this.value); + }; - var CommaSep = exports.CommaSep = function (_CodeRep10) { - _inherits(CommaSep, _CodeRep10); + _Nothing.prototype.ap = util.returnThis; - function CommaSep(children) { - _classCallCheck(this, CommaSep); + // applicative + // `of` inherited from `Maybe` - var _this11 = _possibleConstructorReturn(this, Object.getPrototypeOf(CommaSep).call(this)); - _this11.children = children; - return _this11; - } + // chain + // f must be a function which returns a value + // f must return a value of the same Chain + // chain must return a value of the same Chain + _Just.prototype.chain = util.baseMap; - _createClass(CommaSep, [{ - key: "emit", - value: function emit(ts, noIn) { - var first = true; - this.children.forEach(function (cr) { - if (first) { - first = false; - } else { - ts.put(","); - } - cr.emit(ts, noIn); - }); - } - }, { - key: "forEach", - value: function forEach(f) { - f(this); - this.children.forEach(function (x) { - return x.forEach(f); - }); - } - }]); + _Nothing.prototype.chain = util.returnThis; - return CommaSep; - }(CodeRep); - var SemiOp = exports.SemiOp = function (_CodeRep11) { - _inherits(SemiOp, _CodeRep11); + // + _Just.prototype.datatype = _Just; - function SemiOp() { - _classCallCheck(this, SemiOp); + _Nothing.prototype.datatype = _Nothing; - return _possibleConstructorReturn(this, Object.getPrototypeOf(SemiOp).call(this)); - } + // monad + // A value that implements the Monad specification must also implement the Applicative and Chain specifications. + // see above. - _createClass(SemiOp, [{ - key: "emit", - value: function emit(ts) { - ts.putOptionalSemi(); - } - }]); + // equality method to enable testing + _Just.prototype.equals = util.getEquals(_Just); - return SemiOp; - }(CodeRep); + _Nothing.prototype.equals = function(that) { + return that === _nothing; + }; -/***/ }, -/* 42 */ -/***/ function(module, exports, __webpack_require__) { + Maybe.prototype.isNothing = function() { + return this === _nothing; + }; - "use strict"; + Maybe.prototype.isJust = function() { + return this instanceof _Just; + }; - 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; }; }(); + _Just.prototype.getOrElse = function() { + return this.value; + }; - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.FormattedCodeGen = exports.ExtensibleCodeGen = exports.Sep = undefined; + _Nothing.prototype.getOrElse = function(a) { + return a; + }; - var _objectAssign = __webpack_require__(40); + _Just.prototype.reduce = function(f, x) { + return f(x, this.value); + }; - var _objectAssign2 = _interopRequireDefault(_objectAssign); + _Nothing.prototype.reduce = function(f, x) { + return x; + }; - var _esutils = __webpack_require__(6); + _Just.prototype.toString = function() { + return 'Maybe.Just(' + R.toString(this.value) + ')'; + }; - var _coderep = __webpack_require__(41); + _Nothing.prototype.toString = function() { + return 'Maybe.Nothing()'; + }; - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + module.exports = Maybe; - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { - function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + var R = __webpack_require__(26); - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - function empty() { - return new _coderep.Empty(); + function Tuple(x, y) { + switch (arguments.length) { + case 0: + throw new TypeError('no arguments to Tuple'); + case 1: + return function(y) { + return new _Tuple(x, y); + }; + default: + return new _Tuple(x, y); + } } - function noIn(rep) { - return new _coderep.NoIn(rep); + function _Tuple(x, y) { + this[0] = x; + this[1] = y; + this.length = 2; } - function markContainsIn(state) { - return state.containsIn ? new _coderep.ContainsIn(state) : state; + function ensureConcat(xs) { + xs.forEach(function(x) { + if (typeof x.concat != 'function') { + throw new TypeError(R.toString(x) + ' must be a semigroup to perform this operation'); + } + }); } - function seq() { - for (var _len = arguments.length, reps = Array(_len), _key = 0; _key < _len; _key++) { - reps[_key] = arguments[_key]; - } - - return new _coderep.Seq(reps); - } + Tuple.fst = function(x) { + return x[0]; + }; - function isEmpty(codeRep) { - return codeRep instanceof _coderep.Empty || codeRep instanceof Linebreak || codeRep instanceof _coderep.Seq && codeRep.children.every(isEmpty); - } + Tuple.snd = function(x) { + return x[1]; + }; - var Sep = {}; - var separatorNames = ["ARRAY_EMPTY", "ARRAY_BEFORE_COMMA", "ARRAY_AFTER_COMMA", "SPREAD", "BEFORE_DEFAULT_EQUALS", "AFTER_DEFAULT_EQUALS", "REST", "OBJECT_BEFORE_COMMA", "OBJECT_AFTER_COMMA", "BEFORE_PROP", "AFTER_PROP", "BEFORE_JUMP_LABEL", "ARGS_BEFORE_COMMA", "ARGS_AFTER_COMMA", "CALL", "BEFORE_CATCH_BINDING", "AFTER_CATCH_BINDING", "BEFORE_CLASS_NAME", "BEFORE_EXTENDS", "AFTER_EXTENDS", "BEFORE_CLASS_DECLARATION_ELEMENTS", "BEFORE_CLASS_EXPRESSION_ELEMENTS", "AFTER_STATIC", "BEFORE_CLASS_ELEMENT", "AFTER_CLASS_ELEMENT", "BEFORE_TERNARY_QUESTION", "AFTER_TERNARY_QUESTION", "BEFORE_TERNARY_COLON", "AFTER_TERNARY_COLON", "COMPUTED_MEMBER_EXPRESSION", "AFTER_DO", "BEFORE_DOWHILE_WHILE", "AFTER_DOWHILE_WHILE", "AFTER_FORIN_FOR", "BEFORE_FORIN_IN", "AFTER_FORIN_FOR", "BEFORE_FORIN_BODY", "AFTER_FOROF_FOR", "BEFORE_FOROF_OF", "AFTER_FOROF_FOR", "BEFORE_FOROF_BODY", "AFTER_FOR_FOR", "BEFORE_FOR_INIT", "AFTER_FOR_INIT", "EMPTY_FOR_INIT", "BEFORE_FOR_TEST", "AFTER_FOR_TEST", "EMPTY_FOR_TEST", "BEFORE_FOR_UPDATE", "AFTER_FOR_UPDATE", "EMPTY_FOR_UPDATE", "BEFORE_FOR_BODY", "BEFORE_GENERATOR_STAR", "AFTER_GENERATOR_STAR", "BEFORE_FUNCTION_PARAMS", "BEFORE_FUNCTION_DECLARATION_BODY", "BEFORE_FUNCTION_EXPRESSION_BODY", "AFTER_FUNCTION_DIRECTIVES", "BEFORE_ARROW", "AFTER_ARROW", "AFTER_GET", "BEFORE_GET_PARAMS", "BEFORE_GET_BODY", "AFTER_IF", "AFTER_IF_TEST", "BEFORE_ELSE", "AFTER_ELSE", "PARAMETER_BEFORE_COMMA", "PARAMETER_AFTER_COMMA", "NAMED_IMPORT_BEFORE_COMMA", "NAMED_IMPORT_AFTER_COMMA", "IMPORT_BEFORE_COMMA", "IMPORT_AFTER_COMMA", "BEFORE_IMPORT_BINDINGS", "BEFORE_IMPORT_MODULE", "AFTER_IMPORT_BINDINGS", "AFTER_FROM", "BEFORE_IMPORT_NAMESPACE", "BEFORE_IMPORT_STAR", "AFTER_IMPORT_STAR", "AFTER_IMPORT_AS", "AFTER_NAMESPACE_BINDING", "BEFORE_IMPORT_AS", "AFTER_IMPORT_AS", "EXPORTS_BEFORE_COMMA", "EXPORTS_AFTER_COMMA", "BEFORE_EXPORT_STAR", "AFTER_EXPORT_STAR", "BEFORE_EXPORT_BINDINGS", "AFTER_EXPORT_BINDINGS", "AFTER_EXPORT", "EXPORT_DEFAULT", "AFTER_EXPORT_DEFAULT", "BEFORE_EXPORT_AS", "AFTER_EXPORT_AS", "BEFORE_LABEL_COLON", "AFTER_LABEL_COLON", "AFTER_METHOD_GENERATOR_STAR", "AFTER_METHOD_NAME", "BEFORE_METHOD_BODY", "AFTER_MODULE_DIRECTIVES", "AFTER_NEW", "BEFORE_NEW_ARGS", "EMPTY_NEW_CALL", "NEW_TARGET_BEFORE_DOT", "NEW_TARGET_AFTER_DOT", "RETURN", "AFTER_SET", "BEFORE_SET_PARAMS", "BEFORE_SET_BODY", "AFTER_SCRIPT_DIRECTIVES", "BEFORE_STATIC_MEMBER_DOT", "AFTER_STATIC_MEMBER_DOT", "BEFORE_CASE_TEST", "AFTER_CASE_TEST", "BEFORE_CASE_BODY", "AFTER_CASE_BODY", "DEFAULT", "AFTER_DEFAULT_BODY", "BEFORE_SWITCH_DISCRIM", "BEFORE_SWITCH_BODY", "TEMPLATE_TAG", "BEFORE_TEMPLATE_EXPRESSION", "AFTER_TEMPLATE_EXPRESSION", "THROW", "AFTER_TRY", "BEFORE_CATCH", "BEFORE_FINALLY", "AFTER_FINALLY", "VARIABLE_DECLARATION", "YIELD", "BEFORE_YIELD_STAR", "AFTER_YIELD_STAR", "DECLARATORS_BEFORE_COMMA", "DECLARATORS_AFTER_COMMA", "BEFORE_INIT_EQUALS", "AFTER_INIT_EQUALS", "AFTER_WHILE", "BEFORE_WHILE_BODY", "AFTER_WITH", "BEFORE_WITH_BODY", "PAREN_AVOIDING_DIRECTIVE_BEFORE", "PAREN_AVOIDING_DIRECTIVE_AFTER", "PRECEDENCE_BEFORE", "PRECEDENCE_AFTER", "EXPRESSION_PAREN_BEFORE", "EXPRESSION_PAREN_AFTER", "CALL_PAREN_BEFORE", "CALL_PAREN_AFTER", "CALL_PAREN_EMPTY", "CATCH_PAREN_BEFORE", "CATCH_PAREN_AFTER", "DO_WHILE_TEST_PAREN_BEFORE", "DO_WHILE_TEST_PAREN_AFTER", "EXPRESSION_STATEMENT_PAREN_BEFORE", "EXPRESSION_STATEMENT_PAREN_AFTER", "FOR_IN_LET_PAREN_BEFORE", "FOR_IN_LET_PAREN_AFTER", "FOR_IN_PAREN_BEFORE", "FOR_IN_PAREN_AFTER", "FOR_OF_LET_PAREN_BEFORE", "FOR_OF_LET_PAREN_AFTER", "FOR_OF_PAREN_BEFORE", "FOR_OF_PAREN_AFTER", "PARAMETERS_PAREN_BEFORE", "PARAMETERS_PAREN_AFTER", "PARAMETERS_PAREN_EMPTY", "ARROW_PARAMETERS_PAREN_BEFORE", "ARROW_PARAMETERS_PAREN_AFTER", "ARROW_PARAMETERS_PAREN_EMPTY", "ARROW_BODY_PAREN_BEFORE", "ARROW_BODY_PAREN_AFTER", "GETTER_PARAMS", "IF_PAREN_BEFORE", "IF_PAREN_AFTER", "EXPORT_PAREN_BEFORE", "EXPORT_PAREN_AFTER", "NEW_CALLEE_PAREN_BEFORE", "NEW_CALLEE_PAREN_AFTER", "NEW_PAREN_BEFORE", "NEW_PAREN_AFTER", "NEW_PAREN_EMPTY", "SETTER_PARAM_BEFORE", "SETTER_PARAM_AFTER", "SWITCH_DISCRIM_PAREN_BEFORE", "SWITCH_DISCRIM_PAREN_AFTER", "WHILE_TEST_PAREN_BEFORE", "WHILE_TEST_PAREN_AFTER", "WITH_PAREN_BEFORE", "WITH_PAREN_AFTER", "OBJECT_BRACE_INITIAL", "OBJECT_BRACE_FINAL", "OBJECT_EMPTY", "BLOCK_BRACE_INITIAL", "BLOCK_BRACE_FINAL", "BLOCK_EMPTY", "CLASS_BRACE_INITIAL", "CLASS_BRACE_FINAL", "CLASS_EMPTY", "CLASS_EXPRESSION_BRACE_INITIAL", "CLASS_EXPRESSION_BRACE_FINAL", "CLASS_EXPRESSION_BRACE_EMPTY", "FUNCTION_BRACE_INITIAL", "FUNCTION_BRACE_FINAL", "FUNCTION_EMPTY", "FUNCTION_EXPRESSION_BRACE_INITIAL", "FUNCTION_EXPRESSION_BRACE_FINAL", "FUNCTION_EXPRESSION_EMPTY", "ARROW_BRACE_INITIAL", "ARROW_BRACE_FINAL", "ARROW_BRACE_EMPTY", "GET_BRACE_INTIAL", "GET_BRACE_FINAL", "GET_BRACE_EMPTY", "MISSING_ELSE_INTIIAL", "MISSING_ELSE_FINAL", "MISSING_ELSE_EMPTY", "IMPORT_BRACE_INTIAL", "IMPORT_BRACE_FINAL", "IMPORT_BRACE_EMPTY", "EXPORT_BRACE_INITIAL", "EXPORT_BRACE_FINAL", "EXPORT_BRACE_EMPTY", "METHOD_BRACE_INTIAL", "METHOD_BRACE_FINAL", "METHOD_BRACE_EMPTY", "SET_BRACE_INTIIAL", "SET_BRACE_FINAL", "SET_BRACE_EMPTY", "SWITCH_BRACE_INTIAL", "SWITCH_BRACE_FINAL", "SWITCH_BRACE_EMPTY", "ARRAY_INITIAL", "ARRAY_FINAL", "COMPUTED_MEMBER_BRACKET_INTIAL", "COMPUTED_MEMBER_BRACKET_FINAL", "COMPUTED_PROPERTY_BRACKET_INTIAL", "COMPUTED_PROPERTY_BRACKET_FINAL"]; - for (var i = 0; i < separatorNames.length; ++i) { - Sep[separatorNames[i]] = { type: separatorNames[i] }; - } + // semigroup + _Tuple.prototype.concat = function(x) { + ensureConcat([this[0], this[1]]); + return Tuple(this[0].concat(x[0]), this[1].concat(x[1])); + }; - Sep.BEFORE_ASSIGN_OP = function (op) { - return { - type: "BEFORE_ASSIGN_OP", - op: op - }; + // functor + _Tuple.prototype.map = function(f) { + return Tuple(this[0], f(this[1])); }; - Sep.AFTER_ASSIGN_OP = function (op) { - return { - type: "AFTER_ASSIGN_OP", - op: op - }; + // apply + _Tuple.prototype.ap = function(m) { + ensureConcat([this[0]]); + return Tuple(this[0].concat(m[0]), this[1](m[1])); }; - Sep.BEFORE_BINOP = function (op) { - return { - type: "BEFORE_BINOP", - op: op - }; + // setoid + _Tuple.prototype.equals = function(that) { + return that instanceof _Tuple && R.equals(this[0], that[0]) && R.equals(this[1], that[1]); }; - Sep.AFTER_BINOP = function (op) { - return { - type: "AFTER_BINOP", - op: op - }; + _Tuple.prototype.toString = function() { + return 'Tuple(' + R.toString(this[0]) + ', ' + R.toString(this[1]) + ')'; }; - Sep.BEFORE_POSTFIX = function (op) { - return { - type: "BEFORE_POSTFIX", - op: op - }; + module.exports = Tuple; + + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + var R = __webpack_require__(26); + + + function Reader(run) { + if (!(this instanceof Reader)) { + return new Reader(run); + } + this.run = run; + } + + Reader.run = function(reader) { + return reader.run.apply(reader, [].slice.call(arguments, 1)); }; - Sep.UNARY = function (op) { - return { - type: "UNARY", - op: op - }; + Reader.prototype.chain = function(f) { + var reader = this; + return new Reader(function(r) { + return f(reader.run(r)).run(r); + }); }; - Sep.AFTER_STATEMENT = function (node) { - return { - type: "AFTER_STATEMENT", - node: node - }; + Reader.prototype.ap = function(a) { + return this.chain(function(f) { + return a.map(f); + }); }; - Sep.BEFORE_FUNCTION_NAME = function (node) { - return { - type: "BEFORE_FUNCTION_NAME", - node: node - }; + Reader.prototype.map = function(f) { + return this.chain(function(a) { + return Reader.of(f(a)); + }); }; - exports.Sep = Sep; - var ExtensibleCodeGen = exports.ExtensibleCodeGen = function () { - function ExtensibleCodeGen() { - _classCallCheck(this, ExtensibleCodeGen); - } + Reader.prototype.of = function(a) { + return new Reader(function() { + return a; + }); + }; + Reader.of = Reader.prototype.of; - _createClass(ExtensibleCodeGen, [{ - key: "parenToAvoidBeingDirective", - value: function parenToAvoidBeingDirective(element, original) { - if (element && element.type === "ExpressionStatement" && element.expression.type === "LiteralStringExpression") { - return seq(this.paren(original.children[0], Sep.PAREN_AVOIDING_DIRECTIVE_BEFORE, Sep.PAREN_AVOIDING_DIRECTIVE_AFTER), this.semiOp()); - } - return original; - } - }, { - key: "t", - value: function t(token) { - return new _coderep.Token(token); - } - }, { - key: "p", - value: function p(node, precedence, a) { - return (0, _coderep.getPrecedence)(node) < precedence ? this.paren(a, Sep.PRECEDENCE_BEFORE, Sep.PRECEDENCE_AFTER) : a; - } - }, { - key: "getAssignmentExpr", - value: function getAssignmentExpr(state) { - return state ? state.containsGroup ? this.paren(state, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER) : state : empty(); - } - }, { - key: "paren", - value: function paren(rep, first, last, empty) { - if (isEmpty(rep)) { - return new _coderep.Paren(this.sep(empty)); - } - return new _coderep.Paren(seq(first ? this.sep(first) : new _coderep.Empty(), rep, last ? this.sep(last) : new _coderep.Empty())); - } - }, { - key: "brace", - value: function brace(rep, node, first, last, empty) { - if (isEmpty(rep)) { - return new _coderep.Brace(this.sep(empty)); - } - return new _coderep.Brace(seq(this.sep(first), rep, this.sep(last))); - } - }, { - key: "bracket", - value: function bracket(rep, first, last, empty) { - if (isEmpty(rep)) { - return new _coderep.Bracket(this.sep(empty)); - } - return new _coderep.Bracket(seq(this.sep(first), rep, this.sep(last))); - } - }, { - key: "commaSep", - value: function commaSep(pieces, before, after) { - var _this = this; + Reader.ask = Reader(R.identity); - var first = true; - pieces = pieces.map(function (p) { - if (first) { - first = false; - return p; - } else { - return seq(_this.sep(before), _this.t(","), _this.sep(after), p); - } - }); - return seq.apply(undefined, _toConsumableArray(pieces)); - } - }, { - key: "semiOp", - value: function semiOp() { - return new _coderep.SemiOp(); - } - }, { - key: "sep", - value: function sep(kind) { - return new _coderep.Empty(); + Reader.prototype.toString = function() { + return 'Reader(' + R.toString(this.run) + ')'; + }; + + Reader.T = function(M) { + var ReaderT = function ReaderT(run) { + if (!(this instanceof ReaderT)) { + return new ReaderT(run); } - }, { - key: "reduceArrayExpression", - value: function reduceArrayExpression(node, _ref) { - var _this2 = this; + this.run = run; + }; - var elements = _ref.elements; + ReaderT.lift = R.compose(ReaderT, R.always); - if (elements.length === 0) { - return this.bracket(empty(), null, null, Sep.ARRAY_EMPTY); - } + ReaderT.ask = ReaderT(M.of); - var content = this.commaSep(elements.map(function (e) { - return _this2.getAssignmentExpr(e); - }), Sep.ARRAY_BEFORE_COMMA, Sep.ARRAY_AFTER_COMMA); - if (elements.length > 0 && elements[elements.length - 1] == null) { - content = seq(content, this.sep(Sep.ARRAY_BEFORE_COMMA), this.t(","), this.sep(Sep.ARRAY_AFTER_COMMA)); - } - return this.bracket(content, Sep.ARRAY_INITIAL, Sep.ARRAY_FINAL); - } - }, { - key: "reduceSpreadElement", - value: function reduceSpreadElement(node, _ref2) { - var expression = _ref2.expression; + ReaderT.prototype.of = ReaderT.of = function(a) { + return ReaderT(function() { + return M.of(a); + }); + }; - return seq(this.t("..."), this.sep(Sep.SPREAD), this.p(node.expression, _coderep.Precedence.Assignment, expression)); - } - }, { - key: "reduceAssignmentExpression", - value: function reduceAssignmentExpression(node, _ref3) { - var binding = _ref3.binding; - var expression = _ref3.expression; + ReaderT.prototype.chain = function(f) { + var readerT = this; + return ReaderT(function(e) { + var m = readerT.run(e); + return m.chain(function(a) { + return f(a).run(e); + }); + }); + }; - var leftCode = binding; - var rightCode = expression; - var containsIn = expression.containsIn; - var startsWithCurly = binding.startsWithCurly; - var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; - var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; - if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { - rightCode = this.paren(rightCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); - containsIn = false; - } - return (0, _objectAssign2.default)(seq(leftCode, this.sep(Sep.BEFORE_ASSIGN_OP("=")), this.t("="), this.sep(Sep.AFTER_ASSIGN_OP("=")), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); - } - }, { - key: "reduceCompoundAssignmentExpression", - value: function reduceCompoundAssignmentExpression(node, _ref4) { - var binding = _ref4.binding; - var expression = _ref4.expression; + ReaderT.prototype.map = function(f) { + return this.chain(function(a) { + return ReaderT.of(f(a)); + }); + }; - var leftCode = binding; - var rightCode = expression; - var containsIn = expression.containsIn; - var startsWithCurly = binding.startsWithCurly; - var startsWithLetSquareBracket = binding.startsWithLetSquareBracket; - var startsWithFunctionOrClass = binding.startsWithFunctionOrClass; - if ((0, _coderep.getPrecedence)(node.expression) < (0, _coderep.getPrecedence)(node)) { - rightCode = this.paren(rightCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); - containsIn = false; - } - return (0, _objectAssign2.default)(seq(leftCode, this.sep(Sep.BEFORE_ASSIGN_OP(node.operator)), this.t(node.operator), this.sep(Sep.AFTER_ASSIGN_OP(node.operator)), rightCode), { containsIn: containsIn, startsWithCurly: startsWithCurly, startsWithLetSquareBracket: startsWithLetSquareBracket, startsWithFunctionOrClass: startsWithFunctionOrClass }); - } - }, { - key: "reduceBinaryExpression", - value: function reduceBinaryExpression(node, _ref5) { - var left = _ref5.left; - var right = _ref5.right; + ReaderT.prototype.ap = function(a) { + var readerT = this; + return ReaderT(function(e) { + return readerT.run(e).ap(a.run(e)); + }); + }; - var leftCode = left; - var startsWithCurly = left.startsWithCurly; - var startsWithLetSquareBracket = left.startsWithLetSquareBracket; - var startsWithFunctionOrClass = left.startsWithFunctionOrClass; - var leftContainsIn = left.containsIn; - if ((0, _coderep.getPrecedence)(node.left) < (0, _coderep.getPrecedence)(node)) { - leftCode = this.paren(leftCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); - startsWithCurly = false; - startsWithLetSquareBracket = false; - startsWithFunctionOrClass = false; - leftContainsIn = false; - } - var rightCode = right; - var rightContainsIn = right.containsIn; - if ((0, _coderep.getPrecedence)(node.right) <= (0, _coderep.getPrecedence)(node)) { - rightCode = this.paren(rightCode, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); - rightContainsIn = false; - } - return (0, _objectAssign2.default)(seq(leftCode, this.sep(Sep.BEFORE_BINOP(node.operator)), this.t(node.operator), this.sep(Sep.AFTER_BINOP(node.operator)), rightCode), { - containsIn: leftContainsIn || rightContainsIn || node.operator === "in", - containsGroup: node.operator == ",", - startsWithCurly: startsWithCurly, - startsWithLetSquareBracket: startsWithLetSquareBracket, - startsWithFunctionOrClass: startsWithFunctionOrClass - }); - } - }, { - key: "reduceBindingWithDefault", - value: function reduceBindingWithDefault(node, _ref6) { - var binding = _ref6.binding; - var init = _ref6.init; + ReaderT.prototype.equals = function(that) { + return this === that || + this.run === that.run || + R.equals(this.run().get(), that.run().get()); + }; - return seq(binding, this.sep(Sep.BEFORE_DEFAULT_EQUALS), this.t("="), this.sep(Sep.AFTER_DEFAULT_EQUALS), init); - } - }, { - key: "reduceBindingIdentifier", - value: function reduceBindingIdentifier(node) { - var a = this.t(node.name); - if (node.name === "let") { - a.startsWithLet = true; - } - return a; - } - }, { - key: "reduceArrayBinding", - value: function reduceArrayBinding(node, _ref7) { - var _this3 = this; + ReaderT.prototype.toString = function() { + return 'ReaderT[' + M.name + '](' + R.toString(this.run) + ')'; + }; - var elements = _ref7.elements; - var restElement = _ref7.restElement; + return ReaderT; + }; - var content = undefined; - if (elements.length === 0) { - content = restElement == null ? empty() : seq(this.t("..."), this.sep(Sep.REST), restElement); - } else { - elements = elements.concat(restElement == null ? [] : [seq(this.t("..."), this.sep(Sep.REST), restElement)]); - content = this.commaSep(elements.map(function (e) { - return _this3.getAssignmentExpr(e); - }), Sep.ARRAY_BEFORE_COMMA, Sep.ARRAY_AFTER_COMMA); - if (elements.length > 0 && elements[elements.length - 1] == null) { - content = seq(content, this.sep(Sep.ARRAY_BEFORE_COMMA), this.t(","), this.sep(Sep.ARRAY_AFTER_COMMA)); - } - } - return this.bracket(content, Sep.ARRAY_INITIAL, Sep.ARRAY_FINAL, Sep.ARRAY_EMPTY); - } - }, { - key: "reduceObjectBinding", - value: function reduceObjectBinding(node, _ref8) { - var properties = _ref8.properties; + module.exports = Reader; - var state = this.brace(this.commaSep(properties, Sep.OBJECT_BEFORE_COMMA, Sep.OBJECT_AFTER_COMMA), node, Sep.OBJECT_BRACE_INITIAL, Sep.OBJECT_BRACE_FINAL, Sep.OBJECT_EMPTY); - state.startsWithCurly = true; - return state; - } - }, { - key: "reduceBindingPropertyIdentifier", - value: function reduceBindingPropertyIdentifier(node, _ref9) { - var binding = _ref9.binding; - var init = _ref9.init; - if (node.init == null) return binding; - return seq(binding, this.sep(Sep.BEFORE_DEFAULT_EQUALS), this.t("="), this.sep(Sep.AFTER_DEFAULT_EQUALS), init); - } - }, { - key: "reduceBindingPropertyProperty", - value: function reduceBindingPropertyProperty(node, _ref10) { - var name = _ref10.name; - var binding = _ref10.binding; +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { - return seq(name, this.sep(Sep.BEFORE_PROP), this.t(":"), this.sep(Sep.AFTER_PROP), binding); - } - }, { - key: "reduceBlock", - value: function reduceBlock(node, _ref11) { - var statements = _ref11.statements; + "use strict"; - return this.brace(seq.apply(undefined, _toConsumableArray(statements)), node, Sep.BLOCK_BRACE_INITIAL, Sep.BLOCK_BRACE_FINAL, Sep.BLOCK_EMPTY); - } - }, { - key: "reduceBlockStatement", - value: function reduceBlockStatement(node, _ref12) { - var block = _ref12.block; + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.Modules = exports.Module = undefined; - return seq(block, this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceBreakStatement", - value: function reduceBreakStatement(node, _ref13) { - var label = _ref13.label; + var _immutable = __webpack_require__(3); - return seq(this.t("break"), label ? seq(this.sep(Sep.BEFORE_JUMP_LABEL), this.t(label)) : empty(), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceCallExpression", - value: function reduceCallExpression(node, _ref14) { - var callee = _ref14.callee; - var args = _ref14.arguments; + var _env = __webpack_require__(37); - return (0, _objectAssign2.default)(seq(this.p(node.callee, (0, _coderep.getPrecedence)(node), callee), this.sep(Sep.CALL), this.paren(this.commaSep(args, Sep.ARGS_BEFORE_COMMA, Sep.ARGS_AFTER_COMMA), Sep.CALL_PAREN_BEFORE, Sep.CALL_PAREN_AFTER, Sep.CALL_PAREN_EMPTY)), { - startsWithCurly: callee.startsWithCurly, - startsWithLetSquareBracket: callee.startsWithLetSquareBracket, - startsWithFunctionOrClass: callee.startsWithFunctionOrClass - }); - } - }, { - key: "reduceCatchClause", - value: function reduceCatchClause(node, _ref15) { - var binding = _ref15.binding; - var body = _ref15.body; + var _env2 = _interopRequireDefault(_env); - return seq(this.t("catch"), this.sep(Sep.BEFORE_CATCH_BINDING), this.paren(binding, Sep.CATCH_PAREN_BEFORE, Sep.CATCH_PAREN_AFTER), this.sep(Sep.AFTER_CATCH_BINDING), body); - } - }, { - key: "reduceClassDeclaration", - value: function reduceClassDeclaration(node, _ref16) { - var name = _ref16.name; - var _super = _ref16.super; - var elements = _ref16.elements; + var _store = __webpack_require__(39); - var state = seq(this.t("class"), this.sep(Sep.BEFORE_CLASS_NAME), name); - if (_super != null) { - state = seq(state, this.sep(Sep.BEFORE_EXTENDS), this.t("extends"), this.sep(Sep.AFTER_EXTENDS), _super); - } - state = seq(state, this.sep(Sep.BEFORE_CLASS_DECLARATION_ELEMENTS), this.brace(seq.apply(undefined, _toConsumableArray(elements)), node, Sep.CLASS_BRACE_INITIAL, Sep.CLASS_BRACE_FINAL, Sep.CLASS_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); - return state; - } - }, { - key: "reduceClassExpression", - value: function reduceClassExpression(node, _ref17) { - var name = _ref17.name; - var _super = _ref17.super; - var elements = _ref17.elements; + var _store2 = _interopRequireDefault(_store); - var state = this.t("class"); - if (name != null) { - state = seq(state, this.sep(Sep.BEFORE_CLASS_NAME), name); - } - if (_super != null) { - state = seq(state, this.sep(Sep.BEFORE_EXTENDS), this.t("extends"), this.sep(Sep.AFTER_EXTENDS), _super); - } - state = seq(state, this.sep(Sep.BEFORE_CLASS_EXPRESSION_ELEMENTS), this.brace(seq.apply(undefined, _toConsumableArray(elements)), node, Sep.CLASS_EXPRESSION_BRACE_INITIAL, Sep.CLASS_EXPRESSION_BRACE_FINAL, Sep.CLASS_EXPRESSION_BRACE_EMPTY)); - state.startsWithFunctionOrClass = true; - return state; - } - }, { - key: "reduceClassElement", - value: function reduceClassElement(node, _ref18) { - var method = _ref18.method; + var _shiftReader = __webpack_require__(42); - method = seq(this.sep(Sep.BEFORE_CLASS_ELEMENT), method, this.sep(Sep.AFTER_CLASS_ELEMENT)); - if (!node.isStatic) return method; - return seq(this.t("static"), this.sep(Sep.AFTER_STATIC), method); - } - }, { - key: "reduceComputedMemberExpression", - value: function reduceComputedMemberExpression(node, _ref19) { - var object = _ref19.object; - var expression = _ref19.expression; + var _shiftReader2 = _interopRequireDefault(_shiftReader); - var startsWithLetSquareBracket = object.startsWithLetSquareBracket || node.object.type === "IdentifierExpression" && node.object.name === "let"; - return (0, _objectAssign2.default)(seq(this.p(node.object, (0, _coderep.getPrecedence)(node), object), this.sep(Sep.COMPUTED_MEMBER_EXPRESSION), this.bracket(expression, Sep.COMPUTED_MEMBER_BRACKET_INTIAL, Sep.COMPUTED_MEMBER_BRACKET_FINAL)), { - startsWithLet: object.startsWithLet, - startsWithLetSquareBracket: startsWithLetSquareBracket, - startsWithCurly: object.startsWithCurly, - startsWithFunctionOrClass: object.startsWithFunctionOrClass - }); - } - }, { - key: "reduceComputedPropertyName", - value: function reduceComputedPropertyName(node, _ref20) { - var expression = _ref20.expression; + var _ramda = __webpack_require__(10); - return this.bracket(expression, Sep.COMPUTED_PROPERTY_BRACKET_INTIAL, Sep.COMPUTED_PROPERTY_BRACKET_FINAL); - } - }, { - key: "reduceConditionalExpression", - value: function reduceConditionalExpression(node, _ref21) { - var test = _ref21.test; - var consequent = _ref21.consequent; - var alternate = _ref21.alternate; + var _ = _interopRequireWildcard(_ramda); - var containsIn = test.containsIn || alternate.containsIn; - var startsWithCurly = test.startsWithCurly; - var startsWithLetSquareBracket = test.startsWithLetSquareBracket; - var startsWithFunctionOrClass = test.startsWithFunctionOrClass; - return (0, _objectAssign2.default)(seq(this.p(node.test, _coderep.Precedence.LogicalOR, test), this.sep(Sep.BEFORE_TERNARY_QUESTION), this.t("?"), this.sep(Sep.AFTER_TERNARY_QUESTION), this.p(node.consequent, _coderep.Precedence.Assignment, consequent), this.sep(Sep.BEFORE_TERNARY_COLON), this.t(":"), this.sep(Sep.AFTER_TERNARY_COLON), this.p(node.alternate, _coderep.Precedence.Assignment, alternate)), { - containsIn: containsIn, - startsWithCurly: startsWithCurly, - startsWithLetSquareBracket: startsWithLetSquareBracket, - startsWithFunctionOrClass: startsWithFunctionOrClass - }); - } - }, { - key: "reduceContinueStatement", - value: function reduceContinueStatement(node, _ref22) { - var label = _ref22.label; + var _symbol = __webpack_require__(47); - return seq(this.t("continue"), label ? seq(this.sep(Sep.BEFORE_JUMP_LABEL), this.t(label)) : empty(), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceDataProperty", - value: function reduceDataProperty(node, _ref23) { - var name = _ref23.name; - var expression = _ref23.expression; + var _terms = __webpack_require__(9); - return seq(name, this.sep(Sep.BEFORE_PROP), this.t(":"), this.sep(Sep.AFTER_PROP), this.getAssignmentExpr(expression)); - } - }, { - key: "reduceDebuggerStatement", - value: function reduceDebuggerStatement(node) { - return seq(this.t("debugger"), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceDoWhileStatement", - value: function reduceDoWhileStatement(node, _ref24) { - var body = _ref24.body; - var test = _ref24.test; + var T = _interopRequireWildcard(_terms); - return seq(this.t("do"), this.sep(Sep.AFTER_DO), body, this.sep(Sep.BEFORE_DOWHILE_WHILE), this.t("while"), this.sep(Sep.AFTER_DOWHILE_WHILE), this.paren(test, Sep.DO_WHILE_TEST_PAREN_BEFORE, Sep.DO_WHILE_TEST_PAREN_AFTER), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceEmptyStatement", - value: function reduceEmptyStatement(node) { - return seq(this.t(";"), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceExpressionStatement", - value: function reduceExpressionStatement(node, _ref25) { - var expression = _ref25.expression; + var _loadSyntax = __webpack_require__(48); - var needsParens = expression.startsWithCurly || expression.startsWithLetSquareBracket || expression.startsWithFunctionOrClass; - return seq(needsParens ? this.paren(expression, Sep.EXPRESSION_STATEMENT_PAREN_BEFORE, Sep.EXPRESSION_STATEMENT_PAREN_AFTER) : expression, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceForInStatement", - value: function reduceForInStatement(node, _ref26) { - var left = _ref26.left; - var right = _ref26.right; - var body = _ref26.body; + var _compiler = __webpack_require__(60); - var leftP = left; - switch (node.left.type) { - case "VariableDeclaration": - leftP = noIn(markContainsIn(left)); - break; - case "BindingIdentifier": - if (node.left.name === "let") { - leftP = this.paren(left, Sep.FOR_IN_LET_PAREN_BEFORE, Sep.FOR_IN_LET_PAREN_BEFORE); - } - break; - } - return (0, _objectAssign2.default)(seq(this.t("for"), this.sep(Sep.AFTER_FORIN_FOR), this.paren(seq(leftP, this.sep(Sep.BEFORE_FORIN_IN), this.t("in"), this.sep(Sep.AFTER_FORIN_FOR), right), Sep.FOR_IN_PAREN_BEFORE, Sep.FOR_IN_PAREN_AFTER), this.sep(Sep.BEFORE_FORIN_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceForOfStatement", - value: function reduceForOfStatement(node, _ref27) { - var left = _ref27.left; - var right = _ref27.right; - var body = _ref27.body; + var _compiler2 = _interopRequireDefault(_compiler); - left = node.left.type === "VariableDeclaration" ? noIn(markContainsIn(left)) : left; - return (0, _objectAssign2.default)(seq(this.t("for"), this.sep(Sep.AFTER_FOROF_FOR), this.paren(seq(left.startsWithLet ? this.paren(left, Sep.FOR_OF_LET_PAREN_BEFORE, Sep.FOR_OF_LET_PAREN_AFTER) : left, this.sep(Sep.BEFORE_FOROF_OF), this.t("of"), this.sep(Sep.AFTER_FOROF_FOR), right), Sep.FOR_OF_PAREN_BEFORE, Sep.FOR_OF_PAREN_AFTER), this.sep(Sep.BEFORE_FOROF_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceForStatement", - value: function reduceForStatement(node, _ref28) { - var init = _ref28.init; - var test = _ref28.test; - var update = _ref28.update; - var body = _ref28.body; + var _transforms = __webpack_require__(38); - return (0, _objectAssign2.default)(seq(this.t("for"), this.sep(Sep.AFTER_FOR_FOR), this.paren(seq(init ? seq(this.sep(Sep.BEFORE_FOR_INIT), noIn(markContainsIn(init)), this.sep(Sep.AFTER_FOR_INIT)) : this.sep(Sep.EMPTY_FOR_INIT), this.t(";"), test ? seq(this.sep(Sep.BEFORE_FOR_TEST), test, this.sep(Sep.AFTER_FOR_TEST)) : this.sep(Sep.EMPTY_FOR_TEST), this.t(";"), update ? seq(this.sep(Sep.BEFORE_FOR_UPDATE), update, this.sep(Sep.AFTER_FOR_UPDATE)) : this.sep(Sep.EMPTY_FOR_UPDATE))), this.sep(Sep.BEFORE_FOR_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { - endsWithMissingElse: body.endsWithMissingElse - }); - } - }, { - key: "reduceFunctionBody", - value: function reduceFunctionBody(node, _ref29) { - var directives = _ref29.directives; - var statements = _ref29.statements; + var _scope = __webpack_require__(58); - if (statements.length) { - statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); - } - return seq.apply(undefined, _toConsumableArray(directives).concat([directives.length ? this.sep(Sep.AFTER_FUNCTION_DIRECTIVES) : empty()], _toConsumableArray(statements))); - } - }, { - key: "reduceFunctionDeclaration", - value: function reduceFunctionDeclaration(node, _ref30) { - var name = _ref30.name; - var params = _ref30.params; - var body = _ref30.body; + var _errors = __webpack_require__(23); - return seq(this.t("function"), node.isGenerator ? seq(this.sep(Sep.BEFORE_GENERATOR_STAR), this.t("*"), this.sep(Sep.AFTER_GENERATOR_STAR)) : empty(), this.sep(Sep.BEFORE_FUNCTION_NAME(node)), node.name.name === "*default*" ? empty() : name, this.sep(Sep.BEFORE_FUNCTION_PARAMS), this.paren(params, Sep.PARAMETERS_PAREN_BEFORE, Sep.PARAMETERS_PAREN_AFTER, Sep.PARAMETERS_PAREN_EMPTY), this.sep(Sep.BEFORE_FUNCTION_DECLARATION_BODY), this.brace(body, node, Sep.FUNCTION_BRACE_INITIAL, Sep.FUNCTION_BRACE_FINAL, Sep.FUNCTION_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceFunctionExpression", - value: function reduceFunctionExpression(node, _ref31) { - var name = _ref31.name; - var params = _ref31.params; - var body = _ref31.body; + var _hygieneUtils = __webpack_require__(65); - var state = seq(this.t("function"), node.isGenerator ? seq(this.sep(Sep.BEFORE_GENERATOR_STAR), this.t("*"), this.sep(Sep.AFTER_GENERATOR_STAR)) : empty(), this.sep(Sep.BEFORE_FUNCTION_NAME(node)), name ? name : empty(), this.sep(Sep.BEFORE_FUNCTION_PARAMS), this.paren(params, Sep.PARAMETERS_PAREN_BEFORE, Sep.PARAMETERS_PAREN_AFTER, Sep.PARAMETERS_PAREN_EMPTY), this.sep(Sep.BEFORE_FUNCTION_EXPRESSION_BODY), this.brace(body, node, Sep.FUNCTION_EXPRESSION_BRACE_INITIAL, Sep.FUNCTION_EXPRESSION_BRACE_FINAL, Sep.FUNCTION_EXPRESSION_EMPTY)); - state.startsWithFunctionOrClass = true; - return state; - } - }, { - key: "reduceFormalParameters", - value: function reduceFormalParameters(node, _ref32) { - var items = _ref32.items; - var rest = _ref32.rest; + var _syntax = __webpack_require__(46); - return this.commaSep(items.concat(rest == null ? [] : [seq(this.t("..."), this.sep(Sep.REST), rest)]), Sep.PARAMETER_BEFORE_COMMA, Sep.PARAMETER_AFTER_COMMA); - } - }, { - key: "reduceArrowExpression", - value: function reduceArrowExpression(node, _ref33) { - var params = _ref33.params; - var body = _ref33.body; + var _utilsDirname = __webpack_require__(66); - if (node.params.rest != null || node.params.items.length !== 1 || node.params.items[0].type !== "BindingIdentifier") { - params = this.paren(params, Sep.ARROW_PARAMETERS_PAREN_BEFORE, Sep.ARROW_PARAMETERS_PAREN_AFTER, Sep.ARROW_PARAMETERS_PAREN_EMPTY); - } - if (node.body.type === "FunctionBody") { - body = this.brace(body, node, Sep.ARROW_BRACE_INITIAL, Sep.ARROW_BRACE_FINAL, Sep.ARROW_BRACE_EMPTY); - } else if (body.startsWithCurly) { - body = this.paren(body, Sep.ARROW_BODY_PAREN_BEFORE, Sep.ARROW_BODY_PAREN_AFTER); - } - return seq(params, this.sep(Sep.BEFORE_ARROW), this.t("=>"), this.sep(Sep.AFTER_ARROW), this.p(node.body, _coderep.Precedence.Assignment, body)); - } - }, { - key: "reduceGetter", - value: function reduceGetter(node, _ref34) { - var name = _ref34.name; - var body = _ref34.body; + var _utilsDirname2 = _interopRequireDefault(_utilsDirname); - return seq(this.t("get"), this.sep(Sep.AFTER_GET), name, this.sep(Sep.BEFORE_GET_PARAMS), this.paren(empty(), null, null, Sep.GETTER_PARAMS), this.sep(Sep.BEFORE_GET_BODY), this.brace(body, node, Sep.GET_BRACE_INTIAL, Sep.GET_BRACE_FINAL, Sep.GET_BRACE_EMPTY)); - } - }, { - key: "reduceIdentifierExpression", - value: function reduceIdentifierExpression(node) { - var a = this.t(node.name); - if (node.name === "let") { - a.startsWithLet = true; - } - return a; - } - }, { - key: "reduceIfStatement", - value: function reduceIfStatement(node, _ref35) { - var test = _ref35.test; - var consequent = _ref35.consequent; - var alternate = _ref35.alternate; + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - if (alternate && consequent.endsWithMissingElse) { - consequent = this.brace(consequent, node, Sep.MISSING_ELSE_INTIIAL, Sep.MISSING_ELSE_FINAL, Sep.MISSING_ELSE_EMPTY); - } - return (0, _objectAssign2.default)(seq(this.t("if"), this.sep(Sep.AFTER_IF), this.paren(test, Sep.IF_PAREN_BEFORE, Sep.IF_PAREN_AFTER), this.sep(Sep.AFTER_IF_TEST), consequent, alternate ? seq(this.sep(Sep.BEFORE_ELSE), this.t("else"), this.sep(Sep.AFTER_ELSE), alternate) : empty(), this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: alternate ? alternate.endsWithMissingElse : true }); - } - }, { - key: "reduceImport", - value: function reduceImport(node, _ref36) { - var defaultBinding = _ref36.defaultBinding; - var namedImports = _ref36.namedImports; + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - var bindings = []; - if (defaultBinding != null) { - bindings.push(defaultBinding); - } - if (namedImports.length > 0) { - bindings.push(this.brace(this.commaSep(namedImports, Sep.NAMED_IMPORT_BEFORE_COMMA, Sep.NAMED_IMPORT_AFTER_COMMA), node, Sep.IMPORT_BRACE_INTIAL, Sep.IMPORT_BRACE_FINAL, Sep.IMPORT_BRACE_EMPTY)); - } - if (bindings.length === 0) { - return seq(this.t("import"), this.sep(Sep.BEFORE_IMPORT_MODULE), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - return seq(this.t("import"), this.sep(Sep.BEFORE_IMPORT_BINDINGS), this.commaSep(bindings, Sep.IMPORT_BEFORE_COMMA, Sep.IMPORT_AFTER_COMMA), this.sep(Sep.AFTER_IMPORT_BINDINGS), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceImportNamespace", - value: function reduceImportNamespace(node, _ref37) { - var defaultBinding = _ref37.defaultBinding; - var namespaceBinding = _ref37.namespaceBinding; + class Module { + constructor(moduleSpecifier, isNative, importEntries, exportEntries, pragmas, body) { + this.moduleSpecifier = moduleSpecifier; + this.isNative = isNative; + this.importEntries = importEntries; + this.exportEntries = exportEntries; + this.pragmas = pragmas; + this.body = body; + } + } - return seq(this.t("import"), this.sep(Sep.BEFORE_IMPORT_NAMESPACE), defaultBinding == null ? empty() : seq(defaultBinding, this.sep(Sep.IMPORT_BEFORE_COMMA), this.t(","), this.sep(Sep.IMPORT_AFTER_COMMA)), this.sep(Sep.BEFORE_IMPORT_STAR), this.t("*"), this.sep(Sep.AFTER_IMPORT_STAR), this.t("as"), this.sep(Sep.AFTER_IMPORT_AS), namespaceBinding, this.sep(Sep.AFTER_NAMESPACE_BINDING), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceImportSpecifier", - value: function reduceImportSpecifier(node, _ref38) { - var binding = _ref38.binding; + exports.Module = Module; + const findBindingIdentifierName = term => { + // TODO: handle destructuring + (0, _errors.assert)(term.name, `not implemented yet for type ${ term.type }`); + return term.name; + }; - if (node.name == null) return binding; - return seq(this.t(node.name), this.sep(Sep.BEFORE_IMPORT_AS), this.t("as"), this.sep(Sep.AFTER_IMPORT_AS), binding); - } - }, { - key: "reduceExportAllFrom", - value: function reduceExportAllFrom(node) { - return seq(this.t("export"), this.sep(Sep.BEFORE_EXPORT_STAR), this.t("*"), this.sep(Sep.AFTER_EXPORT_STAR), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceExportFrom", - value: function reduceExportFrom(node, _ref39) { - var namedExports = _ref39.namedExports; + const convertExport = term => { + let declaration = term.declaration; + let bindings = []; + if (T.isVariableDeclaration(declaration)) { + bindings = declaration.declarators.map(decl => findBindingIdentifierName(decl.binding)); + } else if (T.isFunctionDeclaration(declaration) || T.isClassDeclaration(declaration)) { + bindings.push(findBindingIdentifierName(declaration.name)); + } - return seq(this.t("export"), this.sep(Sep.BEFORE_EXPORT_BINDINGS), this.brace(this.commaSep(namedExports, Sep.EXPORTS_BEFORE_COMMA, Sep.EXPORTS_AFTER_COMMA), node, Sep.EXPORT_BRACE_INITIAL, Sep.EXPORT_BRACE_FINAL, Sep.EXPORT_BRACE_EMPTY), node.moduleSpecifier == null ? empty() : seq(this.sep(Sep.AFTER_EXPORT_BINDINGS), this.t("from"), this.sep(Sep.AFTER_FROM), this.t((0, _coderep.escapeStringLiteral)(node.moduleSpecifier)), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node)))); - } - }, { - key: "reduceExport", - value: function reduceExport(node, _ref40) { - var declaration = _ref40.declaration; + let namedExports = bindings.map(binding => { + return new T.default('ExportSpecifier', { + name: null, + exportedName: binding + }); + }); + return new T.default('ExportFrom', { + moduleSpecifier: null, + namedExports: (0, _immutable.List)(namedExports) + }); + }; - switch (node.declaration.type) { - case "FunctionDeclaration": - case "ClassDeclaration": - break; - default: - declaration = seq(declaration, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - return seq(this.t("export"), this.sep(Sep.AFTER_EXPORT), declaration); - } - }, { - key: "reduceExportDefault", - value: function reduceExportDefault(node, _ref41) { - var body = _ref41.body; + const pragmaRegep = /^\s*#\w*/; - body = body.startsWithFunctionOrClass ? this.paren(body, Sep.EXPORT_PAREN_BEFORE, Sep.EXPORT_PAREN_AFTER) : body; - switch (node.body.type) { - case "FunctionDeclaration": - case "ClassDeclaration": - break; - default: - body = seq(body, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - return seq(this.t("export"), this.sep(Sep.EXPORT_DEFAULT), this.t("default"), this.sep(Sep.AFTER_EXPORT_DEFAULT), body); - } - }, { - key: "reduceExportSpecifier", - value: function reduceExportSpecifier(node) { - if (node.name == null) return this.t(node.exportedName); - return seq(this.t(node.name), this.sep(Sep.BEFORE_EXPORT_AS), this.t("as"), this.sep(Sep.AFTER_EXPORT_AS), this.t(node.exportedName)); - } - }, { - key: "reduceLabeledStatement", - value: function reduceLabeledStatement(node, _ref42) { - var label = _ref42.label; - var body = _ref42.body; + class Modules { + constructor(context) { + this.compiledModules = new Map(); + this.context = context; + this.context.modules = this; + } - return (0, _objectAssign2.default)(seq(this.t(label), this.sep(Sep.BEFORE_LABEL_COLON), this.t(":"), this.sep(Sep.AFTER_LABEL_COLON), body), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceLiteralBooleanExpression", - value: function reduceLiteralBooleanExpression(node) { - return this.t(node.value.toString()); - } - }, { - key: "reduceLiteralNullExpression", - value: function reduceLiteralNullExpression(node) { - return this.t("null"); - } - }, { - key: "reduceLiteralInfinityExpression", - value: function reduceLiteralInfinityExpression(node) { - return this.t("2e308"); - } - }, { - key: "reduceLiteralNumericExpression", - value: function reduceLiteralNumericExpression(node) { - return new _coderep.NumberCodeRep(node.value); - } - }, { - key: "reduceLiteralRegExpExpression", - value: function reduceLiteralRegExpExpression(node) { - return this.t("/" + node.pattern + "/" + node.flags); - } - }, { - key: "reduceLiteralStringExpression", - value: function reduceLiteralStringExpression(node) { - return this.t((0, _coderep.escapeStringLiteral)(node.value)); - } - }, { - key: "reduceMethod", - value: function reduceMethod(node, _ref43) { - var name = _ref43.name; - var params = _ref43.params; - var body = _ref43.body; + loadString(str) { + let checkPragma = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; - return seq(node.isGenerator ? seq(this.t("*"), this.sep(Sep.AFTER_METHOD_GENERATOR_STAR)) : empty(), name, this.sep(Sep.AFTER_METHOD_NAME), this.paren(params, Sep.PARAMETERS_PAREN_BEFORE, Sep.PARAMETERS_PAREN_AFTER, Sep.PARAMETERS_PAREN_EMPTY), this.sep(Sep.BEFORE_METHOD_BODY), this.brace(body, node, Sep.METHOD_BRACE_INTIAL, Sep.METHOD_BRACE_FINAL, Sep.METHOD_BRACE_EMPTY)); + let hasPragma = pragmaRegep.test(str); + if (checkPragma && !hasPragma) { + return { + isNative: true, + body: (0, _immutable.List)() + }; } - }, { - key: "reduceModule", - value: function reduceModule(node, _ref44) { - var directives = _ref44.directives; - var items = _ref44.items; + return { + isNative: !hasPragma, + body: new _shiftReader2.default(str).read() + }; + } - if (items.length) { - items[0] = this.parenToAvoidBeingDirective(node.items[0], items[0]); - } - return seq.apply(undefined, _toConsumableArray(directives).concat([directives.length ? this.sep(Sep.AFTER_MODULE_DIRECTIVES) : empty()], _toConsumableArray(items))); - } - }, { - key: "reduceNewExpression", - value: function reduceNewExpression(node, _ref45) { - var callee = _ref45.callee; - var args = _ref45.arguments; + load(path) { + // TODO resolve and we need to carry the cwd through correctly + return this.loadString(this.context.moduleLoader(path)); + } - var calleeRep = (0, _coderep.getPrecedence)(node.callee) == _coderep.Precedence.Call ? this.paren(callee, Sep.NEW_CALLEE_PAREN_BEFORE, Sep.NEW_CALLEE_PAREN_AFTER) : this.p(node.callee, (0, _coderep.getPrecedence)(node), callee); - return seq(this.t("new"), this.sep(Sep.AFTER_NEW), calleeRep, args.length === 0 ? this.sep(Sep.EMPTY_NEW_CALL) : seq(this.sep(Sep.BEFORE_NEW_ARGS), this.paren(this.commaSep(args, Sep.ARGS_BEFORE_COMMA, Sep.ARGS_AFTER_COMMA), Sep.NEW_PAREN_BEFORE, Sep.NEW_PAREN_AFTER, Sep.NEW_PAREN_EMPTY))); - } - }, { - key: "reduceNewTargetExpression", - value: function reduceNewTargetExpression() { - return seq(this.t("new"), this.sep(Sep.NEW_TARGET_BEFORE_DOT), this.t("."), this.sep(Sep.NEW_TARGET_AFTER_DOT), this.t("target")); - } - }, { - key: "reduceObjectExpression", - value: function reduceObjectExpression(node, _ref46) { - var properties = _ref46.properties; + compile(mod, path) { + let stxl = mod.body; + let outScope = (0, _scope.freshScope)('outsideEdge'); + let inScope = (0, _scope.freshScope)(`insideEdge0`); + // the compiler starts at phase 0, with an empty environment and store + let compiler = new _compiler2.default(0, new _env2.default(), new _store2.default(), _.merge(this.context, { + currentScope: [outScope, inScope], + cwd: path === '<>' ? this.context.cwd : (0, _utilsDirname2.default)(path) + })); + let terms = compiler.compile(stxl.map(s => s.addScope(outScope, this.context.bindings, _syntax.ALL_PHASES).addScope(inScope, this.context.bindings, 0))); + + let importEntries = []; + let exportEntries = []; + let pragmas = []; + let filteredTerms = terms.reduce((acc, t) => { + return _.cond([[T.isImport, t => { + importEntries.push(t); + return acc; + }], [T.isExport, t => { + // exportEntries.push(t); + // return acc.concat(t); + if (t.declaration) { + exportEntries.push(convertExport(t)); + if (T.isVariableDeclaration(t.declaration)) { + return acc.concat(new T.default('VariableDeclarationStatement', { + declaration: t.declaration + })); + } + return acc.concat(t.declaration); + } + exportEntries.push(t); + return acc; + }], [T.isPragma, t => { + pragmas.push(t);return acc; + }], [_.T, t => acc.concat(t)]])(t); + }, (0, _immutable.List)()); + return new Module(path, mod.isNative, (0, _immutable.List)(importEntries), (0, _immutable.List)(exportEntries), (0, _immutable.List)(pragmas), filteredTerms); + } - var state = this.brace(this.commaSep(properties, Sep.OBJECT_BEFORE_COMMA, Sep.OBJECT_AFTER_COMMA), node, Sep.OBJECT_BRACE_INITIAL, Sep.OBJECT_BRACE_FINAL, Sep.OBJECT_EMPTY); - state.startsWithCurly = true; - return state; + compileEntrypoint(source, filename) { + let enforcePragma = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + + let stxl = this.loadString(source, false); + if (enforcePragma && stxl.isNative) { + throw new Error(`Entrypoint ${ filename } must begin with #lang pragma`); } - }, { - key: "reduceUpdateExpression", - value: function reduceUpdateExpression(node, _ref47) { - var operand = _ref47.operand; + return this.getAtPhase('<>', 0, this.context.cwd, stxl); + } - if (node.isPrefix) { - return this.reduceUnaryExpression.apply(this, arguments); + // Modules have a unique scope per-phase. We compile each module once at + // phase 0 and store the compiled module in a map. Then, as we ask for + // the module in a particular phase, we add that new phase-specific scope + // to the compiled module and update the map with the module at that specific + // phase. + getAtPhase(rawPath, phase, cwd) { + let rawStxl = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; + + let path = rawPath === '<>' ? rawPath : this.context.moduleResolver(rawPath, cwd); + let mapKey = `${ path }:${ phase }`; + if (!this.compiledModules.has(mapKey)) { + if (phase === 0) { + let stxl = rawStxl != null ? rawStxl : this.load(path); + this.compiledModules.set(mapKey, this.compile(stxl, path)); } else { - return (0, _objectAssign2.default)(seq(this.p(node.operand, _coderep.Precedence.New, operand), this.sep(Sep.BEFORE_POSTFIX(node.operator)), this.t(node.operator)), { - startsWithCurly: operand.startsWithCurly, - startsWithLetSquareBracket: operand.startsWithLetSquareBracket, - startsWithFunctionOrClass: operand.startsWithFunctionOrClass - }); + let rawMod = this.getAtPhase(rawPath, 0, cwd, rawStxl); + let scope = (0, _scope.freshScope)(`insideEdge${ phase }`); + this.compiledModules.set(mapKey, new Module(rawMod.moduleSpecifier, false, rawMod.importEntries.map(term => term.addScope(scope, this.context.bindings, phase)), rawMod.exportEntries.map(term => term.addScope(scope, this.context.bindings, phase)), rawMod.pragmas, rawMod.body.map(term => term.addScope(scope, this.context.bindings, phase)))); } } - }, { - key: "reduceUnaryExpression", - value: function reduceUnaryExpression(node, _ref48) { - var operand = _ref48.operand; + return this.compiledModules.get(mapKey); + } - return seq(this.t(node.operator), this.sep(Sep.UNARY(node.operator)), this.p(node.operand, (0, _coderep.getPrecedence)(node), operand)); - } - }, { - key: "reduceReturnStatement", - value: function reduceReturnStatement(node, _ref49) { - var expression = _ref49.expression; + has(rawPath) { + let phase = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - return seq(this.t("return"), expression ? seq(this.sep(Sep.RETURN), expression) : empty(), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceScript", - value: function reduceScript(node, _ref50) { - var directives = _ref50.directives; - var statements = _ref50.statements; + let path = rawPath === '<>' ? rawPath : this.context.moduleResolver(rawPath, this.context.cwd); + let key = `${ path }:${ phase }`; + return this.compiledModules.has(key) && !this.compiledModules.get(key).isNative; + } - if (statements.length) { - statements[0] = this.parenToAvoidBeingDirective(node.statements[0], statements[0]); - } - return seq.apply(undefined, _toConsumableArray(directives).concat([directives.length ? this.sep(Sep.AFTER_SCRIPT_DIRECTIVES) : empty()], _toConsumableArray(statements))); - } - }, { - key: "reduceSetter", - value: function reduceSetter(node, _ref51) { - var name = _ref51.name; - var param = _ref51.param; - var body = _ref51.body; + registerSyntaxDeclaration(term, phase, store) { + term.declarators.forEach(decl => { + let val = (0, _loadSyntax.evalCompiletimeValue)(decl.init.gen(), _.merge(this.context, { + phase: phase + 1, store: store + })); + (0, _hygieneUtils.collectBindings)(decl.binding).forEach(stx => { + if (phase !== 0) { + // phase 0 bindings extend the binding map during compilation + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: phase, + skipDup: false + }); + } + let resolvedName = stx.resolve(phase); + store.set(resolvedName, new _transforms.CompiletimeTransform(val)); + }); + }); + } - return seq(this.t("set"), this.sep(Sep.AFTER_SET), name, this.sep(Sep.BEFORE_SET_PARAMS), this.paren(param, Sep.SETTER_PARAM_BEFORE, Sep.SETTER_PARAM_AFTER), this.sep(Sep.BEFORE_SET_BODY), this.brace(body, node, Sep.SET_BRACE_INTIIAL, Sep.SET_BRACE_FINAL, Sep.SET_BRACE_EMPTY)); - } - }, { - key: "reduceShorthandProperty", - value: function reduceShorthandProperty(node) { - return this.t(node.name); - } - }, { - key: "reduceStaticMemberExpression", - value: function reduceStaticMemberExpression(node, _ref52) { - var object = _ref52.object; - var property = _ref52.property; + registerVariableDeclaration(term, phase, store) { + term.declarators.forEach(decl => { + (0, _hygieneUtils.collectBindings)(decl.binding).forEach(stx => { + if (phase !== 0) { + // phase 0 bindings extend the binding map during compilation + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: phase, + skipDup: term.kind === 'var' + }); + } + let resolvedName = stx.resolve(phase); + store.set(resolvedName, new _transforms.VarBindingTransform(stx)); + }); + }); + } - var state = seq(this.p(node.object, (0, _coderep.getPrecedence)(node), object), this.sep(Sep.BEFORE_STATIC_MEMBER_DOT), this.t("."), this.sep(Sep.AFTER_STATIC_MEMBER_DOT), this.t(property)); - state.startsWithLet = object.startsWithLet; - state.startsWithCurly = object.startsWithCurly; - state.startsWithLetSquareBracket = object.startsWithLetSquareBracket; - state.startsWithFunctionOrClass = object.startsWithFunctionOrClass; - return state; - } - }, { - key: "reduceStaticPropertyName", - value: function reduceStaticPropertyName(node) { - var n; - if (_esutils.keyword.isIdentifierNameES6(node.value)) { - return this.t(node.value); - } else if (n = parseFloat(node.value), n === n) { - return new _coderep.NumberCodeRep(n); + registerFunctionOrClass(term, phase, store) { + (0, _hygieneUtils.collectBindings)(term.name).forEach(stx => { + if (phase !== 0) { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: phase, + skipDup: false + }); } - return this.t((0, _coderep.escapeStringLiteral)(node.value)); - } - }, { - key: "reduceSuper", - value: function reduceSuper() { - return this.t("super"); - } - }, { - key: "reduceSwitchCase", - value: function reduceSwitchCase(node, _ref53) { - var test = _ref53.test; - var consequent = _ref53.consequent; + let resolvedName = stx.resolve(phase); + store.set(resolvedName, new _transforms.VarBindingTransform(stx)); + }); + } - return seq(this.t("case"), this.sep(Sep.BEFORE_CASE_TEST), test, this.sep(Sep.AFTER_CASE_TEST), this.t(":"), this.sep(Sep.BEFORE_CASE_BODY), seq.apply(undefined, _toConsumableArray(consequent)), this.sep(Sep.AFTER_CASE_BODY)); - } - }, { - key: "reduceSwitchDefault", - value: function reduceSwitchDefault(node, _ref54) { - var consequent = _ref54.consequent; + visit(mod, phase, store) { + // TODO: recursively visit imports + mod.body.forEach(term => { + if (T.isSyntaxDeclarationStatement(term)) { + this.registerSyntaxDeclaration(term.declaration, phase, store); + } + }); + return store; + } - return seq(this.t("default"), this.sep(Sep.DEFAULT), this.t(":"), this.sep(Sep.BEFORE_CASE_BODY), seq.apply(undefined, _toConsumableArray(consequent)), this.sep(Sep.AFTER_DEFAULT_BODY)); - } - }, { - key: "reduceSwitchStatement", - value: function reduceSwitchStatement(node, _ref55) { - var discriminant = _ref55.discriminant; - var cases = _ref55.cases; + invoke(mod, phase, store) { + // TODO: recursively visit imports + let body = mod.body.filter(_.complement(T.isCompiletimeStatement)).map(term => { + term = term.gen(); // TODO: can we remove the need for gen? have to deeply remove compiletime code + if (T.isVariableDeclarationStatement(term)) { + this.registerVariableDeclaration(term.declaration, phase, store); + } else if (T.isFunctionDeclaration(term)) { + this.registerFunctionOrClass(term, phase, store); + } + return term; + }); + (0, _loadSyntax.evalRuntimeValues)(body, _.merge(this.context, { + store: store, phase: phase + })); + return store; + } + } + exports.Modules = Modules; + //# sourceMappingURL=data:application/json;base64,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QUFNLEdBQU4sRUFBVyxLQUFYLEVBQWtCLEtBQWxCLEVBQXlCO0FBQ3ZCO0FBQ0EsUUFBSSxJQUFKLENBQVMsT0FBVCxDQUFpQixRQUFRO0FBQ3ZCLFVBQUksRUFBRSw0QkFBRixDQUErQixJQUEvQixDQUFKLEVBQTBDO0FBQ3hDLGFBQUsseUJBQUwsQ0FBK0IsS0FBSyxXQUFwQyxFQUFpRCxLQUFqRCxFQUF3RCxLQUF4RDtBQUNEO0FBQ0YsS0FKRDtBQUtBLFdBQU8sS0FBUDtBQUNEOztBQUVELFNBQU8sR0FBUCxFQUFZLEtBQVosRUFBbUIsS0FBbkIsRUFBMEI7QUFDeEI7QUFDQSxRQUFJLE9BQU8sSUFBSSxJQUFKLENBQVMsTUFBVCxDQUFnQixFQUFFLFVBQUYsQ0FBYSxFQUFFLHNCQUFmLENBQWhCLEVBQXdELEdBQXhELENBQTRELFFBQVE7QUFDN0UsYUFBTyxLQUFLLEdBQUwsRUFBUCxDQUFtQjtBQUNuQixVQUFJLEVBQUUsOEJBQUYsQ0FBaUMsSUFBakMsQ0FBSixFQUE0QztBQUMxQyxhQUFLLDJCQUFMLENBQWlDLEtBQUssV0FBdEMsRUFBbUQsS0FBbkQsRUFBMEQsS0FBMUQ7QUFDRCxPQUZELE1BRU8sSUFBSSxFQUFFLHFCQUFGLENBQXdCLElBQXhCLENBQUosRUFBbUM7QUFDeEMsYUFBSyx1QkFBTCxDQUE2QixJQUE3QixFQUFtQyxLQUFuQyxFQUEwQyxLQUExQztBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0QsS0FSVSxDQUFYO0FBU0EsdUNBQWtCLElBQWxCLEVBQXdCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQjtBQUM1QyxrQkFENEMsRUFDckM7QUFEcUMsS0FBdEIsQ0FBeEI7QUFHQSxXQUFPLEtBQVA7QUFDRDtBQXJNa0I7UUFBUixPLEdBQUEsTyIsImZpbGUiOiJtb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlzdCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgRW52IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IFN0b3JlIGZyb20gXCIuL3N0b3JlXCI7XG5pbXBvcnQgUmVhZGVyIGZyb20gXCIuL3NoaWZ0LXJlYWRlclwiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IGdlbnN5bSB9IGZyb20gJy4vc3ltYm9sJztcbmltcG9ydCBUZXJtLCAqIGFzIFQgZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IGV2YWxDb21waWxldGltZVZhbHVlLCBldmFsUnVudGltZVZhbHVlcyB9IGZyb20gJy4vbG9hZC1zeW50YXgnO1xuaW1wb3J0IENvbXBpbGVyIGZyb20gXCIuL2NvbXBpbGVyXCI7XG5pbXBvcnQgeyBWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybSB9IGZyb20gJy4vdHJhbnNmb3Jtcyc7XG5pbXBvcnQgeyBmcmVzaFNjb3BlIH0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGNvbGxlY3RCaW5kaW5ncyB9IGZyb20gJy4vaHlnaWVuZS11dGlscyc7XG5cbmltcG9ydCB7IEFMTF9QSEFTRVMgfSBmcm9tICcuL3N5bnRheCc7XG5cbmltcG9ydCBkaXJuYW1lIGZyb20gJ3V0aWxzLWRpcm5hbWUnO1xuXG5cbmV4cG9ydCBjbGFzcyBNb2R1bGUge1xuICBjb25zdHJ1Y3Rvcihtb2R1bGVTcGVjaWZpZXIsIGlzTmF0aXZlLCBpbXBvcnRFbnRyaWVzLCBleHBvcnRFbnRyaWVzLCBwcmFnbWFzLCBib2R5KSB7XG4gICAgdGhpcy5tb2R1bGVTcGVjaWZpZXIgPSBtb2R1bGVTcGVjaWZpZXI7XG4gICAgdGhpcy5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIHRoaXMuaW1wb3J0RW50cmllcyA9IGltcG9ydEVudHJpZXM7XG4gICAgdGhpcy5leHBvcnRFbnRyaWVzID0gZXhwb3J0RW50cmllcztcbiAgICB0aGlzLnByYWdtYXMgPSBwcmFnbWFzO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cbn1cblxuY29uc3QgZmluZEJpbmRpbmdJZGVudGlmaWVyTmFtZSA9IHRlcm0gPT4ge1xuICAvLyBUT0RPOiBoYW5kbGUgZGVzdHJ1Y3R1cmluZ1xuICBhc3NlcnQodGVybS5uYW1lLCBgbm90IGltcGxlbWVudGVkIHlldCBmb3IgdHlwZSAke3Rlcm0udHlwZX1gKTtcbiAgcmV0dXJuIHRlcm0ubmFtZTtcbn07XG5cbmNvbnN0IGNvbnZlcnRFeHBvcnQgPSB0ZXJtID0+IHtcbiAgbGV0IGRlY2xhcmF0aW9uID0gdGVybS5kZWNsYXJhdGlvbjtcbiAgbGV0IGJpbmRpbmdzID0gW107XG4gIGlmIChULmlzVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICBiaW5kaW5ncyA9IGRlY2xhcmF0aW9uLmRlY2xhcmF0b3JzLm1hcChkZWNsID0+ICBmaW5kQmluZGluZ0lkZW50aWZpZXJOYW1lKGRlY2wuYmluZGluZykpO1xuICB9IGVsc2UgaWYgKFQuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB8fCBULmlzQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICBiaW5kaW5ncy5wdXNoKGZpbmRCaW5kaW5nSWRlbnRpZmllck5hbWUoZGVjbGFyYXRpb24ubmFtZSkpO1xuICB9XG5cbiAgbGV0IG5hbWVkRXhwb3J0cyA9IGJpbmRpbmdzLm1hcChiaW5kaW5nID0+IHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydFNwZWNpZmllcicsIHtcbiAgICAgIG5hbWU6IG51bGwsXG4gICAgICBleHBvcnRlZE5hbWU6IGJpbmRpbmdcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBuZXcgVGVybSgnRXhwb3J0RnJvbScsIHtcbiAgICBtb2R1bGVTcGVjaWZpZXI6IG51bGwsXG4gICAgbmFtZWRFeHBvcnRzOiBMaXN0KG5hbWVkRXhwb3J0cylcbiAgfSk7XG59O1xuXG5jb25zdCBwcmFnbWFSZWdlcCA9IC9eXFxzKiNcXHcqLztcblxuZXhwb3J0IGNsYXNzIE1vZHVsZXMge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgdGhpcy5jb21waWxlZE1vZHVsZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLmNvbnRleHQubW9kdWxlcyA9IHRoaXM7XG4gIH1cblxuICBsb2FkU3RyaW5nKHN0ciwgY2hlY2tQcmFnbWEgPSB0cnVlKSB7XG4gICAgbGV0IGhhc1ByYWdtYSA9IHByYWdtYVJlZ2VwLnRlc3Qoc3RyKTtcbiAgICBpZiAoY2hlY2tQcmFnbWEgJiYgIWhhc1ByYWdtYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNOYXRpdmU6IHRydWUsXG4gICAgICAgIGJvZHk6IExpc3QoKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTmF0aXZlOiAhaGFzUHJhZ21hLFxuICAgICAgYm9keTogbmV3IFJlYWRlcihzdHIpLnJlYWQoKVxuICAgIH07XG4gIH1cblxuICBsb2FkKHBhdGgpIHtcbiAgICAvLyBUT0RPIHJlc29sdmUgYW5kIHdlIG5lZWQgdG8gY2FycnkgdGhlIGN3ZCB0aHJvdWdoIGNvcnJlY3RseVxuICAgIHJldHVybiB0aGlzLmxvYWRTdHJpbmcodGhpcy5jb250ZXh0Lm1vZHVsZUxvYWRlcihwYXRoKSk7XG4gIH1cblxuICBjb21waWxlKG1vZCwgcGF0aCkge1xuICAgIGxldCBzdHhsID0gbW9kLmJvZHk7XG4gICAgbGV0IG91dFNjb3BlID0gZnJlc2hTY29wZSgnb3V0c2lkZUVkZ2UnKTtcbiAgICBsZXQgaW5TY29wZSA9IGZyZXNoU2NvcGUoYGluc2lkZUVkZ2UwYCk7XG4gICAgLy8gdGhlIGNvbXBpbGVyIHN0YXJ0cyBhdCBwaGFzZSAwLCB3aXRoIGFuIGVtcHR5IGVudmlyb25tZW50IGFuZCBzdG9yZVxuICAgIGxldCBjb21waWxlciA9IG5ldyBDb21waWxlcigwLCBuZXcgRW52KCksIG5ldyBTdG9yZSgpLCBfLm1lcmdlKHRoaXMuY29udGV4dCwge1xuICAgICAgY3VycmVudFNjb3BlOiBbb3V0U2NvcGUsIGluU2NvcGVdLFxuICAgICAgY3dkOiBwYXRoID09PSAnPDxlbnRyeXBvaW50Pj4nID8gdGhpcy5jb250ZXh0LmN3ZCA6IGRpcm5hbWUocGF0aClcbiAgICB9KSk7XG4gICAgbGV0IHRlcm1zID0gY29tcGlsZXIuY29tcGlsZShzdHhsLm1hcChzID0+XG4gICAgICBzLmFkZFNjb3BlKG91dFNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpXG4gICAgICAgLmFkZFNjb3BlKGluU2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgMClcbiAgICApKTtcblxuICAgIGxldCBpbXBvcnRFbnRyaWVzID0gW107XG4gICAgbGV0IGV4cG9ydEVudHJpZXMgPSBbXTtcbiAgICBsZXQgcHJhZ21hcyA9IFtdO1xuICAgIGxldCBmaWx0ZXJlZFRlcm1zID0gdGVybXMucmVkdWNlKChhY2MsIHQpID0+IHtcbiAgICAgIHJldHVybiBfLmNvbmQoW1xuICAgICAgICBbVC5pc0ltcG9ydCwgdCA9PiB7XG4gICAgICAgICAgaW1wb3J0RW50cmllcy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1dLFxuICAgICAgICBbVC5pc0V4cG9ydCwgdCA9PiB7XG4gICAgICAgICAgLy8gZXhwb3J0RW50cmllcy5wdXNoKHQpO1xuICAgICAgICAgIC8vIHJldHVybiBhY2MuY29uY2F0KHQpO1xuICAgICAgICAgIGlmICh0LmRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBleHBvcnRFbnRyaWVzLnB1c2goY29udmVydEV4cG9ydCh0KSk7XG4gICAgICAgICAgICBpZiAoVC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24odC5kZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQobmV3IFRlcm0oJ1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQnLCB7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb246IHQuZGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQodC5kZWNsYXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cG9ydEVudHJpZXMucHVzaCh0KTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XSxcbiAgICAgICAgW1QuaXNQcmFnbWEsIHQgPT4geyBwcmFnbWFzLnB1c2godCk7IHJldHVybiBhY2M7IH0gXSxcbiAgICAgICAgW18uVCwgdCA9PiBhY2MuY29uY2F0KHQpIF1cbiAgICAgIF0pKHQpO1xuICAgIH0sIExpc3QoKSk7XG4gICAgcmV0dXJuIG5ldyBNb2R1bGUoXG4gICAgICBwYXRoLFxuICAgICAgbW9kLmlzTmF0aXZlLFxuICAgICAgTGlzdChpbXBvcnRFbnRyaWVzKSxcbiAgICAgIExpc3QoZXhwb3J0RW50cmllcyksXG4gICAgICBMaXN0KHByYWdtYXMpLFxuICAgICAgZmlsdGVyZWRUZXJtc1xuICAgICk7XG4gIH1cblxuICBjb21waWxlRW50cnlwb2ludChzb3VyY2UsIGZpbGVuYW1lLCBlbmZvcmNlUHJhZ21hID0gZmFsc2UpIHtcbiAgICBsZXQgc3R4bCA9IHRoaXMubG9hZFN0cmluZyhzb3VyY2UsIGZhbHNlKTtcbiAgICBpZiAoZW5mb3JjZVByYWdtYSAmJiBzdHhsLmlzTmF0aXZlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgJHtmaWxlbmFtZX0gbXVzdCBiZWdpbiB3aXRoICNsYW5nIHByYWdtYWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBdFBoYXNlKCc8PGVudHJ5cG9pbnQ+PicsIDAsIHRoaXMuY29udGV4dC5jd2QsIHN0eGwpO1xuICB9XG5cbiAgLy8gTW9kdWxlcyBoYXZlIGEgdW5pcXVlIHNjb3BlIHBlci1waGFzZS4gV2UgY29tcGlsZSBlYWNoIG1vZHVsZSBvbmNlIGF0XG4gIC8vIHBoYXNlIDAgYW5kIHN0b3JlIHRoZSBjb21waWxlZCBtb2R1bGUgaW4gYSBtYXAuIFRoZW4sIGFzIHdlIGFzayBmb3JcbiAgLy8gdGhlIG1vZHVsZSBpbiBhIHBhcnRpY3VsYXIgcGhhc2UsIHdlIGFkZCB0aGF0IG5ldyBwaGFzZS1zcGVjaWZpYyBzY29wZVxuICAvLyB0byB0aGUgY29tcGlsZWQgbW9kdWxlIGFuZCB1cGRhdGUgdGhlIG1hcCB3aXRoIHRoZSBtb2R1bGUgYXQgdGhhdCBzcGVjaWZpY1xuICAvLyBwaGFzZS5cbiAgZ2V0QXRQaGFzZShyYXdQYXRoLCBwaGFzZSwgY3dkLCByYXdTdHhsID0gbnVsbCkge1xuICAgIGxldCBwYXRoID0gcmF3UGF0aCA9PT0gJzw8ZW50cnlwb2ludD4+JyA/IHJhd1BhdGggOiB0aGlzLmNvbnRleHQubW9kdWxlUmVzb2x2ZXIocmF3UGF0aCwgY3dkKTtcbiAgICBsZXQgbWFwS2V5ID0gYCR7cGF0aH06JHtwaGFzZX1gO1xuICAgIGlmICghdGhpcy5jb21waWxlZE1vZHVsZXMuaGFzKG1hcEtleSkpIHtcbiAgICAgIGlmIChwaGFzZSA9PT0gMCkge1xuICAgICAgICBsZXQgc3R4bCA9IHJhd1N0eGwgIT0gbnVsbCA/IHJhd1N0eGwgOiB0aGlzLmxvYWQocGF0aCk7XG4gICAgICAgIHRoaXMuY29tcGlsZWRNb2R1bGVzLnNldChtYXBLZXksIHRoaXMuY29tcGlsZShzdHhsLCBwYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcmF3TW9kID0gdGhpcy5nZXRBdFBoYXNlKHJhd1BhdGgsIDAsIGN3ZCwgcmF3U3R4bCk7XG4gICAgICAgIGxldCBzY29wZSA9IGZyZXNoU2NvcGUoYGluc2lkZUVkZ2Uke3BoYXNlfWApO1xuICAgICAgICB0aGlzLmNvbXBpbGVkTW9kdWxlcy5zZXQobWFwS2V5LCBuZXcgTW9kdWxlKFxuICAgICAgICAgIHJhd01vZC5tb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgcmF3TW9kLmltcG9ydEVudHJpZXMubWFwKHRlcm0gPT4gdGVybS5hZGRTY29wZShzY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBwaGFzZSkpLFxuICAgICAgICAgIHJhd01vZC5leHBvcnRFbnRyaWVzLm1hcCh0ZXJtID0+IHRlcm0uYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgcGhhc2UpKSxcbiAgICAgICAgICByYXdNb2QucHJhZ21hcyxcbiAgICAgICAgICByYXdNb2QuYm9keS5tYXAodGVybSA9PiB0ZXJtLmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIHBoYXNlKSlcbiAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVkTW9kdWxlcy5nZXQobWFwS2V5KTtcbiAgfVxuXG4gIGhhcyhyYXdQYXRoLCBwaGFzZSA9IDApIHtcbiAgICBsZXQgcGF0aCA9IHJhd1BhdGggPT09ICc8PGVudHJ5cG9pbnQ+PicgPyByYXdQYXRoIDogdGhpcy5jb250ZXh0Lm1vZHVsZVJlc29sdmVyKHJhd1BhdGgsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgIGxldCBrZXkgPSBgJHtwYXRofToke3BoYXNlfWA7XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZWRNb2R1bGVzLmhhcyhrZXkpICYmICF0aGlzLmNvbXBpbGVkTW9kdWxlcy5nZXQoa2V5KS5pc05hdGl2ZTtcbiAgfVxuXG4gIHJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybSwgcGhhc2UsIHN0b3JlKSB7XG4gICAgdGVybS5kZWNsYXJhdG9ycy5mb3JFYWNoKGRlY2wgPT4ge1xuICAgICAgbGV0IHZhbCA9IGV2YWxDb21waWxldGltZVZhbHVlKGRlY2wuaW5pdC5nZW4oKSwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtcbiAgICAgICAgcGhhc2U6IHBoYXNlICsgMSwgc3RvcmVcbiAgICAgIH0pKTtcbiAgICAgIGNvbGxlY3RCaW5kaW5ncyhkZWNsLmJpbmRpbmcpLmZvckVhY2goc3R4ID0+IHtcbiAgICAgICAgaWYgKHBoYXNlICE9PSAwKSB7IC8vIHBoYXNlIDAgYmluZGluZ3MgZXh0ZW5kIHRoZSBiaW5kaW5nIG1hcCBkdXJpbmcgY29tcGlsYXRpb25cbiAgICAgICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShzdHgudmFsKCkpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4LCB7XG4gICAgICAgICAgICBiaW5kaW5nOiBuZXdCaW5kaW5nLFxuICAgICAgICAgICAgcGhhc2U6IHBoYXNlLFxuICAgICAgICAgICAgc2tpcER1cDogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWROYW1lID0gc3R4LnJlc29sdmUocGhhc2UpO1xuICAgICAgICBzdG9yZS5zZXQocmVzb2x2ZWROYW1lLCBuZXcgQ29tcGlsZXRpbWVUcmFuc2Zvcm0odmFsKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtLCBwaGFzZSwgc3RvcmUpIHtcbiAgICB0ZXJtLmRlY2xhcmF0b3JzLmZvckVhY2goZGVjbCA9PiB7XG4gICAgICBjb2xsZWN0QmluZGluZ3MoZGVjbC5iaW5kaW5nKS5mb3JFYWNoKHN0eCA9PiB7XG4gICAgICAgIGlmIChwaGFzZSAhPT0gMCkgeyAvLyBwaGFzZSAwIGJpbmRpbmdzIGV4dGVuZCB0aGUgYmluZGluZyBtYXAgZHVyaW5nIGNvbXBpbGF0aW9uXG4gICAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4LnZhbCgpKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eCwge1xuICAgICAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgICAgIHBoYXNlOiBwaGFzZSxcbiAgICAgICAgICAgIHNraXBEdXA6IHRlcm0ua2luZCA9PT0gJ3ZhcidcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWROYW1lID0gc3R4LnJlc29sdmUocGhhc2UpO1xuICAgICAgICBzdG9yZS5zZXQocmVzb2x2ZWROYW1lLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybSwgcGhhc2UsIHN0b3JlKSB7XG4gICAgY29sbGVjdEJpbmRpbmdzKHRlcm0ubmFtZSkuZm9yRWFjaChzdHggPT4ge1xuICAgICAgaWYgKHBoYXNlICE9PSAwKSB7XG4gICAgICAgIGxldCBuZXdCaW5kaW5nID0gZ2Vuc3ltKHN0eC52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4LCB7XG4gICAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgICBwaGFzZTogcGhhc2UsXG4gICAgICAgICAgc2tpcER1cDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgcmVzb2x2ZWROYW1lID0gc3R4LnJlc29sdmUocGhhc2UpO1xuICAgICAgc3RvcmUuc2V0KHJlc29sdmVkTmFtZSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0oc3R4KSk7XG4gICAgfSk7XG4gIH1cblxuICB2aXNpdChtb2QsIHBoYXNlLCBzdG9yZSkge1xuICAgIC8vIFRPRE86IHJlY3Vyc2l2ZWx5IHZpc2l0IGltcG9ydHNcbiAgICBtb2QuYm9keS5mb3JFYWNoKHRlcm0gPT4ge1xuICAgICAgaWYgKFQuaXNTeW50YXhEZWNsYXJhdGlvblN0YXRlbWVudCh0ZXJtKSkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybS5kZWNsYXJhdGlvbiwgcGhhc2UsIHN0b3JlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH1cblxuICBpbnZva2UobW9kLCBwaGFzZSwgc3RvcmUpIHtcbiAgICAvLyBUT0RPOiByZWN1cnNpdmVseSB2aXNpdCBpbXBvcnRzXG4gICAgbGV0IGJvZHkgPSBtb2QuYm9keS5maWx0ZXIoXy5jb21wbGVtZW50KFQuaXNDb21waWxldGltZVN0YXRlbWVudCkpLm1hcCh0ZXJtID0+IHtcbiAgICAgIHRlcm0gPSB0ZXJtLmdlbigpOyAvLyBUT0RPOiBjYW4gd2UgcmVtb3ZlIHRoZSBuZWVkIGZvciBnZW4/IGhhdmUgdG8gZGVlcGx5IHJlbW92ZSBjb21waWxldGltZSBjb2RlXG4gICAgICBpZiAoVC5pc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybSkpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybS5kZWNsYXJhdGlvbiwgcGhhc2UsIHN0b3JlKTtcbiAgICAgIH0gZWxzZSBpZiAoVC5pc0Z1bmN0aW9uRGVjbGFyYXRpb24odGVybSkpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT3JDbGFzcyh0ZXJtLCBwaGFzZSwgc3RvcmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfSk7XG4gICAgZXZhbFJ1bnRpbWVWYWx1ZXMoYm9keSwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtcbiAgICAgIHN0b3JlLCBwaGFzZVxuICAgIH0pKTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH1cbn1cbiJdfQ== - return seq(this.t("switch"), this.sep(Sep.BEFORE_SWITCH_DISCRIM), this.paren(discriminant, Sep.SWITCH_DISCRIM_PAREN_BEFORE, Sep.SWITCH_DISCRIM_PAREN_AFTER), this.sep(Sep.BEFORE_SWITCH_BODY), this.brace(seq.apply(undefined, _toConsumableArray(cases)), node, Sep.SWITCH_BRACE_INTIAL, Sep.SWITCH_BRACE_FINAL, Sep.SWITCH_BRACE_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceSwitchStatementWithDefault", - value: function reduceSwitchStatementWithDefault(node, _ref56) { - var discriminant = _ref56.discriminant; - var preDefaultCases = _ref56.preDefaultCases; - var defaultCase = _ref56.defaultCase; - var postDefaultCases = _ref56.postDefaultCases; +/***/ }, +/* 37 */ +/***/ function(module, exports, __webpack_require__) { - return seq(this.t("switch"), this.sep(Sep.BEFORE_SWITCH_DISCRIM), this.paren(discriminant, Sep.SWITCH_DISCRIM_PAREN_BEFORE, Sep.SWITCH_DISCRIM_PAREN_AFTER), this.sep(Sep.BEFORE_SWITCH_BODY), this.brace(seq.apply(undefined, _toConsumableArray(preDefaultCases).concat([defaultCase], _toConsumableArray(postDefaultCases))), node, Sep.SWITCH_BRACE_INTIAL, Sep.SWITCH_BRACE_FINAL, Sep.SWITCH_BRACE_EMPTY), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceTemplateExpression", - value: function reduceTemplateExpression(node, _ref57) { - var tag = _ref57.tag; - var elements = _ref57.elements; + "use strict"; - var state = node.tag == null ? empty() : seq(this.p(node.tag, (0, _coderep.getPrecedence)(node), tag), this.sep(Sep.TEMPLATE_TAG)); - var templateData = ""; - state = seq(state, this.t("`")); - for (var i = 0, l = node.elements.length; i < l; ++i) { - if (node.elements[i].type === "TemplateElement") { - var d = ""; - if (i > 0) d += "}"; - d += node.elements[i].rawValue; - if (i < l - 1) d += "${"; - state = seq(state, this.t(d)); - } else { - state = seq(state, this.sep(Sep.BEFORE_TEMPLATE_EXPRESSION), elements[i], this.sep(Sep.AFTER_TEMPLATE_EXPRESSION)); - } - } - state = seq(state, this.t("`")); - if (node.tag != null) { - state.startsWithCurly = tag.startsWithCurly; - state.startsWithLetSquareBracket = tag.startsWithLetSquareBracket; - state.startsWithFunctionOrClass = tag.startsWithFunctionOrClass; - } - return state; - } - }, { - key: "reduceTemplateElement", - value: function reduceTemplateElement(node) { - return this.t(node.rawValue); - } - }, { - key: "reduceThisExpression", - value: function reduceThisExpression(node) { - return this.t("this"); - } - }, { - key: "reduceThrowStatement", - value: function reduceThrowStatement(node, _ref58) { - var expression = _ref58.expression; + Object.defineProperty(exports, "__esModule", { + value: true + }); - return seq(this.t("throw"), this.sep(Sep.THROW), expression, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceTryCatchStatement", - value: function reduceTryCatchStatement(node, _ref59) { - var body = _ref59.body; - var catchClause = _ref59.catchClause; + var _transforms = __webpack_require__(38); - return seq(this.t("try"), this.sep(Sep.AFTER_TRY), body, this.sep(Sep.BEFORE_CATCH), catchClause, this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceTryFinallyStatement", - value: function reduceTryFinallyStatement(node, _ref60) { - var body = _ref60.body; - var catchClause = _ref60.catchClause; - var finalizer = _ref60.finalizer; + class Env { + constructor() { + this.map = new Map(); + this.map.set("function", _transforms.FunctionDeclTransform); + this.map.set("var", _transforms.VariableDeclTransform); + this.map.set("let", _transforms.LetDeclTransform); + this.map.set("const", _transforms.ConstDeclTransform); + this.map.set("syntaxQuote", _transforms.SyntaxQuoteTransform); + this.map.set("syntaxrec", _transforms.SyntaxrecDeclTransform); + this.map.set("syntax", _transforms.SyntaxDeclTransform); + this.map.set("return", _transforms.ReturnStatementTransform); + this.map.set("while", _transforms.WhileTransform); + this.map.set("if", _transforms.IfTransform); + this.map.set("for", _transforms.ForTransform); + this.map.set("switch", _transforms.SwitchTransform); + this.map.set("break", _transforms.BreakTransform); + this.map.set("continue", _transforms.ContinueTransform); + this.map.set("do", _transforms.DoTransform); + this.map.set("debugger", _transforms.DebuggerTransform); + this.map.set("with", _transforms.WithTransform); + this.map.set("try", _transforms.TryTransform); + this.map.set("throw", _transforms.ThrowTransform); + this.map.set("new", _transforms.NewTransform); + } - return seq(this.t("try"), this.sep(Sep.AFTER_TRY), body, catchClause ? seq(this.sep(Sep.BEFORE_CATCH), catchClause) : empty(), this.sep(Sep.BEFORE_FINALLY), this.t("finally"), this.sep(Sep.AFTER_FINALLY), finalizer, this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceYieldExpression", - value: function reduceYieldExpression(node, _ref61) { - var expression = _ref61.expression; + has(key) { + return this.map.has(key); + } - if (node.expression == null) return this.t("yield"); - return seq(this.t("yield"), this.sep(Sep.YIELD), this.p(node.expression, (0, _coderep.getPrecedence)(node), expression)); - } - }, { - key: "reduceYieldGeneratorExpression", - value: function reduceYieldGeneratorExpression(node, _ref62) { - var expression = _ref62.expression; + get(key) { + return this.map.get(key); + } - return seq(this.t("yield"), this.sep(Sep.BEFORE_YIELD_STAR), this.t("*"), this.sep(Sep.AFTER_YIELD_STAR), this.p(node.expression, (0, _coderep.getPrecedence)(node), expression)); - } - }, { - key: "reduceDirective", - value: function reduceDirective(node) { - var delim = /^(?:[^"\\]|\\.)*$/.test(node.rawValue) ? "\"" : "'"; - return seq(this.t(delim + node.rawValue + delim), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceVariableDeclaration", - value: function reduceVariableDeclaration(node, _ref63) { - var declarators = _ref63.declarators; + set(key, val) { + return this.map.set(key, val); + } + } + exports.default = Env; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBdUJlLE1BQU0sR0FBTixDQUFVO0FBQ3ZCLGdCQUFjO0FBQ1osU0FBSyxHQUFMLEdBQVcsSUFBSSxHQUFKLEVBQVg7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsVUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxhQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFdBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsUUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxRQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsSUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFFBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxVQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLElBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsVUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxNQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0Q7O0FBRUQsTUFBSSxHQUFKLEVBQVM7QUFDUCxXQUFPLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxHQUFiLENBQVA7QUFDRDs7QUFFRCxNQUFJLEdBQUosRUFBUztBQUNQLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEdBQWIsQ0FBUDtBQUNEOztBQUVELE1BQUksR0FBSixFQUFTLEdBQVQsRUFBYztBQUNaLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEdBQWIsRUFBa0IsR0FBbEIsQ0FBUDtBQUNEO0FBbkNzQjtrQkFBSixHIiwiZmlsZSI6ImVudi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybSxcbiAgVmFyaWFibGVEZWNsVHJhbnNmb3JtLFxuICBMZXREZWNsVHJhbnNmb3JtLFxuICBDb25zdERlY2xUcmFuc2Zvcm0sXG4gIFN5bnRheERlY2xUcmFuc2Zvcm0sXG4gIFN5bnRheHJlY0RlY2xUcmFuc2Zvcm0sXG4gIFN5bnRheFF1b3RlVHJhbnNmb3JtLFxuICBSZXR1cm5TdGF0ZW1lbnRUcmFuc2Zvcm0sXG4gIElmVHJhbnNmb3JtLFxuICBGb3JUcmFuc2Zvcm0sXG4gIFN3aXRjaFRyYW5zZm9ybSxcbiAgQnJlYWtUcmFuc2Zvcm0sXG4gIENvbnRpbnVlVHJhbnNmb3JtLFxuICBEb1RyYW5zZm9ybSxcbiAgRGVidWdnZXJUcmFuc2Zvcm0sXG4gIFdpdGhUcmFuc2Zvcm0sXG4gIFRyeVRyYW5zZm9ybSxcbiAgVGhyb3dUcmFuc2Zvcm0sXG4gIE5ld1RyYW5zZm9ybSxcbiAgV2hpbGVUcmFuc2Zvcm1cbn0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbnYge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJmdW5jdGlvblwiLCBGdW5jdGlvbkRlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInZhclwiLCBWYXJpYWJsZURlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImxldFwiLCBMZXREZWNsVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJjb25zdFwiLCBDb25zdERlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInN5bnRheFF1b3RlXCIsIFN5bnRheFF1b3RlVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJzeW50YXhyZWNcIiwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwic3ludGF4XCIsIFN5bnRheERlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInJldHVyblwiLCBSZXR1cm5TdGF0ZW1lbnRUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcIndoaWxlXCIsIFdoaWxlVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJpZlwiLCBJZlRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiZm9yXCIsIEZvclRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwic3dpdGNoXCIsIFN3aXRjaFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiYnJlYWtcIiwgQnJlYWtUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImNvbnRpbnVlXCIsIENvbnRpbnVlVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJkb1wiLCBEb1RyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiZGVidWdnZXJcIiwgRGVidWdnZXJUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcIndpdGhcIiwgV2l0aFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwidHJ5XCIsIFRyeVRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwidGhyb3dcIiwgVGhyb3dUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcIm5ld1wiLCBOZXdUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXMoa2V5KTtcbiAgfVxuXG4gIGdldChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KGtleSk7XG4gIH1cblxuICBzZXQoa2V5LCB2YWwpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuc2V0KGtleSwgdmFsKTtcbiAgfVxufVxuIl19 - return seq(this.t(node.kind), this.sep(Sep.VARIABLE_DECLARATION), this.commaSep(declarators, Sep.DECLARATORS_BEFORE_COMMA, Sep.DECLARATORS_AFTER_COMMA)); - } - }, { - key: "reduceVariableDeclarationStatement", - value: function reduceVariableDeclarationStatement(node, _ref64) { - var declaration = _ref64.declaration; +/***/ }, +/* 38 */ +/***/ function(module, exports) { - return seq(declaration, this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); - } - }, { - key: "reduceVariableDeclarator", - value: function reduceVariableDeclarator(node, _ref65) { - var binding = _ref65.binding; - var init = _ref65.init; + "use strict"; - var containsIn = init && init.containsIn && !init.containsGroup; - if (init) { - if (init.containsGroup) { - init = this.paren(init, Sep.EXPRESSION_PAREN_BEFORE, Sep.EXPRESSION_PAREN_AFTER); - } else { - init = markContainsIn(init); - } - } - return (0, _objectAssign2.default)(init == null ? binding : seq(binding, this.sep(Sep.BEFORE_INIT_EQUALS), this.t("="), this.sep(Sep.AFTER_INIT_EQUALS), init), { containsIn: containsIn }); - } - }, { - key: "reduceWhileStatement", - value: function reduceWhileStatement(node, _ref66) { - var test = _ref66.test; - var body = _ref66.body; + Object.defineProperty(exports, "__esModule", { + value: true + }); + class FunctionDeclTransform {} + exports.FunctionDeclTransform = FunctionDeclTransform; + class VariableDeclTransform {} + exports.VariableDeclTransform = VariableDeclTransform; + class NewTransform {} + exports.NewTransform = NewTransform; + class ThrowTransform {} + exports.ThrowTransform = ThrowTransform; + class LetDeclTransform {} + exports.LetDeclTransform = LetDeclTransform; + class ConstDeclTransform {} + exports.ConstDeclTransform = ConstDeclTransform; + class TryTransform {} + exports.TryTransform = TryTransform; + class WhileTransform {} + exports.WhileTransform = WhileTransform; + class IfTransform {} + exports.IfTransform = IfTransform; + class ForTransform {} + exports.ForTransform = ForTransform; + class SwitchTransform {} + exports.SwitchTransform = SwitchTransform; + class BreakTransform {} + exports.BreakTransform = BreakTransform; + class ContinueTransform {} + exports.ContinueTransform = ContinueTransform; + class DoTransform {} + exports.DoTransform = DoTransform; + class WithTransform {} + exports.WithTransform = WithTransform; + class DebuggerTransform {} + exports.DebuggerTransform = DebuggerTransform; + class SyntaxrecDeclTransform {} + exports.SyntaxrecDeclTransform = SyntaxrecDeclTransform; + class SyntaxDeclTransform {} + exports.SyntaxDeclTransform = SyntaxDeclTransform; + class SyntaxQuoteTransform {} + exports.SyntaxQuoteTransform = SyntaxQuoteTransform; + class ReturnStatementTransform {} + exports.ReturnStatementTransform = ReturnStatementTransform; + class VarBindingTransform { + constructor(id) { + this.id = id; + } + } + exports.VarBindingTransform = VarBindingTransform; + class CompiletimeTransform { + constructor(value) { + this.value = value; + } + } + exports.CompiletimeTransform = CompiletimeTransform; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFuc2Zvcm1zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxxQkFBTixDQUE0QjtRQUF0QixxQixHQUFBLHFCO0FBQ04sTUFBTSxxQkFBTixDQUE0QjtRQUF0QixxQixHQUFBLHFCO0FBQ04sTUFBTSxZQUFOLENBQW1CO1FBQWIsWSxHQUFBLFk7QUFDTixNQUFNLGNBQU4sQ0FBcUI7UUFBZixjLEdBQUEsYztBQUNOLE1BQU0sZ0JBQU4sQ0FBdUI7UUFBakIsZ0IsR0FBQSxnQjtBQUNOLE1BQU0sa0JBQU4sQ0FBeUI7UUFBbkIsa0IsR0FBQSxrQjtBQUNOLE1BQU0sWUFBTixDQUFtQjtRQUFiLFksR0FBQSxZO0FBQ04sTUFBTSxjQUFOLENBQXFCO1FBQWYsYyxHQUFBLGM7QUFDTixNQUFNLFdBQU4sQ0FBa0I7UUFBWixXLEdBQUEsVztBQUNOLE1BQU0sWUFBTixDQUFtQjtRQUFiLFksR0FBQSxZO0FBQ04sTUFBTSxlQUFOLENBQXNCO1FBQWhCLGUsR0FBQSxlO0FBQ04sTUFBTSxjQUFOLENBQXFCO1FBQWYsYyxHQUFBLGM7QUFDTixNQUFNLGlCQUFOLENBQXdCO1FBQWxCLGlCLEdBQUEsaUI7QUFDTixNQUFNLFdBQU4sQ0FBa0I7UUFBWixXLEdBQUEsVztBQUNOLE1BQU0sYUFBTixDQUFvQjtRQUFkLGEsR0FBQSxhO0FBQ04sTUFBTSxpQkFBTixDQUF3QjtRQUFsQixpQixHQUFBLGlCO0FBQ04sTUFBTSxzQkFBTixDQUE2QjtRQUF2QixzQixHQUFBLHNCO0FBQ04sTUFBTSxtQkFBTixDQUEwQjtRQUFwQixtQixHQUFBLG1CO0FBQ04sTUFBTSxvQkFBTixDQUEyQjtRQUFyQixvQixHQUFBLG9CO0FBQ04sTUFBTSx3QkFBTixDQUErQjtRQUF6Qix3QixHQUFBLHdCO0FBQ04sTUFBTSxtQkFBTixDQUEwQjtBQUMvQixjQUFZLEVBQVosRUFBZ0I7QUFDZCxTQUFLLEVBQUwsR0FBVSxFQUFWO0FBQ0Q7QUFIOEI7UUFBcEIsbUIsR0FBQSxtQjtBQUtOLE1BQU0sb0JBQU4sQ0FBMkI7QUFDaEMsY0FBWSxLQUFaLEVBQW1CO0FBQ2pCLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDRDtBQUgrQjtRQUFyQixvQixHQUFBLG9CIiwiZmlsZSI6InRyYW5zZm9ybXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRnVuY3Rpb25EZWNsVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBOZXdUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgVGhyb3dUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgTGV0RGVjbFRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBDb25zdERlY2xUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgVHJ5VHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFdoaWxlVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIElmVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIEZvclRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBTd2l0Y2hUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgQnJlYWtUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgQ29udGludWVUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgRG9UcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgV2l0aFRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBEZWJ1Z2dlclRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBTeW50YXhyZWNEZWNsVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFN5bnRheERlY2xUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgU3ludGF4UXVvdGVUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgUmV0dXJuU3RhdGVtZW50VHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFZhckJpbmRpbmdUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihpZCkge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBpbGV0aW1lVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cbiJdfQ== - return (0, _objectAssign2.default)(seq(this.t("while"), this.sep(Sep.AFTER_WHILE), this.paren(test, Sep.WHILE_TEST_PAREN_BEFORE, Sep.WHILE_TEST_PAREN_AFTER), this.sep(Sep.BEFORE_WHILE_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); - } - }, { - key: "reduceWithStatement", - value: function reduceWithStatement(node, _ref67) { - var object = _ref67.object; - var body = _ref67.body; +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { - return (0, _objectAssign2.default)(seq(this.t("with"), this.sep(Sep.AFTER_WITH), this.paren(object, Sep.WITH_PAREN_BEFORE, Sep.WITH_PAREN_AFTER), this.sep(Sep.BEFORE_WITH_BODY), body, this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: body.endsWithMissingElse }); - } - }]); - - return ExtensibleCodeGen; - }(); + 'use strict'; - var INDENT = " "; + Object.defineProperty(exports, "__esModule", { + value: true + }); - var Linebreak = function (_CodeRep) { - _inherits(Linebreak, _CodeRep); + var _vm = __webpack_require__(40); - function Linebreak() { - _classCallCheck(this, Linebreak); + var _vm2 = _interopRequireDefault(_vm); - var _this4 = _possibleConstructorReturn(this, Object.getPrototypeOf(Linebreak).call(this)); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - _this4.indentation = 0; - return _this4; + class Store { + constructor() { + this.map = new Map(); + this.nodeContext = _vm2.default.createContext(); } - _createClass(Linebreak, [{ - key: "emit", - value: function emit(ts) { - ts.put("\n"); - for (var i = 0; i < this.indentation; ++i) { - ts.put(INDENT); - } - } - }]); - - return Linebreak; - }(_coderep.CodeRep); + has(key) { + return this.map.has(key); + } - function withoutTrailingLinebreak(state) { - if (state && state instanceof _coderep.Seq) { - var lastChild = state.children[state.children.length - 1]; - /* istanbul ignore next */ - while (lastChild instanceof _coderep.Empty) { - state.children.pop(); - lastChild = state.children[state.children.length - 1]; - } - /* istanbul ignore else */ - if (lastChild instanceof _coderep.Seq) { - withoutTrailingLinebreak(lastChild); - } else if (lastChild instanceof Linebreak) { - state.children.pop(); - } + get(key) { + return this.map.get(key); } - return state; - } - function indent(rep, includingFinal) { - var finalLinebreak = undefined; - function indentNode(node) { - if (node instanceof Linebreak) { - finalLinebreak = node; - ++node.indentation; - } + set(key, val) { + this.nodeContext[key] = val; + return this.map.set(key, val); } - rep.forEach(indentNode); - if (!includingFinal) { - --finalLinebreak.indentation; + + getNodeContext() { + return this.nodeContext; } - return rep; } + exports.default = Store; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7Ozs7O0FBRWUsTUFBTSxLQUFOLENBQVk7QUFDekIsZ0JBQWM7QUFDWixTQUFLLEdBQUwsR0FBVyxJQUFJLEdBQUosRUFBWDtBQUNBLFNBQUssV0FBTCxHQUFtQixhQUFHLGFBQUgsRUFBbkI7QUFDRDs7QUFFRCxNQUFJLEdBQUosRUFBUztBQUNQLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEdBQWIsQ0FBUDtBQUNEOztBQUVELE1BQUksR0FBSixFQUFTO0FBQ1AsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsR0FBYixDQUFQO0FBQ0Q7O0FBRUQsTUFBSSxHQUFKLEVBQVMsR0FBVCxFQUFjO0FBQ1osU0FBSyxXQUFMLENBQWlCLEdBQWpCLElBQXdCLEdBQXhCO0FBQ0EsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsR0FBYixFQUFrQixHQUFsQixDQUFQO0FBQ0Q7O0FBRUQsbUJBQWlCO0FBQ2YsV0FBTyxLQUFLLFdBQVo7QUFDRDtBQXJCd0I7a0JBQU4sSyIsImZpbGUiOiJzdG9yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2bSBmcm9tICd2bSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5ub2RlQ29udGV4dCA9IHZtLmNyZWF0ZUNvbnRleHQoKTtcbiAgfVxuXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleSk7XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXkpO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsKSB7XG4gICAgdGhpcy5ub2RlQ29udGV4dFtrZXldID0gdmFsO1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoa2V5LCB2YWwpO1xuICB9XG5cbiAgZ2V0Tm9kZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZUNvbnRleHQ7XG4gIH1cbn1cbiJdfQ== - var FormattedCodeGen = exports.FormattedCodeGen = function (_ExtensibleCodeGen) { - _inherits(FormattedCodeGen, _ExtensibleCodeGen); - - function FormattedCodeGen() { - _classCallCheck(this, FormattedCodeGen); +/***/ }, +/* 40 */ +/***/ function(module, exports, __webpack_require__) { - return _possibleConstructorReturn(this, Object.getPrototypeOf(FormattedCodeGen).apply(this, arguments)); - } + var indexOf = __webpack_require__(41); - _createClass(FormattedCodeGen, [{ - key: "parenToAvoidBeingDirective", - value: function parenToAvoidBeingDirective(element, original) { - if (element && element.type === "ExpressionStatement" && element.expression.type === "LiteralStringExpression") { - return seq(this.paren(original.children[0], Sep.PAREN_AVOIDING_DIRECTIVE_BEFORE, Sep.PAREN_AVOIDING_DIRECTIVE_AFTER), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(element))); - } - return original; + var Object_keys = function (obj) { + if (Object.keys) return Object.keys(obj) + else { + var res = []; + for (var key in obj) res.push(key) + return res; } - }, { - key: "brace", - value: function brace(rep, node) { - if (isEmpty(rep)) { - return this.t("{}"); - } - - switch (node.type) { - case "ObjectBinding": - case "Import": - case "ExportFrom": - case "ObjectExpression": - return new _coderep.Brace(rep); - } + }; - rep = seq(new Linebreak(), rep); - indent(rep, false); - return new _coderep.Brace(rep); + var forEach = function (xs, fn) { + if (xs.forEach) return xs.forEach(fn) + else for (var i = 0; i < xs.length; i++) { + fn(xs[i], i, xs); } - }, { - key: "reduceDoWhileStatement", - value: function reduceDoWhileStatement(node, _ref68) { - var body = _ref68.body; - var test = _ref68.test; + }; - return seq(this.t("do"), this.sep(Sep.AFTER_DO), withoutTrailingLinebreak(body), this.sep(Sep.BEFORE_DOWHILE_WHILE), this.t("while"), this.sep(Sep.AFTER_DOWHILE_WHILE), this.paren(test, Sep.DO_WHILE_TEST_PAREN_BEFORE, Sep.DO_WHILE_TEST_PAREN_AFTER), this.semiOp(), this.sep(Sep.AFTER_STATEMENT(node))); + var defineProp = (function() { + try { + Object.defineProperty({}, '_', {}); + return function(obj, name, value) { + Object.defineProperty(obj, name, { + writable: true, + enumerable: false, + configurable: true, + value: value + }) + }; + } catch(e) { + return function(obj, name, value) { + obj[name] = value; + }; } - }, { - key: "reduceIfStatement", - value: function reduceIfStatement(node, _ref69) { - var test = _ref69.test; - var consequent = _ref69.consequent; - var alternate = _ref69.alternate; + }()); - if (alternate && consequent.endsWithMissingElse) { - consequent = this.brace(consequent, node); - } - return (0, _objectAssign2.default)(seq(this.t("if"), this.sep(Sep.AFTER_IF), this.paren(test, Sep.IF_PAREN_BEFORE, Sep.IF_PAREN_AFTER), this.sep(Sep.AFTER_IF_TEST), withoutTrailingLinebreak(consequent), alternate ? seq(this.sep(Sep.BEFORE_ELSE), this.t("else"), this.sep(Sep.AFTER_ELSE), withoutTrailingLinebreak(alternate)) : empty(), this.sep(Sep.AFTER_STATEMENT(node))), { endsWithMissingElse: alternate ? alternate.endsWithMissingElse : true }); - } - }, { - key: "reduceSwitchCase", - value: function reduceSwitchCase(node, _ref70) { - var test = _ref70.test; - var consequent = _ref70.consequent; + var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', + 'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', + 'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', + 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', + 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape']; - consequent = indent(withoutTrailingLinebreak(seq.apply(undefined, [this.sep(Sep.BEFORE_CASE_BODY)].concat(_toConsumableArray(consequent)))), true); - return seq(this.t("case"), this.sep(Sep.BEFORE_CASE_TEST), test, this.sep(Sep.AFTER_CASE_TEST), this.t(":"), consequent, this.sep(Sep.AFTER_CASE_BODY)); - } - }, { - key: "reduceSwitchDefault", - value: function reduceSwitchDefault(node, _ref71) { - var consequent = _ref71.consequent; + function Context() {} + Context.prototype = {}; - consequent = indent(withoutTrailingLinebreak(seq.apply(undefined, [this.sep(Sep.BEFORE_CASE_BODY)].concat(_toConsumableArray(consequent)))), true); - return seq(this.t("default"), this.sep(Sep.DEFAULT), this.t(":"), consequent, this.sep(Sep.AFTER_DEFAULT_BODY)); + var Script = exports.Script = function NodeScript (code) { + if (!(this instanceof Script)) return new Script(code); + this.code = code; + }; + + Script.prototype.runInContext = function (context) { + if (!(context instanceof Context)) { + throw new TypeError("needs a 'context' argument."); } - }, { - key: "sep", - value: function sep(separator) { - switch (separator.type) { - case "ARRAY_AFTER_COMMA": - case "OBJECT_AFTER_COMMA": - case "ARGS_AFTER_COMMA": - case "PARAMETER_AFTER_COMMA": - case "DECLARATORS_AFTER_COMMA": - case "NAMED_IMPORT_AFTER_COMMA": - case "IMPORT_AFTER_COMMA": - case "BEFORE_DEFAULT_EQUALS": - case "AFTER_DEFAULT_EQUALS": - case "AFTER_PROP": - case "BEFORE_JUMP_LABEL": - case "BEFORE_CATCH": - case "BEFORE_CATCH_BINDING": - case "AFTER_CATCH_BINDING": - case "BEFORE_CLASS_NAME": - case "BEFORE_EXTENDS": - case "AFTER_EXTENDS": - case "BEFORE_CLASS_DECLARATION_ELEMENTS": - case "BEFORE_CLASS_EXPRESSION_ELEMENTS": - case "AFTER_STATIC": - case "BEFORE_TERNARY_QUESTION": - case "AFTER_TERNARY_QUESTION": - case "BEFORE_TERNARY_COLON": - case "AFTER_TERNARY_COLON": - case "AFTER_DO": - case "BEFORE_DOWHILE_WHILE": - case "AFTER_DOWHILE_WHILE": - case "AFTER_FORIN_FOR": - case "BEFORE_FORIN_IN": - case "AFTER_FORIN_FOR": - case "BEFORE_FORIN_BODY": - case "AFTER_FOROF_FOR": - case "BEFORE_FOROF_OF": - case "AFTER_FOROF_FOR": - case "BEFORE_FOROF_BODY": - case "AFTER_FOR_FOR": - case "BEFORE_FOR_TEST": - case "BEFORE_FOR_UPDATE": - case "BEFORE_FOR_BODY": - case "BEFORE_FUNCTION_DECLARATION_BODY": - case "BEFORE_FUNCTION_EXPRESSION_BODY": - case "BEFORE_ARROW": - case "AFTER_ARROW": - case "AFTER_GET": - case "BEFORE_GET_BODY": - case "AFTER_IF": - case "AFTER_IF_TEST": - case "BEFORE_ELSE": - case "AFTER_ELSE": - case "BEFORE_IMPORT_BINDINGS": - case "BEFORE_IMPORT_MODULE": - case "AFTER_IMPORT_BINDINGS": - case "AFTER_FROM": - case "BEFORE_IMPORT_NAMESPACE": - case "BEFORE_IMPORT_STAR": - case "AFTER_IMPORT_STAR": - case "AFTER_IMPORT_AS": - case "AFTER_NAMESPACE_BINDING": - case "BEFORE_IMPORT_AS": - case "AFTER_IMPORT_AS": - case "EXPORTS_AFTER_COMMA": - case "BEFORE_EXPORT_STAR": - case "AFTER_EXPORT_STAR": - case "BEFORE_EXPORT_BINDINGS": - case "AFTER_EXPORT_BINDINGS": - case "AFTER_EXPORT": - case "AFTER_EXPORT_DEFAULT": - case "BEFORE_EXPORT_AS": - case "AFTER_EXPORT_AS": - case "AFTER_LABEL_COLON": - case "BEFORE_METHOD_BODY": - case "AFTER_NEW": - case "RETURN": - case "AFTER_SET": - case "BEFORE_SET_BODY": - case "BEFORE_SET_PARAMS": - case "BEFORE_CASE_TEST": - case "BEFORE_SWITCH_DISCRIM": - case "BEFORE_SWITCH_BODY": - case "THROW": - case "AFTER_TRY": - case "BEFORE_CATCH": - case "BEFORE_FINALLY": - case "AFTER_FINALLY": - case "VARIABLE_DECLARATION": - case "YIELD": - case "AFTER_YIELD_STAR": - case "DECLARATORS_AFTER_COMMA": - case "BEFORE_INIT_EQUALS": - case "AFTER_INIT_EQUALS": - case "AFTER_WHILE": - case "BEFORE_WHILE_BODY": - case "AFTER_WITH": - case "BEFORE_WITH_BODY": - case "BEFORE_FUNCTION_NAME": - case "AFTER_BINOP": - case "BEFORE_ASSIGN_OP": - case "AFTER_ASSIGN_OP": - return this.t(" "); - case "AFTER_STATEMENT": - switch (separator.node.type) { - case "ForInStatement": - case "ForOfStatement": - case "ForStatement": - case "WhileStatement": - case "WithStatement": - return empty(); // because those already end with an AFTER_STATEMENT - default: - return new Linebreak(); - } - case "AFTER_CLASS_ELEMENT": - case "BEFORE_CASE_BODY": - case "AFTER_CASE_BODY": - case "AFTER_DEFAULT_BODY": - return new Linebreak(); - case "BEFORE_BINOP": - return separator.op === "," ? empty() : this.t(" "); - case "UNARY": - return separator.op === "delete" || separator.op === "void" || separator.op === "typeof" ? this.t(" ") : empty(); - default: - return empty(); - } + + var iframe = document.createElement('iframe'); + if (!iframe.style) iframe.style = {}; + iframe.style.display = 'none'; + + document.body.appendChild(iframe); + + var win = iframe.contentWindow; + var wEval = win.eval, wExecScript = win.execScript; + + if (!wEval && wExecScript) { + // win.eval() magically appears when this is called in IE: + wExecScript.call(win, 'null'); + wEval = win.eval; } - }]); + + forEach(Object_keys(context), function (key) { + win[key] = context[key]; + }); + forEach(globals, function (key) { + if (context[key]) { + win[key] = context[key]; + } + }); + + var winKeys = Object_keys(win); - return FormattedCodeGen; - }(ExtensibleCodeGen); + var res = wEval.call(win, this.code); + + forEach(Object_keys(win), function (key) { + // Avoid copying circular objects like `top` and `window` by only + // updating existing context properties or new properties in the `win` + // that was only introduced after the eval. + if (key in context || indexOf(winKeys, key) === -1) { + context[key] = win[key]; + } + }); -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { + forEach(globals, function (key) { + if (!(key in context)) { + defineProp(context, key, win[key]); + } + }); + + document.body.removeChild(iframe); + + return res; + }; - "use strict"; + Script.prototype.runInThisContext = function () { + return eval(this.code); // maybe... + }; - 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; }; }(); /** - * 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. - */ + Script.prototype.runInNewContext = function (context) { + var ctx = Script.createContext(context); + var res = this.runInContext(ctx); - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.TokenStream = undefined; + forEach(Object_keys(ctx), function (key) { + context[key] = ctx[key]; + }); - var _esutils = __webpack_require__(6); + return res; + }; - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + forEach(Object_keys(Script.prototype), function (name) { + exports[name] = Script[name] = function (code) { + var s = Script(code); + return s[name].apply(s, [].slice.call(arguments, 1)); + }; + }); - function numberDot(fragment) { - if (fragment.indexOf(".") < 0 && fragment.indexOf("e") < 0) { - return ".."; - } - return "."; - } + exports.createScript = function (code) { + return exports.Script(code); + }; - function renderNumber(n) { - var s; - if (n >= 1e3 && n % 10 === 0) { - s = n.toString(10); - if (/[eE]/.test(s)) { - return s.replace(/[eE]\+/, "e"); - } - return n.toString(10).replace(/0+$/, function (match) { - return "e" + match.length; - }); - } else if (n % 1 === 0) { - if (n > 1e15 && n < 1e20) { - return "0x" + n.toString(16).toUpperCase(); + exports.createContext = Script.createContext = function (context) { + var copy = new Context(); + if(typeof context === 'object') { + forEach(Object_keys(context), function (key) { + copy[key] = context[key]; + }); } - return n.toString(10).replace(/[eE]\+/, "e"); - } else { - return n.toString(10).replace(/^0\./, ".").replace(/[eE]\+/, "e"); - } - } - - var TokenStream = exports.TokenStream = function () { - function TokenStream() { - _classCallCheck(this, TokenStream); + return copy; + }; - this.result = ""; - this.lastNumber = null; - this.lastChar = null; - this.optionalSemi = false; - } - _createClass(TokenStream, [{ - key: "putNumber", - value: function putNumber(number) { - var tokenStr = renderNumber(number); - this.put(tokenStr); - this.lastNumber = tokenStr; - } - }, { - key: "putOptionalSemi", - value: function putOptionalSemi() { - this.optionalSemi = true; - } - }, { - key: "put", - value: function put(tokenStr) { - if (this.optionalSemi) { - this.optionalSemi = false; - if (tokenStr !== "}") { - this.put(";"); - } - } - if (this.lastNumber !== null && tokenStr.length == 1) { - if (tokenStr === ".") { - this.result += numberDot(this.lastNumber); - this.lastNumber = null; - this.lastChar = "."; - return; - } - } - this.lastNumber = null; - var rightChar = tokenStr.charAt(0); - var lastChar = this.lastChar; - this.lastChar = tokenStr.charAt(tokenStr.length - 1); - if (lastChar && ((lastChar == "+" || lastChar == "-") && lastChar == rightChar || _esutils.code.isIdentifierPartES6(lastChar.charCodeAt(0)) && _esutils.code.isIdentifierPartES6(rightChar.charCodeAt(0)) || lastChar == "/" && rightChar == "i")) { - this.result += " "; - } +/***/ }, +/* 41 */ +/***/ function(module, exports) { - this.result += tokenStr; - } - }]); + + var indexOf = [].indexOf; - return TokenStream; - }(); + module.exports = function(arr, obj){ + if (indexOf) return arr.indexOf(obj); + for (var i = 0; i < arr.length; ++i) { + if (arr[i] === obj) return i; + } + return -1; + }; /***/ }, -/* 44 */ +/* 42 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -30026,504 +28590,423 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack Object.defineProperty(exports, "__esModule", { value: true }); - exports.Scope = exports.freshScope = undefined; - var _errors = __webpack_require__(13); + var _tokenizer = __webpack_require__(43); - var _symbol = __webpack_require__(45); + var _tokenizer2 = _interopRequireDefault(_tokenizer); - let scopeIndex_625 = 0; - function freshScope_626() { - let name_628 = arguments.length <= 0 || arguments[0] === undefined ? "scope" : arguments[0]; + var _immutable = __webpack_require__(3); - scopeIndex_625++; - return (0, _symbol.Symbol)(name_628 + "_" + scopeIndex_625); - } - ; - function Scope_627(name_629) { - return (0, _symbol.Symbol)(name_629); - } - exports.freshScope = freshScope_626; - exports.Scope = Scope_627; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3Njb3BlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQSxJQUFJLGlCQUFpQixDQUFyQjtBQUNBLFNBQVMsY0FBVCxHQUE0QztBQUFBLE1BQXBCLFFBQW9CLHlEQUFULE9BQVM7O0FBQzFDO0FBQ0EsU0FBTyxvQkFBTyxXQUFXLEdBQVgsR0FBaUIsY0FBeEIsQ0FBUDtBQUNEO0FBQ0Q7QUFDQSxTQUFTLFNBQVQsQ0FBbUIsUUFBbkIsRUFBNkI7QUFDM0IsU0FBTyxvQkFBTyxRQUFQLENBQVA7QUFDRDtRQUN5QixVLEdBQWxCLGM7UUFDYSxLLEdBQWIsUyIsImZpbGUiOiJzY29wZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXhwZWN0LCBhc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtTeW1ib2wsIGdlbnN5bX0gZnJvbSBcIi4vc3ltYm9sXCI7XG5sZXQgc2NvcGVJbmRleF82MjUgPSAwO1xuZnVuY3Rpb24gZnJlc2hTY29wZV82MjYobmFtZV82MjggPSBcInNjb3BlXCIpIHtcbiAgc2NvcGVJbmRleF82MjUrKztcbiAgcmV0dXJuIFN5bWJvbChuYW1lXzYyOCArIFwiX1wiICsgc2NvcGVJbmRleF82MjUpO1xufVxuO1xuZnVuY3Rpb24gU2NvcGVfNjI3KG5hbWVfNjI5KSB7XG4gIHJldHVybiBTeW1ib2wobmFtZV82MjkpO1xufVxuZXhwb3J0IHtmcmVzaFNjb3BlXzYyNiBhcyBmcmVzaFNjb3BlfTtcbmV4cG9ydCB7U2NvcGVfNjI3IGFzIFNjb3BlfSJdfQ== + var _syntax = __webpack_require__(46); -/***/ }, -/* 45 */ -/***/ function(module, exports) { + var _syntax2 = _interopRequireDefault(_syntax); - "use strict"; + var _ramda = __webpack_require__(10); - Object.defineProperty(exports, "__esModule", { - value: true - }); - let internedMap_815 = new Map(); - let counter_816 = 0; - function gensym_817(name_820) { - let prefix_821 = name_820 == null ? "s_" : name_820 + "_"; - let sym_822 = new Symbol_818(prefix_821 + counter_816); - counter_816++; - return sym_822; - } - function Symbol_818(name_823) { - this.name = name_823; - } - Symbol_818.prototype.toString = function () { - return this.name; - }; - function makeSymbol_819(name_824) { - if (internedMap_815.has(name_824)) { - return internedMap_815.get(name_824); - } else { - let sym = new Symbol_818(name_824); - internedMap_815.set(name_824, sym); - return sym; - } - } - exports.Symbol = makeSymbol_819; - exports.SymbolClass = Symbol_818; - exports.gensym = gensym_817; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3N5bWJvbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUksa0JBQWtCLElBQUksR0FBSixFQUF0QjtBQUNBLElBQUksY0FBYyxDQUFsQjtBQUNBLFNBQVMsVUFBVCxDQUFvQixRQUFwQixFQUE4QjtBQUM1QixNQUFJLGFBQWEsWUFBWSxJQUFaLEdBQW1CLElBQW5CLEdBQTBCLFdBQVcsR0FBdEQ7QUFDQSxNQUFJLFVBQVUsSUFBSSxVQUFKLENBQWUsYUFBYSxXQUE1QixDQUFkO0FBQ0E7QUFDQSxTQUFPLE9BQVA7QUFDRDtBQUNELFNBQVMsVUFBVCxDQUFvQixRQUFwQixFQUE4QjtBQUM1QixPQUFLLElBQUwsR0FBWSxRQUFaO0FBQ0Q7QUFDRCxXQUFXLFNBQVgsQ0FBcUIsUUFBckIsR0FBZ0MsWUFBWTtBQUMxQyxTQUFPLEtBQUssSUFBWjtBQUNELENBRkQ7QUFHQSxTQUFTLGNBQVQsQ0FBd0IsUUFBeEIsRUFBa0M7QUFDaEMsTUFBSSxnQkFBZ0IsR0FBaEIsQ0FBb0IsUUFBcEIsQ0FBSixFQUFtQztBQUNqQyxXQUFPLGdCQUFnQixHQUFoQixDQUFvQixRQUFwQixDQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsUUFBSSxNQUFNLElBQUksVUFBSixDQUFlLFFBQWYsQ0FBVjtBQUNBLG9CQUFnQixHQUFoQixDQUFvQixRQUFwQixFQUE4QixHQUE5QjtBQUNBLFdBQU8sR0FBUDtBQUNEO0FBQ0Y7UUFDeUIsTSxHQUFsQixjO1FBQXdDLFcsR0FBZCxVO1FBQ1osTSxHQUFkLFUiLCJmaWxlIjoic3ltYm9sLmpzIiwic291cmNlc0NvbnRlbnQiOlsibGV0IGludGVybmVkTWFwXzgxNSA9IG5ldyBNYXA7XG5sZXQgY291bnRlcl84MTYgPSAwO1xuZnVuY3Rpb24gZ2Vuc3ltXzgxNyhuYW1lXzgyMCkge1xuICBsZXQgcHJlZml4XzgyMSA9IG5hbWVfODIwID09IG51bGwgPyBcInNfXCIgOiBuYW1lXzgyMCArIFwiX1wiO1xuICBsZXQgc3ltXzgyMiA9IG5ldyBTeW1ib2xfODE4KHByZWZpeF84MjEgKyBjb3VudGVyXzgxNik7XG4gIGNvdW50ZXJfODE2Kys7XG4gIHJldHVybiBzeW1fODIyO1xufVxuZnVuY3Rpb24gU3ltYm9sXzgxOChuYW1lXzgyMykge1xuICB0aGlzLm5hbWUgPSBuYW1lXzgyMztcbn1cblN5bWJvbF84MTgucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5uYW1lO1xufTtcbmZ1bmN0aW9uIG1ha2VTeW1ib2xfODE5KG5hbWVfODI0KSB7XG4gIGlmIChpbnRlcm5lZE1hcF84MTUuaGFzKG5hbWVfODI0KSkge1xuICAgIHJldHVybiBpbnRlcm5lZE1hcF84MTUuZ2V0KG5hbWVfODI0KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc3ltID0gbmV3IFN5bWJvbF84MTgobmFtZV84MjQpO1xuICAgIGludGVybmVkTWFwXzgxNS5zZXQobmFtZV84MjQsIHN5bSk7XG4gICAgcmV0dXJuIHN5bTtcbiAgfVxufVxuZXhwb3J0IHttYWtlU3ltYm9sXzgxOSBhcyBTeW1ib2wsIFN5bWJvbF84MTggYXMgU3ltYm9sQ2xhc3N9O1xuZXhwb3J0IHtnZW5zeW1fODE3IGFzIGdlbnN5bX0iXX0= + var R = _interopRequireWildcard(_ramda); -/***/ }, -/* 46 */ -/***/ function(module, exports, __webpack_require__) { + var _ramdaFantasy = __webpack_require__(24); - "use strict"; + var _errors = __webpack_require__(23); - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.Modules = exports.Module = undefined; + var _terms = __webpack_require__(9); - var _immutable = __webpack_require__(11); + var _terms2 = _interopRequireDefault(_terms); - var _env = __webpack_require__(31); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - var _env2 = _interopRequireDefault(_env); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - var _store = __webpack_require__(47); + const Just = _ramdaFantasy.Maybe.Just; + const Nothing = _ramdaFantasy.Maybe.Nothing; - var _store2 = _interopRequireDefault(_store); - var _shiftReader = __webpack_require__(3); + const LSYNTAX = { name: 'left-syntax' }; + const RSYNTAX = { name: 'right-syntax' }; + const AT = { klass: _tokenizer.TokenClass.Punctuator, name: "@" }; - var _shiftReader2 = _interopRequireDefault(_shiftReader); + // TODO: also, need to handle contextual yield + const literalKeywords = ['this', 'null', 'true', 'false']; - var _tokenExpander = __webpack_require__(50); + // Token -> Boolean + const isLeftBracket = R.whereEq({ type: _tokenizer.TokenType.LBRACK }); + const isLeftBrace = R.whereEq({ type: _tokenizer.TokenType.LBRACE }); + const isLeftParen = R.whereEq({ type: _tokenizer.TokenType.LPAREN }); + const isRightBracket = R.whereEq({ type: _tokenizer.TokenType.RBRACK }); + const isRightBrace = R.whereEq({ type: _tokenizer.TokenType.RBRACE }); + const isRightParen = R.whereEq({ type: _tokenizer.TokenType.RPAREN }); - var _tokenExpander2 = _interopRequireDefault(_tokenExpander); + const isEOS = R.whereEq({ type: _tokenizer.TokenType.EOS }); - var _termExpander = __webpack_require__(54); + // const isHash = R.whereEq({ type: TokenType.IDENTIFIER, value: '#'}); + const isLeftSyntax = R.whereEq({ type: LSYNTAX }); + const isRightSyntax = R.whereEq({ type: RSYNTAX }); - var _termExpander2 = _interopRequireDefault(_termExpander); + const isLeftDelimiter = R.anyPass([isLeftBracket, isLeftBrace, isLeftParen, isLeftSyntax]); - var _bindingMap = __webpack_require__(14); + const isRightDelimiter = R.anyPass([isRightBracket, isRightBrace, isRightParen, isRightSyntax]); - var _bindingMap2 = _interopRequireDefault(_bindingMap); + const isMatchingDelimiters = R.cond([[isLeftBracket, (_, b) => isRightBracket(b)], [isLeftBrace, (_, b) => isRightBrace(b)], [isLeftParen, (_, b) => isRightParen(b)], [isLeftSyntax, (_, b) => isRightSyntax(b)], [R.T, R.F]]); - var _symbol = __webpack_require__(45); + const assignOps = ["=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "|=", "^=", ","]; - var _terms = __webpack_require__(28); + const binaryOps = ["+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", "|", "^", "&&", "||", "?", ":", "===", "==", ">=", "<=", "<", ">", "!=", "!==", "instanceof"]; - var _terms2 = _interopRequireDefault(_terms); + const unaryOps = ["++", "--", "~", "!", "delete", "void", "typeof", "yield", "throw", "new"]; - var _loadSyntax = __webpack_require__(53); + // List -> Boolean + const isEmpty = R.whereEq({ size: 0 }); - var _compiler = __webpack_require__(56); + // Syntax -> Boolean + const isPunctuator = s => s.match("punctuator"); + const isKeyword = s => s.match("keyword"); + const isParens = s => s.match("parens"); + const isBraces = s => s.match("braces"); + const isIdentifier = s => s.match("identifier"); - var _compiler2 = _interopRequireDefault(_compiler); + // Any -> Syntax -> Boolean + const isVal = R.curry((v, s) => s.val() === v); - var _transforms = __webpack_require__(32); + // Syntax -> Boolean + const isDot = R.allPass([isPunctuator, isVal('.')]); + const isColon = R.allPass([isPunctuator, isVal(':')]); + const isFunctionKeyword = R.allPass([isKeyword, isVal('function')]); + const isOperator = s => (s.match("punctuator") || s.match("keyword")) && R.any(R.equals(s.val()), assignOps.concat(binaryOps).concat(unaryOps)); + const isNonLiteralKeyword = R.allPass([isKeyword, s => R.none(R.equals(s.val()), literalKeywords)]); + const isKeywordExprPrefix = R.allPass([isKeyword, s => R.any(R.equals(s.val()), ['instanceof', 'typeof', 'delete', 'void', 'yield', 'throw', 'new', 'case'])]); + // List a -> a? + let last = p => p.last(); + // List a -> Maybe a + let safeLast = R.pipe(R.cond([[isEmpty, R.always(Nothing())], [R.T, R.compose(_ramdaFantasy.Maybe.of, last)]])); - var _scope = __webpack_require__(44); + // TODO: better name + // List -> Boolean -> Maybe List + let stuffTrue = R.curry((p, b) => b ? Just(p) : Nothing()); + let stuffFalse = R.curry((p, b) => !b ? Just(p) : Nothing()); - var _errors = __webpack_require__(13); + // List a -> Boolean + let isTopColon = R.pipe(safeLast, R.map(isColon), _ramdaFantasy.Maybe.maybe(false, R.identity)); + // List a -> Boolean + let isTopPunctuator = R.pipe(safeLast, R.map(isPunctuator), _ramdaFantasy.Maybe.maybe(false, R.identity)); - var _hygieneUtils = __webpack_require__(67); + // Number -> List -> Boolean + let isExprReturn = R.curry((l, p) => { + let retKwd = safeLast(p); + let maybeDot = pop(p).chain(safeLast); - var _syntax = __webpack_require__(12); + if (maybeDot.map(isDot).getOrElse(false)) { + return true; + } + return retKwd.map(s => { + return s.match("keyword") && s.val() === 'return' && s.lineNumber() === l; + }).getOrElse(false); + }); - var _utilsDirname = __webpack_require__(68); + const isTopOperator = R.pipe(safeLast, R.map(isOperator), _ramdaFantasy.Maybe.maybe(false, R.identity)); + + const isTopKeywordExprPrefix = R.pipe(safeLast, R.map(isKeywordExprPrefix), _ramdaFantasy.Maybe.maybe(false, R.identity)); + + // Number -> Boolean -> List -> Boolean + let isExprPrefix = R.curry((l, b) => R.cond([ + // ... ({x: 42} /r/i) + [isEmpty, R.always(b)], + // ... ({x: {x: 42} /r/i }) + [isTopColon, R.always(b)], + // ... throw {x: 42} /r/i + [isTopKeywordExprPrefix, R.T], + // ... 42 + {x: 42} /r/i + [isTopOperator, R.T], + // ... for ( ; {x: 42}/r/i) + [isTopPunctuator, R.always(b)], + // ... return {x: 42} /r /i + // ... return\n{x: 42} /r /i + [isExprReturn(l), R.T], [R.T, R.F]])); + + // List a -> Maybe List a + let curly = p => safeLast(p).map(isBraces).chain(stuffTrue(p)); + let paren = p => safeLast(p).map(isParens).chain(stuffTrue(p)); + let func = p => safeLast(p).map(isFunctionKeyword).chain(stuffTrue(p)); + let ident = p => safeLast(p).map(isIdentifier).chain(stuffTrue(p)); + let nonLiteralKeyword = p => safeLast(p).map(isNonLiteralKeyword).chain(stuffTrue(p)); + + let opt = R.curry((a, b, p) => { + let result = R.pipeK(a, b)(_ramdaFantasy.Maybe.of(p)); + return _ramdaFantasy.Maybe.isJust(result) ? result : _ramdaFantasy.Maybe.of(p); + }); - var _utilsDirname2 = _interopRequireDefault(_utilsDirname); + let notDot = R.ifElse(R.whereEq({ size: 0 }), Just, p => safeLast(p).map(s => !(s.match("punctuator") && s.val() === '.')).chain(stuffTrue(p))); + + // List a -> Maybe List a + let pop = R.compose(Just, p => p.pop()); + + // Maybe List a -> Maybe List a + const functionPrefix = R.pipeK(curly, pop, paren, pop, opt(ident, pop), func); + + // Boolean -> List a -> Boolean + const isRegexPrefix = b => R.anyPass([ + // ε + isEmpty, + // P . t where t ∈ Punctuator + isTopPunctuator, + // P . t . t' where t \not = "." and t' ∈ (Keyword \setminus LiteralKeyword) + R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(nonLiteralKeyword, pop, notDot), _ramdaFantasy.Maybe.isJust), + // P . t . t' . (T) where t \not = "." and t' ∈ (Keyword \setminus LiteralKeyword) + R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(paren, pop, nonLiteralKeyword, pop, notDot), _ramdaFantasy.Maybe.isJust), + // P . function^l . x? . () . {} where isExprPrefix(P, b, l) = false + R.pipe(_ramdaFantasy.Maybe.of, functionPrefix, R.chain(p => { + return safeLast(p).map(s => s.lineNumber()).chain(fnLine => { + return pop(p).map(isExprPrefix(fnLine, b)); + }).chain(stuffFalse(p)); + }), _ramdaFantasy.Maybe.isJust), + // P . {T}^l where isExprPrefix(P, b, l) = false + p => { + let alreadyCheckedFunction = R.pipe(_ramdaFantasy.Maybe.of, functionPrefix, _ramdaFantasy.Maybe.isJust)(p); + if (alreadyCheckedFunction) { + return false; + } + return R.pipe(_ramdaFantasy.Maybe.of, R.chain(curly), R.chain(p => { + return safeLast(p).map(s => s.lineNumber()).chain(curlyLine => { + return pop(p).map(isExprPrefix(curlyLine, b)); + }).chain(stuffFalse(p)); + }), _ramdaFantasy.Maybe.isJust)(p); + }]); - var _ramda = __webpack_require__(27); + function lastEl(l) { + return l[l.length - 1]; + } - var _ = _interopRequireWildcard(_ramda); + class Reader extends _tokenizer2.default { + constructor(strings, context, replacements) { + super(Array.isArray(strings) ? strings.join('') : strings); + this.delimStack = new Map(); + this.insideSyntaxTemplate = [false]; + this.context = context; - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + // setup splicing replacement array + if (Array.isArray(strings)) { + let totalIndex = 0; + this.replacementIndex = R.reduce((acc, strRep) => { + acc.push({ + index: totalIndex + strRep[0].length, + replacement: strRep[1] + }); + totalIndex += strRep[0].length; + return acc; + }, [], R.zip(strings, replacements)); + } + } - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + read() { + let stack = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + let b = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + let singleDelimiter = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; - class Module_469 { - constructor(moduleSpecifier_474, isNative_475, importEntries_476, exportEntries_477, pragmas_478, body_479) { - this.moduleSpecifier = moduleSpecifier_474; - this.isNative = isNative_475; - this.importEntries = importEntries_476; - this.exportEntries = exportEntries_477; - this.pragmas = pragmas_478; - this.body = body_479; - } - } - const findBindingIdentifierName_470 = term_480 => { - (0, _errors.assert)(term_480.name, `not implemented yet for type ${ term_480.type }`); - return term_480.name; - }; - const convertExport_471 = term_481 => { - let declaration_482 = term_481.declaration; - let bindings_483 = []; - if ((0, _terms.isVariableDeclaration)(declaration_482)) { - bindings_483 = declaration_482.declarators.map(decl_485 => findBindingIdentifierName_470(decl_485.binding)); - } else if ((0, _terms.isFunctionDeclaration)(declaration_482) || (0, _terms.isClassDeclaration)(declaration_482)) { - bindings_483.push(findBindingIdentifierName_470(declaration_482.name)); - } - let namedExports_484 = bindings_483.map(binding_486 => { - return new _terms2.default("ExportSpecifier", { name: null, exportedName: binding_486 }); - }); - return new _terms2.default("ExportFrom", { moduleSpecifier: null, namedExports: (0, _immutable.List)(namedExports_484) }); - }; - const pragmaRegep_472 = /^\s*#\w*/; - class Modules_473 { - constructor(context_487) { - this.compiledModules = new Map(); - this.context = context_487; - this.context.modules = this; - } - loadString(str_488) { - let checkPragma_489 = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; - - let hasPragma_490 = pragmaRegep_472.test(str_488); - if (checkPragma_489 && !hasPragma_490) { - return { isNative: true, body: (0, _immutable.List)() }; - } - return { isNative: !hasPragma_490, body: new _shiftReader2.default(str_488).read() }; - } - load(path_491) { - return this.loadString(this.context.moduleLoader(path_491)); - } - compile(mod_492, path_493) { - let stxl_494 = mod_492.body; - let outScope_495 = (0, _scope.freshScope)("outsideEdge"); - let inScope_496 = (0, _scope.freshScope)(`insideEdge0`); - let compiler_497 = new _compiler2.default(0, new _env2.default(), new _store2.default(), _.merge(this.context, { currentScope: [outScope_495, inScope_496], cwd: path_493 === "<>" ? this.context.cwd : (0, _utilsDirname2.default)(path_493) })); - let terms_498 = compiler_497.compile(stxl_494.map(s_503 => s_503.addScope(outScope_495, this.context.bindings, _syntax.ALL_PHASES).addScope(inScope_496, this.context.bindings, 0))); - let importEntries_499 = []; - let exportEntries_500 = []; - let pragmas_501 = []; - let filteredTerms_502 = terms_498.reduce((acc_504, t_505) => { - return _.cond([[_terms.isImport, t_506 => { - importEntries_499.push(t_506); - return acc_504; - }], [_terms.isExport, t_507 => { - if (t_507.declaration) { - exportEntries_500.push(convertExport_471(t_507)); - if ((0, _terms.isVariableDeclaration)(t_507.declaration)) { - return acc_504.concat(new _terms2.default("VariableDeclarationStatement", { declaration: t_507.declaration })); - } - return acc_504.concat(t_507.declaration); - } - exportEntries_500.push(t_507); - return acc_504; - }], [_terms.isPragma, t_508 => { - pragmas_501.push(t_508); - return acc_504; - }], [_.T, t_509 => acc_504.concat(t_509)]])(t_505); - }, (0, _immutable.List)()); - return new Module_469(path_493, mod_492.isNative, (0, _immutable.List)(importEntries_499), (0, _immutable.List)(exportEntries_500), (0, _immutable.List)(pragmas_501), filteredTerms_502); - } - compileEntrypoint(source_510, filename_511) { - let enforcePragma_512 = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + let prefix = (0, _immutable.List)(); + while (true) { + let tok = this.advance(prefix, b); - let stxl_513 = this.loadString(source_510, false); - if (enforcePragma_512 && stxl_513.isNative) { - throw new Error(`Entrypoint ${ filename_511 } must begin with #lang pragma`); - } - return this.getAtPhase("<>", 0, this.context.cwd, stxl_513); - } - getAtPhase(rawPath_514, phase_515, cwd_516) { - let rawStxl_517 = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; + // splicing allows syntax and terms + if (tok.scopesets || tok instanceof _terms2.default) { + stack.push(tok); + continue; + } + if (Array.isArray(tok)) { + Array.prototype.push.apply(stack, tok); + continue; + } + if (_immutable.List.isList(tok)) { + Array.prototype.push.apply(stack, tok.toArray()); + continue; + } - let path_518 = rawPath_514 === "<>" ? rawPath_514 : this.context.moduleResolver(rawPath_514, cwd_516); - let mapKey_519 = `${ path_518 }:${ phase_515 }`; - if (!this.compiledModules.has(mapKey_519)) { - if (phase_515 === 0) { - let stxl = rawStxl_517 != null ? rawStxl_517 : this.load(path_518); - this.compiledModules.set(mapKey_519, this.compile(stxl, path_518)); - } else { - let rawMod = this.getAtPhase(rawPath_514, 0, cwd_516, rawStxl_517); - let scope = (0, _scope.freshScope)(`insideEdge${ phase_515 }`); - this.compiledModules.set(mapKey_519, new Module_469(rawMod.moduleSpecifier, false, rawMod.importEntries.map(term_520 => term_520.addScope(scope, this.context.bindings, phase_515)), rawMod.exportEntries.map(term_521 => term_521.addScope(scope, this.context.bindings, phase_515)), rawMod.pragmas, rawMod.body.map(term_522 => term_522.addScope(scope, this.context.bindings, phase_515)))); + if (isEOS(tok)) { + if (stack[0] && isLeftDelimiter(stack[0].token)) { + throw this.createUnexpected(tok); + } + break; } - } - return this.compiledModules.get(mapKey_519); - } - has(rawPath_523) { - let phase_524 = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - let path_525 = rawPath_523 === "<>" ? rawPath_523 : this.context.moduleResolver(rawPath_523, this.context.cwd); - let key_526 = `${ path_525 }:${ phase_524 }`; - return this.compiledModules.has(key_526) && !this.compiledModules.get(key_526).isNative; - } - registerSyntaxDeclaration(term_527, phase_528, store_529) { - term_527.declarators.forEach(decl_530 => { - let val_531 = (0, _loadSyntax.evalCompiletimeValue)(decl_530.init.gen(), _.merge(this.context, { phase: phase_528 + 1, store: store_529 })); - (0, _hygieneUtils.collectBindings)(decl_530.binding).forEach(stx_532 => { - if (phase_528 !== 0) { - let newBinding = (0, _symbol.gensym)(stx_532.val()); - this.context.bindings.add(stx_532, { binding: newBinding, phase: phase_528, skipDup: false }); + if (isLeftDelimiter(tok)) { + if (isLeftSyntax(tok)) { + this.insideSyntaxTemplate.push(true); } - let resolvedName_533 = stx_532.resolve(phase_528); - store_529.set(resolvedName_533, new _transforms.CompiletimeTransform(val_531)); - }); - }); - } - registerVariableDeclaration(term_534, phase_535, store_536) { - term_534.declarators.forEach(decl_537 => { - (0, _hygieneUtils.collectBindings)(decl_537.binding).forEach(stx_538 => { - if (phase_535 !== 0) { - let newBinding = (0, _symbol.gensym)(stx_538.val()); - this.context.bindings.add(stx_538, { binding: newBinding, phase: phase_535, skipDup: term_534.kind === "var" }); + let line = tok.slice.startLocation.line; + let innerB = isLeftBrace(tok) ? isExprPrefix(line, b)(prefix) : true; + let inner = this.read([new _syntax2.default(tok, this.context)], innerB, false); + let stx = new _syntax2.default(inner, this.context); + prefix = prefix.concat(stx); + stack.push(stx); + if (singleDelimiter) { + break; } - let resolvedName_539 = stx_538.resolve(phase_535); - store_536.set(resolvedName_539, new _transforms.VarBindingTransform(stx_538)); - }); - }); - } - registerFunctionOrClass(term_540, phase_541, store_542) { - (0, _hygieneUtils.collectBindings)(term_540.name).forEach(stx_543 => { - if (phase_541 !== 0) { - let newBinding = (0, _symbol.gensym)(stx_543.val()); - this.context.bindings.add(stx_543, { binding: newBinding, phase: phase_541, skipDup: false }); - } - let resolvedName_544 = stx_543.resolve(phase_541); - store_542.set(resolvedName_544, new _transforms.VarBindingTransform(stx_543)); - }); - } - visit(mod_545, phase_546, store_547) { - mod_545.body.forEach(term_548 => { - if ((0, _terms.isSyntaxDeclarationStatement)(term_548)) { - this.registerSyntaxDeclaration(term_548.declaration, phase_546, store_547); - } - }); - return store_547; - } - invoke(mod_549, phase_550, store_551) { - let body_552 = mod_549.body.filter(_.complement(_terms.isCompiletimeStatement)).map(term_554 => { - term_554 = term_554.gen(); - if ((0, _terms.isVariableDeclarationStatement)(term_554)) { - this.registerVariableDeclaration(term_554.declaration, phase_550, store_551); - } else if ((0, _terms.isFunctionDeclaration)(term_554)) { - this.registerFunctionOrClass(term_554, phase_550, store_551); + } else if (isRightDelimiter(tok)) { + if (stack[0] && !isMatchingDelimiters(stack[0].token, tok)) { + throw this.createUnexpected(tok); + } + let stx = new _syntax2.default(tok, this.context); + stack.push(stx); + if (lastEl(this.insideSyntaxTemplate) && isRightSyntax(tok)) { + this.insideSyntaxTemplate.pop(); + } + break; + } else { + let stx = new _syntax2.default(tok, this.context); + prefix = prefix.concat(stx); + stack.push(stx); } - return term_554; - }); - let exportsObj_553 = (0, _loadSyntax.evalRuntimeValues)(body_552, _.merge(this.context, { store: store_551, phase: phase_550 })); - return store_551; + } + return (0, _immutable.List)(stack); } - } - exports.Module = Module_469; - exports.Modules = Modules_473; - //# sourceMappingURL=data:application/json;base64,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LEVBQTRDO0FBQzFDLGFBQUsseUJBQUwsQ0FBK0IsU0FBUyxXQUF4QyxFQUFxRCxTQUFyRCxFQUFnRSxTQUFoRTtBQUNEO0FBQ0YsS0FKRDtBQUtBLFdBQU8sU0FBUDtBQUNEO0FBQ0QsU0FBTyxPQUFQLEVBQWdCLFNBQWhCLEVBQTJCLFNBQTNCLEVBQXNDO0FBQ3BDLFFBQUksV0FBVyxRQUFRLElBQVIsQ0FBYSxNQUFiLENBQW9CLEVBQUUsVUFBRiwrQkFBcEIsRUFBMEQsR0FBMUQsQ0FBOEQsWUFBWTtBQUN2RixpQkFBVyxTQUFTLEdBQVQsRUFBWDtBQUNBLFVBQUksMkNBQStCLFFBQS9CLENBQUosRUFBOEM7QUFDNUMsYUFBSywyQkFBTCxDQUFpQyxTQUFTLFdBQTFDLEVBQXVELFNBQXZELEVBQWtFLFNBQWxFO0FBQ0QsT0FGRCxNQUVPLElBQUksa0NBQXNCLFFBQXRCLENBQUosRUFBcUM7QUFDMUMsYUFBSyx1QkFBTCxDQUE2QixRQUE3QixFQUF1QyxTQUF2QyxFQUFrRCxTQUFsRDtBQUNEO0FBQ0QsYUFBTyxRQUFQO0FBQ0QsS0FSYyxDQUFmO0FBU0EsUUFBSSxpQkFBaUIsbUNBQWtCLFFBQWxCLEVBQTRCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQixFQUFDLE9BQU8sU0FBUixFQUFtQixPQUFPLFNBQTFCLEVBQXRCLENBQTVCLENBQXJCO0FBQ0EsV0FBTyxTQUFQO0FBQ0Q7QUFoSWU7UUFrSUksTSxHQUFkLFU7UUFDZSxPLEdBQWYsVyIsImZpbGUiOiJtb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgRW52IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IFN0b3JlIGZyb20gXCIuL3N0b3JlXCI7XG5pbXBvcnQgUmVhZGVyIGZyb20gXCIuL3NoaWZ0LXJlYWRlclwiO1xuaW1wb3J0IFRva2VuRXhwYW5kZXIgZnJvbSBcIi4vdG9rZW4tZXhwYW5kZXIuanNcIjtcbmltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlci5qc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXAuanNcIjtcbmltcG9ydCB7Z2Vuc3ltfSBmcm9tIFwiLi9zeW1ib2xcIjtcbmltcG9ydCBUZXJtLCB7aXNFT0YsIGlzQmluZGluZ0lkZW50aWZpZXIsIGlzRnVuY3Rpb25EZWNsYXJhdGlvbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24sIGlzRnVuY3Rpb25UZXJtLCBpc0Z1bmN0aW9uV2l0aE5hbWUsIGlzU3ludGF4RGVjbGFyYXRpb24sIGlzU3ludGF4cmVjRGVjbGFyYXRpb24sIGlzVmFyaWFibGVEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LCBpc0ltcG9ydCwgaXNFeHBvcnQsIGlzRXhwb3J0RnJvbSwgaXNFeHBvcnRBbGxGcm9tLCBpc0V4cG9ydERlZmF1bHQsIGlzRXhwb3J0U3ludGF4LCBpc1N5bnRheERlY2xhcmF0aW9uU3RhdGVtZW50LCBpc1ByYWdtYSwgaXNDb21waWxldGltZURlY2xhcmF0aW9uLCBpc0NvbXBpbGV0aW1lU3RhdGVtZW50LCBpc0NsYXNzRGVjbGFyYXRpb259IGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge2V2YWxDb21waWxldGltZVZhbHVlLCBldmFsUnVudGltZVZhbHVlc30gZnJvbSBcIi4vbG9hZC1zeW50YXhcIjtcbmltcG9ydCBDb21waWxlciBmcm9tIFwiLi9jb21waWxlclwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHtTY29wZSwgZnJlc2hTY29wZX0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7Y29sbGVjdEJpbmRpbmdzfSBmcm9tIFwiLi9oeWdpZW5lLXV0aWxzXCI7XG5pbXBvcnQge0FMTF9QSEFTRVN9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IGRpcm5hbWUgZnJvbSBcInV0aWxzLWRpcm5hbWVcIjtcbmltcG9ydCAgKiBhcyBfIGZyb20gXCJyYW1kYVwiO1xuY2xhc3MgTW9kdWxlXzQ2OSB7XG4gIGNvbnN0cnVjdG9yKG1vZHVsZVNwZWNpZmllcl80NzQsIGlzTmF0aXZlXzQ3NSwgaW1wb3J0RW50cmllc180NzYsIGV4cG9ydEVudHJpZXNfNDc3LCBwcmFnbWFzXzQ3OCwgYm9keV80NzkpIHtcbiAgICB0aGlzLm1vZHVsZVNwZWNpZmllciA9IG1vZHVsZVNwZWNpZmllcl80NzQ7XG4gICAgdGhpcy5pc05hdGl2ZSA9IGlzTmF0aXZlXzQ3NTtcbiAgICB0aGlzLmltcG9ydEVudHJpZXMgPSBpbXBvcnRFbnRyaWVzXzQ3NjtcbiAgICB0aGlzLmV4cG9ydEVudHJpZXMgPSBleHBvcnRFbnRyaWVzXzQ3NztcbiAgICB0aGlzLnByYWdtYXMgPSBwcmFnbWFzXzQ3ODtcbiAgICB0aGlzLmJvZHkgPSBib2R5XzQ3OTtcbiAgfVxufVxuY29uc3QgZmluZEJpbmRpbmdJZGVudGlmaWVyTmFtZV80NzAgPSB0ZXJtXzQ4MCA9PiB7XG4gIGFzc2VydCh0ZXJtXzQ4MC5uYW1lLCBgbm90IGltcGxlbWVudGVkIHlldCBmb3IgdHlwZSAke3Rlcm1fNDgwLnR5cGV9YCk7XG4gIHJldHVybiB0ZXJtXzQ4MC5uYW1lO1xufTtcbmNvbnN0IGNvbnZlcnRFeHBvcnRfNDcxID0gdGVybV80ODEgPT4ge1xuICBsZXQgZGVjbGFyYXRpb25fNDgyID0gdGVybV80ODEuZGVjbGFyYXRpb247XG4gIGxldCBiaW5kaW5nc180ODMgPSBbXTtcbiAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbl80ODIpKSB7XG4gICAgYmluZGluZ3NfNDgzID0gZGVjbGFyYXRpb25fNDgyLmRlY2xhcmF0b3JzLm1hcChkZWNsXzQ4NSA9PiBmaW5kQmluZGluZ0lkZW50aWZpZXJOYW1lXzQ3MChkZWNsXzQ4NS5iaW5kaW5nKSk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbkRlY2xhcmF0aW9uKGRlY2xhcmF0aW9uXzQ4MikgfHwgaXNDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uXzQ4MikpIHtcbiAgICBiaW5kaW5nc180ODMucHVzaChmaW5kQmluZGluZ0lkZW50aWZpZXJOYW1lXzQ3MChkZWNsYXJhdGlvbl80ODIubmFtZSkpO1xuICB9XG4gIGxldCBuYW1lZEV4cG9ydHNfNDg0ID0gYmluZGluZ3NfNDgzLm1hcChiaW5kaW5nXzQ4NiA9PiB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0U3BlY2lmaWVyXCIsIHtuYW1lOiBudWxsLCBleHBvcnRlZE5hbWU6IGJpbmRpbmdfNDg2fSk7XG4gIH0pO1xuICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRGcm9tXCIsIHttb2R1bGVTcGVjaWZpZXI6IG51bGwsIG5hbWVkRXhwb3J0czogTGlzdChuYW1lZEV4cG9ydHNfNDg0KX0pO1xufTtcbmNvbnN0IHByYWdtYVJlZ2VwXzQ3MiA9IC9eXFxzKiNcXHcqLztcbmNsYXNzIE1vZHVsZXNfNDczIHtcbiAgY29uc3RydWN0b3IoY29udGV4dF80ODcpIHtcbiAgICB0aGlzLmNvbXBpbGVkTW9kdWxlcyA9IG5ldyBNYXA7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF80ODc7XG4gICAgdGhpcy5jb250ZXh0Lm1vZHVsZXMgPSB0aGlzO1xuICB9XG4gIGxvYWRTdHJpbmcoc3RyXzQ4OCwgY2hlY2tQcmFnbWFfNDg5ID0gdHJ1ZSkge1xuICAgIGxldCBoYXNQcmFnbWFfNDkwID0gcHJhZ21hUmVnZXBfNDcyLnRlc3Qoc3RyXzQ4OCk7XG4gICAgaWYgKGNoZWNrUHJhZ21hXzQ4OSAmJiAhaGFzUHJhZ21hXzQ5MCkge1xuICAgICAgcmV0dXJuIHtpc05hdGl2ZTogdHJ1ZSwgYm9keTogTGlzdCgpfTtcbiAgICB9XG4gICAgcmV0dXJuIHtpc05hdGl2ZTogIWhhc1ByYWdtYV80OTAsIGJvZHk6IG5ldyBSZWFkZXIoc3RyXzQ4OCkucmVhZCgpfTtcbiAgfVxuICBsb2FkKHBhdGhfNDkxKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFN0cmluZyh0aGlzLmNvbnRleHQubW9kdWxlTG9hZGVyKHBhdGhfNDkxKSk7XG4gIH1cbiAgY29tcGlsZShtb2RfNDkyLCBwYXRoXzQ5Mykge1xuICAgIGxldCBzdHhsXzQ5NCA9IG1vZF80OTIuYm9keTtcbiAgICBsZXQgb3V0U2NvcGVfNDk1ID0gZnJlc2hTY29wZShcIm91dHNpZGVFZGdlXCIpO1xuICAgIGxldCBpblNjb3BlXzQ5NiA9IGZyZXNoU2NvcGUoYGluc2lkZUVkZ2UwYCk7XG4gICAgbGV0IGNvbXBpbGVyXzQ5NyA9IG5ldyBDb21waWxlcigwLCBuZXcgRW52LCBuZXcgU3RvcmUsIF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7Y3VycmVudFNjb3BlOiBbb3V0U2NvcGVfNDk1LCBpblNjb3BlXzQ5Nl0sIGN3ZDogcGF0aF80OTMgPT09IFwiPDxlbnRyeXBvaW50Pj5cIiA/IHRoaXMuY29udGV4dC5jd2QgOiBkaXJuYW1lKHBhdGhfNDkzKX0pKTtcbiAgICBsZXQgdGVybXNfNDk4ID0gY29tcGlsZXJfNDk3LmNvbXBpbGUoc3R4bF80OTQubWFwKHNfNTAzID0+IHNfNTAzLmFkZFNjb3BlKG91dFNjb3BlXzQ5NSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKS5hZGRTY29wZShpblNjb3BlXzQ5NiwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCAwKSkpO1xuICAgIGxldCBpbXBvcnRFbnRyaWVzXzQ5OSA9IFtdO1xuICAgIGxldCBleHBvcnRFbnRyaWVzXzUwMCA9IFtdO1xuICAgIGxldCBwcmFnbWFzXzUwMSA9IFtdO1xuICAgIGxldCBmaWx0ZXJlZFRlcm1zXzUwMiA9IHRlcm1zXzQ5OC5yZWR1Y2UoKGFjY181MDQsIHRfNTA1KSA9PiB7XG4gICAgICByZXR1cm4gXy5jb25kKFtbaXNJbXBvcnQsIHRfNTA2ID0+IHtcbiAgICAgICAgaW1wb3J0RW50cmllc180OTkucHVzaCh0XzUwNik7XG4gICAgICAgIHJldHVybiBhY2NfNTA0O1xuICAgICAgfV0sIFtpc0V4cG9ydCwgdF81MDcgPT4ge1xuICAgICAgICBpZiAodF81MDcuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICBleHBvcnRFbnRyaWVzXzUwMC5wdXNoKGNvbnZlcnRFeHBvcnRfNDcxKHRfNTA3KSk7XG4gICAgICAgICAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbih0XzUwNy5kZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2NfNTA0LmNvbmNhdChuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRcIiwge2RlY2xhcmF0aW9uOiB0XzUwNy5kZWNsYXJhdGlvbn0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY181MDQuY29uY2F0KHRfNTA3LmRlY2xhcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRFbnRyaWVzXzUwMC5wdXNoKHRfNTA3KTtcbiAgICAgICAgcmV0dXJuIGFjY181MDQ7XG4gICAgICB9XSwgW2lzUHJhZ21hLCB0XzUwOCA9PiB7XG4gICAgICAgIHByYWdtYXNfNTAxLnB1c2godF81MDgpO1xuICAgICAgICByZXR1cm4gYWNjXzUwNDtcbiAgICAgIH1dLCBbXy5ULCB0XzUwOSA9PiBhY2NfNTA0LmNvbmNhdCh0XzUwOSldXSkodF81MDUpO1xuICAgIH0sIExpc3QoKSk7XG4gICAgcmV0dXJuIG5ldyBNb2R1bGVfNDY5KHBhdGhfNDkzLCBtb2RfNDkyLmlzTmF0aXZlLCBMaXN0KGltcG9ydEVudHJpZXNfNDk5KSwgTGlzdChleHBvcnRFbnRyaWVzXzUwMCksIExpc3QocHJhZ21hc181MDEpLCBmaWx0ZXJlZFRlcm1zXzUwMik7XG4gIH1cbiAgY29tcGlsZUVudHJ5cG9pbnQoc291cmNlXzUxMCwgZmlsZW5hbWVfNTExLCBlbmZvcmNlUHJhZ21hXzUxMiA9IGZhbHNlKSB7XG4gICAgbGV0IHN0eGxfNTEzID0gdGhpcy5sb2FkU3RyaW5nKHNvdXJjZV81MTAsIGZhbHNlKTtcbiAgICBpZiAoZW5mb3JjZVByYWdtYV81MTIgJiYgc3R4bF81MTMuaXNOYXRpdmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50cnlwb2ludCAke2ZpbGVuYW1lXzUxMX0gbXVzdCBiZWdpbiB3aXRoICNsYW5nIHByYWdtYWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBdFBoYXNlKFwiPDxlbnRyeXBvaW50Pj5cIiwgMCwgdGhpcy5jb250ZXh0LmN3ZCwgc3R4bF81MTMpO1xuICB9XG4gIGdldEF0UGhhc2UocmF3UGF0aF81MTQsIHBoYXNlXzUxNSwgY3dkXzUxNiwgcmF3U3R4bF81MTcgPSBudWxsKSB7XG4gICAgbGV0IHBhdGhfNTE4ID0gcmF3UGF0aF81MTQgPT09IFwiPDxlbnRyeXBvaW50Pj5cIiA/IHJhd1BhdGhfNTE0IDogdGhpcy5jb250ZXh0Lm1vZHVsZVJlc29sdmVyKHJhd1BhdGhfNTE0LCBjd2RfNTE2KTtcbiAgICBsZXQgbWFwS2V5XzUxOSA9IGAke3BhdGhfNTE4fToke3BoYXNlXzUxNX1gO1xuICAgIGlmICghdGhpcy5jb21waWxlZE1vZHVsZXMuaGFzKG1hcEtleV81MTkpKSB7XG4gICAgICBpZiAocGhhc2VfNTE1ID09PSAwKSB7XG4gICAgICAgIGxldCBzdHhsID0gcmF3U3R4bF81MTcgIT0gbnVsbCA/IHJhd1N0eGxfNTE3IDogdGhpcy5sb2FkKHBhdGhfNTE4KTtcbiAgICAgICAgdGhpcy5jb21waWxlZE1vZHVsZXMuc2V0KG1hcEtleV81MTksIHRoaXMuY29tcGlsZShzdHhsLCBwYXRoXzUxOCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJhd01vZCA9IHRoaXMuZ2V0QXRQaGFzZShyYXdQYXRoXzUxNCwgMCwgY3dkXzUxNiwgcmF3U3R4bF81MTcpO1xuICAgICAgICBsZXQgc2NvcGUgPSBmcmVzaFNjb3BlKGBpbnNpZGVFZGdlJHtwaGFzZV81MTV9YCk7XG4gICAgICAgIHRoaXMuY29tcGlsZWRNb2R1bGVzLnNldChtYXBLZXlfNTE5LCBuZXcgTW9kdWxlXzQ2OShyYXdNb2QubW9kdWxlU3BlY2lmaWVyLCBmYWxzZSwgcmF3TW9kLmltcG9ydEVudHJpZXMubWFwKHRlcm1fNTIwID0+IHRlcm1fNTIwLmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIHBoYXNlXzUxNSkpLCByYXdNb2QuZXhwb3J0RW50cmllcy5tYXAodGVybV81MjEgPT4gdGVybV81MjEuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgcGhhc2VfNTE1KSksIHJhd01vZC5wcmFnbWFzLCByYXdNb2QuYm9keS5tYXAodGVybV81MjIgPT4gdGVybV81MjIuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgcGhhc2VfNTE1KSkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZWRNb2R1bGVzLmdldChtYXBLZXlfNTE5KTtcbiAgfVxuICBoYXMocmF3UGF0aF81MjMsIHBoYXNlXzUyNCA9IDApIHtcbiAgICBsZXQgcGF0aF81MjUgPSByYXdQYXRoXzUyMyA9PT0gXCI8PGVudHJ5cG9pbnQ+PlwiID8gcmF3UGF0aF81MjMgOiB0aGlzLmNvbnRleHQubW9kdWxlUmVzb2x2ZXIocmF3UGF0aF81MjMsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgIGxldCBrZXlfNTI2ID0gYCR7cGF0aF81MjV9OiR7cGhhc2VfNTI0fWA7XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZWRNb2R1bGVzLmhhcyhrZXlfNTI2KSAmJiAhdGhpcy5jb21waWxlZE1vZHVsZXMuZ2V0KGtleV81MjYpLmlzTmF0aXZlO1xuICB9XG4gIHJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybV81MjcsIHBoYXNlXzUyOCwgc3RvcmVfNTI5KSB7XG4gICAgdGVybV81MjcuZGVjbGFyYXRvcnMuZm9yRWFjaChkZWNsXzUzMCA9PiB7XG4gICAgICBsZXQgdmFsXzUzMSA9IGV2YWxDb21waWxldGltZVZhbHVlKGRlY2xfNTMwLmluaXQuZ2VuKCksIF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7cGhhc2U6IHBoYXNlXzUyOCArIDEsIHN0b3JlOiBzdG9yZV81Mjl9KSk7XG4gICAgICBjb2xsZWN0QmluZGluZ3MoZGVjbF81MzAuYmluZGluZykuZm9yRWFjaChzdHhfNTMyID0+IHtcbiAgICAgICAgaWYgKHBoYXNlXzUyOCAhPT0gMCkge1xuICAgICAgICAgIGxldCBuZXdCaW5kaW5nID0gZ2Vuc3ltKHN0eF81MzIudmFsKCkpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4XzUzMiwge2JpbmRpbmc6IG5ld0JpbmRpbmcsIHBoYXNlOiBwaGFzZV81MjgsIHNraXBEdXA6IGZhbHNlfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVkTmFtZV81MzMgPSBzdHhfNTMyLnJlc29sdmUocGhhc2VfNTI4KTtcbiAgICAgICAgc3RvcmVfNTI5LnNldChyZXNvbHZlZE5hbWVfNTMzLCBuZXcgQ29tcGlsZXRpbWVUcmFuc2Zvcm0odmFsXzUzMSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmVnaXN0ZXJWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm1fNTM0LCBwaGFzZV81MzUsIHN0b3JlXzUzNikge1xuICAgIHRlcm1fNTM0LmRlY2xhcmF0b3JzLmZvckVhY2goZGVjbF81MzcgPT4ge1xuICAgICAgY29sbGVjdEJpbmRpbmdzKGRlY2xfNTM3LmJpbmRpbmcpLmZvckVhY2goc3R4XzUzOCA9PiB7XG4gICAgICAgIGlmIChwaGFzZV81MzUgIT09IDApIHtcbiAgICAgICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShzdHhfNTM4LnZhbCgpKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eF81MzgsIHtiaW5kaW5nOiBuZXdCaW5kaW5nLCBwaGFzZTogcGhhc2VfNTM1LCBza2lwRHVwOiB0ZXJtXzUzNC5raW5kID09PSBcInZhclwifSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVkTmFtZV81MzkgPSBzdHhfNTM4LnJlc29sdmUocGhhc2VfNTM1KTtcbiAgICAgICAgc3RvcmVfNTM2LnNldChyZXNvbHZlZE5hbWVfNTM5LCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfNTM4KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZWdpc3RlckZ1bmN0aW9uT3JDbGFzcyh0ZXJtXzU0MCwgcGhhc2VfNTQxLCBzdG9yZV81NDIpIHtcbiAgICBjb2xsZWN0QmluZGluZ3ModGVybV81NDAubmFtZSkuZm9yRWFjaChzdHhfNTQzID0+IHtcbiAgICAgIGlmIChwaGFzZV81NDEgIT09IDApIHtcbiAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4XzU0My52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4XzU0Mywge2JpbmRpbmc6IG5ld0JpbmRpbmcsIHBoYXNlOiBwaGFzZV81NDEsIHNraXBEdXA6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgICBsZXQgcmVzb2x2ZWROYW1lXzU0NCA9IHN0eF81NDMucmVzb2x2ZShwaGFzZV81NDEpO1xuICAgICAgc3RvcmVfNTQyLnNldChyZXNvbHZlZE5hbWVfNTQ0LCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfNTQzKSk7XG4gICAgfSk7XG4gIH1cbiAgdmlzaXQobW9kXzU0NSwgcGhhc2VfNTQ2LCBzdG9yZV81NDcpIHtcbiAgICBtb2RfNTQ1LmJvZHkuZm9yRWFjaCh0ZXJtXzU0OCA9PiB7XG4gICAgICBpZiAoaXNTeW50YXhEZWNsYXJhdGlvblN0YXRlbWVudCh0ZXJtXzU0OCkpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclN5bnRheERlY2xhcmF0aW9uKHRlcm1fNTQ4LmRlY2xhcmF0aW9uLCBwaGFzZV81NDYsIHN0b3JlXzU0Nyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0b3JlXzU0NztcbiAgfVxuICBpbnZva2UobW9kXzU0OSwgcGhhc2VfNTUwLCBzdG9yZV81NTEpIHtcbiAgICBsZXQgYm9keV81NTIgPSBtb2RfNTQ5LmJvZHkuZmlsdGVyKF8uY29tcGxlbWVudChpc0NvbXBpbGV0aW1lU3RhdGVtZW50KSkubWFwKHRlcm1fNTU0ID0+IHtcbiAgICAgIHRlcm1fNTU0ID0gdGVybV81NTQuZ2VuKCk7XG4gICAgICBpZiAoaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRlcm1fNTU0KSkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtXzU1NC5kZWNsYXJhdGlvbiwgcGhhc2VfNTUwLCBzdG9yZV81NTEpO1xuICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uRGVjbGFyYXRpb24odGVybV81NTQpKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybV81NTQsIHBoYXNlXzU1MCwgc3RvcmVfNTUxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXJtXzU1NDtcbiAgICB9KTtcbiAgICBsZXQgZXhwb3J0c09ial81NTMgPSBldmFsUnVudGltZVZhbHVlcyhib2R5XzU1MiwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtzdG9yZTogc3RvcmVfNTUxLCBwaGFzZTogcGhhc2VfNTUwfSkpO1xuICAgIHJldHVybiBzdG9yZV81NTE7XG4gIH1cbn1cbmV4cG9ydCB7TW9kdWxlXzQ2OSBhcyBNb2R1bGV9O1xuZXhwb3J0IHtNb2R1bGVzXzQ3MyBhcyBNb2R1bGVzfSJdfQ== -/***/ }, -/* 47 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _vm = __webpack_require__(48); - - var _vm2 = _interopRequireDefault(_vm); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - class Store { - constructor() { - this.map = new Map(); - this.nodeContext = _vm2.default.createContext(); - } - has(key_793) { - return this.map.has(key_793); - } - get(key_794) { - return this.map.get(key_794); - } - set(key_795, val_796) { - this.nodeContext[key_795] = val_796; - return this.map.set(key_795, val_796); - } - getNodeContext() { - return this.nodeContext; - } - } - exports.default = Store; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3N0b3JlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7Ozs7QUFDZSxNQUFNLEtBQU4sQ0FBWTtBQUN6QixnQkFBYztBQUNaLFNBQUssR0FBTCxHQUFXLElBQUksR0FBSixFQUFYO0FBQ0EsU0FBSyxXQUFMLEdBQW1CLGFBQUcsYUFBSCxFQUFuQjtBQUNEO0FBQ0QsTUFBSSxPQUFKLEVBQWE7QUFDWCxXQUFPLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxPQUFiLENBQVA7QUFDRDtBQUNELE1BQUksT0FBSixFQUFhO0FBQ1gsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYixDQUFQO0FBQ0Q7QUFDRCxNQUFJLE9BQUosRUFBYSxPQUFiLEVBQXNCO0FBQ3BCLFNBQUssV0FBTCxDQUFpQixPQUFqQixJQUE0QixPQUE1QjtBQUNBLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWIsRUFBc0IsT0FBdEIsQ0FBUDtBQUNEO0FBQ0QsbUJBQWlCO0FBQ2YsV0FBTyxLQUFLLFdBQVo7QUFDRDtBQWpCd0I7a0JBQU4sSyIsImZpbGUiOiJzdG9yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2bSBmcm9tIFwidm1cIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwO1xuICAgIHRoaXMubm9kZUNvbnRleHQgPSB2bS5jcmVhdGVDb250ZXh0KCk7XG4gIH1cbiAgaGFzKGtleV83OTMpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleV83OTMpO1xuICB9XG4gIGdldChrZXlfNzk0KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXlfNzk0KTtcbiAgfVxuICBzZXQoa2V5Xzc5NSwgdmFsXzc5Nikge1xuICAgIHRoaXMubm9kZUNvbnRleHRba2V5Xzc5NV0gPSB2YWxfNzk2O1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoa2V5Xzc5NSwgdmFsXzc5Nik7XG4gIH1cbiAgZ2V0Tm9kZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZUNvbnRleHQ7XG4gIH1cbn1cbiJdfQ== + advance(prefix, b) { + this.lastIndex = this.index; + this.lastLine = this.line; + this.lastLineStart = this.lineStart; -/***/ }, -/* 48 */ -/***/ function(module, exports, __webpack_require__) { + this.skipComment(); - var indexOf = __webpack_require__(49); + this.startIndex = this.index; + this.startLine = this.line; + this.startLineStart = this.lineStart; - var Object_keys = function (obj) { - if (Object.keys) return Object.keys(obj) - else { - var res = []; - for (var key in obj) res.push(key) - return res; + if (this.replacementIndex && this.replacementIndex[0] && this.index >= this.replacementIndex[0].index) { + let rep = this.replacementIndex[0].replacement; + this.replacementIndex.shift(); + return rep; } - }; - var forEach = function (xs, fn) { - if (xs.forEach) return xs.forEach(fn) - else for (var i = 0; i < xs.length; i++) { - fn(xs[i], i, xs); - } - }; + let charCode = this.source.charCodeAt(this.index); - var defineProp = (function() { - try { - Object.defineProperty({}, '_', {}); - return function(obj, name, value) { - Object.defineProperty(obj, name, { - writable: true, - enumerable: false, - configurable: true, - value: value - }) + if (charCode === 0x60) { + // ` + let element, + items = []; + let startLocation = this.getLocation(); + let start = this.index; + this.index++; + if (lastEl(this.insideSyntaxTemplate)) { + + let slice = this.getSlice(start, startLocation); + return { + type: RSYNTAX, + value: '`', + slice: slice }; - } catch(e) { - return function(obj, name, value) { - obj[name] = value; + } + do { + element = this.scanTemplateElement(); + items.push(element); + if (element.interp) { + // only read the single delimiter + element = this.read([], false, true); + (0, _errors.assert)(element.size === 1, "should only have read a single delimiter inside a template"); + items.push(element.get(0)); + } + } while (!element.tail); + return { + type: _tokenizer.TokenType.TEMPLATE, + items: (0, _immutable.List)(items), + slice: this.getSlice(start, startLocation) + }; + } else if (charCode === 35) { + // # + let startLocation = this.getLocation(); + let start = this.index; + let slice = this.getSlice(start, startLocation); + this.index++; + // TODO: handle ` inside of syntax template interpolations + if (this.source.charCodeAt(this.index) === 0x60) { + // ` + this.index++; + return { + type: LSYNTAX, + value: '#`', + slice: slice }; + } + return { + type: _tokenizer.TokenType.IDENTIFIER, + value: '#', + slice: slice + }; + } else if (charCode === 64) { + // @ + let startLocation = this.getLocation(); + let start = this.index; + let slice = this.getSlice(start, startLocation); + this.index++; + return { + type: AT, + value: '@', + slice: slice + }; } - }()); - - var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', - 'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', - 'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', - 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', - 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape']; - - function Context() {} - Context.prototype = {}; - - var Script = exports.Script = function NodeScript (code) { - if (!(this instanceof Script)) return new Script(code); - this.code = code; - }; - - Script.prototype.runInContext = function (context) { - if (!(context instanceof Context)) { - throw new TypeError("needs a 'context' argument."); - } - - var iframe = document.createElement('iframe'); - if (!iframe.style) iframe.style = {}; - iframe.style.display = 'none'; - - document.body.appendChild(iframe); - - var win = iframe.contentWindow; - var wEval = win.eval, wExecScript = win.execScript; - if (!wEval && wExecScript) { - // win.eval() magically appears when this is called in IE: - wExecScript.call(win, 'null'); - wEval = win.eval; + let lookahead = super.advance(); + if (lookahead.type === _tokenizer.TokenType.DIV && isRegexPrefix(b)(prefix)) { + return super.scanRegExp("/"); } - - forEach(Object_keys(context), function (key) { - win[key] = context[key]; - }); - forEach(globals, function (key) { - if (context[key]) { - win[key] = context[key]; - } - }); - - var winKeys = Object_keys(win); - - var res = wEval.call(win, this.code); - - forEach(Object_keys(win), function (key) { - // Avoid copying circular objects like `top` and `window` by only - // updating existing context properties or new properties in the `win` - // that was only introduced after the eval. - if (key in context || indexOf(winKeys, key) === -1) { - context[key] = win[key]; - } - }); - - forEach(globals, function (key) { - if (!(key in context)) { - defineProp(context, key, win[key]); - } - }); - - document.body.removeChild(iframe); - - return res; - }; - - Script.prototype.runInThisContext = function () { - return eval(this.code); // maybe... - }; - - Script.prototype.runInNewContext = function (context) { - var ctx = Script.createContext(context); - var res = this.runInContext(ctx); - - forEach(Object_keys(ctx), function (key) { - context[key] = ctx[key]; - }); - - return res; - }; - - forEach(Object_keys(Script.prototype), function (name) { - exports[name] = Script[name] = function (code) { - var s = Script(code); - return s[name].apply(s, [].slice.call(arguments, 1)); - }; - }); - - exports.createScript = function (code) { - return exports.Script(code); - }; + return lookahead; + } - exports.createContext = Script.createContext = function (context) { - var copy = new Context(); - if(typeof context === 'object') { - forEach(Object_keys(context), function (key) { - copy[key] = context[key]; - }); + // need to override how templates are lexed because of delimiters + scanTemplateElement() { + let startLocation = this.getLocation(); + let start = this.index; + while (this.index < this.source.length) { + let ch = this.source.charCodeAt(this.index); + switch (ch) { + case 0x60: + { + // ` + // don't include the traling "`" + let slice = this.getSlice(start, startLocation); + this.index++; + return { + type: _tokenizer.TokenType.TEMPLATE, + tail: true, + interp: false, + slice: slice + }; + } + case 0x24: + // $ + if (this.source.charCodeAt(this.index + 1) === 0x7B) { + // { + // don't include the trailing "$" + let slice = this.getSlice(start, startLocation); + this.index += 1; + return { + type: _tokenizer.TokenType.TEMPLATE, + tail: false, + interp: true, + slice: slice + }; + } + this.index++; + break; + case 0x5C: + // \\ + { + let octal = this.scanStringEscape("", null)[1]; + if (octal != null) { + throw this.createILLEGAL(); + } + break; + } + default: + this.index++; + } } - return copy; - }; - - -/***/ }, -/* 49 */ -/***/ function(module, exports) { - - - var indexOf = [].indexOf; - module.exports = function(arr, obj){ - if (indexOf) return arr.indexOf(obj); - for (var i = 0; i < arr.length; ++i) { - if (arr[i] === obj) return i; + throw this.createILLEGAL(); } - return -1; - }; + } + exports.default = Reader; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGlmdC1yZWFkZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7QUFFQTs7QUFDQTs7OztBQUNBOztJQUFZLEM7O0FBQ1o7O0FBQ0E7O0FBR0E7Ozs7Ozs7O0FBRkEsTUFBTSxPQUFPLG9CQUFNLElBQW5CO0FBQ0EsTUFBTSxVQUFVLG9CQUFNLE9BQXRCOzs7QUFHQSxNQUFNLFVBQVUsRUFBRSxNQUFNLGFBQVIsRUFBaEI7QUFDQSxNQUFNLFVBQVUsRUFBRSxNQUFNLGNBQVIsRUFBaEI7QUFDQSxNQUFNLEtBQUssRUFBRSxPQUFPLHNCQUFXLFVBQXBCLEVBQWdDLE1BQU0sR0FBdEMsRUFBWDs7QUFHQTtBQUNBLE1BQU0sa0JBQWtCLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsTUFBakIsRUFBeUIsT0FBekIsQ0FBeEI7O0FBRUE7QUFDQSxNQUFNLGdCQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0scUJBQVUsTUFBbEIsRUFBVixDQUF2QjtBQUNBLE1BQU0sY0FBaUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFVLE1BQWxCLEVBQVYsQ0FBdkI7QUFDQSxNQUFNLGNBQWlCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxxQkFBVSxNQUFsQixFQUFWLENBQXZCO0FBQ0EsTUFBTSxpQkFBaUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFVLE1BQWxCLEVBQVYsQ0FBdkI7QUFDQSxNQUFNLGVBQWlCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxxQkFBVSxNQUFsQixFQUFWLENBQXZCO0FBQ0EsTUFBTSxlQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0scUJBQVUsTUFBbEIsRUFBVixDQUF2Qjs7QUFFQSxNQUFNLFFBQVEsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFVLEdBQWxCLEVBQVYsQ0FBZDs7QUFFQTtBQUNBLE1BQU0sZUFBZSxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1B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anMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVG9rZW5pemVyIGZyb20gXCJzaGlmdC1wYXJzZXIvZGlzdC90b2tlbml6ZXJcIjtcbmltcG9ydCB7IFRva2VuQ2xhc3MsIFRva2VuVHlwZSB9IGZyb20gXCJzaGlmdC1wYXJzZXIvZGlzdC90b2tlbml6ZXJcIjtcbmltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0ICogYXMgUiBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBNYXliZSB9IGZyb20gJ3JhbWRhLWZhbnRhc3knO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi9lcnJvcnMnO1xuY29uc3QgSnVzdCA9IE1heWJlLkp1c3Q7XG5jb25zdCBOb3RoaW5nID0gTWF5YmUuTm90aGluZztcbmltcG9ydCBUZXJtIGZyb20gJy4vdGVybXMnO1xuXG5jb25zdCBMU1lOVEFYID0geyBuYW1lOiAnbGVmdC1zeW50YXgnIH07XG5jb25zdCBSU1lOVEFYID0geyBuYW1lOiAncmlnaHQtc3ludGF4JyB9O1xuY29uc3QgQVQgPSB7IGtsYXNzOiBUb2tlbkNsYXNzLlB1bmN0dWF0b3IsIG5hbWU6IFwiQFwiIH07XG5cblxuLy8gVE9ETzogYWxzbywgbmVlZCB0byBoYW5kbGUgY29udGV4dHVhbCB5aWVsZFxuY29uc3QgbGl0ZXJhbEtleXdvcmRzID0gWyd0aGlzJywgJ251bGwnLCAndHJ1ZScsICdmYWxzZSddO1xuXG4vLyBUb2tlbiAtPiBCb29sZWFuXG5jb25zdCBpc0xlZnRCcmFja2V0ICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5MQlJBQ0sgfSk7XG5jb25zdCBpc0xlZnRCcmFjZSAgICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5MQlJBQ0UgfSk7XG5jb25zdCBpc0xlZnRQYXJlbiAgICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5MUEFSRU4gfSk7XG5jb25zdCBpc1JpZ2h0QnJhY2tldCA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5SQlJBQ0sgfSk7XG5jb25zdCBpc1JpZ2h0QnJhY2UgICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5SQlJBQ0UgfSk7XG5jb25zdCBpc1JpZ2h0UGFyZW4gICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5SUEFSRU4gfSk7XG5cbmNvbnN0IGlzRU9TID0gUi53aGVyZUVxKHsgdHlwZTogVG9rZW5UeXBlLkVPUyB9KTtcblxuLy8gY29uc3QgaXNIYXNoID0gUi53aGVyZUVxKHsgdHlwZTogVG9rZW5UeXBlLklERU5USUZJRVIsIHZhbHVlOiAnIyd9KTtcbmNvbnN0IGlzTGVmdFN5bnRheCA9IFIud2hlcmVFcSh7IHR5cGU6IExTWU5UQVggfSk7XG5jb25zdCBpc1JpZ2h0U3ludGF4ID0gUi53aGVyZUVxKHsgdHlwZTogUlNZTlRBWCB9KTtcblxuY29uc3QgaXNMZWZ0RGVsaW1pdGVyID0gUi5hbnlQYXNzKFtpc0xlZnRCcmFja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xlZnRCcmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMZWZ0UGFyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVmdFN5bnRheF0pO1xuXG5jb25zdCBpc1JpZ2h0RGVsaW1pdGVyID0gUi5hbnlQYXNzKFtpc1JpZ2h0QnJhY2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmlnaHRCcmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmlnaHRQYXJlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmlnaHRTeW50YXhdKTtcblxuY29uc3QgaXNNYXRjaGluZ0RlbGltaXRlcnMgPSBSLmNvbmQoW1xuICBbaXNMZWZ0QnJhY2tldCwgKF8sIGIpID0+IGlzUmlnaHRCcmFja2V0KGIpXSxcbiAgW2lzTGVmdEJyYWNlLCAoXywgYikgPT4gaXNSaWdodEJyYWNlKGIpXSxcbiAgW2lzTGVmdFBhcmVuLCAoXywgYikgPT4gaXNSaWdodFBhcmVuKGIpXSxcbiAgW2lzTGVmdFN5bnRheCwgKF8sIGIpID0+IGlzUmlnaHRTeW50YXgoYildLFxuICBbUi5ULCBSLkZdXG5dKTtcblxuY29uc3QgYXNzaWduT3BzID0gIFtcIj1cIiwgXCIrPVwiLCBcIi09XCIsIFwiKj1cIiwgXCIvPVwiLCBcIiU9XCIsIFwiPDw9XCIsIFwiPj49XCIsIFwiPj4+PVwiLFxuICAgICAgICAgICAgICAgICAgXCImPVwiLCBcInw9XCIsIFwiXj1cIiwgXCIsXCJdO1xuXG5jb25zdCBiaW5hcnlPcHMgPSBbXCIrXCIsIFwiLVwiLCBcIipcIiwgXCIvXCIsIFwiJVwiLFwiPDxcIiwgXCI+PlwiLCBcIj4+PlwiLCBcIiZcIiwgXCJ8XCIsIFwiXlwiLFxuICAgICAgICAgICAgICAgICBcIiYmXCIsIFwifHxcIiwgXCI/XCIsIFwiOlwiLFxuICAgICAgICAgICAgICAgICBcIj09PVwiLCBcIj09XCIsIFwiPj1cIiwgXCI8PVwiLCBcIjxcIiwgXCI+XCIsIFwiIT1cIiwgXCIhPT1cIiwgXCJpbnN0YW5jZW9mXCJdO1xuXG5jb25zdCB1bmFyeU9wcyA9IFtcIisrXCIsIFwiLS1cIiwgXCJ+XCIsIFwiIVwiLCBcImRlbGV0ZVwiLCBcInZvaWRcIiwgXCJ0eXBlb2ZcIiwgXCJ5aWVsZFwiLCBcInRocm93XCIsIFwibmV3XCJdO1xuXG4vLyBMaXN0IC0+IEJvb2xlYW5cbmNvbnN0IGlzRW1wdHkgPSBSLndoZXJlRXEoe3NpemU6IDB9KTtcblxuLy8gU3ludGF4IC0+IEJvb2xlYW5cbmNvbnN0IGlzUHVuY3R1YXRvciA9IHMgPT4gcy5tYXRjaChcInB1bmN0dWF0b3JcIik7XG5jb25zdCBpc0tleXdvcmQgPSBzID0+IHMubWF0Y2goXCJrZXl3b3JkXCIpO1xuY29uc3QgaXNQYXJlbnMgPSBzID0+IHMubWF0Y2goXCJwYXJlbnNcIik7XG5jb25zdCBpc0JyYWNlcyA9IHMgPT4gcy5tYXRjaChcImJyYWNlc1wiKTtcbmNvbnN0IGlzSWRlbnRpZmllciA9IHMgPT4gcy5tYXRjaChcImlkZW50aWZpZXJcIik7XG5cbi8vIEFueSAtPiBTeW50YXggLT4gQm9vbGVhblxuY29uc3QgaXNWYWwgPSBSLmN1cnJ5KCh2LCBzKSA9PiBzLnZhbCgpID09PSB2KTtcblxuLy8gU3ludGF4IC0+IEJvb2xlYW5cbmNvbnN0IGlzRG90ID0gUi5hbGxQYXNzKFtpc1B1bmN0dWF0b3IsIGlzVmFsKCcuJyldKTtcbmNvbnN0IGlzQ29sb24gPSBSLmFsbFBhc3MoW2lzUHVuY3R1YXRvciwgaXNWYWwoJzonKV0pO1xuY29uc3QgaXNGdW5jdGlvbktleXdvcmQgPSBSLmFsbFBhc3MoW2lzS2V5d29yZCwgaXNWYWwoJ2Z1bmN0aW9uJyldKTtcbmNvbnN0IGlzT3BlcmF0b3IgPSBzID0+IChzLm1hdGNoKFwicHVuY3R1YXRvclwiKSB8fCBzLm1hdGNoKFwia2V5d29yZFwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hbnkoUi5lcXVhbHMocy52YWwoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbk9wcy5jb25jYXQoYmluYXJ5T3BzKS5jb25jYXQodW5hcnlPcHMpKTtcbmNvbnN0IGlzTm9uTGl0ZXJhbEtleXdvcmQgPSBSLmFsbFBhc3MoW2lzS2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPT4gUi5ub25lKFIuZXF1YWxzKHMudmFsKCkpLCBsaXRlcmFsS2V5d29yZHMpXSk7XG5jb25zdCBpc0tleXdvcmRFeHByUHJlZml4ID0gUi5hbGxQYXNzKFtpc0tleXdvcmQsXG4gIHMgPT4gUi5hbnkoUi5lcXVhbHMocy52YWwoKSksIFsnaW5zdGFuY2VvZicsICd0eXBlb2YnLCAnZGVsZXRlJywgJ3ZvaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5aWVsZCcsICd0aHJvdycsICduZXcnLCAnY2FzZSddKV0pO1xuLy8gTGlzdCBhIC0+IGE/XG5sZXQgbGFzdCA9IHAgPT4gcC5sYXN0KCk7XG4vLyBMaXN0IGEgLT4gTWF5YmUgYVxubGV0IHNhZmVMYXN0ID0gUi5waXBlKFIuY29uZChbXG4gIFtpc0VtcHR5LCBSLmFsd2F5cyhOb3RoaW5nKCkpXSxcbiAgW1IuVCwgUi5jb21wb3NlKE1heWJlLm9mLCBsYXN0KV1cbl0pKTtcblxuLy8gVE9ETzogYmV0dGVyIG5hbWVcbi8vIExpc3QgLT4gQm9vbGVhbiAtPiBNYXliZSBMaXN0XG5sZXQgc3R1ZmZUcnVlID0gUi5jdXJyeSgocCwgYikgPT4gYiA/IEp1c3QocCkgOiBOb3RoaW5nKCkpO1xubGV0IHN0dWZmRmFsc2UgPSBSLmN1cnJ5KChwLCBiKSA9PiAhYiA/IEp1c3QocCkgOiBOb3RoaW5nKCkpO1xuXG4vLyBMaXN0IGEgLT4gQm9vbGVhblxubGV0IGlzVG9wQ29sb24gPSBSLnBpcGUoXG4gIHNhZmVMYXN0LFxuICBSLm1hcChpc0NvbG9uKSxcbiAgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpXG4pO1xuLy8gTGlzdCBhIC0+IEJvb2xlYW5cbmxldCBpc1RvcFB1bmN0dWF0b3IgPSBSLnBpcGUoXG4gIHNhZmVMYXN0LFxuICBSLm1hcChpc1B1bmN0dWF0b3IpLFxuICBNYXliZS5tYXliZShmYWxzZSwgUi5pZGVudGl0eSlcbik7XG5cbi8vIE51bWJlciAtPiBMaXN0IC0+IEJvb2xlYW5cbmxldCBpc0V4cHJSZXR1cm4gPSBSLmN1cnJ5KChsLCBwKSA9PiB7XG4gIGxldCByZXRLd2QgPSBzYWZlTGFzdChwKTtcbiAgbGV0IG1heWJlRG90ID0gcG9wKHApLmNoYWluKHNhZmVMYXN0KTtcblxuICBpZiAobWF5YmVEb3QubWFwKGlzRG90KS5nZXRPckVsc2UoZmFsc2UpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHJldEt3ZC5tYXAocyA9PiB7XG4gICAgcmV0dXJuIHMubWF0Y2goXCJrZXl3b3JkXCIpICYmIHMudmFsKCkgPT09ICdyZXR1cm4nICYmIHMubGluZU51bWJlcigpID09PSBsO1xuICB9KS5nZXRPckVsc2UoZmFsc2UpO1xufSk7XG5cbmNvbnN0IGlzVG9wT3BlcmF0b3IgPSBSLnBpcGUoXG4gIHNhZmVMYXN0LFxuICBSLm1hcChpc09wZXJhdG9yKSxcbiAgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpXG4pO1xuXG5jb25zdCBpc1RvcEtleXdvcmRFeHByUHJlZml4ID0gUi5waXBlKFxuICBzYWZlTGFzdCxcbiAgUi5tYXAoaXNLZXl3b3JkRXhwclByZWZpeCksXG4gIE1heWJlLm1heWJlKGZhbHNlLCBSLmlkZW50aXR5KVxuKTtcblxuLy8gTnVtYmVyIC0+IEJvb2xlYW4gLT4gTGlzdCAtPiBCb29sZWFuXG5sZXQgaXNFeHByUHJlZml4ID0gUi5jdXJyeSgobCwgYikgPT4gUi5jb25kKFtcbiAgLy8gLi4uICh7eDogNDJ9IC9yL2kpXG4gIFtpc0VtcHR5LCBSLmFsd2F5cyhiKV0sXG4gIC8vIC4uLiAoe3g6IHt4OiA0Mn0gL3IvaSB9KVxuICBbaXNUb3BDb2xvbiwgUi5hbHdheXMoYildLFxuICAvLyAuLi4gdGhyb3cge3g6IDQyfSAvci9pXG4gIFtpc1RvcEtleXdvcmRFeHByUHJlZml4LCBSLlRdLFxuICAvLyAuLi4gNDIgKyB7eDogNDJ9IC9yL2lcbiAgW2lzVG9wT3BlcmF0b3IsIFIuVF0sXG4gIC8vIC4uLiBmb3IgKCA7IHt4OiA0Mn0vci9pKVxuICBbaXNUb3BQdW5jdHVhdG9yLCBSLmFsd2F5cyhiKV0sXG4gIC8vIC4uLiByZXR1cm4ge3g6IDQyfSAvciAvaVxuICAvLyAuLi4gcmV0dXJuXFxue3g6IDQyfSAvciAvaVxuICBbaXNFeHByUmV0dXJuKGwpLCBSLlRdLFxuICBbUi5ULCBSLkZdLFxuXSkpO1xuXG4vLyBMaXN0IGEgLT4gTWF5YmUgTGlzdCBhXG5sZXQgY3VybHkgPSBwID0+IHNhZmVMYXN0KHApLm1hcChpc0JyYWNlcykuY2hhaW4oc3R1ZmZUcnVlKHApKTtcbmxldCBwYXJlbiA9IHAgPT4gc2FmZUxhc3QocCkubWFwKGlzUGFyZW5zKS5jaGFpbihzdHVmZlRydWUocCkpO1xubGV0IGZ1bmMgPSBwID0+IHNhZmVMYXN0KHApLm1hcChpc0Z1bmN0aW9uS2V5d29yZCkuY2hhaW4oc3R1ZmZUcnVlKHApKTtcbmxldCBpZGVudCA9IHAgPT4gc2FmZUxhc3QocCkubWFwKGlzSWRlbnRpZmllcikuY2hhaW4oc3R1ZmZUcnVlKHApKTtcbmxldCBub25MaXRlcmFsS2V5d29yZCA9IHAgPT4gc2FmZUxhc3QocCkubWFwKGlzTm9uTGl0ZXJhbEtleXdvcmQpLmNoYWluKHN0dWZmVHJ1ZShwKSk7XG5cbmxldCBvcHQgPSBSLmN1cnJ5KChhLCBiLCBwKSA9PiB7XG4gIGxldCByZXN1bHQgPSBSLnBpcGVLKGEsIGIpKE1heWJlLm9mKHApKTtcbiAgcmV0dXJuIE1heWJlLmlzSnVzdChyZXN1bHQpID8gcmVzdWx0IDogTWF5YmUub2YocCk7XG59KTtcblxubGV0IG5vdERvdCA9IFIuaWZFbHNlKFxuICBSLndoZXJlRXEoe3NpemU6IDB9KSxcbiAgSnVzdCxcbiAgcCA9PiBzYWZlTGFzdChwKS5tYXAocyA9PiAhKHMubWF0Y2goXCJwdW5jdHVhdG9yXCIpICYmIHMudmFsKCkgPT09ICcuJykpLmNoYWluKHN0dWZmVHJ1ZShwKSlcbik7XG5cbi8vIExpc3QgYSAtPiBNYXliZSBMaXN0IGFcbmxldCBwb3AgPSBSLmNvbXBvc2UoSnVzdCwgcCA9PiBwLnBvcCgpKTtcblxuLy8gTWF5YmUgTGlzdCBhIC0+IE1heWJlIExpc3QgYVxuY29uc3QgZnVuY3Rpb25QcmVmaXggPSBSLnBpcGVLKFxuICAgIGN1cmx5LFxuICAgIHBvcCxcbiAgICBwYXJlbixcbiAgICBwb3AsXG4gICAgb3B0KGlkZW50LCBwb3ApLFxuICAgIGZ1bmMpO1xuXG4vLyBCb29sZWFuIC0+IExpc3QgYSAtPiBCb29sZWFuXG5jb25zdCBpc1JlZ2V4UHJlZml4ID0gYiA9PiBSLmFueVBhc3MoW1xuICAvLyDOtVxuICBpc0VtcHR5LFxuICAvLyBQIC4gdCAgIHdoZXJlIHQg4oiIIFB1bmN0dWF0b3JcbiAgaXNUb3BQdW5jdHVhdG9yLFxuICAvLyBQIC4gdCAuIHQnICB3aGVyZSB0IFxcbm90ID0gXCIuXCIgYW5kIHQnIOKIiCAoS2V5d29yZCBcXHNldG1pbnVzICBMaXRlcmFsS2V5d29yZClcbiAgUi5waXBlKFxuICAgIE1heWJlLm9mLFxuICAgIFIucGlwZUsoXG4gICAgICBub25MaXRlcmFsS2V5d29yZCxcbiAgICAgIHBvcCxcbiAgICAgIG5vdERvdFxuICAgICksXG4gICAgTWF5YmUuaXNKdXN0XG4gICksXG4gIC8vIFAgLiB0IC4gdCcgLiAoVCkgIHdoZXJlIHQgXFxub3QgPSBcIi5cIiBhbmQgdCcg4oiIIChLZXl3b3JkIFxcc2V0bWludXMgTGl0ZXJhbEtleXdvcmQpXG4gIFIucGlwZShcbiAgICBNYXliZS5vZixcbiAgICBSLnBpcGVLKFxuICAgICAgcGFyZW4sXG4gICAgICBwb3AsXG4gICAgICBub25MaXRlcmFsS2V5d29yZCxcbiAgICAgIHBvcCxcbiAgICAgIG5vdERvdFxuICAgICksXG4gICAgTWF5YmUuaXNKdXN0XG4gICksXG4gIC8vIFAgLiBmdW5jdGlvbl5sIC4geD8gLiAoKSAuIHt9ICAgICB3aGVyZSBpc0V4cHJQcmVmaXgoUCwgYiwgbCkgPSBmYWxzZVxuICBSLnBpcGUoXG4gICAgTWF5YmUub2YsXG4gICAgZnVuY3Rpb25QcmVmaXgsXG4gICAgUi5jaGFpbihwID0+IHtcbiAgICAgICAgcmV0dXJuIHNhZmVMYXN0KHApXG4gICAgICAgICAgLm1hcChzID0+IHMubGluZU51bWJlcigpKVxuICAgICAgICAgIC5jaGFpbihmbkxpbmUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHBvcChwKS5tYXAoaXNFeHByUHJlZml4KGZuTGluZSwgYikpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNoYWluKHN0dWZmRmFsc2UocCkpO1xuICAgICAgfVxuICAgICksXG4gICAgTWF5YmUuaXNKdXN0XG4gICksXG4gIC8vIFAgLiB7VH1ebCAgd2hlcmUgaXNFeHByUHJlZml4KFAsIGIsIGwpID0gZmFsc2VcbiAgcCA9PiB7XG4gICAgbGV0IGFscmVhZHlDaGVja2VkRnVuY3Rpb24gPSBSLnBpcGUoXG4gICAgICBNYXliZS5vZixcbiAgICAgIGZ1bmN0aW9uUHJlZml4LFxuICAgICAgTWF5YmUuaXNKdXN0XG4gICAgKShwKTtcbiAgICBpZiAoYWxyZWFkeUNoZWNrZWRGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gUi5waXBlKFxuICAgICAgTWF5YmUub2YsXG4gICAgICBSLmNoYWluKGN1cmx5KSxcbiAgICAgIFIuY2hhaW4ocCA9PiB7XG4gICAgICAgIHJldHVybiBzYWZlTGFzdChwKVxuICAgICAgICAubWFwKHMgPT4gcy5saW5lTnVtYmVyKCkpXG4gICAgICAgIC5jaGFpbihjdXJseUxpbmUgPT4ge1xuICAgICAgICAgIHJldHVybiBwb3AocCkubWFwKGlzRXhwclByZWZpeChjdXJseUxpbmUsIGIpKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNoYWluKHN0dWZmRmFsc2UocCkpO1xuICAgICAgfSksXG4gICAgICBNYXliZS5pc0p1c3RcbiAgICApKHApO1xuICB9XG5cblxuXSk7XG5cbmZ1bmN0aW9uIGxhc3RFbChsKSB7XG4gIHJldHVybiBsW2wubGVuZ3RoIC0gMV07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlYWRlciBleHRlbmRzIFRva2VuaXplciB7XG4gIGNvbnN0cnVjdG9yKHN0cmluZ3MsIGNvbnRleHQsIHJlcGxhY2VtZW50cykge1xuICAgIHN1cGVyKEFycmF5LmlzQXJyYXkoc3RyaW5ncykgPyBzdHJpbmdzLmpvaW4oJycpIDogc3RyaW5ncyk7XG4gICAgdGhpcy5kZWxpbVN0YWNrID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUgPSBbZmFsc2VdO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICAvLyBzZXR1cCBzcGxpY2luZyByZXBsYWNlbWVudCBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KHN0cmluZ3MpKSB7XG4gICAgICBsZXQgdG90YWxJbmRleCA9IDA7XG4gICAgICB0aGlzLnJlcGxhY2VtZW50SW5kZXggPSBSLnJlZHVjZSgoYWNjLCBzdHJSZXApID0+IHtcbiAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgIGluZGV4OiB0b3RhbEluZGV4ICsgc3RyUmVwWzBdLmxlbmd0aCxcbiAgICAgICAgICByZXBsYWNlbWVudDogc3RyUmVwWzFdXG4gICAgICAgIH0pO1xuICAgICAgICB0b3RhbEluZGV4ICs9IHN0clJlcFswXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSwgUi56aXAoc3RyaW5ncywgcmVwbGFjZW1lbnRzKSk7XG4gICAgfVxuICB9XG5cbiAgcmVhZChzdGFjayA9IFtdLCBiID0gZmFsc2UsIHNpbmdsZURlbGltaXRlciA9IGZhbHNlKSB7XG4gICAgbGV0IHByZWZpeCA9IExpc3QoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IHRvayA9IHRoaXMuYWR2YW5jZShwcmVmaXgsIGIpO1xuXG4gICAgICAvLyBzcGxpY2luZyBhbGxvd3Mgc3ludGF4IGFuZCB0ZXJtc1xuICAgICAgaWYgKHRvay5zY29wZXNldHMgfHwgdG9rIGluc3RhbmNlb2YgVGVybSkge1xuICAgICAgICBzdGFjay5wdXNoKHRvayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9rKSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzdGFjaywgdG9rKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoTGlzdC5pc0xpc3QodG9rKSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzdGFjaywgdG9rLnRvQXJyYXkoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFT1ModG9rKSkge1xuICAgICAgICBpZiAoc3RhY2tbMF0gJiYgaXNMZWZ0RGVsaW1pdGVyKHN0YWNrWzBdLnRva2VuKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5leHBlY3RlZCh0b2spO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMZWZ0RGVsaW1pdGVyKHRvaykpIHtcbiAgICAgICAgaWYgKGlzTGVmdFN5bnRheCh0b2spKSB7XG4gICAgICAgICAgdGhpcy5pbnNpZGVTeW50YXhUZW1wbGF0ZS5wdXNoKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gdG9rLnNsaWNlLnN0YXJ0TG9jYXRpb24ubGluZTtcbiAgICAgICAgbGV0IGlubmVyQiA9IGlzTGVmdEJyYWNlKHRvaykgPyBpc0V4cHJQcmVmaXgobGluZSwgYikocHJlZml4KSA6IHRydWU7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMucmVhZChbbmV3IFN5bnRheCh0b2ssIHRoaXMuY29udGV4dCldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJCLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpO1xuICAgICAgICBsZXQgc3R4ID0gbmV3IFN5bnRheChpbm5lciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgcHJlZml4ID0gcHJlZml4LmNvbmNhdChzdHgpO1xuICAgICAgICBzdGFjay5wdXNoKHN0eCk7XG4gICAgICAgIGlmIChzaW5nbGVEZWxpbWl0ZXIpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1JpZ2h0RGVsaW1pdGVyKHRvaykpIHtcbiAgICAgICAgaWYgKHN0YWNrWzBdICYmICFpc01hdGNoaW5nRGVsaW1pdGVycyhzdGFja1swXS50b2tlbiwgdG9rKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5leHBlY3RlZCh0b2spO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdHggPSBuZXcgU3ludGF4KHRvaywgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgc3RhY2sucHVzaChzdHgpO1xuICAgICAgICBpZiAobGFzdEVsKHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUpICYmIGlzUmlnaHRTeW50YXgodG9rKSkge1xuICAgICAgICAgIHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgc3R4ID0gbmV3IFN5bnRheCh0b2ssIHRoaXMuY29udGV4dCk7XG4gICAgICAgIHByZWZpeCA9IHByZWZpeC5jb25jYXQoc3R4KTtcbiAgICAgICAgc3RhY2sucHVzaChzdHgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTGlzdChzdGFjayk7XG4gIH1cblxuICBhZHZhbmNlKHByZWZpeCwgYikge1xuICAgIHRoaXMubGFzdEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmxhc3RMaW5lID0gdGhpcy5saW5lO1xuICAgIHRoaXMubGFzdExpbmVTdGFydCA9IHRoaXMubGluZVN0YXJ0O1xuXG4gICAgdGhpcy5za2lwQ29tbWVudCgpO1xuXG4gICAgdGhpcy5zdGFydEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLnN0YXJ0TGluZSA9IHRoaXMubGluZTtcbiAgICB0aGlzLnN0YXJ0TGluZVN0YXJ0ID0gdGhpcy5saW5lU3RhcnQ7XG5cbiAgICBpZiAodGhpcy5yZXBsYWNlbWVudEluZGV4ICYmIHRoaXMucmVwbGFjZW1lbnRJbmRleFswXSAmJiB0aGlzLmluZGV4ID49IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5pbmRleCkge1xuICAgICAgbGV0IHJlcCA9IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5yZXBsYWNlbWVudDtcbiAgICAgIHRoaXMucmVwbGFjZW1lbnRJbmRleC5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHJlcDtcbiAgICB9XG5cbiAgICBsZXQgY2hhckNvZGUgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJDb2RlID09PSAweDYwKSB7IC8vIGBcbiAgICAgIGxldCBlbGVtZW50LCBpdGVtcyA9IFtdO1xuICAgICAgbGV0IHN0YXJ0TG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgICBsZXQgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgaWYgKGxhc3RFbCh0aGlzLmluc2lkZVN5bnRheFRlbXBsYXRlKSkge1xuXG4gICAgICAgIGxldCBzbGljZSA9IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb24pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFJTWU5UQVgsXG4gICAgICAgICAgdmFsdWU6ICdgJyxcbiAgICAgICAgICBzbGljZTogc2xpY2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGRvIHtcbiAgICAgICAgZWxlbWVudCA9IHRoaXMuc2NhblRlbXBsYXRlRWxlbWVudCgpO1xuICAgICAgICBpdGVtcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICBpZiAoZWxlbWVudC5pbnRlcnApIHtcbiAgICAgICAgICAvLyBvbmx5IHJlYWQgdGhlIHNpbmdsZSBkZWxpbWl0ZXJcbiAgICAgICAgICBlbGVtZW50ID0gdGhpcy5yZWFkKFtdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgYXNzZXJ0KGVsZW1lbnQuc2l6ZSA9PT0gMSwgXCJzaG91bGQgb25seSBoYXZlIHJlYWQgYSBzaW5nbGUgZGVsaW1pdGVyIGluc2lkZSBhIHRlbXBsYXRlXCIpO1xuICAgICAgICAgIGl0ZW1zLnB1c2goZWxlbWVudC5nZXQoMCkpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICghZWxlbWVudC50YWlsKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFRva2VuVHlwZS5URU1QTEFURSxcbiAgICAgICAgaXRlbXM6IExpc3QoaXRlbXMpLFxuICAgICAgICBzbGljZTogdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbilcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjaGFyQ29kZSA9PT0gMzUpIHsgLy8gI1xuICAgICAgbGV0IHN0YXJ0TG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgICBsZXQgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbik7XG4gICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAvLyBUT0RPOiBoYW5kbGUgYCBpbnNpZGUgb2Ygc3ludGF4IHRlbXBsYXRlIGludGVycG9sYXRpb25zXG4gICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSA9PT0gMHg2MCkgeyAvLyBgXG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBMU1lOVEFYLFxuICAgICAgICAgIHZhbHVlOiAnI2AnLFxuICAgICAgICAgIHNsaWNlOiBzbGljZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLklERU5USUZJRVIsXG4gICAgICAgIHZhbHVlOiAnIycsXG4gICAgICAgIHNsaWNlOiBzbGljZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09PSA2NCkgeyAvLyBAXG4gICAgICBsZXQgc3RhcnRMb2NhdGlvbiA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICBsZXQgc2xpY2UgPSB0aGlzLmdldFNsaWNlKHN0YXJ0LCBzdGFydExvY2F0aW9uKTtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IEFULFxuICAgICAgICB2YWx1ZTogJ0AnLFxuICAgICAgICBzbGljZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgbG9va2FoZWFkID0gc3VwZXIuYWR2YW5jZSgpO1xuICAgIGlmIChsb29rYWhlYWQudHlwZSA9PT0gVG9rZW5UeXBlLkRJViAmJiBpc1JlZ2V4UHJlZml4KGIpKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiBzdXBlci5zY2FuUmVnRXhwKFwiL1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2thaGVhZDtcbiAgfVxuXG4gIC8vIG5lZWQgdG8gb3ZlcnJpZGUgaG93IHRlbXBsYXRlcyBhcmUgbGV4ZWQgYmVjYXVzZSBvZiBkZWxpbWl0ZXJzXG4gIHNjYW5UZW1wbGF0ZUVsZW1lbnQoKSB7XG4gICAgbGV0IHN0YXJ0TG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCkge1xuICAgICAgbGV0IGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcbiAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgY2FzZSAweDYwOiB7IC8vIGBcbiAgICAgICAgICAvLyBkb24ndCBpbmNsdWRlIHRoZSB0cmFsaW5nIFwiYFwiXG4gICAgICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbik7XG4gICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuVEVNUExBVEUsXG4gICAgICAgICAgICB0YWlsOiB0cnVlLFxuICAgICAgICAgICAgaW50ZXJwOiBmYWxzZSxcbiAgICAgICAgICAgIHNsaWNlOiBzbGljZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAweDI0OiAgLy8gJFxuICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSA9PT0gMHg3QikgeyAgLy8ge1xuICAgICAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSB0aGUgdHJhaWxpbmcgXCIkXCJcbiAgICAgICAgICAgIGxldCBzbGljZSA9IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLlRFTVBMQVRFLFxuICAgICAgICAgICAgICB0YWlsOiBmYWxzZSxcbiAgICAgICAgICAgICAgaW50ZXJwOiB0cnVlLFxuICAgICAgICAgICAgICBzbGljZTogc2xpY2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDVDOiAgLy8gXFxcXFxuICAgICAgICB7XG4gICAgICAgICAgbGV0IG9jdGFsID0gdGhpcy5zY2FuU3RyaW5nRXNjYXBlKFwiXCIsIG51bGwpWzFdO1xuICAgICAgICAgIGlmIChvY3RhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUlMTEVHQUwoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgdGhpcy5jcmVhdGVJTExFR0FMKCk7XG4gIH1cbn1cbiJdfQ== /***/ }, -/* 50 */ +/* 43 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -30531,2614 +29014,2416 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack Object.defineProperty(exports, "__esModule", { value: true }); + exports.JsError = exports.TokenType = exports.TokenClass = undefined; - var _immutable = __webpack_require__(11); - - var _enforester = __webpack_require__(51); - - var _termExpander = __webpack_require__(54); - - var _termExpander2 = _interopRequireDefault(_termExpander); - - var _bindingMap = __webpack_require__(14); + 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"); } }; }(); - var _bindingMap2 = _interopRequireDefault(_bindingMap); + 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; }; }(); - var _env = __webpack_require__(31); + var _utils = __webpack_require__(44); - var _env2 = _interopRequireDefault(_env); + var _errors = __webpack_require__(45); - var _shiftReader = __webpack_require__(3); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var _shiftReader2 = _interopRequireDefault(_shiftReader); + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - var _terms = __webpack_require__(28); + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * 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. + */ - var _terms2 = _interopRequireDefault(_terms); + var TokenClass = exports.TokenClass = { + Eof: { name: "" }, + Ident: { name: "Identifier", isIdentifierName: true }, + Keyword: { name: "Keyword", isIdentifierName: true }, + NumericLiteral: { name: "Numeric" }, + TemplateElement: { name: "Template" }, + Punctuator: { name: "Punctuator" }, + StringLiteral: { name: "String" }, + RegularExpression: { name: "RegularExpression" }, + Illegal: { name: "Illegal" } + }; - var _symbol = __webpack_require__(45); + var TokenType = exports.TokenType = { + EOS: { klass: TokenClass.Eof, name: "EOS" }, + LPAREN: { klass: TokenClass.Punctuator, name: "(" }, + RPAREN: { klass: TokenClass.Punctuator, name: ")" }, + LBRACK: { klass: TokenClass.Punctuator, name: "[" }, + RBRACK: { klass: TokenClass.Punctuator, name: "]" }, + LBRACE: { klass: TokenClass.Punctuator, name: "{" }, + RBRACE: { klass: TokenClass.Punctuator, name: "}" }, + COLON: { klass: TokenClass.Punctuator, name: ":" }, + SEMICOLON: { klass: TokenClass.Punctuator, name: ";" }, + PERIOD: { klass: TokenClass.Punctuator, name: "." }, + ELLIPSIS: { klass: TokenClass.Punctuator, name: "..." }, + ARROW: { klass: TokenClass.Punctuator, name: "=>" }, + CONDITIONAL: { klass: TokenClass.Punctuator, name: "?" }, + INC: { klass: TokenClass.Punctuator, name: "++" }, + DEC: { klass: TokenClass.Punctuator, name: "--" }, + ASSIGN: { klass: TokenClass.Punctuator, name: "=" }, + ASSIGN_BIT_OR: { klass: TokenClass.Punctuator, name: "|=" }, + ASSIGN_BIT_XOR: { klass: TokenClass.Punctuator, name: "^=" }, + ASSIGN_BIT_AND: { klass: TokenClass.Punctuator, name: "&=" }, + ASSIGN_SHL: { klass: TokenClass.Punctuator, name: "<<=" }, + ASSIGN_SHR: { klass: TokenClass.Punctuator, name: ">>=" }, + ASSIGN_SHR_UNSIGNED: { klass: TokenClass.Punctuator, name: ">>>=" }, + ASSIGN_ADD: { klass: TokenClass.Punctuator, name: "+=" }, + ASSIGN_SUB: { klass: TokenClass.Punctuator, name: "-=" }, + ASSIGN_MUL: { klass: TokenClass.Punctuator, name: "*=" }, + ASSIGN_DIV: { klass: TokenClass.Punctuator, name: "/=" }, + ASSIGN_MOD: { klass: TokenClass.Punctuator, name: "%=" }, + COMMA: { klass: TokenClass.Punctuator, name: "," }, + OR: { klass: TokenClass.Punctuator, name: "||" }, + AND: { klass: TokenClass.Punctuator, name: "&&" }, + BIT_OR: { klass: TokenClass.Punctuator, name: "|" }, + BIT_XOR: { klass: TokenClass.Punctuator, name: "^" }, + BIT_AND: { klass: TokenClass.Punctuator, name: "&" }, + SHL: { klass: TokenClass.Punctuator, name: "<<" }, + SHR: { klass: TokenClass.Punctuator, name: ">>" }, + SHR_UNSIGNED: { klass: TokenClass.Punctuator, name: ">>>" }, + ADD: { klass: TokenClass.Punctuator, name: "+" }, + SUB: { klass: TokenClass.Punctuator, name: "-" }, + MUL: { klass: TokenClass.Punctuator, name: "*" }, + DIV: { klass: TokenClass.Punctuator, name: "/" }, + MOD: { klass: TokenClass.Punctuator, name: "%" }, + EQ: { klass: TokenClass.Punctuator, name: "==" }, + NE: { klass: TokenClass.Punctuator, name: "!=" }, + EQ_STRICT: { klass: TokenClass.Punctuator, name: "===" }, + NE_STRICT: { klass: TokenClass.Punctuator, name: "!==" }, + LT: { klass: TokenClass.Punctuator, name: "<" }, + GT: { klass: TokenClass.Punctuator, name: ">" }, + LTE: { klass: TokenClass.Punctuator, name: "<=" }, + GTE: { klass: TokenClass.Punctuator, name: ">=" }, + INSTANCEOF: { klass: TokenClass.Keyword, name: "instanceof" }, + IN: { klass: TokenClass.Keyword, name: "in" }, + NOT: { klass: TokenClass.Punctuator, name: "!" }, + BIT_NOT: { klass: TokenClass.Punctuator, name: "~" }, + AWAIT: { klass: TokenClass.Keyword, name: "await" }, + DELETE: { klass: TokenClass.Keyword, name: "delete" }, + TYPEOF: { klass: TokenClass.Keyword, name: "typeof" }, + VOID: { klass: TokenClass.Keyword, name: "void" }, + BREAK: { klass: TokenClass.Keyword, name: "break" }, + CASE: { klass: TokenClass.Keyword, name: "case" }, + CATCH: { klass: TokenClass.Keyword, name: "catch" }, + CLASS: { klass: TokenClass.Keyword, name: "class" }, + CONTINUE: { klass: TokenClass.Keyword, name: "continue" }, + DEBUGGER: { klass: TokenClass.Keyword, name: "debugger" }, + DEFAULT: { klass: TokenClass.Keyword, name: "default" }, + DO: { klass: TokenClass.Keyword, name: "do" }, + ELSE: { klass: TokenClass.Keyword, name: "else" }, + EXPORT: { klass: TokenClass.Keyword, name: "export" }, + EXTENDS: { klass: TokenClass.Keyword, name: "extends" }, + FINALLY: { klass: TokenClass.Keyword, name: "finally" }, + FOR: { klass: TokenClass.Keyword, name: "for" }, + FUNCTION: { klass: TokenClass.Keyword, name: "function" }, + IF: { klass: TokenClass.Keyword, name: "if" }, + IMPORT: { klass: TokenClass.Keyword, name: "import" }, + LET: { klass: TokenClass.Keyword, name: "let" }, + NEW: { klass: TokenClass.Keyword, name: "new" }, + RETURN: { klass: TokenClass.Keyword, name: "return" }, + SUPER: { klass: TokenClass.Keyword, name: "super" }, + SWITCH: { klass: TokenClass.Keyword, name: "switch" }, + THIS: { klass: TokenClass.Keyword, name: "this" }, + THROW: { klass: TokenClass.Keyword, name: "throw" }, + TRY: { klass: TokenClass.Keyword, name: "try" }, + VAR: { klass: TokenClass.Keyword, name: "var" }, + WHILE: { klass: TokenClass.Keyword, name: "while" }, + WITH: { klass: TokenClass.Keyword, name: "with" }, + NULL: { klass: TokenClass.Keyword, name: "null" }, + TRUE: { klass: TokenClass.Keyword, name: "true" }, + FALSE: { klass: TokenClass.Keyword, name: "false" }, + YIELD: { klass: TokenClass.Keyword, name: "yield" }, + NUMBER: { klass: TokenClass.NumericLiteral, name: "" }, + STRING: { klass: TokenClass.StringLiteral, name: "" }, + REGEXP: { klass: TokenClass.RegularExpression, name: "" }, + IDENTIFIER: { klass: TokenClass.Ident, name: "" }, + CONST: { klass: TokenClass.Keyword, name: "const" }, + TEMPLATE: { klass: TokenClass.TemplateElement, name: "" }, + ILLEGAL: { klass: TokenClass.Illegal, name: "" } + }; - var _transforms = __webpack_require__(32); + var TT = TokenType; + var I = TT.ILLEGAL; + var F = false; + var T = true; - var _errors = __webpack_require__(13); + var ONE_CHAR_PUNCTUATOR = [I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, TT.NOT, I, I, I, TT.MOD, TT.BIT_AND, I, TT.LPAREN, TT.RPAREN, TT.MUL, TT.ADD, TT.COMMA, TT.SUB, TT.PERIOD, TT.DIV, I, I, I, I, I, I, I, I, I, I, TT.COLON, TT.SEMICOLON, TT.LT, TT.ASSIGN, TT.GT, TT.CONDITIONAL, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, TT.LBRACK, I, TT.RBRACK, TT.BIT_XOR, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, TT.LBRACE, TT.BIT_OR, TT.RBRACE, TT.BIT_NOT]; - var _loadSyntax = __webpack_require__(53); + var PUNCTUATOR_START = [F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, T, T, F, T, T, T, T, T, T, F, T, F, F, F, F, F, F, F, F, F, F, T, T, T, T, T, T, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, F, T, T, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, T, T, T, F]; - var _scope = __webpack_require__(44); + var JsError = exports.JsError = function (_Error) { + _inherits(JsError, _Error); - var _syntax = __webpack_require__(12); + function JsError(index, line, column, msg) { + _classCallCheck(this, JsError); - var _syntax2 = _interopRequireDefault(_syntax); + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(JsError).call(this, msg)); - var _astDispatcher = __webpack_require__(64); + _this.index = index; + _this.line = line; + _this.column = column; + _this.description = msg; + _this.message = "[" + line + ":" + column + "]: " + msg; + return _this; + } - var _astDispatcher2 = _interopRequireDefault(_astDispatcher); + return JsError; + }(Error); - var _hygieneUtils = __webpack_require__(67); + function fromCodePoint(cp) { + if (cp <= 0xFFFF) return String.fromCharCode(cp); + var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); + var cu2 = String.fromCharCode((cp - 0x10000) % 0x400 + 0xDC00); + return cu1 + cu2; + } - var _ramda = __webpack_require__(27); + function decodeUtf16(lead, trail) { + return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; + } - var _ = _interopRequireWildcard(_ramda); + var Tokenizer = function () { + function Tokenizer(source) { + _classCallCheck(this, Tokenizer); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function bindImports_1372(impTerm_1375, exModule_1376, context_1377) { - let names_1378 = []; - let phase_1379 = impTerm_1375.forSyntax ? context_1377.phase + 1 : context_1377.phase; - impTerm_1375.namedImports.forEach(specifier_1380 => { - let name_1381 = specifier_1380.binding.name; - let exportName_1382 = findNameInExports_1373(name_1381, exModule_1376.exportEntries); - if (exportName_1382 != null) { - let newBinding = (0, _symbol.gensym)(name_1381.val()); - context_1377.store.set(newBinding.toString(), new _transforms.VarBindingTransform(name_1381)); - context_1377.bindings.addForward(name_1381, exportName_1382, newBinding, phase_1379); - names_1378.push(name_1381); - } - }); - return (0, _immutable.List)(names_1378); - } - function findNameInExports_1373(name_1383, exp_1384) { - let foundNames_1385 = exp_1384.reduce((acc_1386, e_1387) => { - if ((0, _terms.isExportFrom)(e_1387)) { - return acc_1386.concat(e_1387.namedExports.reduce((acc_1388, specifier_1389) => { - if (specifier_1389.exportedName.val() === name_1383.val()) { - return acc_1388.concat(specifier_1389.exportedName); - } - return acc_1388; - }, (0, _immutable.List)())); - } else if ((0, _terms.isExport)(e_1387)) { - return acc_1386.concat(e_1387.declaration.declarators.reduce((acc_1390, decl_1391) => { - if (decl_1391.binding.name.val() === name_1383.val()) { - return acc_1390.concat(decl_1391.binding.name); - } - return acc_1390; - }, (0, _immutable.List)())); - } - return acc_1386; - }, (0, _immutable.List)()); - (0, _errors.assert)(foundNames_1385.size <= 1, "expecting no more than 1 matching name in exports"); - return foundNames_1385.get(0); - } - function removeNames_1374(impTerm_1392, names_1393) { - let namedImports_1394 = impTerm_1392.namedImports.filter(specifier_1395 => !names_1393.contains(specifier_1395.binding.name)); - return impTerm_1392.extend({ namedImports: namedImports_1394 }); - } - class TokenExpander extends _astDispatcher2.default { - constructor(context_1396) { - super("expand", false); - this.context = context_1396; - } - expand(stxl_1397) { - let result_1398 = []; - if (stxl_1397.size === 0) { - return (0, _immutable.List)(result_1398); - } - let prev_1399 = (0, _immutable.List)(); - let enf_1400 = new _enforester.Enforester(stxl_1397, prev_1399, this.context); - while (!enf_1400.done) { - result_1398.push(this.dispatch(enf_1400.enforest())); - } - return (0, _immutable.List)(result_1398); - } - expandVariableDeclarationStatement(term_1401) { - return term_1401.extend({ declaration: this.registerVariableDeclaration(term_1401.declaration) }); - } - expandFunctionDeclaration(term_1402) { - let registeredTerm_1403 = this.registerFunctionOrClass(term_1402); - let stx_1404 = registeredTerm_1403.name.name; - this.context.env.set(stx_1404.resolve(this.context.phase), new _transforms.VarBindingTransform(stx_1404)); - return registeredTerm_1403; - } - expandImport(term_1405) { - let path_1406 = term_1405.moduleSpecifier.val(); - let mod_1407; - if (term_1405.forSyntax) { - mod_1407 = this.context.modules.getAtPhase(path_1406, this.context.phase + 1, this.context.cwd); - this.context.store = this.context.modules.visit(mod_1407, this.context.phase + 1, this.context.store); - this.context.store = this.context.modules.invoke(mod_1407, this.context.phase + 1, this.context.store); - } else { - mod_1407 = this.context.modules.getAtPhase(path_1406, this.context.phase, this.context.cwd); - this.context.store = this.context.modules.visit(mod_1407, this.context.phase, this.context.store); - } - let boundNames_1408 = bindImports_1372(term_1405, mod_1407, this.context); - return removeNames_1374(term_1405, boundNames_1408); - } - expandExport(term_1409) { - if ((0, _terms.isFunctionDeclaration)(term_1409.declaration) || (0, _terms.isClassDeclaration)(term_1409.declaration)) { - return term_1409.extend({ declaration: this.registerFunctionOrClass(term_1409.declaration) }); - } else if ((0, _terms.isVariableDeclaration)(term_1409.declaration)) { - return term_1409.extend({ declaration: this.registerVariableDeclaration(term_1409.declaration) }); - } - return term_1409; - } - registerFunctionOrClass(term_1410) { - let name_1411 = term_1410.name.removeScope(this.context.useScope, this.context.phase); - (0, _hygieneUtils.collectBindings)(term_1410.name).forEach(stx_1412 => { - let newBinding_1413 = (0, _symbol.gensym)(stx_1412.val()); - this.context.bindings.add(stx_1412, { binding: newBinding_1413, phase: this.context.phase, skipDup: false }); - this.context.env.set(newBinding_1413.toString(), new _transforms.VarBindingTransform(stx_1412)); - }); - return term_1410.extend({ name: name_1411 }); - } - registerVariableDeclaration(term_1414) { - if ((0, _terms.isSyntaxDeclaration)(term_1414) || (0, _terms.isSyntaxrecDeclaration)(term_1414)) { - return this.registerSyntaxDeclaration(term_1414); - } - return term_1414.extend({ declarators: term_1414.declarators.map(decl_1415 => { - let binding_1416 = decl_1415.binding.removeScope(this.context.useScope, this.context.phase); - (0, _hygieneUtils.collectBindings)(binding_1416).forEach(stx_1417 => { - let newBinding_1418 = (0, _symbol.gensym)(stx_1417.val()); - this.context.bindings.add(stx_1417, { binding: newBinding_1418, phase: this.context.phase, skipDup: term_1414.kind === "var" }); - this.context.env.set(newBinding_1418.toString(), new _transforms.VarBindingTransform(stx_1417)); - }); - return decl_1415.extend({ binding: binding_1416 }); - }) }); - } - registerSyntaxDeclaration(term_1419) { - if ((0, _terms.isSyntaxDeclaration)(term_1419)) { - let scope = (0, _scope.freshScope)("nonrec"); - term_1419 = term_1419.extend({ declarators: term_1419.declarators.map(decl_1420 => { - let name_1421 = decl_1420.binding.name; - let nameAdded_1422 = name_1421.addScope(scope, this.context.bindings, _syntax.ALL_PHASES); - let nameRemoved_1423 = name_1421.removeScope(this.context.currentScope[this.context.currentScope.length - 1], this.context.phase); - let newBinding_1424 = (0, _symbol.gensym)(name_1421.val()); - this.context.bindings.addForward(nameAdded_1422, nameRemoved_1423, newBinding_1424, this.context.phase); - return decl_1420.extend({ init: decl_1420.init.addScope(scope, this.context.bindings, _syntax.ALL_PHASES) }); - }) }); - } - return term_1419.extend({ declarators: term_1419.declarators.map(decl_1425 => { - let binding_1426 = decl_1425.binding.removeScope(this.context.useScope, this.context.phase); - let syntaxExpander_1427 = new _termExpander2.default(_.merge(this.context, { phase: this.context.phase + 1, env: new _env2.default(), store: this.context.store })); - let init_1428 = syntaxExpander_1427.expand(decl_1425.init); - let val_1429 = (0, _loadSyntax.evalCompiletimeValue)(init_1428.gen(), _.merge(this.context, { phase: this.context.phase + 1 })); - (0, _hygieneUtils.collectBindings)(binding_1426).forEach(stx_1430 => { - let newBinding_1431 = (0, _symbol.gensym)(stx_1430.val()); - this.context.bindings.add(stx_1430, { binding: newBinding_1431, phase: this.context.phase, skipDup: false }); - let resolvedName_1432 = stx_1430.resolve(this.context.phase); - this.context.env.set(resolvedName_1432, new _transforms.CompiletimeTransform(val_1429)); - }); - return decl_1425.extend({ binding: binding_1426, init: init_1428 }); - }) }); - } - } - exports.default = TokenExpander; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3Rva2VuLWV4cGFuZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0lBQWEsQzs7Ozs7O0FBQ2IsU0FBUyxnQkFBVCxDQUEwQixZQUExQixFQUF3QyxhQUF4QyxFQUF1RCxZQUF2RCxFQUFxRTtBQUNuRSxNQUFJLGFBQWEsRUFBakI7QUFDQSxNQUFJLGFBQWEsYUFBYSxTQUFiLEdBQXlCLGFBQWEsS0FBYixHQUFxQixDQUE5QyxHQUFrRCxhQUFhLEtBQWhGO0FBQ0EsZUFBYSxZQUFiLENBQTBCLE9BQTFCLENBQWtDLGtCQUFrQjtBQUNsRCxRQUFJLFlBQVksZUFBZSxPQUFmLENBQXVCLElBQXZDO0FBQ0EsUUFBSSxrQkFBa0IsdUJBQXVCLFNBQXZCLEVBQWtDLGNBQWMsYUFBaEQsQ0FBdEI7QUFDQSxRQUFJLG1CQUFtQixJQUF2QixFQUE2QjtBQUMzQixVQUFJLGFBQWEsb0JBQU8sVUFBVSxHQUFWLEVBQVAsQ0FBakI7QUFDQSxtQkFBYSxLQUFiLENBQW1CLEdBQW5CLENBQXVCLFdBQVcsUUFBWCxFQUF2QixFQUE4QyxvQ0FBd0IsU0FBeEIsQ0FBOUM7QUFDQSxtQkFBYSxRQUFiLENBQXNCLFVBQXRCLENBQWlDLFNBQWpDLEVBQTRDLGVBQTVDLEVBQTZELFVBQTdELEVBQXlFLFVBQXpFO0FBQ0EsaUJBQVcsSUFBWCxDQUFnQixTQUFoQjtBQUNEO0FBQ0YsR0FURDtBQVVBLFNBQU8scUJBQUssVUFBTCxDQUFQO0FBQ0Q7QUFDRCxTQUFTLHNCQUFULENBQWdDLFNBQWhDLEVBQTJDLFFBQTNDLEVBQXFEO0FBQ25ELE1BQUksa0JBQWtCLFNBQVMsTUFBVCxDQUFnQixDQUFDLFFBQUQsRUFBVyxNQUFYLEtBQXNCO0FBQzFELFFBQUks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QUFJLGtCQUFrQixvQkFBTyxTQUFTLEdBQVQsRUFBUCxDQUF0QjtBQUNBLGVBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsR0FBdEIsQ0FBMEIsUUFBMUIsRUFBb0MsRUFBQyxTQUFTLGVBQVYsRUFBMkIsT0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUEvQyxFQUFzRCxTQUFTLEtBQS9ELEVBQXBDO0FBQ0EsY0FBSSxvQkFBb0IsU0FBUyxPQUFULENBQWlCLEtBQUssT0FBTCxDQUFhLEtBQTlCLENBQXhCO0FBQ0EsZUFBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixpQkFBckIsRUFBd0MscUNBQXlCLFFBQXpCLENBQXhDO0FBQ0QsU0FMRDtBQU1BLGVBQU8sVUFBVSxNQUFWLENBQWlCLEVBQUMsU0FBUyxZQUFWLEVBQXdCLE1BQU0sU0FBOUIsRUFBakIsQ0FBUDtBQUNELE9BWnFDLENBQWQsRUFBakIsQ0FBUDtBQWFEO0FBaEdzRDtrQkFBcEMsYSIsImZpbGUiOiJ0b2tlbi1leHBhbmRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHtlbmZvcmVzdEV4cHIsIEVuZm9yZXN0ZXJ9IGZyb20gXCIuL2VuZm9yZXN0ZXJcIjtcbmltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlci5qc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXAuanNcIjtcbmltcG9ydCBFbnYgZnJvbSBcIi4vZW52XCI7XG5pbXBvcnQgUmVhZGVyIGZyb20gXCIuL3NoaWZ0LXJlYWRlclwiO1xuaW1wb3J0IFRlcm0sIHtpc0VPRiwgaXNCaW5kaW5nSWRlbnRpZmllciwgaXNCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eSwgaXNCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyLCBpc09iamVjdEJpbmRpbmcsIGlzQXJyYXlCaW5kaW5nLCBpc0Z1bmN0aW9uRGVjbGFyYXRpb24sIGlzRnVuY3Rpb25FeHByZXNzaW9uLCBpc0Z1bmN0aW9uVGVybSwgaXNGdW5jdGlvbldpdGhOYW1lLCBpc1N5bnRheERlY2xhcmF0aW9uLCBpc1N5bnRheHJlY0RlY2xhcmF0aW9uLCBpc1ZhcmlhYmxlRGVjbGFyYXRpb24sIGlzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCwgaXNJbXBvcnQsIGlzRXhwb3J0LCBpc0V4cG9ydEZyb20sIGlzUHJhZ21hLCBpc0V4cG9ydFN5bnRheCwgaXNDbGFzc0RlY2xhcmF0aW9ufSBmcm9tIFwiLi90ZXJtc1wiO1xuaW1wb3J0IHtnZW5zeW19IGZyb20gXCIuL3N5bWJvbFwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHtleHBlY3QsIGFzc2VydH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQge2V2YWxDb21waWxldGltZVZhbHVlfSBmcm9tIFwiLi9sb2FkLXN5bnRheFwiO1xuaW1wb3J0IHtTY29wZSwgZnJlc2hTY29wZX0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCBTeW50YXgsIHtBTExfUEhBU0VTfSBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBBU1REaXNwYXRjaGVyIGZyb20gXCIuL2FzdC1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge2NvbGxlY3RCaW5kaW5nc30gZnJvbSBcIi4vaHlnaWVuZS11dGlsc1wiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5mdW5jdGlvbiBiaW5kSW1wb3J0c18xMzcyKGltcFRlcm1fMTM3NSwgZXhNb2R1bGVfMTM3NiwgY29udGV4dF8xMzc3KSB7XG4gIGxldCBuYW1lc18xMzc4ID0gW107XG4gIGxldCBwaGFzZV8xMzc5ID0gaW1wVGVybV8xMzc1LmZvclN5bnRheCA/IGNvbnRleHRfMTM3Ny5waGFzZSArIDEgOiBjb250ZXh0XzEzNzcucGhhc2U7XG4gIGltcFRlcm1fMTM3NS5uYW1lZEltcG9ydHMuZm9yRWFjaChzcGVjaWZpZXJfMTM4MCA9PiB7XG4gICAgbGV0IG5hbWVfMTM4MSA9IHNwZWNpZmllcl8xMzgwLmJpbmRpbmcubmFtZTtcbiAgICBsZXQgZXhwb3J0TmFtZV8xMzgyID0gZmluZE5hbWVJbkV4cG9ydHNfMTM3MyhuYW1lXzEzODEsIGV4TW9kdWxlXzEzNzYuZXhwb3J0RW50cmllcyk7XG4gICAgaWYgKGV4cG9ydE5hbWVfMTM4MiAhPSBudWxsKSB7XG4gICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lXzEzODEudmFsKCkpO1xuICAgICAgY29udGV4dF8xMzc3LnN0b3JlLnNldChuZXdCaW5kaW5nLnRvU3RyaW5nKCksIG5ldyBWYXJCaW5kaW5nVHJhbnNmb3JtKG5hbWVfMTM4MSkpO1xuICAgICAgY29udGV4dF8xMzc3LmJpbmRpbmdzLmFkZEZvcndhcmQobmFtZV8xMzgxLCBleHBvcnROYW1lXzEzODIsIG5ld0JpbmRpbmcsIHBoYXNlXzEzNzkpO1xuICAgICAgbmFtZXNfMTM3OC5wdXNoKG5hbWVfMTM4MSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIExpc3QobmFtZXNfMTM3OCk7XG59XG5mdW5jdGlvbiBmaW5kTmFtZUluRXhwb3J0c18xMzczKG5hbWVfMTM4MywgZXhwXzEzODQpIHtcbiAgbGV0IGZvdW5kTmFtZXNfMTM4NSA9IGV4cF8xMzg0LnJlZHVjZSgoYWNjXzEzODYsIGVfMTM4NykgPT4ge1xuICAgIGlmIChpc0V4cG9ydEZyb20oZV8xMzg3KSkge1xuICAgICAgcmV0dXJuIGFjY18xMzg2LmNvbmNhdChlXzEzODcubmFtZWRFeHBvcnRzLnJlZHVjZSgoYWNjXzEzODgsIHNwZWNpZmllcl8xMzg5KSA9PiB7XG4gICAgICAgIGlmIChzcGVjaWZpZXJfMTM4OS5leHBvcnRlZE5hbWUudmFsKCkgPT09IG5hbWVfMTM4My52YWwoKSkge1xuICAgICAgICAgIHJldHVybiBhY2NfMTM4OC5jb25jYXQoc3BlY2lmaWVyXzEzODkuZXhwb3J0ZWROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjXzEzODg7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9IGVsc2UgaWYgKGlzRXhwb3J0KGVfMTM4NykpIHtcbiAgICAgIHJldHVybiBhY2NfMTM4Ni5jb25jYXQoZV8xMzg3LmRlY2xhcmF0aW9uLmRlY2xhcmF0b3JzLnJlZHVjZSgoYWNjXzEzOTAsIGRlY2xfMTM5MSkgPT4ge1xuICAgICAgICBpZiAoZGVjbF8xMzkxLmJpbmRpbmcubmFtZS52YWwoKSA9PT0gbmFtZV8xMzgzLnZhbCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY18xMzkwLmNvbmNhdChkZWNsXzEzOTEuYmluZGluZy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjXzEzOTA7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY18xMzg2O1xuICB9LCBMaXN0KCkpO1xuICBhc3NlcnQoZm91bmROYW1lc18xMzg1LnNpemUgPD0gMSwgXCJleHBlY3Rpbmcgbm8gbW9yZSB0aGFuIDEgbWF0Y2hpbmcgbmFtZSBpbiBleHBvcnRzXCIpO1xuICByZXR1cm4gZm91bmROYW1lc18xMzg1LmdldCgwKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzXzEzNzQoaW1wVGVybV8xMzkyLCBuYW1lc18xMzkzKSB7XG4gIGxldCBuYW1lZEltcG9ydHNfMTM5NCA9IGltcFRlcm1fMTM5Mi5uYW1lZEltcG9ydHMuZmlsdGVyKHNwZWNpZmllcl8xMzk1ID0+ICFuYW1lc18xMzkzLmNvbnRhaW5zKHNwZWNpZmllcl8xMzk1LmJpbmRpbmcubmFtZSkpO1xuICByZXR1cm4gaW1wVGVybV8xMzkyLmV4dGVuZCh7bmFtZWRJbXBvcnRzOiBuYW1lZEltcG9ydHNfMTM5NH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5FeHBhbmRlciBleHRlbmRzIEFTVERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0XzEzOTYpIHtcbiAgICBzdXBlcihcImV4cGFuZFwiLCBmYWxzZSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF8xMzk2O1xuICB9XG4gIGV4cGFuZChzdHhsXzEzOTcpIHtcbiAgICBsZXQgcmVzdWx0XzEzOTggPSBbXTtcbiAgICBpZiAoc3R4bF8xMzk3LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBMaXN0KHJlc3VsdF8xMzk4KTtcbiAgICB9XG4gICAgbGV0IHByZXZfMTM5OSA9IExpc3QoKTtcbiAgICBsZXQgZW5mXzE0MDAgPSBuZXcgRW5mb3Jlc3RlcihzdHhsXzEzOTcsIHByZXZfMTM5OSwgdGhpcy5jb250ZXh0KTtcbiAgICB3aGlsZSAoIWVuZl8xNDAwLmRvbmUpIHtcbiAgICAgIHJlc3VsdF8xMzk4LnB1c2godGhpcy5kaXNwYXRjaChlbmZfMTQwMC5lbmZvcmVzdCgpKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdF8xMzk4KTtcbiAgfVxuICBleHBhbmRWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRlcm1fMTQwMSkge1xuICAgIHJldHVybiB0ZXJtXzE0MDEuZXh0ZW5kKHtkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybV8xNDAxLmRlY2xhcmF0aW9uKX0pO1xuICB9XG4gIGV4cGFuZEZ1bmN0aW9uRGVjbGFyYXRpb24odGVybV8xNDAyKSB7XG4gICAgbGV0IHJlZ2lzdGVyZWRUZXJtXzE0MDMgPSB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PckNsYXNzKHRlcm1fMTQwMik7XG4gICAgbGV0IHN0eF8xNDA0ID0gcmVnaXN0ZXJlZFRlcm1fMTQwMy5uYW1lLm5hbWU7XG4gICAgdGhpcy5jb250ZXh0LmVudi5zZXQoc3R4XzE0MDQucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfMTQwNCkpO1xuICAgIHJldHVybiByZWdpc3RlcmVkVGVybV8xNDAzO1xuICB9XG4gIGV4cGFuZEltcG9ydCh0ZXJtXzE0MDUpIHtcbiAgICBsZXQgcGF0aF8xNDA2ID0gdGVybV8xNDA1Lm1vZHVsZVNwZWNpZmllci52YWwoKTtcbiAgICBsZXQgbW9kXzE0MDc7XG4gICAgaWYgKHRlcm1fMTQwNS5mb3JTeW50YXgpIHtcbiAgICAgIG1vZF8xNDA3ID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuZ2V0QXRQaGFzZShwYXRoXzE0MDYsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMudmlzaXQobW9kXzE0MDcsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5zdG9yZSk7XG4gICAgICB0aGlzLmNvbnRleHQuc3RvcmUgPSB0aGlzLmNvbnRleHQubW9kdWxlcy5pbnZva2UobW9kXzE0MDcsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5zdG9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZF8xNDA3ID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuZ2V0QXRQaGFzZShwYXRoXzE0MDYsIHRoaXMuY29udGV4dC5waGFzZSwgdGhpcy5jb250ZXh0LmN3ZCk7XG4gICAgICB0aGlzLmNvbnRleHQuc3RvcmUgPSB0aGlzLmNvbnRleHQubW9kdWxlcy52aXNpdChtb2RfMTQwNywgdGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuc3RvcmUpO1xuICAgIH1cbiAgICBsZXQgYm91bmROYW1lc18xNDA4ID0gYmluZEltcG9ydHNfMTM3Mih0ZXJtXzE0MDUsIG1vZF8xNDA3LCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiByZW1vdmVOYW1lc18xMzc0KHRlcm1fMTQwNSwgYm91bmROYW1lc18xNDA4KTtcbiAgfVxuICBleHBhbmRFeHBvcnQodGVybV8xNDA5KSB7XG4gICAgaWYgKGlzRnVuY3Rpb25EZWNsYXJhdGlvbih0ZXJtXzE0MDkuZGVjbGFyYXRpb24pIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbih0ZXJtXzE0MDkuZGVjbGFyYXRpb24pKSB7XG4gICAgICByZXR1cm4gdGVybV8xNDA5LmV4dGVuZCh7ZGVjbGFyYXRpb246IHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybV8xNDA5LmRlY2xhcmF0aW9uKX0pO1xuICAgIH0gZWxzZSBpZiAoaXNWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm1fMTQwOS5kZWNsYXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB0ZXJtXzE0MDkuZXh0ZW5kKHtkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybV8xNDA5LmRlY2xhcmF0aW9uKX0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVybV8xNDA5O1xuICB9XG4gIHJlZ2lzdGVyRnVuY3Rpb25PckNsYXNzKHRlcm1fMTQxMCkge1xuICAgIGxldCBuYW1lXzE0MTEgPSB0ZXJtXzE0MTAubmFtZS5yZW1vdmVTY29wZSh0aGlzLmNvbnRleHQudXNlU2NvcGUsIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgY29sbGVjdEJpbmRpbmdzKHRlcm1fMTQxMC5uYW1lKS5mb3JFYWNoKHN0eF8xNDEyID0+IHtcbiAgICAgIGxldCBuZXdCaW5kaW5nXzE0MTMgPSBnZW5zeW0oc3R4XzE0MTIudmFsKCkpO1xuICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChzdHhfMTQxMiwge2JpbmRpbmc6IG5ld0JpbmRpbmdfMTQxMywgcGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSwgc2tpcER1cDogZmFsc2V9KTtcbiAgICAgIHRoaXMuY29udGV4dC5lbnYuc2V0KG5ld0JpbmRpbmdfMTQxMy50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfMTQxMikpO1xuICAgIH0pO1xuICAgIHJldHVybiB0ZXJtXzE0MTAuZXh0ZW5kKHtuYW1lOiBuYW1lXzE0MTF9KTtcbiAgfVxuICByZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybV8xNDE0KSB7XG4gICAgaWYgKGlzU3ludGF4RGVjbGFyYXRpb24odGVybV8xNDE0KSB8fCBpc1N5bnRheHJlY0RlY2xhcmF0aW9uKHRlcm1fMTQxNCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybV8xNDE0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm1fMTQxNC5leHRlbmQoe2RlY2xhcmF0b3JzOiB0ZXJtXzE0MTQuZGVjbGFyYXRvcnMubWFwKGRlY2xfMTQxNSA9PiB7XG4gICAgICBsZXQgYmluZGluZ18xNDE2ID0gZGVjbF8xNDE1LmJpbmRpbmcucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LnVzZVNjb3BlLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgY29sbGVjdEJpbmRpbmdzKGJpbmRpbmdfMTQxNikuZm9yRWFjaChzdHhfMTQxNyA9PiB7XG4gICAgICAgIGxldCBuZXdCaW5kaW5nXzE0MTggPSBnZW5zeW0oc3R4XzE0MTcudmFsKCkpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eF8xNDE3LCB7YmluZGluZzogbmV3QmluZGluZ18xNDE4LCBwaGFzZTogdGhpcy5jb250ZXh0LnBoYXNlLCBza2lwRHVwOiB0ZXJtXzE0MTQua2luZCA9PT0gXCJ2YXJcIn0pO1xuICAgICAgICB0aGlzLmNvbnRleHQuZW52LnNldChuZXdCaW5kaW5nXzE0MTgudG9TdHJpbmcoKSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0oc3R4XzE0MTcpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRlY2xfMTQxNS5leHRlbmQoe2JpbmRpbmc6IGJpbmRpbmdfMTQxNn0pO1xuICAgIH0pfSk7XG4gIH1cbiAgcmVnaXN0ZXJTeW50YXhEZWNsYXJhdGlvbih0ZXJtXzE0MTkpIHtcbiAgICBpZiAoaXNTeW50YXhEZWNsYXJhdGlvbih0ZXJtXzE0MTkpKSB7XG4gICAgICBsZXQgc2NvcGUgPSBmcmVzaFNjb3BlKFwibm9ucmVjXCIpO1xuICAgICAgdGVybV8xNDE5ID0gdGVybV8xNDE5LmV4dGVuZCh7ZGVjbGFyYXRvcnM6IHRlcm1fMTQxOS5kZWNsYXJhdG9ycy5tYXAoZGVjbF8xNDIwID0+IHtcbiAgICAgICAgbGV0IG5hbWVfMTQyMSA9IGRlY2xfMTQyMC5iaW5kaW5nLm5hbWU7XG4gICAgICAgIGxldCBuYW1lQWRkZWRfMTQyMiA9IG5hbWVfMTQyMS5hZGRTY29wZShzY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKTtcbiAgICAgICAgbGV0IG5hbWVSZW1vdmVkXzE0MjMgPSBuYW1lXzE0MjEucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZVt0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLmxlbmd0aCAtIDFdLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgICBsZXQgbmV3QmluZGluZ18xNDI0ID0gZ2Vuc3ltKG5hbWVfMTQyMS52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGRGb3J3YXJkKG5hbWVBZGRlZF8xNDIyLCBuYW1lUmVtb3ZlZF8xNDIzLCBuZXdCaW5kaW5nXzE0MjQsIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgICAgIHJldHVybiBkZWNsXzE0MjAuZXh0ZW5kKHtpbml0OiBkZWNsXzE0MjAuaW5pdC5hZGRTY29wZShzY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKX0pO1xuICAgICAgfSl9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm1fMTQxOS5leHRlbmQoe2RlY2xhcmF0b3JzOiB0ZXJtXzE0MTkuZGVjbGFyYXRvcnMubWFwKGRlY2xfMTQyNSA9PiB7XG4gICAgICBsZXQgYmluZGluZ18xNDI2ID0gZGVjbF8xNDI1LmJpbmRpbmcucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LnVzZVNjb3BlLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgbGV0IHN5bnRheEV4cGFuZGVyXzE0MjcgPSBuZXcgVGVybUV4cGFuZGVyKF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7cGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSArIDEsIGVudjogbmV3IEVudiwgc3RvcmU6IHRoaXMuY29udGV4dC5zdG9yZX0pKTtcbiAgICAgIGxldCBpbml0XzE0MjggPSBzeW50YXhFeHBhbmRlcl8xNDI3LmV4cGFuZChkZWNsXzE0MjUuaW5pdCk7XG4gICAgICBsZXQgdmFsXzE0MjkgPSBldmFsQ29tcGlsZXRpbWVWYWx1ZShpbml0XzE0MjguZ2VuKCksIF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7cGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSArIDF9KSk7XG4gICAgICBjb2xsZWN0QmluZGluZ3MoYmluZGluZ18xNDI2KS5mb3JFYWNoKHN0eF8xNDMwID0+IHtcbiAgICAgICAgbGV0IG5ld0JpbmRpbmdfMTQzMSA9IGdlbnN5bShzdHhfMTQzMC52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4XzE0MzAsIHtiaW5kaW5nOiBuZXdCaW5kaW5nXzE0MzEsIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsIHNraXBEdXA6IGZhbHNlfSk7XG4gICAgICAgIGxldCByZXNvbHZlZE5hbWVfMTQzMiA9IHN0eF8xNDMwLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmVudi5zZXQocmVzb2x2ZWROYW1lXzE0MzIsIG5ldyBDb21waWxldGltZVRyYW5zZm9ybSh2YWxfMTQyOSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGVjbF8xNDI1LmV4dGVuZCh7YmluZGluZzogYmluZGluZ18xNDI2LCBpbml0OiBpbml0XzE0Mjh9KTtcbiAgICB9KX0pO1xuICB9XG59XG4iXX0= - -/***/ }, -/* 51 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.Enforester = undefined; - - var _terms = __webpack_require__(28); - - var _terms2 = _interopRequireDefault(_terms); - - var _ramdaFantasy = __webpack_require__(15); - - var _transforms = __webpack_require__(32); - - var _immutable = __webpack_require__(11); - - var _errors = __webpack_require__(13); - - var _operators = __webpack_require__(52); - - var _syntax = __webpack_require__(12); - - var _syntax2 = _interopRequireDefault(_syntax); - - var _scope = __webpack_require__(44); - - var _loadSyntax = __webpack_require__(53); - - var _macroContext = __webpack_require__(65); - - var _macroContext2 = _interopRequireDefault(_macroContext); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - const Just_41 = _ramdaFantasy.Maybe.Just; - const Nothing_42 = _ramdaFantasy.Maybe.Nothing; - const EXPR_LOOP_OPERATOR_43 = {}; - const EXPR_LOOP_NO_CHANGE_44 = {}; - const EXPR_LOOP_EXPANSION_45 = {}; - class Enforester_46 { - constructor(stxl_47, prev_48, context_49) { - this.done = false; - (0, _errors.assert)(_immutable.List.isList(stxl_47), "expecting a list of terms to enforest"); - (0, _errors.assert)(_immutable.List.isList(prev_48), "expecting a list of terms to enforest"); - (0, _errors.assert)(context_49, "expecting a context to enforest"); - this.term = null; - this.rest = stxl_47; - this.prev = prev_48; - this.context = context_49; - } - peek() { - let n_50 = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - - return this.rest.get(n_50); - } - advance() { - let ret_51 = this.rest.first(); - this.rest = this.rest.rest(); - return ret_51; + this.source = source; + this.index = 0; + this.line = 0; + this.lineStart = 0; + this.startIndex = 0; + this.startLine = 0; + this.startLineStart = 0; + this.lastIndex = 0; + this.lastLine = 0; + this.lastLineStart = 0; + this.hasLineTerminatorBeforeNext = false; + this.tokenIndex = 0; } - enforest() { - let type_52 = arguments.length <= 0 || arguments[0] === undefined ? "Module" : arguments[0]; - this.term = null; - if (this.rest.size === 0) { - this.done = true; - return this.term; - } - if (this.isEOF(this.peek())) { - this.term = new _terms2.default("EOF", {}); - this.advance(); - return this.term; - } - let result_53; - if (type_52 === "expression") { - result_53 = this.enforestExpressionLoop(); - } else { - result_53 = this.enforestModule(); - } - if (this.rest.size === 0) { - this.done = true; - } - return result_53; - } - enforestModule() { - return this.enforestBody(); - } - enforestBody() { - return this.enforestModuleItem(); - } - enforestModuleItem() { - let lookahead_54 = this.peek(); - if (this.isKeyword(lookahead_54, "import")) { - this.advance(); - return this.enforestImportDeclaration(); - } else if (this.isKeyword(lookahead_54, "export")) { - this.advance(); - return this.enforestExportDeclaration(); - } else if (this.isIdentifier(lookahead_54, "#")) { - return this.enforestLanguagePragma(); - } - return this.enforestStatement(); - } - enforestLanguagePragma() { - this.matchIdentifier("#"); - this.matchIdentifier("lang"); - let path_55 = this.matchStringLiteral(); - this.consumeSemicolon(); - return new _terms2.default("Pragma", { kind: "lang", items: _immutable.List.of(path_55) }); - } - enforestExportDeclaration() { - let lookahead_56 = this.peek(); - if (this.isPunctuator(lookahead_56, "*")) { - this.advance(); - let moduleSpecifier = this.enforestFromClause(); - return new _terms2.default("ExportAllFrom", { moduleSpecifier: moduleSpecifier }); - } else if (this.isBraces(lookahead_56)) { - let namedExports = this.enforestExportClause(); - let moduleSpecifier = null; - if (this.isIdentifier(this.peek(), "from")) { - moduleSpecifier = this.enforestFromClause(); - } - return new _terms2.default("ExportFrom", { namedExports: namedExports, moduleSpecifier: moduleSpecifier }); - } else if (this.isKeyword(lookahead_56, "class")) { - return new _terms2.default("Export", { declaration: this.enforestClass({ isExpr: false }) }); - } else if (this.isFnDeclTransform(lookahead_56)) { - return new _terms2.default("Export", { declaration: this.enforestFunction({ isExpr: false, inDefault: false }) }); - } else if (this.isKeyword(lookahead_56, "default")) { - this.advance(); - if (this.isFnDeclTransform(this.peek())) { - return new _terms2.default("ExportDefault", { body: this.enforestFunction({ isExpr: false, inDefault: true }) }); - } else if (this.isKeyword(this.peek(), "class")) { - return new _terms2.default("ExportDefault", { body: this.enforestClass({ isExpr: false, inDefault: true }) }); - } else { - let body = this.enforestExpressionLoop(); - this.consumeSemicolon(); - return new _terms2.default("ExportDefault", { body: body }); - } - } else if (this.isVarDeclTransform(lookahead_56) || this.isLetDeclTransform(lookahead_56) || this.isConstDeclTransform(lookahead_56) || this.isSyntaxrecDeclTransform(lookahead_56) || this.isSyntaxDeclTransform(lookahead_56)) { - return new _terms2.default("Export", { declaration: this.enforestVariableDeclaration() }); - } - throw this.createError(lookahead_56, "unexpected syntax"); - } - enforestExportClause() { - let enf_57 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - let result_58 = []; - while (enf_57.rest.size !== 0) { - result_58.push(enf_57.enforestExportSpecifier()); - enf_57.consumeComma(); - } - return (0, _immutable.List)(result_58); - } - enforestExportSpecifier() { - let name_59 = this.enforestIdentifier(); - if (this.isIdentifier(this.peek(), "as")) { - this.advance(); - let exportedName = this.enforestIdentifier(); - return new _terms2.default("ExportSpecifier", { name: name_59, exportedName: exportedName }); - } - return new _terms2.default("ExportSpecifier", { name: null, exportedName: name_59 }); - } - enforestImportDeclaration() { - let lookahead_60 = this.peek(); - let defaultBinding_61 = null; - let namedImports_62 = (0, _immutable.List)(); - let forSyntax_63 = false; - if (this.isStringLiteral(lookahead_60)) { - let moduleSpecifier = this.advance(); - this.consumeSemicolon(); - return new _terms2.default("Import", { defaultBinding: defaultBinding_61, namedImports: namedImports_62, moduleSpecifier: moduleSpecifier }); - } - if (this.isIdentifier(lookahead_60) || this.isKeyword(lookahead_60)) { - defaultBinding_61 = this.enforestBindingIdentifier(); - if (!this.isPunctuator(this.peek(), ",")) { - let moduleSpecifier = this.enforestFromClause(); - if (this.isKeyword(this.peek(), "for") && this.isIdentifier(this.peek(1), "syntax")) { - this.advance(); - this.advance(); - forSyntax_63 = true; - } - return new _terms2.default("Import", { defaultBinding: defaultBinding_61, moduleSpecifier: moduleSpecifier, namedImports: (0, _immutable.List)(), forSyntax: forSyntax_63 }); - } - } - this.consumeComma(); - lookahead_60 = this.peek(); - if (this.isBraces(lookahead_60)) { - let imports = this.enforestNamedImports(); - let fromClause = this.enforestFromClause(); - if (this.isKeyword(this.peek(), "for") && this.isIdentifier(this.peek(1), "syntax")) { - this.advance(); - this.advance(); - forSyntax_63 = true; - } - return new _terms2.default("Import", { defaultBinding: defaultBinding_61, forSyntax: forSyntax_63, namedImports: imports, moduleSpecifier: fromClause }); - } else if (this.isPunctuator(lookahead_60, "*")) { - let namespaceBinding = this.enforestNamespaceBinding(); - let moduleSpecifier = this.enforestFromClause(); - if (this.isKeyword(this.peek(), "for") && this.isIdentifier(this.peek(1), "syntax")) { - this.advance(); - this.advance(); - forSyntax_63 = true; - } - return new _terms2.default("ImportNamespace", { defaultBinding: defaultBinding_61, forSyntax: forSyntax_63, namespaceBinding: namespaceBinding, moduleSpecifier: moduleSpecifier }); - } - throw this.createError(lookahead_60, "unexpected syntax"); - } - enforestNamespaceBinding() { - this.matchPunctuator("*"); - this.matchIdentifier("as"); - return this.enforestBindingIdentifier(); - } - enforestNamedImports() { - let enf_64 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - let result_65 = []; - while (enf_64.rest.size !== 0) { - result_65.push(enf_64.enforestImportSpecifiers()); - enf_64.consumeComma(); - } - return (0, _immutable.List)(result_65); - } - enforestImportSpecifiers() { - let lookahead_66 = this.peek(); - let name_67; - if (this.isIdentifier(lookahead_66) || this.isKeyword(lookahead_66)) { - name_67 = this.advance(); - if (!this.isIdentifier(this.peek(), "as")) { - return new _terms2.default("ImportSpecifier", { name: null, binding: new _terms2.default("BindingIdentifier", { name: name_67 }) }); - } else { - this.matchIdentifier("as"); - } - } else { - throw this.createError(lookahead_66, "unexpected token in import specifier"); - } - return new _terms2.default("ImportSpecifier", { name: name_67, binding: this.enforestBindingIdentifier() }); - } - enforestFromClause() { - this.matchIdentifier("from"); - let lookahead_68 = this.matchStringLiteral(); - this.consumeSemicolon(); - return lookahead_68; - } - enforestStatementListItem() { - let lookahead_69 = this.peek(); - if (this.isFnDeclTransform(lookahead_69)) { - return this.enforestFunctionDeclaration({ isExpr: false }); - } else if (this.isKeyword(lookahead_69, "class")) { - return this.enforestClass({ isExpr: false }); - } else { - return this.enforestStatement(); - } - } - enforestStatement() { - let lookahead_70 = this.peek(); - if (this.term === null && this.isCompiletimeTransform(lookahead_70)) { - this.expandMacro(); - lookahead_70 = this.peek(); - } - if (this.term === null && this.isTerm(lookahead_70)) { - return this.advance(); - } - if (this.term === null && this.isBraces(lookahead_70)) { - return this.enforestBlockStatement(); - } - if (this.term === null && this.isWhileTransform(lookahead_70)) { - return this.enforestWhileStatement(); - } - if (this.term === null && this.isIfTransform(lookahead_70)) { - return this.enforestIfStatement(); - } - if (this.term === null && this.isForTransform(lookahead_70)) { - return this.enforestForStatement(); - } - if (this.term === null && this.isSwitchTransform(lookahead_70)) { - return this.enforestSwitchStatement(); - } - if (this.term === null && this.isBreakTransform(lookahead_70)) { - return this.enforestBreakStatement(); - } - if (this.term === null && this.isContinueTransform(lookahead_70)) { - return this.enforestContinueStatement(); - } - if (this.term === null && this.isDoTransform(lookahead_70)) { - return this.enforestDoStatement(); - } - if (this.term === null && this.isDebuggerTransform(lookahead_70)) { - return this.enforestDebuggerStatement(); - } - if (this.term === null && this.isWithTransform(lookahead_70)) { - return this.enforestWithStatement(); - } - if (this.term === null && this.isTryTransform(lookahead_70)) { - return this.enforestTryStatement(); - } - if (this.term === null && this.isThrowTransform(lookahead_70)) { - return this.enforestThrowStatement(); - } - if (this.term === null && this.isKeyword(lookahead_70, "class")) { - return this.enforestClass({ isExpr: false }); - } - if (this.term === null && this.isFnDeclTransform(lookahead_70)) { - return this.enforestFunctionDeclaration(); - } - if (this.term === null && this.isIdentifier(lookahead_70) && this.isPunctuator(this.peek(1), ":")) { - return this.enforestLabeledStatement(); - } - if (this.term === null && (this.isVarDeclTransform(lookahead_70) || this.isLetDeclTransform(lookahead_70) || this.isConstDeclTransform(lookahead_70) || this.isSyntaxrecDeclTransform(lookahead_70) || this.isSyntaxDeclTransform(lookahead_70))) { - let stmt = new _terms2.default("VariableDeclarationStatement", { declaration: this.enforestVariableDeclaration() }); - this.consumeSemicolon(); - return stmt; - } - if (this.term === null && this.isReturnStmtTransform(lookahead_70)) { - return this.enforestReturnStatement(); - } - if (this.term === null && this.isPunctuator(lookahead_70, ";")) { - this.advance(); - return new _terms2.default("EmptyStatement", {}); - } - return this.enforestExpressionStatement(); - } - enforestLabeledStatement() { - let label_71 = this.matchIdentifier(); - let punc_72 = this.matchPunctuator(":"); - let stmt_73 = this.enforestStatement(); - return new _terms2.default("LabeledStatement", { label: label_71, body: stmt_73 }); - } - enforestBreakStatement() { - this.matchKeyword("break"); - let lookahead_74 = this.peek(); - let label_75 = null; - if (this.rest.size === 0 || this.isPunctuator(lookahead_74, ";")) { - this.consumeSemicolon(); - return new _terms2.default("BreakStatement", { label: label_75 }); - } - if (this.isIdentifier(lookahead_74) || this.isKeyword(lookahead_74, "yield") || this.isKeyword(lookahead_74, "let")) { - label_75 = this.enforestIdentifier(); - } - this.consumeSemicolon(); - return new _terms2.default("BreakStatement", { label: label_75 }); - } - enforestTryStatement() { - this.matchKeyword("try"); - let body_76 = this.enforestBlock(); - if (this.isKeyword(this.peek(), "catch")) { - let catchClause = this.enforestCatchClause(); - if (this.isKeyword(this.peek(), "finally")) { - this.advance(); - let finalizer = this.enforestBlock(); - return new _terms2.default("TryFinallyStatement", { body: body_76, catchClause: catchClause, finalizer: finalizer }); - } - return new _terms2.default("TryCatchStatement", { body: body_76, catchClause: catchClause }); - } - if (this.isKeyword(this.peek(), "finally")) { - this.advance(); - let finalizer = this.enforestBlock(); - return new _terms2.default("TryFinallyStatement", { body: body_76, catchClause: null, finalizer: finalizer }); - } - throw this.createError(this.peek(), "try with no catch or finally"); - } - enforestCatchClause() { - this.matchKeyword("catch"); - let bindingParens_77 = this.matchParens(); - let enf_78 = new Enforester_46(bindingParens_77, (0, _immutable.List)(), this.context); - let binding_79 = enf_78.enforestBindingTarget(); - let body_80 = this.enforestBlock(); - return new _terms2.default("CatchClause", { binding: binding_79, body: body_80 }); - } - enforestThrowStatement() { - this.matchKeyword("throw"); - let expression_81 = this.enforestExpression(); - this.consumeSemicolon(); - return new _terms2.default("ThrowStatement", { expression: expression_81 }); - } - enforestWithStatement() { - this.matchKeyword("with"); - let objParens_82 = this.matchParens(); - let enf_83 = new Enforester_46(objParens_82, (0, _immutable.List)(), this.context); - let object_84 = enf_83.enforestExpression(); - let body_85 = this.enforestStatement(); - return new _terms2.default("WithStatement", { object: object_84, body: body_85 }); - } - enforestDebuggerStatement() { - this.matchKeyword("debugger"); - return new _terms2.default("DebuggerStatement", {}); - } - enforestDoStatement() { - this.matchKeyword("do"); - let body_86 = this.enforestStatement(); - this.matchKeyword("while"); - let testBody_87 = this.matchParens(); - let enf_88 = new Enforester_46(testBody_87, (0, _immutable.List)(), this.context); - let test_89 = enf_88.enforestExpression(); - this.consumeSemicolon(); - return new _terms2.default("DoWhileStatement", { body: body_86, test: test_89 }); - } - enforestContinueStatement() { - let kwd_90 = this.matchKeyword("continue"); - let lookahead_91 = this.peek(); - let label_92 = null; - if (this.rest.size === 0 || this.isPunctuator(lookahead_91, ";")) { - this.consumeSemicolon(); - return new _terms2.default("ContinueStatement", { label: label_92 }); - } - if (this.lineNumberEq(kwd_90, lookahead_91) && (this.isIdentifier(lookahead_91) || this.isKeyword(lookahead_91, "yield") || this.isKeyword(lookahead_91, "let"))) { - label_92 = this.enforestIdentifier(); - } - this.consumeSemicolon(); - return new _terms2.default("ContinueStatement", { label: label_92 }); - } - enforestSwitchStatement() { - this.matchKeyword("switch"); - let cond_93 = this.matchParens(); - let enf_94 = new Enforester_46(cond_93, (0, _immutable.List)(), this.context); - let discriminant_95 = enf_94.enforestExpression(); - let body_96 = this.matchCurlies(); - if (body_96.size === 0) { - return new _terms2.default("SwitchStatement", { discriminant: discriminant_95, cases: (0, _immutable.List)() }); - } - enf_94 = new Enforester_46(body_96, (0, _immutable.List)(), this.context); - let cases_97 = enf_94.enforestSwitchCases(); - let lookahead_98 = enf_94.peek(); - if (enf_94.isKeyword(lookahead_98, "default")) { - let defaultCase = enf_94.enforestSwitchDefault(); - let postDefaultCases = enf_94.enforestSwitchCases(); - return new _terms2.default("SwitchStatementWithDefault", { discriminant: discriminant_95, preDefaultCases: cases_97, defaultCase: defaultCase, postDefaultCases: postDefaultCases }); - } - return new _terms2.default("SwitchStatement", { discriminant: discriminant_95, cases: cases_97 }); - } - enforestSwitchCases() { - let cases_99 = []; - while (!(this.rest.size === 0 || this.isKeyword(this.peek(), "default"))) { - cases_99.push(this.enforestSwitchCase()); - } - return (0, _immutable.List)(cases_99); - } - enforestSwitchCase() { - this.matchKeyword("case"); - return new _terms2.default("SwitchCase", { test: this.enforestExpression(), consequent: this.enforestSwitchCaseBody() }); - } - enforestSwitchCaseBody() { - this.matchPunctuator(":"); - return this.enforestStatementListInSwitchCaseBody(); - } - enforestStatementListInSwitchCaseBody() { - let result_100 = []; - while (!(this.rest.size === 0 || this.isKeyword(this.peek(), "default") || this.isKeyword(this.peek(), "case"))) { - result_100.push(this.enforestStatementListItem()); - } - return (0, _immutable.List)(result_100); - } - enforestSwitchDefault() { - this.matchKeyword("default"); - return new _terms2.default("SwitchDefault", { consequent: this.enforestSwitchCaseBody() }); - } - enforestForStatement() { - this.matchKeyword("for"); - let cond_101 = this.matchParens(); - let enf_102 = new Enforester_46(cond_101, (0, _immutable.List)(), this.context); - let lookahead_103, test_104, init_105, right_106, type_107, left_108, update_109; - if (enf_102.isPunctuator(enf_102.peek(), ";")) { - enf_102.advance(); - if (!enf_102.isPunctuator(enf_102.peek(), ";")) { - test_104 = enf_102.enforestExpression(); - } - enf_102.matchPunctuator(";"); - if (enf_102.rest.size !== 0) { - right_106 = enf_102.enforestExpression(); - } - return new _terms2.default("ForStatement", { init: null, test: test_104, update: right_106, body: this.enforestStatement() }); - } else { - lookahead_103 = enf_102.peek(); - if (enf_102.isVarDeclTransform(lookahead_103) || enf_102.isLetDeclTransform(lookahead_103) || enf_102.isConstDeclTransform(lookahead_103)) { - init_105 = enf_102.enforestVariableDeclaration(); - lookahead_103 = enf_102.peek(); - if (this.isKeyword(lookahead_103, "in") || this.isIdentifier(lookahead_103, "of")) { - if (this.isKeyword(lookahead_103, "in")) { - enf_102.advance(); - right_106 = enf_102.enforestExpression(); - type_107 = "ForInStatement"; - } else if (this.isIdentifier(lookahead_103, "of")) { - enf_102.advance(); - right_106 = enf_102.enforestExpression(); - type_107 = "ForOfStatement"; - } - return new _terms2.default(type_107, { left: init_105, right: right_106, body: this.enforestStatement() }); - } - enf_102.matchPunctuator(";"); - if (enf_102.isPunctuator(enf_102.peek(), ";")) { - enf_102.advance(); - test_104 = null; - } else { - test_104 = enf_102.enforestExpression(); - enf_102.matchPunctuator(";"); - } - update_109 = enf_102.enforestExpression(); - } else { - if (this.isKeyword(enf_102.peek(1), "in") || this.isIdentifier(enf_102.peek(1), "of")) { - left_108 = enf_102.enforestBindingIdentifier(); - let kind = enf_102.advance(); - if (this.isKeyword(kind, "in")) { - type_107 = "ForInStatement"; - } else { - type_107 = "ForOfStatement"; - } - right_106 = enf_102.enforestExpression(); - return new _terms2.default(type_107, { left: left_108, right: right_106, body: this.enforestStatement() }); - } - init_105 = enf_102.enforestExpression(); - enf_102.matchPunctuator(";"); - if (enf_102.isPunctuator(enf_102.peek(), ";")) { - enf_102.advance(); - test_104 = null; - } else { - test_104 = enf_102.enforestExpression(); - enf_102.matchPunctuator(";"); - } - update_109 = enf_102.enforestExpression(); - } - return new _terms2.default("ForStatement", { init: init_105, test: test_104, update: update_109, body: this.enforestStatement() }); - } - } - enforestIfStatement() { - this.matchKeyword("if"); - let cond_110 = this.matchParens(); - let enf_111 = new Enforester_46(cond_110, (0, _immutable.List)(), this.context); - let lookahead_112 = enf_111.peek(); - let test_113 = enf_111.enforestExpression(); - if (test_113 === null) { - throw enf_111.createError(lookahead_112, "expecting an expression"); - } - let consequent_114 = this.enforestStatement(); - let alternate_115 = null; - if (this.isKeyword(this.peek(), "else")) { - this.advance(); - alternate_115 = this.enforestStatement(); - } - return new _terms2.default("IfStatement", { test: test_113, consequent: consequent_114, alternate: alternate_115 }); - } - enforestWhileStatement() { - this.matchKeyword("while"); - let cond_116 = this.matchParens(); - let enf_117 = new Enforester_46(cond_116, (0, _immutable.List)(), this.context); - let lookahead_118 = enf_117.peek(); - let test_119 = enf_117.enforestExpression(); - if (test_119 === null) { - throw enf_117.createError(lookahead_118, "expecting an expression"); + _createClass(Tokenizer, [{ + key: "saveLexerState", + value: function saveLexerState() { + return { + source: this.source, + index: this.index, + line: this.line, + lineStart: this.lineStart, + startIndex: this.startIndex, + startLine: this.startLine, + startLineStart: this.startLineStart, + lastIndex: this.lastIndex, + lastLine: this.lastLine, + lastLineStart: this.lastLineStart, + lookahead: this.lookahead, + hasLineTerminatorBeforeNext: this.hasLineTerminatorBeforeNext, + tokenIndex: this.tokenIndex + }; } - let body_120 = this.enforestStatement(); - return new _terms2.default("WhileStatement", { test: test_119, body: body_120 }); - } - enforestBlockStatement() { - return new _terms2.default("BlockStatement", { block: this.enforestBlock() }); - } - enforestBlock() { - return new _terms2.default("Block", { statements: this.matchCurlies() }); - } - enforestClass(_ref) { - let isExpr = _ref.isExpr; - let inDefault = _ref.inDefault; - - let kw_121 = this.advance(); - let name_122 = null, - supr_123 = null; - let type_124 = isExpr ? "ClassExpression" : "ClassDeclaration"; - if (this.isIdentifier(this.peek())) { - name_122 = this.enforestBindingIdentifier(); - } else if (!isExpr) { - if (inDefault) { - name_122 = new _terms2.default("BindingIdentifier", { name: _syntax2.default.fromIdentifier("_default", kw_121) }); - } else { - throw this.createError(this.peek(), "unexpected syntax"); - } + }, { + key: "restoreLexerState", + value: function restoreLexerState(state) { + this.source = state.source; + this.index = state.index; + this.line = state.line; + this.lineStart = state.lineStart; + this.startIndex = state.startIndex; + this.startLine = state.startLine; + this.startLineStart = state.startLineStart; + this.lastIndex = state.lastIndex; + this.lastLine = state.lastLine; + this.lastLineStart = state.lastLineStart; + this.lookahead = state.lookahead; + this.hasLineTerminatorBeforeNext = state.hasLineTerminatorBeforeNext; + this.tokenIndex = state.tokenIndex; } - if (this.isKeyword(this.peek(), "extends")) { - this.advance(); - supr_123 = this.enforestExpressionLoop(); + }, { + key: "createILLEGAL", + value: function createILLEGAL() { + this.startIndex = this.index; + this.startLine = this.line; + this.startLineStart = this.lineStart; + return this.index < this.source.length ? this.createError(_errors.ErrorMessages.UNEXPECTED_ILLEGAL_TOKEN, this.source.charAt(this.index)) : this.createError(_errors.ErrorMessages.UNEXPECTED_EOS); } - let elements_125 = []; - let enf_126 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - while (enf_126.rest.size !== 0) { - if (enf_126.isPunctuator(enf_126.peek(), ";")) { - enf_126.advance(); - continue; - } - let isStatic = false; - - var _enf_126$enforestMeth = enf_126.enforestMethodDefinition(); - - let methodOrKey = _enf_126$enforestMeth.methodOrKey; - let kind = _enf_126$enforestMeth.kind; - - if (kind === "identifier" && methodOrKey.value.val() === "static") { - isStatic = true; - - var _enf_126$enforestMeth2 = enf_126.enforestMethodDefinition(); - - methodOrKey = _enf_126$enforestMeth2.methodOrKey; - kind = _enf_126$enforestMeth2.kind; - } - if (kind === "method") { - elements_125.push(new _terms2.default("ClassElement", { isStatic: isStatic, method: methodOrKey })); - } else { - throw this.createError(enf_126.peek(), "Only methods are allowed in classes"); + }, { + key: "createUnexpected", + value: function createUnexpected(token) { + switch (token.type.klass) { + case TokenClass.Eof: + return this.createError(_errors.ErrorMessages.UNEXPECTED_EOS); + case TokenClass.Ident: + return this.createError(_errors.ErrorMessages.UNEXPECTED_IDENTIFIER); + case TokenClass.Keyword: + return this.createError(_errors.ErrorMessages.UNEXPECTED_TOKEN, token.slice.text); + case TokenClass.NumericLiteral: + return this.createError(_errors.ErrorMessages.UNEXPECTED_NUMBER); + case TokenClass.TemplateElement: + return this.createError(_errors.ErrorMessages.UNEXPECTED_TEMPLATE); + case TokenClass.Punctuator: + return this.createError(_errors.ErrorMessages.UNEXPECTED_TOKEN, token.type.name); + case TokenClass.StringLiteral: + return this.createError(_errors.ErrorMessages.UNEXPECTED_STRING); + // the other token classes are RegularExpression and Illegal, but they cannot reach here } } - return new _terms2.default(type_124, { name: name_122, super: supr_123, elements: (0, _immutable.List)(elements_125) }); - } - enforestBindingTarget() { - var _ref2 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - - let allowPunctuator = _ref2.allowPunctuator; + }, { + key: "createError", + value: function createError(message) { + var _arguments = arguments; - let lookahead_127 = this.peek(); - if (this.isIdentifier(lookahead_127) || this.isKeyword(lookahead_127) || allowPunctuator && this.isPunctuator(lookahead_127)) { - return this.enforestBindingIdentifier({ allowPunctuator: allowPunctuator }); - } else if (this.isBrackets(lookahead_127)) { - return this.enforestArrayBinding(); - } else if (this.isBraces(lookahead_127)) { - return this.enforestObjectBinding(); - } - (0, _errors.assert)(false, "not implemented yet"); - } - enforestObjectBinding() { - let enf_128 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - let properties_129 = []; - while (enf_128.rest.size !== 0) { - properties_129.push(enf_128.enforestBindingProperty()); - enf_128.consumeComma(); + /* istanbul ignore next */ + var msg = message.replace(/\{(\d+)\}/g, function (_, n) { + return JSON.stringify(_arguments[+n + 1]); + }); + return new JsError(this.startIndex, this.startLine + 1, this.startIndex - this.startLineStart + 1, msg); } - return new _terms2.default("ObjectBinding", { properties: (0, _immutable.List)(properties_129) }); - } - enforestBindingProperty() { - let lookahead_130 = this.peek(); - - var _enforestPropertyName = this.enforestPropertyName(); - - let name = _enforestPropertyName.name; - let binding = _enforestPropertyName.binding; + }, { + key: "createErrorWithLocation", + value: function createErrorWithLocation(location, message) { + var _arguments2 = arguments; - if (this.isIdentifier(lookahead_130) || this.isKeyword(lookahead_130, "let") || this.isKeyword(lookahead_130, "yield")) { - if (!this.isPunctuator(this.peek(), ":")) { - let defaultValue = null; - if (this.isAssign(this.peek())) { - this.advance(); - let expr = this.enforestExpressionLoop(); - defaultValue = expr; - } - return new _terms2.default("BindingPropertyIdentifier", { binding: binding, init: defaultValue }); - } - } - this.matchPunctuator(":"); - binding = this.enforestBindingElement(); - return new _terms2.default("BindingPropertyProperty", { name: name, binding: binding }); - } - enforestArrayBinding() { - let bracket_131 = this.matchSquares(); - let enf_132 = new Enforester_46(bracket_131, (0, _immutable.List)(), this.context); - let elements_133 = [], - restElement_134 = null; - while (enf_132.rest.size !== 0) { - let el; - if (enf_132.isPunctuator(enf_132.peek(), ",")) { - enf_132.consumeComma(); - el = null; - } else { - if (enf_132.isPunctuator(enf_132.peek(), "...")) { - enf_132.advance(); - restElement_134 = enf_132.enforestBindingTarget(); - break; - } else { - el = enf_132.enforestBindingElement(); - } - enf_132.consumeComma(); + /* istanbul ignore next */ + var msg = message.replace(/\{(\d+)\}/g, function (_, n) { + return JSON.stringify(_arguments2[+n + 2]); + }); + if (location.slice && location.slice.startLocation) { + location = location.slice.startLocation; } - elements_133.push(el); - } - return new _terms2.default("ArrayBinding", { elements: (0, _immutable.List)(elements_133), restElement: restElement_134 }); - } - enforestBindingElement() { - let binding_135 = this.enforestBindingTarget(); - if (this.isAssign(this.peek())) { - this.advance(); - let init = this.enforestExpressionLoop(); - binding_135 = new _terms2.default("BindingWithDefault", { binding: binding_135, init: init }); - } - return binding_135; - } - enforestBindingIdentifier() { - var _ref3 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - - let allowPunctuator = _ref3.allowPunctuator; - - let name_136; - if (allowPunctuator && this.isPunctuator(this.peek())) { - name_136 = this.enforestPunctuator(); - } else { - name_136 = this.enforestIdentifier(); - } - return new _terms2.default("BindingIdentifier", { name: name_136 }); - } - enforestPunctuator() { - let lookahead_137 = this.peek(); - if (this.isPunctuator(lookahead_137)) { - return this.advance(); - } - throw this.createError(lookahead_137, "expecting a punctuator"); - } - enforestIdentifier() { - let lookahead_138 = this.peek(); - if (this.isIdentifier(lookahead_138) || this.isKeyword(lookahead_138)) { - return this.advance(); - } - throw this.createError(lookahead_138, "expecting an identifier"); - } - enforestReturnStatement() { - let kw_139 = this.advance(); - let lookahead_140 = this.peek(); - if (this.rest.size === 0 || lookahead_140 && !this.lineNumberEq(kw_139, lookahead_140)) { - return new _terms2.default("ReturnStatement", { expression: null }); - } - let term_141 = null; - if (!this.isPunctuator(lookahead_140, ";")) { - term_141 = this.enforestExpression(); - (0, _errors.expect)(term_141 != null, "Expecting an expression to follow return keyword", lookahead_140, this.rest); + return new JsError(location.offset, location.line, location.column + 1, msg); } - this.consumeSemicolon(); - return new _terms2.default("ReturnStatement", { expression: term_141 }); - } - enforestVariableDeclaration() { - let kind_142; - let lookahead_143 = this.advance(); - let kindSyn_144 = lookahead_143; - let phase_145 = this.context.phase; - if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.VariableDeclTransform) { - kind_142 = "var"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.LetDeclTransform) { - kind_142 = "let"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.ConstDeclTransform) { - kind_142 = "const"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.SyntaxDeclTransform) { - kind_142 = "syntax"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.SyntaxrecDeclTransform) { - kind_142 = "syntaxrec"; - } - let decls_146 = (0, _immutable.List)(); - while (true) { - let term = this.enforestVariableDeclarator({ isSyntax: kind_142 === "syntax" || kind_142 === "syntaxrec" }); - let lookahead_143 = this.peek(); - decls_146 = decls_146.concat(term); - if (this.isPunctuator(lookahead_143, ",")) { - this.advance(); - } else { - break; + }, { + key: "getKeyword", + value: function getKeyword(id) { + if (id.length === 1 || id.length > 10) { + return TokenType.IDENTIFIER; } - } - return new _terms2.default("VariableDeclaration", { kind: kind_142, declarators: decls_146 }); - } - enforestVariableDeclarator(_ref4) { - let isSyntax = _ref4.isSyntax; - let id_147 = this.enforestBindingTarget({ allowPunctuator: isSyntax }); - let lookahead_148 = this.peek(); - let init_149, rest_150; - if (this.isPunctuator(lookahead_148, "=")) { - this.advance(); - let enf = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); - init_149 = enf.enforest("expression"); - this.rest = enf.rest; - } else { - init_149 = null; - } - return new _terms2.default("VariableDeclarator", { binding: id_147, init: init_149 }); - } - enforestExpressionStatement() { - let start_151 = this.rest.get(0); - let expr_152 = this.enforestExpression(); - if (expr_152 === null) { - throw this.createError(start_151, "not a valid expression"); - } - this.consumeSemicolon(); - return new _terms2.default("ExpressionStatement", { expression: expr_152 }); - } - enforestExpression() { - let left_153 = this.enforestExpressionLoop(); - let lookahead_154 = this.peek(); - if (this.isPunctuator(lookahead_154, ",")) { - while (this.rest.size !== 0) { - if (!this.isPunctuator(this.peek(), ",")) { + /* istanbul ignore next */ + switch (id.length) { + case 2: + switch (id.charAt(0)) { + case "i": + switch (id.charAt(1)) { + case "f": + return TokenType.IF; + case "n": + return TokenType.IN; + default: + break; + } + break; + case "d": + if (id.charAt(1) === "o") { + return TokenType.DO; + } + break; + } + break; + case 3: + switch (id.charAt(0)) { + case "v": + if (Tokenizer.cse2(id, "a", "r")) { + return TokenType.VAR; + } + break; + case "f": + if (Tokenizer.cse2(id, "o", "r")) { + return TokenType.FOR; + } + break; + case "n": + if (Tokenizer.cse2(id, "e", "w")) { + return TokenType.NEW; + } + break; + case "t": + if (Tokenizer.cse2(id, "r", "y")) { + return TokenType.TRY; + } + break; + case "l": + if (Tokenizer.cse2(id, "e", "t")) { + return TokenType.LET; + } + break; + } + break; + case 4: + switch (id.charAt(0)) { + case "t": + if (Tokenizer.cse3(id, "h", "i", "s")) { + return TokenType.THIS; + } else if (Tokenizer.cse3(id, "r", "u", "e")) { + return TokenType.TRUE; + } + break; + case "n": + if (Tokenizer.cse3(id, "u", "l", "l")) { + return TokenType.NULL; + } + break; + case "e": + if (Tokenizer.cse3(id, "l", "s", "e")) { + return TokenType.ELSE; + } + break; + case "c": + if (Tokenizer.cse3(id, "a", "s", "e")) { + return TokenType.CASE; + } + break; + case "v": + if (Tokenizer.cse3(id, "o", "i", "d")) { + return TokenType.VOID; + } + break; + case "w": + if (Tokenizer.cse3(id, "i", "t", "h")) { + return TokenType.WITH; + } + break; + } + break; + case 5: + switch (id.charAt(0)) { + case "a": + if (this.moduleIsTheGoalSymbol && Tokenizer.cse4(id, "w", "a", "i", "t")) { + return TokenType.AWAIT; + } + break; + case "w": + if (Tokenizer.cse4(id, "h", "i", "l", "e")) { + return TokenType.WHILE; + } + break; + case "b": + if (Tokenizer.cse4(id, "r", "e", "a", "k")) { + return TokenType.BREAK; + } + break; + case "f": + if (Tokenizer.cse4(id, "a", "l", "s", "e")) { + return TokenType.FALSE; + } + break; + case "c": + if (Tokenizer.cse4(id, "a", "t", "c", "h")) { + return TokenType.CATCH; + } else if (Tokenizer.cse4(id, "o", "n", "s", "t")) { + return TokenType.CONST; + } else if (Tokenizer.cse4(id, "l", "a", "s", "s")) { + return TokenType.CLASS; + } + break; + case "t": + if (Tokenizer.cse4(id, "h", "r", "o", "w")) { + return TokenType.THROW; + } + break; + case "y": + if (Tokenizer.cse4(id, "i", "e", "l", "d")) { + return TokenType.YIELD; + } + break; + case "s": + if (Tokenizer.cse4(id, "u", "p", "e", "r")) { + return TokenType.SUPER; + } + break; + } + break; + case 6: + switch (id.charAt(0)) { + case "r": + if (Tokenizer.cse5(id, "e", "t", "u", "r", "n")) { + return TokenType.RETURN; + } + break; + case "t": + if (Tokenizer.cse5(id, "y", "p", "e", "o", "f")) { + return TokenType.TYPEOF; + } + break; + case "d": + if (Tokenizer.cse5(id, "e", "l", "e", "t", "e")) { + return TokenType.DELETE; + } + break; + case "s": + if (Tokenizer.cse5(id, "w", "i", "t", "c", "h")) { + return TokenType.SWITCH; + } + break; + case "e": + if (Tokenizer.cse5(id, "x", "p", "o", "r", "t")) { + return TokenType.EXPORT; + } + break; + case "i": + if (Tokenizer.cse5(id, "m", "p", "o", "r", "t")) { + return TokenType.IMPORT; + } + break; + } + break; + case 7: + switch (id.charAt(0)) { + case "d": + if (Tokenizer.cse6(id, "e", "f", "a", "u", "l", "t")) { + return TokenType.DEFAULT; + } + break; + case "f": + if (Tokenizer.cse6(id, "i", "n", "a", "l", "l", "y")) { + return TokenType.FINALLY; + } + break; + case "e": + if (Tokenizer.cse6(id, "x", "t", "e", "n", "d", "s")) { + return TokenType.EXTENDS; + } + break; + } + break; + case 8: + switch (id.charAt(0)) { + case "f": + if (Tokenizer.cse7(id, "u", "n", "c", "t", "i", "o", "n")) { + return TokenType.FUNCTION; + } + break; + case "c": + if (Tokenizer.cse7(id, "o", "n", "t", "i", "n", "u", "e")) { + return TokenType.CONTINUE; + } + break; + case "d": + if (Tokenizer.cse7(id, "e", "b", "u", "g", "g", "e", "r")) { + return TokenType.DEBUGGER; + } + break; + } + break; + case 10: + if (id === "instanceof") { + return TokenType.INSTANCEOF; + } break; - } - let operator = this.advance(); - let right = this.enforestExpressionLoop(); - left_153 = new _terms2.default("BinaryExpression", { left: left_153, operator: operator, right: right }); - } - } - this.term = null; - return left_153; - } - enforestExpressionLoop() { - this.term = null; - this.opCtx = { prec: 0, combine: x_155 => x_155, stack: (0, _immutable.List)() }; - do { - let term = this.enforestAssignmentExpression(); - if (term === EXPR_LOOP_NO_CHANGE_44 && this.opCtx.stack.size > 0) { - this.term = this.opCtx.combine(this.term); - - var _opCtx$stack$last = this.opCtx.stack.last(); - - let prec = _opCtx$stack$last.prec; - let combine = _opCtx$stack$last.combine; - - this.opCtx.prec = prec; - this.opCtx.combine = combine; - this.opCtx.stack = this.opCtx.stack.pop(); - } else if (term === EXPR_LOOP_NO_CHANGE_44) { - break; - } else if (term === EXPR_LOOP_OPERATOR_43 || term === EXPR_LOOP_EXPANSION_45) { - this.term = null; - } else { - this.term = term; } - } while (true); - return this.term; - } - enforestAssignmentExpression() { - let lookahead_156 = this.peek(); - if (this.term === null && this.isCompiletimeTransform(lookahead_156)) { - this.expandMacro(); - lookahead_156 = this.peek(); - } - if (this.term === null && this.isTerm(lookahead_156)) { - return this.advance(); - } - if (this.term === null && this.isKeyword(lookahead_156, "yield")) { - return this.enforestYieldExpression(); - } - if (this.term === null && this.isKeyword(lookahead_156, "class")) { - return this.enforestClass({ isExpr: true }); - } - if (this.term === null && (this.isIdentifier(lookahead_156) || this.isParens(lookahead_156)) && this.isPunctuator(this.peek(1), "=>") && this.lineNumberEq(lookahead_156, this.peek(1))) { - return this.enforestArrowExpression(); - } - if (this.term === null && this.isSyntaxTemplate(lookahead_156)) { - return this.enforestSyntaxTemplate(); - } - if (this.term === null && this.isSyntaxQuoteTransform(lookahead_156)) { - return this.enforestSyntaxQuote(); - } - if (this.term === null && this.isParens(lookahead_156)) { - return new _terms2.default("ParenthesizedExpression", { inner: this.advance().inner() }); - } - if (this.term === null && (this.isKeyword(lookahead_156, "this") || this.isIdentifier(lookahead_156) || this.isKeyword(lookahead_156, "let") || this.isKeyword(lookahead_156, "yield") || this.isNumericLiteral(lookahead_156) || this.isStringLiteral(lookahead_156) || this.isTemplate(lookahead_156) || this.isBooleanLiteral(lookahead_156) || this.isNullLiteral(lookahead_156) || this.isRegularExpression(lookahead_156) || this.isFnDeclTransform(lookahead_156) || this.isBraces(lookahead_156) || this.isBrackets(lookahead_156))) { - return this.enforestPrimaryExpression(); - } - if (this.term === null && this.isOperator(lookahead_156)) { - return this.enforestUnaryExpression(); + return TokenType.IDENTIFIER; } - if (this.term === null && this.isVarBindingTransform(lookahead_156)) { - let id = this.getFromCompiletimeEnvironment(lookahead_156).id; - if (id !== lookahead_156) { - this.advance(); - this.rest = _immutable.List.of(id).concat(this.rest); - return EXPR_LOOP_EXPANSION_45; + }, { + key: "skipSingleLineComment", + value: function skipSingleLineComment(offset) { + this.index += offset; + while (this.index < this.source.length) { + /** + * @type {Number} + */ + var chCode = this.source.charCodeAt(this.index); + this.index++; + if ((0, _utils.isLineTerminator)(chCode)) { + this.hasLineTerminatorBeforeNext = true; + if (chCode === 0xD /* "\r" */ && this.source.charCodeAt(this.index) === 0xA /*"\n" */) { + this.index++; + } + this.lineStart = this.index; + this.line++; + return; + } } } - if (this.term === null && (this.isNewTransform(lookahead_156) || this.isKeyword(lookahead_156, "super")) || this.term && (this.isPunctuator(lookahead_156, ".") && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1))) || this.isBrackets(lookahead_156) || this.isParens(lookahead_156))) { - return this.enforestLeftHandSideExpression({ allowCall: true }); - } - if (this.term && this.isTemplate(lookahead_156)) { - return this.enforestTemplateLiteral(); - } - if (this.term && this.isUpdateOperator(lookahead_156)) { - return this.enforestUpdateExpression(); - } - if (this.term && this.isOperator(lookahead_156)) { - return this.enforestBinaryExpression(); - } - if (this.term && this.isAssign(lookahead_156)) { - let binding = this.transformDestructuring(this.term); - let op = this.advance(); - let enf = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); - let init = enf.enforest("expression"); - this.rest = enf.rest; - if (op.val() === "=") { - return new _terms2.default("AssignmentExpression", { binding: binding, expression: init }); - } else { - return new _terms2.default("CompoundAssignmentExpression", { binding: binding, operator: op.val(), expression: init }); + }, { + key: "skipMultiLineComment", + value: function skipMultiLineComment() { + this.index += 2; + var length = this.source.length; + var isLineStart = false; + while (this.index < length) { + var chCode = this.source.charCodeAt(this.index); + if (chCode < 0x80) { + switch (chCode) { + case 42: + // "*" + // Block comment ends with "*/". + if (this.source.charAt(this.index + 1) === "/") { + this.index = this.index + 2; + return isLineStart; + } + this.index++; + break; + case 10: + // "\n" + isLineStart = true; + this.hasLineTerminatorBeforeNext = true; + this.index++; + this.lineStart = this.index; + this.line++; + break; + case 13: + // "\r": + isLineStart = true; + this.hasLineTerminatorBeforeNext = true; + if (this.source.charAt(this.index + 1) === "\n") { + this.index++; + } + this.index++; + this.lineStart = this.index; + this.line++; + break; + default: + this.index++; + } + } else if (chCode === 0x2028 || chCode === 0x2029) { + isLineStart = true; + this.hasLineTerminatorBeforeNext = true; + this.index++; + this.lineStart = this.index; + this.line++; + } else { + this.index++; + } } + throw this.createILLEGAL(); } - if (this.term && this.isPunctuator(lookahead_156, "?")) { - return this.enforestConditionalExpression(); - } - return EXPR_LOOP_NO_CHANGE_44; - } - enforestPrimaryExpression() { - let lookahead_157 = this.peek(); - if (this.term === null && this.isKeyword(lookahead_157, "this")) { - return this.enforestThisExpression(); - } - if (this.term === null && (this.isIdentifier(lookahead_157) || this.isKeyword(lookahead_157, "let") || this.isKeyword(lookahead_157, "yield"))) { - return this.enforestIdentifierExpression(); - } - if (this.term === null && this.isNumericLiteral(lookahead_157)) { - return this.enforestNumericLiteral(); - } - if (this.term === null && this.isStringLiteral(lookahead_157)) { - return this.enforestStringLiteral(); - } - if (this.term === null && this.isTemplate(lookahead_157)) { - return this.enforestTemplateLiteral(); - } - if (this.term === null && this.isBooleanLiteral(lookahead_157)) { - return this.enforestBooleanLiteral(); - } - if (this.term === null && this.isNullLiteral(lookahead_157)) { - return this.enforestNullLiteral(); - } - if (this.term === null && this.isRegularExpression(lookahead_157)) { - return this.enforestRegularExpressionLiteral(); - } - if (this.term === null && this.isFnDeclTransform(lookahead_157)) { - return this.enforestFunctionExpression(); - } - if (this.term === null && this.isBraces(lookahead_157)) { - return this.enforestObjectExpression(); - } - if (this.term === null && this.isBrackets(lookahead_157)) { - return this.enforestArrayExpression(); - } - (0, _errors.assert)(false, "Not a primary expression"); - } - enforestLeftHandSideExpression(_ref5) { - let allowCall = _ref5.allowCall; + }, { + key: "skipComment", + value: function skipComment() { + this.hasLineTerminatorBeforeNext = false; - let lookahead_158 = this.peek(); - if (this.isKeyword(lookahead_158, "super")) { - this.advance(); - this.term = new _terms2.default("Super", {}); - } else if (this.isNewTransform(lookahead_158)) { - this.term = this.enforestNewExpression(); - } - while (true) { - lookahead_158 = this.peek(); - if (this.isParens(lookahead_158)) { - if (!allowCall) { - if (this.term && (0, _terms.isIdentifierExpression)(this.term)) { - return this.term; + var isLineStart = this.index === 0; + var length = this.source.length; + + while (this.index < length) { + var chCode = this.source.charCodeAt(this.index); + if ((0, _utils.isWhiteSpace)(chCode)) { + this.index++; + } else if ((0, _utils.isLineTerminator)(chCode)) { + this.hasLineTerminatorBeforeNext = true; + this.index++; + if (chCode === 13 /* "\r" */ && this.source.charAt(this.index) === "\n") { + this.index++; } - this.term = this.enforestExpressionLoop(); - } else { - this.term = this.enforestCallExpression(); + this.lineStart = this.index; + this.line++; + isLineStart = true; + } else if (chCode === 47 /* "/" */) { + if (this.index + 1 >= length) { + break; + } + chCode = this.source.charCodeAt(this.index + 1); + if (chCode === 47 /* "/" */) { + this.skipSingleLineComment(2); + isLineStart = true; + } else if (chCode === 42 /* "*" */) { + isLineStart = this.skipMultiLineComment() || isLineStart; + } else { + break; + } + } else if (!this.moduleIsTheGoalSymbol && isLineStart && chCode === 45 /* "-" */) { + if (this.index + 2 >= length) { + break; + } + // U+003E is ">" + if (this.source.charAt(this.index + 1) === "-" && this.source.charAt(this.index + 2) === ">") { + // "-->" is a single-line comment + this.skipSingleLineComment(3); + } else { + break; + } + } else if (!this.moduleIsTheGoalSymbol && chCode === 60 /* "<" */) { + if (this.source.slice(this.index + 1, this.index + 4) === "!--") { + this.skipSingleLineComment(4); + } else { + break; + } + } else { + break; } - } else if (this.isBrackets(lookahead_158)) { - this.term = allowCall ? this.enforestComputedMemberExpression() : this.enforestExpressionLoop(); - } else if (this.isPunctuator(lookahead_158, ".") && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1)))) { - this.term = this.enforestStaticMemberExpression(); - } else if (this.isTemplate(lookahead_158)) { - this.term = this.enforestTemplateLiteral(); - } else if (this.isBraces(lookahead_158)) { - this.term = this.enforestPrimaryExpression(); - } else if (this.isIdentifier(lookahead_158)) { - this.term = new _terms2.default("IdentifierExpression", { name: this.enforestIdentifier() }); - } else { - break; } } - return this.term; - } - enforestBooleanLiteral() { - return new _terms2.default("LiteralBooleanExpression", { value: this.advance() }); - } - enforestTemplateLiteral() { - return new _terms2.default("TemplateExpression", { tag: this.term, elements: this.enforestTemplateElements() }); - } - enforestStringLiteral() { - return new _terms2.default("LiteralStringExpression", { value: this.advance() }); - } - enforestNumericLiteral() { - let num_159 = this.advance(); - if (num_159.val() === 1 / 0) { - return new _terms2.default("LiteralInfinityExpression", {}); - } - return new _terms2.default("LiteralNumericExpression", { value: num_159 }); - } - enforestIdentifierExpression() { - return new _terms2.default("IdentifierExpression", { name: this.advance() }); - } - enforestRegularExpressionLiteral() { - let reStx_160 = this.advance(); - let lastSlash_161 = reStx_160.token.value.lastIndexOf("/"); - let pattern_162 = reStx_160.token.value.slice(1, lastSlash_161); - let flags_163 = reStx_160.token.value.slice(lastSlash_161 + 1); - return new _terms2.default("LiteralRegExpExpression", { pattern: pattern_162, flags: flags_163 }); - } - enforestNullLiteral() { - this.advance(); - return new _terms2.default("LiteralNullExpression", {}); - } - enforestThisExpression() { - return new _terms2.default("ThisExpression", { stx: this.advance() }); - } - enforestArgumentList() { - let result_164 = []; - while (this.rest.size > 0) { - let arg; - if (this.isPunctuator(this.peek(), "...")) { - this.advance(); - arg = new _terms2.default("SpreadElement", { expression: this.enforestExpressionLoop() }); - } else { - arg = this.enforestExpressionLoop(); + }, { + key: "scanHexEscape2", + value: function scanHexEscape2() { + if (this.index + 2 > this.source.length) { + return -1; } - if (this.rest.size > 0) { - this.matchPunctuator(","); + var r1 = (0, _utils.getHexValue)(this.source.charAt(this.index)); + if (r1 === -1) { + return -1; } - result_164.push(arg); - } - return (0, _immutable.List)(result_164); - } - enforestNewExpression() { - this.matchKeyword("new"); - if (this.isPunctuator(this.peek(), ".") && this.isIdentifier(this.peek(1), "target")) { - this.advance(); - this.advance(); - return new _terms2.default("NewTargetExpression", {}); - } - let callee_165 = this.enforestLeftHandSideExpression({ allowCall: false }); - let args_166; - if (this.isParens(this.peek())) { - args_166 = this.matchParens(); - } else { - args_166 = (0, _immutable.List)(); - } - return new _terms2.default("NewExpression", { callee: callee_165, arguments: args_166 }); - } - enforestComputedMemberExpression() { - let enf_167 = new Enforester_46(this.matchSquares(), (0, _immutable.List)(), this.context); - return new _terms2.default("ComputedMemberExpression", { object: this.term, expression: enf_167.enforestExpression() }); - } - transformDestructuring(term_168) { - switch (term_168.type) { - case "IdentifierExpression": - return new _terms2.default("BindingIdentifier", { name: term_168.name }); - case "ParenthesizedExpression": - if (term_168.inner.size === 1 && this.isIdentifier(term_168.inner.get(0))) { - return new _terms2.default("BindingIdentifier", { name: term_168.inner.get(0) }); - } - case "DataProperty": - return new _terms2.default("BindingPropertyProperty", { name: term_168.name, binding: this.transformDestructuringWithDefault(term_168.expression) }); - case "ShorthandProperty": - return new _terms2.default("BindingPropertyIdentifier", { binding: new _terms2.default("BindingIdentifier", { name: term_168.name }), init: null }); - case "ObjectExpression": - return new _terms2.default("ObjectBinding", { properties: term_168.properties.map(t_169 => this.transformDestructuring(t_169)) }); - case "ArrayExpression": - let last = term_168.elements.last(); - if (last != null && last.type === "SpreadElement") { - return new _terms2.default("ArrayBinding", { elements: term_168.elements.slice(0, -1).map(t_170 => t_170 && this.transformDestructuringWithDefault(t_170)), restElement: this.transformDestructuringWithDefault(last.expression) }); - } else { - return new _terms2.default("ArrayBinding", { elements: term_168.elements.map(t_171 => t_171 && this.transformDestructuringWithDefault(t_171)), restElement: null }); - } - return new _terms2.default("ArrayBinding", { elements: term_168.elements.map(t_172 => t_172 && this.transformDestructuring(t_172)), restElement: null }); - case "StaticPropertyName": - return new _terms2.default("BindingIdentifier", { name: term_168.value }); - case "ComputedMemberExpression": - case "StaticMemberExpression": - case "ArrayBinding": - case "BindingIdentifier": - case "BindingPropertyIdentifier": - case "BindingPropertyProperty": - case "BindingWithDefault": - case "ObjectBinding": - return term_168; - } - (0, _errors.assert)(false, "not implemented yet for " + term_168.type); - } - transformDestructuringWithDefault(term_173) { - switch (term_173.type) { - case "AssignmentExpression": - return new _terms2.default("BindingWithDefault", { binding: this.transformDestructuring(term_173.binding), init: term_173.expression }); - } - return this.transformDestructuring(term_173); - } - enforestCallExpression() { - let paren_174 = this.advance(); - return new _terms2.default("CallExpression", { callee: this.term, arguments: paren_174.inner() }); - } - enforestArrowExpression() { - let enf_175; - if (this.isIdentifier(this.peek())) { - enf_175 = new Enforester_46(_immutable.List.of(this.advance()), (0, _immutable.List)(), this.context); - } else { - let p = this.matchParens(); - enf_175 = new Enforester_46(p, (0, _immutable.List)(), this.context); - } - let params_176 = enf_175.enforestFormalParameters(); - this.matchPunctuator("=>"); - let body_177; - if (this.isBraces(this.peek())) { - body_177 = this.matchCurlies(); - } else { - enf_175 = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); - body_177 = enf_175.enforestExpressionLoop(); - this.rest = enf_175.rest; - } - return new _terms2.default("ArrowExpression", { params: params_176, body: body_177 }); - } - enforestYieldExpression() { - let kwd_178 = this.matchKeyword("yield"); - let lookahead_179 = this.peek(); - if (this.rest.size === 0 || lookahead_179 && !this.lineNumberEq(kwd_178, lookahead_179)) { - return new _terms2.default("YieldExpression", { expression: null }); - } else { - let isGenerator = false; - if (this.isPunctuator(this.peek(), "*")) { - isGenerator = true; - this.advance(); + var r2 = (0, _utils.getHexValue)(this.source.charAt(this.index + 1)); + if (r2 === -1) { + return -1; } - let expr = this.enforestExpression(); - let type = isGenerator ? "YieldGeneratorExpression" : "YieldExpression"; - return new _terms2.default(type, { expression: expr }); + this.index += 2; + return r1 << 4 | r2; } - } - enforestSyntaxTemplate() { - return new _terms2.default("SyntaxTemplate", { template: this.advance() }); - } - enforestSyntaxQuote() { - let name_180 = this.advance(); - return new _terms2.default("SyntaxQuote", { name: name_180, template: new _terms2.default("TemplateExpression", { tag: new _terms2.default("IdentifierExpression", { name: name_180 }), elements: this.enforestTemplateElements() }) }); - } - enforestStaticMemberExpression() { - let object_181 = this.term; - let dot_182 = this.advance(); - let property_183 = this.advance(); - return new _terms2.default("StaticMemberExpression", { object: object_181, property: property_183 }); - } - enforestArrayExpression() { - let arr_184 = this.advance(); - let elements_185 = []; - let enf_186 = new Enforester_46(arr_184.inner(), (0, _immutable.List)(), this.context); - while (enf_186.rest.size > 0) { - let lookahead = enf_186.peek(); - if (enf_186.isPunctuator(lookahead, ",")) { - enf_186.advance(); - elements_185.push(null); - } else if (enf_186.isPunctuator(lookahead, "...")) { - enf_186.advance(); - let expression = enf_186.enforestExpressionLoop(); - if (expression == null) { - throw enf_186.createError(lookahead, "expecting expression"); - } - elements_185.push(new _terms2.default("SpreadElement", { expression: expression })); - } else { - let term = enf_186.enforestExpressionLoop(); - if (term == null) { - throw enf_186.createError(lookahead, "expected expression"); + }, { + key: "scanUnicode", + value: function scanUnicode() { + if (this.source.charAt(this.index) === "{") { + //\u{HexDigits} + var i = this.index + 1; + var hexDigits = 0, + ch = void 0; + while (i < this.source.length) { + ch = this.source.charAt(i); + var hex = (0, _utils.getHexValue)(ch); + if (hex === -1) { + break; + } + hexDigits = hexDigits << 4 | hex; + if (hexDigits > 0x10FFFF) { + throw this.createILLEGAL(); + } + i++; } - elements_185.push(term); - enf_186.consumeComma(); - } - } - return new _terms2.default("ArrayExpression", { elements: (0, _immutable.List)(elements_185) }); - } - enforestObjectExpression() { - let obj_187 = this.advance(); - let properties_188 = (0, _immutable.List)(); - let enf_189 = new Enforester_46(obj_187.inner(), (0, _immutable.List)(), this.context); - let lastProp_190 = null; - while (enf_189.rest.size > 0) { - let prop = enf_189.enforestPropertyDefinition(); - enf_189.consumeComma(); - properties_188 = properties_188.concat(prop); - if (lastProp_190 === prop) { - throw enf_189.createError(prop, "invalid syntax in object"); + if (ch !== "}") { + throw this.createILLEGAL(); + } + if (i === this.index + 1) { + ++this.index; // This is so that the error is 'Unexpected "}"' instead of 'Unexpected "{"'. + throw this.createILLEGAL(); + } + this.index = i + 1; + return hexDigits; + } else { + //\uHex4Digits + if (this.index + 4 > this.source.length) { + return -1; + } + var r1 = (0, _utils.getHexValue)(this.source.charAt(this.index)); + if (r1 === -1) { + return -1; + } + var r2 = (0, _utils.getHexValue)(this.source.charAt(this.index + 1)); + if (r2 === -1) { + return -1; + } + var r3 = (0, _utils.getHexValue)(this.source.charAt(this.index + 2)); + if (r3 === -1) { + return -1; + } + var r4 = (0, _utils.getHexValue)(this.source.charAt(this.index + 3)); + if (r4 === -1) { + return -1; + } + this.index += 4; + return r1 << 12 | r2 << 8 | r3 << 4 | r4; } - lastProp_190 = prop; } - return new _terms2.default("ObjectExpression", { properties: properties_188 }); - } - enforestPropertyDefinition() { - var _enforestMethodDefini = this.enforestMethodDefinition(); - - let methodOrKey = _enforestMethodDefini.methodOrKey; - let kind = _enforestMethodDefini.kind; + }, { + key: "getEscapedIdentifier", + value: function getEscapedIdentifier() { + var id = ""; + var check = _utils.isIdentifierStart; - switch (kind) { - case "method": - return methodOrKey; - case "identifier": - if (this.isAssign(this.peek())) { - this.advance(); - let init = this.enforestExpressionLoop(); - return new _terms2.default("BindingPropertyIdentifier", { init: init, binding: this.transformDestructuring(methodOrKey) }); - } else if (!this.isPunctuator(this.peek(), ":")) { - return new _terms2.default("ShorthandProperty", { name: methodOrKey.value }); + while (this.index < this.source.length) { + var ch = this.source.charAt(this.index); + var code = ch.charCodeAt(0); + var start = this.index; + ++this.index; + if (ch === "\\") { + if (this.index >= this.source.length) { + throw this.createILLEGAL(); + } + if (this.source.charAt(this.index) !== "u") { + throw this.createILLEGAL(); + } + ++this.index; + code = this.scanUnicode(); + if (code < 0) { + throw this.createILLEGAL(); + } + ch = fromCodePoint(code); + } else if (0xD800 <= code && code <= 0xDBFF) { + if (this.index >= this.source.length) { + throw this.createILLEGAL(); + } + var lowSurrogateCode = this.source.charCodeAt(this.index); + ++this.index; + if (!(0xDC00 <= lowSurrogateCode && lowSurrogateCode <= 0xDFFF)) { + throw this.createILLEGAL(); + } + code = decodeUtf16(code, lowSurrogateCode); + ch = fromCodePoint(code); } + if (!check(code)) { + if (id.length < 1) { + throw this.createILLEGAL(); + } + this.index = start; + return id; + } + check = _utils.isIdentifierPart; + id += ch; + } + return id; } - this.matchPunctuator(":"); - let expr_191 = this.enforestExpressionLoop(); - return new _terms2.default("DataProperty", { name: methodOrKey, expression: expr_191 }); - } - enforestMethodDefinition() { - let lookahead_192 = this.peek(); - let isGenerator_193 = false; - if (this.isPunctuator(lookahead_192, "*")) { - isGenerator_193 = true; - this.advance(); - } - if (this.isIdentifier(lookahead_192, "get") && this.isPropertyName(this.peek(1))) { - this.advance(); - - var _enforestPropertyName2 = this.enforestPropertyName(); - - let name = _enforestPropertyName2.name; - - this.matchParens(); - let body = this.matchCurlies(); - return { methodOrKey: new _terms2.default("Getter", { name: name, body: body }), kind: "method" }; - } else if (this.isIdentifier(lookahead_192, "set") && this.isPropertyName(this.peek(1))) { - this.advance(); - - var _enforestPropertyName3 = this.enforestPropertyName(); - - let name = _enforestPropertyName3.name; - - let enf = new Enforester_46(this.matchParens(), (0, _immutable.List)(), this.context); - let param = enf.enforestBindingElement(); - let body = this.matchCurlies(); - return { methodOrKey: new _terms2.default("Setter", { name: name, param: param, body: body }), kind: "method" }; + }, { + key: "getIdentifier", + value: function getIdentifier() { + var start = this.index; + var l = this.source.length; + var i = this.index; + var check = _utils.isIdentifierStart; + while (i < l) { + var ch = this.source.charAt(i); + var code = ch.charCodeAt(0); + if (ch === "\\" || 0xD800 <= code && code <= 0xDBFF) { + // Go back and try the hard one. + this.index = start; + return this.getEscapedIdentifier(); + } + if (!check(code)) { + this.index = i; + return this.source.slice(start, i); + } + ++i; + check = _utils.isIdentifierPart; + } + this.index = i; + return this.source.slice(start, i); } + }, { + key: "scanIdentifier", + value: function scanIdentifier() { + var startLocation = this.getLocation(); + var start = this.index; - var _enforestPropertyName4 = this.enforestPropertyName(); + // Backslash (U+005C) starts an escaped character. + var id = this.source.charAt(this.index) === "\\" ? this.getEscapedIdentifier() : this.getIdentifier(); - let name = _enforestPropertyName4.name; + // There is no keyword or literal with only one character. + // Thus, it must be an identifier. + var slice = this.getSlice(start, startLocation); + slice.text = id; - if (this.isParens(this.peek())) { - let params = this.matchParens(); - let enf = new Enforester_46(params, (0, _immutable.List)(), this.context); - let formalParams = enf.enforestFormalParameters(); - let body = this.matchCurlies(); - return { methodOrKey: new _terms2.default("Method", { isGenerator: isGenerator_193, name: name, params: formalParams, body: body }), kind: "method" }; - } - return { methodOrKey: name, kind: this.isIdentifier(lookahead_192) || this.isKeyword(lookahead_192) ? "identifier" : "property" }; - } - enforestPropertyName() { - let lookahead_194 = this.peek(); - if (this.isStringLiteral(lookahead_194) || this.isNumericLiteral(lookahead_194)) { - return { name: new _terms2.default("StaticPropertyName", { value: this.advance() }), binding: null }; - } else if (this.isBrackets(lookahead_194)) { - let enf = new Enforester_46(this.matchSquares(), (0, _immutable.List)(), this.context); - let expr = enf.enforestExpressionLoop(); - return { name: new _terms2.default("ComputedPropertyName", { expression: expr }), binding: null }; - } - let name_195 = this.advance(); - return { name: new _terms2.default("StaticPropertyName", { value: name_195 }), binding: new _terms2.default("BindingIdentifier", { name: name_195 }) }; - } - enforestFunction(_ref6) { - let isExpr = _ref6.isExpr; - let inDefault = _ref6.inDefault; - let allowGenerator = _ref6.allowGenerator; - - let name_196 = null, - params_197, - body_198, - rest_199; - let isGenerator_200 = false; - let fnKeyword_201 = this.advance(); - let lookahead_202 = this.peek(); - let type_203 = isExpr ? "FunctionExpression" : "FunctionDeclaration"; - if (this.isPunctuator(lookahead_202, "*")) { - isGenerator_200 = true; - this.advance(); - lookahead_202 = this.peek(); - } - if (!this.isParens(lookahead_202)) { - name_196 = this.enforestBindingIdentifier(); - } else if (inDefault) { - name_196 = new _terms2.default("BindingIdentifier", { name: _syntax2.default.fromIdentifier("*default*", fnKeyword_201) }); - } - params_197 = this.matchParens(); - body_198 = this.matchCurlies(); - let enf_204 = new Enforester_46(params_197, (0, _immutable.List)(), this.context); - let formalParams_205 = enf_204.enforestFormalParameters(); - return new _terms2.default(type_203, { name: name_196, isGenerator: isGenerator_200, params: formalParams_205, body: body_198 }); - } - enforestFunctionExpression() { - let name_206 = null, - params_207, - body_208, - rest_209; - let isGenerator_210 = false; - this.advance(); - let lookahead_211 = this.peek(); - if (this.isPunctuator(lookahead_211, "*")) { - isGenerator_210 = true; - this.advance(); - lookahead_211 = this.peek(); - } - if (!this.isParens(lookahead_211)) { - name_206 = this.enforestBindingIdentifier(); + return { type: this.getKeyword(id), value: id, slice: slice }; } - params_207 = this.matchParens(); - body_208 = this.matchCurlies(); - let enf_212 = new Enforester_46(params_207, (0, _immutable.List)(), this.context); - let formalParams_213 = enf_212.enforestFormalParameters(); - return new _terms2.default("FunctionExpression", { name: name_206, isGenerator: isGenerator_210, params: formalParams_213, body: body_208 }); - } - enforestFunctionDeclaration() { - let name_214, params_215, body_216, rest_217; - let isGenerator_218 = false; - this.advance(); - let lookahead_219 = this.peek(); - if (this.isPunctuator(lookahead_219, "*")) { - isGenerator_218 = true; - this.advance(); + }, { + key: "getLocation", + value: function getLocation() { + return { + line: this.startLine + 1, + column: this.startIndex - this.startLineStart, + offset: this.startIndex + }; } - name_214 = this.enforestBindingIdentifier(); - params_215 = this.matchParens(); - body_216 = this.matchCurlies(); - let enf_220 = new Enforester_46(params_215, (0, _immutable.List)(), this.context); - let formalParams_221 = enf_220.enforestFormalParameters(); - return new _terms2.default("FunctionDeclaration", { name: name_214, isGenerator: isGenerator_218, params: formalParams_221, body: body_216 }); - } - enforestFormalParameters() { - let items_222 = []; - let rest_223 = null; - while (this.rest.size !== 0) { - let lookahead = this.peek(); - if (this.isPunctuator(lookahead, "...")) { - this.matchPunctuator("..."); - rest_223 = this.enforestBindingIdentifier(); - break; - } - items_222.push(this.enforestParam()); - this.consumeComma(); + }, { + key: "getSlice", + value: function getSlice(start, startLocation) { + return { text: this.source.slice(start, this.index), start: start, startLocation: startLocation, end: this.index }; } - return new _terms2.default("FormalParameters", { items: (0, _immutable.List)(items_222), rest: rest_223 }); - } - enforestParam() { - return this.enforestBindingElement(); - } - enforestUpdateExpression() { - let operator_224 = this.matchUnaryOperator(); - return new _terms2.default("UpdateExpression", { isPrefix: false, operator: operator_224.val(), operand: this.transformDestructuring(this.term) }); - } - enforestUnaryExpression() { - let operator_225 = this.matchUnaryOperator(); - this.opCtx.stack = this.opCtx.stack.push({ prec: this.opCtx.prec, combine: this.opCtx.combine }); - this.opCtx.prec = 14; - this.opCtx.combine = rightTerm_226 => { - let type_227, term_228, isPrefix_229; - if (operator_225.val() === "++" || operator_225.val() === "--") { - type_227 = "UpdateExpression"; - term_228 = this.transformDestructuring(rightTerm_226); - isPrefix_229 = true; - } else { - type_227 = "UnaryExpression"; - isPrefix_229 = undefined; - term_228 = rightTerm_226; + }, { + key: "scanPunctuatorHelper", + value: function scanPunctuatorHelper() { + var ch1 = this.source.charAt(this.index); + + switch (ch1) { + // Check for most common single-character punctuators. + case ".": + var ch2 = this.source.charAt(this.index + 1); + if (ch2 !== ".") return TokenType.PERIOD; + var ch3 = this.source.charAt(this.index + 2); + if (ch3 !== ".") return TokenType.PERIOD; + return TokenType.ELLIPSIS; + case "(": + return TokenType.LPAREN; + case ")": + case ";": + case ",": + return ONE_CHAR_PUNCTUATOR[ch1.charCodeAt(0)]; + case "{": + return TokenType.LBRACE; + case "}": + case "[": + case "]": + case ":": + case "?": + case "~": + return ONE_CHAR_PUNCTUATOR[ch1.charCodeAt(0)]; + default: + // "=" (U+003D) marks an assignment or comparison operator. + if (this.index + 1 < this.source.length && this.source.charAt(this.index + 1) === "=") { + switch (ch1) { + case "=": + if (this.index + 2 < this.source.length && this.source.charAt(this.index + 2) === "=") { + return TokenType.EQ_STRICT; + } + return TokenType.EQ; + case "!": + if (this.index + 2 < this.source.length && this.source.charAt(this.index + 2) === "=") { + return TokenType.NE_STRICT; + } + return TokenType.NE; + case "|": + return TokenType.ASSIGN_BIT_OR; + case "+": + return TokenType.ASSIGN_ADD; + case "-": + return TokenType.ASSIGN_SUB; + case "*": + return TokenType.ASSIGN_MUL; + case "<": + return TokenType.LTE; + case ">": + return TokenType.GTE; + case "/": + return TokenType.ASSIGN_DIV; + case "%": + return TokenType.ASSIGN_MOD; + case "^": + return TokenType.ASSIGN_BIT_XOR; + case "&": + return TokenType.ASSIGN_BIT_AND; + // istanbul ignore next + default: + break; //failed + } + } } - return new _terms2.default(type_227, { operator: operator_225.val(), operand: term_228, isPrefix: isPrefix_229 }); - }; - return EXPR_LOOP_OPERATOR_43; - } - enforestConditionalExpression() { - let test_230 = this.opCtx.combine(this.term); - if (this.opCtx.stack.size > 0) { - var _opCtx$stack$last2 = this.opCtx.stack.last(); - let prec = _opCtx$stack$last2.prec; - let combine = _opCtx$stack$last2.combine; + if (this.index + 1 < this.source.length) { + var _ch = this.source.charAt(this.index + 1); + if (ch1 === _ch) { + if (this.index + 2 < this.source.length) { + var _ch2 = this.source.charAt(this.index + 2); + if (ch1 === ">" && _ch2 === ">") { + // 4-character punctuator: >>>= + if (this.index + 3 < this.source.length && this.source.charAt(this.index + 3) === "=") { + return TokenType.ASSIGN_SHR_UNSIGNED; + } + return TokenType.SHR_UNSIGNED; + } - this.opCtx.stack = this.opCtx.stack.pop(); - this.opCtx.prec = prec; - this.opCtx.combine = combine; - } - this.matchPunctuator("?"); - let enf_231 = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); - let consequent_232 = enf_231.enforestExpressionLoop(); - enf_231.matchPunctuator(":"); - enf_231 = new Enforester_46(enf_231.rest, (0, _immutable.List)(), this.context); - let alternate_233 = enf_231.enforestExpressionLoop(); - this.rest = enf_231.rest; - return new _terms2.default("ConditionalExpression", { test: test_230, consequent: consequent_232, alternate: alternate_233 }); - } - enforestBinaryExpression() { - let leftTerm_234 = this.term; - let opStx_235 = this.peek(); - let op_236 = opStx_235.val(); - let opPrec_237 = (0, _operators.getOperatorPrec)(op_236); - let opAssoc_238 = (0, _operators.getOperatorAssoc)(op_236); - if ((0, _operators.operatorLt)(this.opCtx.prec, opPrec_237, opAssoc_238)) { - this.opCtx.stack = this.opCtx.stack.push({ prec: this.opCtx.prec, combine: this.opCtx.combine }); - this.opCtx.prec = opPrec_237; - this.opCtx.combine = rightTerm_239 => { - return new _terms2.default("BinaryExpression", { left: leftTerm_234, operator: opStx_235, right: rightTerm_239 }); - }; - this.advance(); - return EXPR_LOOP_OPERATOR_43; - } else { - let term = this.opCtx.combine(leftTerm_234); + if (ch1 === "<" && _ch2 === "=") { + return TokenType.ASSIGN_SHL; + } - var _opCtx$stack$last3 = this.opCtx.stack.last(); + if (ch1 === ">" && _ch2 === "=") { + return TokenType.ASSIGN_SHR; + } + } + // Other 2-character punctuators: ++ -- << >> && || + switch (ch1) { + case "+": + return TokenType.INC; + case "-": + return TokenType.DEC; + case "<": + return TokenType.SHL; + case ">": + return TokenType.SHR; + case "&": + return TokenType.AND; + case "|": + return TokenType.OR; + // istanbul ignore next + default: + break; //failed + } + } else if (ch1 === "=" && _ch === ">") { + return TokenType.ARROW; + } + } - let prec = _opCtx$stack$last3.prec; - let combine = _opCtx$stack$last3.combine; + return ONE_CHAR_PUNCTUATOR[ch1.charCodeAt(0)]; + } - this.opCtx.stack = this.opCtx.stack.pop(); - this.opCtx.prec = prec; - this.opCtx.combine = combine; - return term; + // 7.7 Punctuators + + }, { + key: "scanPunctuator", + value: function scanPunctuator() { + var startLocation = this.getLocation(); + var start = this.index; + var subType = this.scanPunctuatorHelper(); + this.index += subType.name.length; + return { type: subType, value: subType.name, slice: this.getSlice(start, startLocation) }; } - } - enforestTemplateElements() { - let lookahead_240 = this.matchTemplate(); - let elements_241 = lookahead_240.token.items.map(it_242 => { - if (this.isDelimiter(it_242)) { - let enf = new Enforester_46(it_242.inner(), (0, _immutable.List)(), this.context); - return enf.enforest("expression"); + }, { + key: "scanHexLiteral", + value: function scanHexLiteral(start, startLocation) { + var i = this.index; + while (i < this.source.length) { + var ch = this.source.charAt(i); + var hex = (0, _utils.getHexValue)(ch); + if (hex === -1) { + break; + } + i++; } - return new _terms2.default("TemplateElement", { rawValue: it_242.slice.text }); - }); - return elements_241; - } - expandMacro() { - let lookahead_243 = this.peek(); - while (this.isCompiletimeTransform(lookahead_243)) { - let name = this.advance(); - let syntaxTransform = this.getFromCompiletimeEnvironment(name); - if (syntaxTransform == null || typeof syntaxTransform.value !== "function") { - throw this.createError(name, "the macro name was not bound to a value that could be invoked"); + + if (this.index === i) { + throw this.createILLEGAL(); } - let useSiteScope = (0, _scope.freshScope)("u"); - let introducedScope = (0, _scope.freshScope)("i"); - this.context.useScope = useSiteScope; - let ctx = new _macroContext2.default(this, name, this.context, useSiteScope, introducedScope); - let result = (0, _loadSyntax.sanitizeReplacementValues)(syntaxTransform.value.call(null, ctx)); - if (!_immutable.List.isList(result)) { - throw this.createError(name, "macro must return a list but got: " + result); + + if (i < this.source.length && (0, _utils.isIdentifierStart)(this.source.charCodeAt(i))) { + throw this.createILLEGAL(); } - result = result.map(stx_244 => { - if (!(stx_244 && typeof stx_244.addScope === "function")) { - throw this.createError(name, "macro must return syntax objects or terms but got: " + stx_244); - } - return stx_244.addScope(introducedScope, this.context.bindings, _syntax.ALL_PHASES, { flip: true }); - }); - this.rest = result.concat(ctx._rest(this)); - lookahead_243 = this.peek(); - } - } - consumeSemicolon() { - let lookahead_245 = this.peek(); - if (lookahead_245 && this.isPunctuator(lookahead_245, ";")) { - this.advance(); - } - } - consumeComma() { - let lookahead_246 = this.peek(); - if (lookahead_246 && this.isPunctuator(lookahead_246, ",")) { - this.advance(); - } - } - safeCheck(obj_247, type_248) { - let val_249 = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - return obj_247 && (typeof obj_247.match === "function" ? obj_247.match(type_248, val_249) : false); - } - isTerm(term_250) { - return term_250 && term_250 instanceof _terms2.default; - } - isEOF(obj_251) { - return this.safeCheck(obj_251, "eof"); - } - isIdentifier(obj_252) { - let val_253 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + this.index = i; - return this.safeCheck(obj_252, "identifier", val_253); - } - isPropertyName(obj_254) { - return this.isIdentifier(obj_254) || this.isKeyword(obj_254) || this.isNumericLiteral(obj_254) || this.isStringLiteral(obj_254) || this.isBrackets(obj_254); - } - isNumericLiteral(obj_255) { - let val_256 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + var slice = this.getSlice(start, startLocation); + return { type: TokenType.NUMBER, value: parseInt(slice.text.substr(2), 16), slice: slice }; + } + }, { + key: "scanBinaryLiteral", + value: function scanBinaryLiteral(start, startLocation) { + var offset = this.index - start; - return this.safeCheck(obj_255, "number", val_256); - } - isStringLiteral(obj_257) { - let val_258 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + while (this.index < this.source.length) { + var ch = this.source.charAt(this.index); + if (ch !== "0" && ch !== "1") { + break; + } + this.index++; + } - return this.safeCheck(obj_257, "string", val_258); - } - isTemplate(obj_259) { - let val_260 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + if (this.index - start <= offset) { + throw this.createILLEGAL(); + } - return this.safeCheck(obj_259, "template", val_260); - } - isSyntaxTemplate(obj_261) { - return this.safeCheck(obj_261, "syntaxTemplate"); - } - isBooleanLiteral(obj_262) { - let val_263 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + if (this.index < this.source.length && ((0, _utils.isIdentifierStart)(this.source.charCodeAt(this.index)) || (0, _utils.isDecimalDigit)(this.source.charCodeAt(this.index)))) { + throw this.createILLEGAL(); + } - return this.safeCheck(obj_262, "boolean", val_263); - } - isNullLiteral(obj_264) { - let val_265 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + return { + type: TokenType.NUMBER, + value: parseInt(this.getSlice(start, startLocation).text.substr(offset), 2), + slice: this.getSlice(start, startLocation), + octal: false, + noctal: false + }; + } + }, { + key: "scanOctalLiteral", + value: function scanOctalLiteral(start, startLocation) { + while (this.index < this.source.length) { + var ch = this.source.charAt(this.index); + if ("0" <= ch && ch <= "7") { + this.index++; + } else if ((0, _utils.isIdentifierPart)(ch.charCodeAt(0))) { + throw this.createILLEGAL(); + } else { + break; + } + } - return this.safeCheck(obj_264, "null", val_265); - } - isRegularExpression(obj_266) { - let val_267 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + if (this.index - start === 2) { + throw this.createILLEGAL(); + } - return this.safeCheck(obj_266, "regularExpression", val_267); - } - isDelimiter(obj_268) { - return this.safeCheck(obj_268, "delimiter"); - } - isParens(obj_269) { - return this.safeCheck(obj_269, "parens"); - } - isBraces(obj_270) { - return this.safeCheck(obj_270, "braces"); - } - isBrackets(obj_271) { - return this.safeCheck(obj_271, "brackets"); - } - isAssign(obj_272) { - let val_273 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + return { + type: TokenType.NUMBER, + value: parseInt(this.getSlice(start, startLocation).text.substr(2), 8), + slice: this.getSlice(start, startLocation), + octal: false, + noctal: false + }; + } + }, { + key: "scanLegacyOctalLiteral", + value: function scanLegacyOctalLiteral(start, startLocation) { + var isOctal = true; - return this.safeCheck(obj_272, "assign", val_273); - } - isKeyword(obj_274) { - let val_275 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + while (this.index < this.source.length) { + var ch = this.source.charAt(this.index); + if ("0" <= ch && ch <= "7") { + this.index++; + } else if (ch === "8" || ch === "9") { + isOctal = false; + this.index++; + } else if ((0, _utils.isIdentifierPart)(ch.charCodeAt(0))) { + throw this.createILLEGAL(); + } else { + break; + } + } - return this.safeCheck(obj_274, "keyword", val_275); - } - isPunctuator(obj_276) { - let val_277 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + var slice = this.getSlice(start, startLocation); + if (!isOctal) { + this.eatDecimalLiteralSuffix(); + return { + type: TokenType.NUMBER, + slice: slice, + value: +slice.text, + octal: true, + noctal: !isOctal + }; + } - return this.safeCheck(obj_276, "punctuator", val_277); - } - isOperator(obj_278) { - return (this.safeCheck(obj_278, "punctuator") || this.safeCheck(obj_278, "identifier") || this.safeCheck(obj_278, "keyword")) && (0, _operators.isOperator)(obj_278); - } - isUpdateOperator(obj_279) { - return this.safeCheck(obj_279, "punctuator", "++") || this.safeCheck(obj_279, "punctuator", "--"); - } - safeResolve(obj_280, phase_281) { - return obj_280 && typeof obj_280.resolve === "function" ? Just_41(obj_280.resolve(phase_281)) : Nothing_42(); - } - isTransform(obj_282, trans_283) { - return this.safeResolve(obj_282, this.context.phase).map(name_284 => this.context.env.get(name_284) === trans_283 || this.context.store.get(name_284) === trans_283).getOrElse(false); - } - isTransformInstance(obj_285, trans_286) { - return this.safeResolve(obj_285, this.context.phase).map(name_287 => this.context.env.get(name_287) instanceof trans_286 || this.context.store.get(name_287) instanceof trans_286).getOrElse(false); - } - isFnDeclTransform(obj_288) { - return this.isTransform(obj_288, _transforms.FunctionDeclTransform); - } - isVarDeclTransform(obj_289) { - return this.isTransform(obj_289, _transforms.VariableDeclTransform); - } - isLetDeclTransform(obj_290) { - return this.isTransform(obj_290, _transforms.LetDeclTransform); - } - isConstDeclTransform(obj_291) { - return this.isTransform(obj_291, _transforms.ConstDeclTransform); - } - isSyntaxDeclTransform(obj_292) { - return this.isTransform(obj_292, _transforms.SyntaxDeclTransform); - } - isSyntaxrecDeclTransform(obj_293) { - return this.isTransform(obj_293, _transforms.SyntaxrecDeclTransform); - } - isSyntaxQuoteTransform(obj_294) { - return this.isTransform(obj_294, _transforms.SyntaxQuoteTransform); - } - isReturnStmtTransform(obj_295) { - return this.isTransform(obj_295, _transforms.ReturnStatementTransform); - } - isWhileTransform(obj_296) { - return this.isTransform(obj_296, _transforms.WhileTransform); - } - isForTransform(obj_297) { - return this.isTransform(obj_297, _transforms.ForTransform); - } - isSwitchTransform(obj_298) { - return this.isTransform(obj_298, _transforms.SwitchTransform); - } - isBreakTransform(obj_299) { - return this.isTransform(obj_299, _transforms.BreakTransform); - } - isContinueTransform(obj_300) { - return this.isTransform(obj_300, _transforms.ContinueTransform); - } - isDoTransform(obj_301) { - return this.isTransform(obj_301, _transforms.DoTransform); - } - isDebuggerTransform(obj_302) { - return this.isTransform(obj_302, _transforms.DebuggerTransform); - } - isWithTransform(obj_303) { - return this.isTransform(obj_303, _transforms.WithTransform); - } - isTryTransform(obj_304) { - return this.isTransform(obj_304, _transforms.TryTransform); - } - isThrowTransform(obj_305) { - return this.isTransform(obj_305, _transforms.ThrowTransform); - } - isIfTransform(obj_306) { - return this.isTransform(obj_306, _transforms.IfTransform); - } - isNewTransform(obj_307) { - return this.isTransform(obj_307, _transforms.NewTransform); - } - isCompiletimeTransform(obj_308) { - return this.isTransformInstance(obj_308, _transforms.CompiletimeTransform); - } - isVarBindingTransform(obj_309) { - return this.isTransformInstance(obj_309, _transforms.VarBindingTransform); - } - getFromCompiletimeEnvironment(term_310) { - if (this.context.env.has(term_310.resolve(this.context.phase))) { - return this.context.env.get(term_310.resolve(this.context.phase)); - } - return this.context.store.get(term_310.resolve(this.context.phase)); - } - lineNumberEq(a_311, b_312) { - if (!(a_311 && b_312)) { - return false; - } - return a_311.lineNumber() === b_312.lineNumber(); - } - matchIdentifier(val_313) { - let lookahead_314 = this.advance(); - if (this.isIdentifier(lookahead_314)) { - return lookahead_314; - } - throw this.createError(lookahead_314, "expecting an identifier"); - } - matchKeyword(val_315) { - let lookahead_316 = this.advance(); - if (this.isKeyword(lookahead_316, val_315)) { - return lookahead_316; - } - throw this.createError(lookahead_316, "expecting " + val_315); - } - matchLiteral() { - let lookahead_317 = this.advance(); - if (this.isNumericLiteral(lookahead_317) || this.isStringLiteral(lookahead_317) || this.isBooleanLiteral(lookahead_317) || this.isNullLiteral(lookahead_317) || this.isTemplate(lookahead_317) || this.isRegularExpression(lookahead_317)) { - return lookahead_317; - } - throw this.createError(lookahead_317, "expecting a literal"); - } - matchStringLiteral() { - let lookahead_318 = this.advance(); - if (this.isStringLiteral(lookahead_318)) { - return lookahead_318; - } - throw this.createError(lookahead_318, "expecting a string literal"); - } - matchTemplate() { - let lookahead_319 = this.advance(); - if (this.isTemplate(lookahead_319)) { - return lookahead_319; - } - throw this.createError(lookahead_319, "expecting a template literal"); - } - matchParens() { - let lookahead_320 = this.advance(); - if (this.isParens(lookahead_320)) { - return lookahead_320.inner(); - } - throw this.createError(lookahead_320, "expecting parens"); - } - matchCurlies() { - let lookahead_321 = this.advance(); - if (this.isBraces(lookahead_321)) { - return lookahead_321.inner(); - } - throw this.createError(lookahead_321, "expecting curly braces"); - } - matchSquares() { - let lookahead_322 = this.advance(); - if (this.isBrackets(lookahead_322)) { - return lookahead_322.inner(); + return { + type: TokenType.NUMBER, + slice: slice, + value: parseInt(slice.text.substr(1), 8), + octal: true, + noctal: !isOctal + }; } - throw this.createError(lookahead_322, "expecting sqaure braces"); - } - matchUnaryOperator() { - let lookahead_323 = this.advance(); - if ((0, _operators.isUnaryOperator)(lookahead_323)) { - return lookahead_323; - } - throw this.createError(lookahead_323, "expecting a unary operator"); - } - matchPunctuator(val_324) { - let lookahead_325 = this.advance(); - if (this.isPunctuator(lookahead_325)) { - if (typeof val_324 !== "undefined") { - if (lookahead_325.val() === val_324) { - return lookahead_325; + }, { + key: "scanNumericLiteral", + value: function scanNumericLiteral() { + var ch = this.source.charAt(this.index); + // assert(ch === "." || "0" <= ch && ch <= "9") + var startLocation = this.getLocation(); + var start = this.index; + + if (ch === "0") { + this.index++; + if (this.index < this.source.length) { + ch = this.source.charAt(this.index); + if (ch === "x" || ch === "X") { + this.index++; + return this.scanHexLiteral(start, startLocation); + } else if (ch === "b" || ch === "B") { + this.index++; + return this.scanBinaryLiteral(start, startLocation); + } else if (ch === "o" || ch === "O") { + this.index++; + return this.scanOctalLiteral(start, startLocation); + } else if ("0" <= ch && ch <= "9") { + return this.scanLegacyOctalLiteral(start, startLocation); + } } else { - throw this.createError(lookahead_325, "expecting a " + val_324 + " punctuator"); - } - } - return lookahead_325; - } - throw this.createError(lookahead_325, "expecting a punctuator"); - } - createError(stx_326, message_327) { - let ctx_328 = ""; - let offending_329 = stx_326; - if (this.rest.size > 0) { - ctx_328 = this.rest.slice(0, 20).map(term_330 => { - if (this.isDelimiter(term_330)) { - return term_330.inner(); + var _slice = this.getSlice(start, startLocation); + return { + type: TokenType.NUMBER, + value: +_slice.text, + slice: _slice, + octal: false, + noctal: false + }; } - return _immutable.List.of(term_330); - }).flatten().map(s_331 => { - if (s_331 === offending_329) { - return "__" + s_331.val() + "__"; + } else if (ch !== ".") { + // Must be "1".."9" + ch = this.source.charAt(this.index); + while ("0" <= ch && ch <= "9") { + this.index++; + if (this.index === this.source.length) { + var _slice2 = this.getSlice(start, startLocation); + return { + type: TokenType.NUMBER, + value: +_slice2.text, + slice: _slice2, + octal: false, + noctal: false + }; + } + ch = this.source.charAt(this.index); } - return s_331.val(); - }).join(" "); - } else { - ctx_328 = offending_329.toString(); - } - return new Error(message_327 + "\n" + ctx_328); - } - } - exports.Enforester = Enforester_46; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2VuZm9yZXN0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBQ0EsTUFBTSxVQUFVLG9CQUFNLElBQXRCO0FBQ0EsTUFBTSxhQUFhLG9CQUFNLE9BQXpCO0FBQ0EsTUFBTSx3QkFBd0IsRUFBOUI7QUFDQSxNQUFNLHlCQUF5QixFQUEvQjtBQUNBLE1BQU0seUJBQXlCLEVBQS9CO0FBQ0EsTUFBTSxhQUFOLENBQW9CO0FBQ2xCLGNBQVksT0FBWixFQUFxQixPQUFyQixFQUE4QixVQUE5QixFQUEwQztBQUN4QyxTQUFLLElBQUwsR0FBWSxLQUFaO0FBQ0Esd0JBQU8sZ0JBQUssTUFBTCxDQUFZLE9BQVosQ0FBUCxFQUE2Qix1Q0FBN0I7QUFDQSx3QkFBTyxnQkFBSyxNQUFMLENBQVksT0FBWixDQUFQLEVBQTZCLHVDQUE3QjtBQUNBLHdCQUFPLFVBQVAsRUFBbUIsaUNBQW5CO0FBQ0EsU0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFNBQUssSUFBTCxHQUFZLE9BQVo7QUFDQSxTQUFLLElBQUwsR0FBWSxPQUFaO0FBQ0EsU0FBSyxPQUFMLEdBQWUsVUFBZjtBQUNEO0FBQ0QsU0FBZTtBQUFBLFFBQVYsSUFBVSx5REFBSCxDQUFHOztBQUNiLFdBQU8sS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLElBQWQsQ0FBUDtBQUNEO0FBQ0QsWUFBVTtBQUNSLFFBQUksU0FBUyxLQUFLLElBQUwsQ0FBVSxLQUFWLEVBQWI7QUFDQSxTQUFLLElBQUwsR0FBWSxLQUFLLElBQUwsQ0FBVSxJQUFWLEVBQVo7QUFDQSxXQUFPLE1BQVA7QUFDRDtBQUNELGFBQTZCO0FBQUEsUUFBcEIsT0FBb0IseURBQVYsUUFBVTs7QUFDM0IsU0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFFBQUksS0FBSyxJQUFMLENBQVUsSUFBVixLQUFt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YyxRQUFkLEVBQVY7QUFDRDtBQUNELFdBQU8sSUFBSSxLQUFKLENBQVUsY0FBYyxJQUFkLEdBQXFCLE9BQS9CLENBQVA7QUFDRDtBQXZqRGlCO1FBeWpESyxVLEdBQWpCLGEiLCJmaWxlIjoiZW5mb3Jlc3Rlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtLCB7aXNJZGVudGlmaWVyRXhwcmVzc2lvbn0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7TWF5YmV9IGZyb20gXCJyYW1kYS1mYW50YXN5XCI7XG5pbXBvcnQge0Z1bmN0aW9uRGVjbFRyYW5zZm9ybSwgVmFyaWFibGVEZWNsVHJhbnNmb3JtLCBOZXdUcmFuc2Zvcm0sIExldERlY2xUcmFuc2Zvcm0sIENvbnN0RGVjbFRyYW5zZm9ybSwgU3ludGF4RGVjbFRyYW5zZm9ybSwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSwgU3ludGF4UXVvdGVUcmFuc2Zvcm0sIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSwgV2hpbGVUcmFuc2Zvcm0sIElmVHJhbnNmb3JtLCBGb3JUcmFuc2Zvcm0sIFN3aXRjaFRyYW5zZm9ybSwgQnJlYWtUcmFuc2Zvcm0sIENvbnRpbnVlVHJhbnNmb3JtLCBEb1RyYW5zZm9ybSwgRGVidWdnZXJUcmFuc2Zvcm0sIFdpdGhUcmFuc2Zvcm0sIFRyeVRyYW5zZm9ybSwgVGhyb3dUcmFuc2Zvcm0sIENvbXBpbGV0aW1lVHJhbnNmb3JtLCBWYXJCaW5kaW5nVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm1zXCI7XG5pbXBvcnQge0xpc3R9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCB7ZXhwZWN0LCBhc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtpc09wZXJhdG9yLCBpc1VuYXJ5T3BlcmF0b3IsIGdldE9wZXJhdG9yQXNzb2MsIGdldE9wZXJhdG9yUHJlYywgb3BlcmF0b3JMdH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgU3ludGF4LCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge2ZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQge3Nhbml0aXplUmVwbGFjZW1lbnRWYWx1ZXN9IGZyb20gXCIuL2xvYWQtc3ludGF4XCI7XG5pbXBvcnQgTWFjcm9Db250ZXh0IGZyb20gXCIuL21hY3JvLWNvbnRleHRcIjtcbmNvbnN0IEp1c3RfNDEgPSBNYXliZS5KdXN0O1xuY29uc3QgTm90aGluZ180MiA9IE1heWJlLk5vdGhpbmc7XG5jb25zdCBFWFBSX0xPT1BfT1BFUkFUT1JfNDMgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9OT19DSEFOR0VfNDQgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9FWFBBTlNJT05fNDUgPSB7fTtcbmNsYXNzIEVuZm9yZXN0ZXJfNDYge1xuICBjb25zdHJ1Y3RvcihzdHhsXzQ3LCBwcmV2XzQ4LCBjb250ZXh0XzQ5KSB7XG4gICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHN0eGxfNDcpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHByZXZfNDgpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KGNvbnRleHRfNDksIFwiZXhwZWN0aW5nIGEgY29udGV4dCB0byBlbmZvcmVzdFwiKTtcbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuICAgIHRoaXMucmVzdCA9IHN0eGxfNDc7XG4gICAgdGhpcy5wcmV2ID0gcHJldl80ODtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XzQ5O1xuICB9XG4gIHBlZWsobl81MCA9IDApIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0LmdldChuXzUwKTtcbiAgfVxuICBhZHZhbmNlKCkge1xuICAgIGxldCByZXRfNTEgPSB0aGlzLnJlc3QuZmlyc3QoKTtcbiAgICB0aGlzLnJlc3QgPSB0aGlzLnJlc3QucmVzdCgpO1xuICAgIHJldHVybiByZXRfNTE7XG4gIH1cbiAgZW5mb3Jlc3QodHlwZV81MiA9IFwiTW9kdWxlXCIpIHtcbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnRlcm07XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRU9GKHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy50ZXJtID0gbmV3IFRlcm0oXCJFT0ZcIiwge30pO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdGhpcy50ZXJtO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0XzUzO1xuICAgIGlmICh0eXBlXzUyID09PSBcImV4cHJlc3Npb25cIikge1xuICAgICAgcmVzdWx0XzUzID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdF81MyA9IHRoaXMuZW5mb3Jlc3RNb2R1bGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XzUzO1xuICB9XG4gIGVuZm9yZXN0TW9kdWxlKCkge1xuICAgIHJldHVybiB0aGlzLmVuZm9yZXN0Qm9keSgpO1xuICB9XG4gIGVuZm9yZXN0Qm9keSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdE1vZHVsZUl0ZW0oKTtcbiAgfVxuICBlbmZvcmVzdE1vZHVsZUl0ZW0oKSB7XG4gICAgbGV0IGxvb2thaGVhZF81NCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfNTQsIFwiaW1wb3J0XCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SW1wb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF81NCwgXCJleHBvcnRcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RFeHBvcnREZWNsYXJhdGlvbigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzU0LCBcIiNcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TGFuZ3VhZ2VQcmFnbWEoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgfVxuICBlbmZvcmVzdExhbmd1YWdlUHJhZ21hKCkge1xuICAgIHRoaXMubWF0Y2hJZGVudGlmaWVyKFwiI1wiKTtcbiAgICB0aGlzLm1hdGNoSWRlbnRpZmllcihcImxhbmdcIik7XG4gICAgbGV0IHBhdGhfNTUgPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlByYWdtYVwiLCB7a2luZDogXCJsYW5nXCIsIGl0ZW1zOiBMaXN0Lm9mKHBhdGhfNTUpfSk7XG4gIH1cbiAgZW5mb3Jlc3RFeHBvcnREZWNsYXJhdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzU2ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF81NiwgXCIqXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSB0aGlzLmVuZm9yZXN0RnJvbUNsYXVzZSgpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0QWxsRnJvbVwiLCB7bW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXJ9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzU2KSkge1xuICAgICAgbGV0IG5hbWVkRXhwb3J0cyA9IHRoaXMuZW5mb3Jlc3RFeHBvcnRDbGF1c2UoKTtcbiAgICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCBcImZyb21cIikpIHtcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5lbmZvcmVzdEZyb21DbGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydEZyb21cIiwge25hbWVkRXhwb3J0czogbmFtZWRFeHBvcnRzLCBtb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcn0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzU2LCBcImNsYXNzXCIpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0Q2xhc3Moe2lzRXhwcjogZmFsc2V9KX0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0ZuRGVjbFRyYW5zZm9ybShsb29rYWhlYWRfNTYpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwcjogZmFsc2UsIGluRGVmYXVsdDogZmFsc2V9KX0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzU2LCBcImRlZmF1bHRcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0odGhpcy5wZWVrKCkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydERlZmF1bHRcIiwge2JvZHk6IHRoaXMuZW5mb3Jlc3RGdW5jdGlvbih7aXNFeHByOiBmYWxzZSwgaW5EZWZhdWx0OiB0cnVlfSl9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksIFwiY2xhc3NcIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0RGVmYXVsdFwiLCB7Ym9keTogdGhpcy5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IGZhbHNlLCBpbkRlZmF1bHQ6IHRydWV9KX0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGJvZHkgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydERlZmF1bHRcIiwge2JvZHk6IGJvZHl9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNWYXJEZWNsVHJhbnNmb3JtKGxvb2thaGVhZF81NikgfHwgdGhpcy5pc0xldERlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzU2KSB8fCB0aGlzLmlzQ29uc3REZWNsVHJhbnNmb3JtKGxvb2thaGVhZF81NikgfHwgdGhpcy5pc1N5bnRheHJlY0RlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzU2KSB8fCB0aGlzLmlzU3ludGF4RGVjbFRyYW5zZm9ybShsb29rYWhlYWRfNTYpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzU2LCBcInVuZXhwZWN0ZWQgc3ludGF4XCIpO1xuICB9XG4gIGVuZm9yZXN0RXhwb3J0Q2xhdXNlKCkge1xuICAgIGxldCBlbmZfNTcgPSBuZXcgRW5mb3Jlc3Rlcl80Nih0aGlzLm1hdGNoQ3VybGllcygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IHJlc3VsdF81OCA9IFtdO1xuICAgIHdoaWxlIChlbmZfNTcucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICByZXN1bHRfNTgucHVzaChlbmZfNTcuZW5mb3Jlc3RFeHBvcnRTcGVjaWZpZXIoKSk7XG4gICAgICBlbmZfNTcuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdF81OCk7XG4gIH1cbiAgZW5mb3Jlc3RFeHBvcnRTcGVjaWZpZXIoKSB7XG4gICAgbGV0IG5hbWVfNTkgPSB0aGlzLmVuZm9yZXN0SWRlbnRpZmllcigpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoKSwgXCJhc1wiKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgZXhwb3J0ZWROYW1lID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydFNwZWNpZmllclwiLCB7bmFtZTogbmFtZV81OSwgZXhwb3J0ZWROYW1lOiBleHBvcnRlZE5hbWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0U3BlY2lmaWVyXCIsIHtuYW1lOiBudWxsLCBleHBvcnRlZE5hbWU6IG5hbWVfNTl9KTtcbiAgfVxuICBlbmZvcmVzdEltcG9ydERlY2xhcmF0aW9uKCkge1xuICAgIGxldCBsb29rYWhlYWRfNjAgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgZGVmYXVsdEJpbmRpbmdfNjEgPSBudWxsO1xuICAgIGxldCBuYW1lZEltcG9ydHNfNjIgPSBMaXN0KCk7XG4gICAgbGV0IGZvclN5bnRheF82MyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWRfNjApKSB7XG4gICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFwiLCB7ZGVmYXVsdEJpbmRpbmc6IGRlZmF1bHRCaW5kaW5nXzYxLCBuYW1lZEltcG9ydHM6IG5hbWVkSW1wb3J0c182MiwgbW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXJ9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF82MCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzYwKSkge1xuICAgICAgZGVmYXVsdEJpbmRpbmdfNjEgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiLFwiKSkge1xuICAgICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5lbmZvcmVzdEZyb21DbGF1c2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImZvclwiKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksIFwic3ludGF4XCIpKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgZm9yU3ludGF4XzYzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnRcIiwge2RlZmF1bHRCaW5kaW5nOiBkZWZhdWx0QmluZGluZ182MSwgbW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsIG5hbWVkSW1wb3J0czogTGlzdCgpLCBmb3JTeW50YXg6IGZvclN5bnRheF82M30pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnN1bWVDb21tYSgpO1xuICAgIGxvb2thaGVhZF82MCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZF82MCkpIHtcbiAgICAgIGxldCBpbXBvcnRzID0gdGhpcy5lbmZvcmVzdE5hbWVkSW1wb3J0cygpO1xuICAgICAgbGV0IGZyb21DbGF1c2UgPSB0aGlzLmVuZm9yZXN0RnJvbUNsYXVzZSgpO1xuICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImZvclwiKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksIFwic3ludGF4XCIpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgZm9yU3ludGF4XzYzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFwiLCB7ZGVmYXVsdEJpbmRpbmc6IGRlZmF1bHRCaW5kaW5nXzYxLCBmb3JTeW50YXg6IGZvclN5bnRheF82MywgbmFtZWRJbXBvcnRzOiBpbXBvcnRzLCBtb2R1bGVTcGVjaWZpZXI6IGZyb21DbGF1c2V9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF82MCwgXCIqXCIpKSB7XG4gICAgICBsZXQgbmFtZXNwYWNlQmluZGluZyA9IHRoaXMuZW5mb3Jlc3ROYW1lc3BhY2VCaW5kaW5nKCk7XG4gICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5lbmZvcmVzdEZyb21DbGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJmb3JcIikgJiYgdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKDEpLCBcInN5bnRheFwiKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGZvclN5bnRheF82MyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnROYW1lc3BhY2VcIiwge2RlZmF1bHRCaW5kaW5nOiBkZWZhdWx0QmluZGluZ182MSwgZm9yU3ludGF4OiBmb3JTeW50YXhfNjMsIG5hbWVzcGFjZUJpbmRpbmc6IG5hbWVzcGFjZUJpbmRpbmcsIG1vZHVsZVNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzYwLCBcInVuZXhwZWN0ZWQgc3ludGF4XCIpO1xuICB9XG4gIGVuZm9yZXN0TmFtZXNwYWNlQmluZGluZygpIHtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIipcIik7XG4gICAgdGhpcy5tYXRjaElkZW50aWZpZXIoXCJhc1wiKTtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gIH1cbiAgZW5mb3Jlc3ROYW1lZEltcG9ydHMoKSB7XG4gICAgbGV0IGVuZl82NCA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgcmVzdWx0XzY1ID0gW107XG4gICAgd2hpbGUgKGVuZl82NC5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIHJlc3VsdF82NS5wdXNoKGVuZl82NC5lbmZvcmVzdEltcG9ydFNwZWNpZmllcnMoKSk7XG4gICAgICBlbmZfNjQuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdF82NSk7XG4gIH1cbiAgZW5mb3Jlc3RJbXBvcnRTcGVjaWZpZXJzKCkge1xuICAgIGxldCBsb29rYWhlYWRfNjYgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgbmFtZV82NztcbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzY2KSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfNjYpKSB7XG4gICAgICBuYW1lXzY3ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICBpZiAoIXRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCBcImFzXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFNwZWNpZmllclwiLCB7bmFtZTogbnVsbCwgYmluZGluZzogbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogbmFtZV82N30pfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hdGNoSWRlbnRpZmllcihcImFzXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZF82NiwgXCJ1bmV4cGVjdGVkIHRva2VuIGluIGltcG9ydCBzcGVjaWZpZXJcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFNwZWNpZmllclwiLCB7bmFtZTogbmFtZV82NywgYmluZGluZzogdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCl9KTtcbiAgfVxuICBlbmZvcmVzdEZyb21DbGF1c2UoKSB7XG4gICAgdGhpcy5tYXRjaElkZW50aWZpZXIoXCJmcm9tXCIpO1xuICAgIGxldCBsb29rYWhlYWRfNjggPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBsb29rYWhlYWRfNjg7XG4gIH1cbiAgZW5mb3Jlc3RTdGF0ZW1lbnRMaXN0SXRlbSgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzY5ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzY5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RGdW5jdGlvbkRlY2xhcmF0aW9uKHtpc0V4cHI6IGZhbHNlfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfNjksIFwiY2xhc3NcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0Q2xhc3Moe2lzRXhwcjogZmFsc2V9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICB9XG4gIH1cbiAgZW5mb3Jlc3RTdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGxvb2thaGVhZF83MCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0NvbXBpbGV0aW1lVHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kTWFjcm8oKTtcbiAgICAgIGxvb2thaGVhZF83MCA9IHRoaXMucGVlaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUZXJtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJhY2VzKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmxvY2tTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzV2hpbGVUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RXaGlsZVN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNJZlRyYW5zZm9ybShsb29rYWhlYWRfNzApKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdElmU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0ZvclRyYW5zZm9ybShsb29rYWhlYWRfNzApKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEZvclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNTd2l0Y2hUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTd2l0Y2hTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJlYWtUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCcmVha1N0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNDb250aW51ZVRyYW5zZm9ybShsb29rYWhlYWRfNzApKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0RvVHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RG9TdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRGVidWdnZXJUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3REZWJ1Z2dlclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNXaXRoVHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0V2l0aFN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUcnlUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUcnlTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVGhyb3dUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUaHJvd1N0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF83MCwgXCJjbGFzc1wiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RDbGFzcyh7aXNFeHByOiBmYWxzZX0pO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzcwKSAmJiB0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoMSksIFwiOlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMYWJlbGVkU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgKHRoaXMuaXNWYXJEZWNsVHJhbnNmb3JtKGxvb2thaGVhZF83MCkgfHwgdGhpcy5pc0xldERlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSB8fCB0aGlzLmlzQ29uc3REZWNsVHJhbnNmb3JtKGxvb2thaGVhZF83MCkgfHwgdGhpcy5pc1N5bnRheHJlY0RlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSB8fCB0aGlzLmlzU3ludGF4RGVjbFRyYW5zZm9ybShsb29rYWhlYWRfNzApKSkge1xuICAgICAgbGV0IHN0bXQgPSBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpfSk7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBzdG10O1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNSZXR1cm5TdG10VHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0UmV0dXJuU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzcwLCBcIjtcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRW1wdHlTdGF0ZW1lbnRcIiwge30pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25TdGF0ZW1lbnQoKTtcbiAgfVxuICBlbmZvcmVzdExhYmVsZWRTdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGxhYmVsXzcxID0gdGhpcy5tYXRjaElkZW50aWZpZXIoKTtcbiAgICBsZXQgcHVuY183MiA9IHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiOlwiKTtcbiAgICBsZXQgc3RtdF83MyA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMYWJlbGVkU3RhdGVtZW50XCIsIHtsYWJlbDogbGFiZWxfNzEsIGJvZHk6IHN0bXRfNzN9KTtcbiAgfVxuICBlbmZvcmVzdEJyZWFrU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwiYnJlYWtcIik7XG4gICAgbGV0IGxvb2thaGVhZF83NCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBsYWJlbF83NSA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwIHx8IHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF83NCwgXCI7XCIpKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIkJyZWFrU3RhdGVtZW50XCIsIHtsYWJlbDogbGFiZWxfNzV9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF83NCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzc0LCBcInlpZWxkXCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF83NCwgXCJsZXRcIikpIHtcbiAgICAgIGxhYmVsXzc1ID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQnJlYWtTdGF0ZW1lbnRcIiwge2xhYmVsOiBsYWJlbF83NX0pO1xuICB9XG4gIGVuZm9yZXN0VHJ5U3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwidHJ5XCIpO1xuICAgIGxldCBib2R5Xzc2ID0gdGhpcy5lbmZvcmVzdEJsb2NrKCk7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImNhdGNoXCIpKSB7XG4gICAgICBsZXQgY2F0Y2hDbGF1c2UgPSB0aGlzLmVuZm9yZXN0Q2F0Y2hDbGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJmaW5hbGx5XCIpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBsZXQgZmluYWxpemVyID0gdGhpcy5lbmZvcmVzdEJsb2NrKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIlRyeUZpbmFsbHlTdGF0ZW1lbnRcIiwge2JvZHk6IGJvZHlfNzYsIGNhdGNoQ2xhdXNlOiBjYXRjaENsYXVzZSwgZmluYWxpemVyOiBmaW5hbGl6ZXJ9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIlRyeUNhdGNoU3RhdGVtZW50XCIsIHtib2R5OiBib2R5Xzc2LCBjYXRjaENsYXVzZTogY2F0Y2hDbGF1c2V9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImZpbmFsbHlcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IGZpbmFsaXplciA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiVHJ5RmluYWxseVN0YXRlbWVudFwiLCB7Ym9keTogYm9keV83NiwgY2F0Y2hDbGF1c2U6IG51bGwsIGZpbmFsaXplcjogZmluYWxpemVyfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IodGhpcy5wZWVrKCksIFwidHJ5IHdpdGggbm8gY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgfVxuICBlbmZvcmVzdENhdGNoQ2xhdXNlKCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwiY2F0Y2hcIik7XG4gICAgbGV0IGJpbmRpbmdQYXJlbnNfNzcgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgbGV0IGVuZl83OCA9IG5ldyBFbmZvcmVzdGVyXzQ2KGJpbmRpbmdQYXJlbnNfNzcsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYmluZGluZ183OSA9IGVuZl83OC5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoKTtcbiAgICBsZXQgYm9keV84MCA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNhdGNoQ2xhdXNlXCIsIHtiaW5kaW5nOiBiaW5kaW5nXzc5LCBib2R5OiBib2R5XzgwfSk7XG4gIH1cbiAgZW5mb3Jlc3RUaHJvd1N0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcInRocm93XCIpO1xuICAgIGxldCBleHByZXNzaW9uXzgxID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUaHJvd1N0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogZXhwcmVzc2lvbl84MX0pO1xuICB9XG4gIGVuZm9yZXN0V2l0aFN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcIndpdGhcIik7XG4gICAgbGV0IG9ialBhcmVuc184MiA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mXzgzID0gbmV3IEVuZm9yZXN0ZXJfNDYob2JqUGFyZW5zXzgyLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IG9iamVjdF84NCA9IGVuZl84My5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBsZXQgYm9keV84NSA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJXaXRoU3RhdGVtZW50XCIsIHtvYmplY3Q6IG9iamVjdF84NCwgYm9keTogYm9keV84NX0pO1xuICB9XG4gIGVuZm9yZXN0RGVidWdnZXJTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJkZWJ1Z2dlclwiKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEZWJ1Z2dlclN0YXRlbWVudFwiLCB7fSk7XG4gIH1cbiAgZW5mb3Jlc3REb1N0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcImRvXCIpO1xuICAgIGxldCBib2R5Xzg2ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwid2hpbGVcIik7XG4gICAgbGV0IHRlc3RCb2R5Xzg3ID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmZfODggPSBuZXcgRW5mb3Jlc3Rlcl80Nih0ZXN0Qm9keV84NywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCB0ZXN0Xzg5ID0gZW5mXzg4LmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkRvV2hpbGVTdGF0ZW1lbnRcIiwge2JvZHk6IGJvZHlfODYsIHRlc3Q6IHRlc3RfODl9KTtcbiAgfVxuICBlbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCkge1xuICAgIGxldCBrd2RfOTAgPSB0aGlzLm1hdGNoS2V5d29yZChcImNvbnRpbnVlXCIpO1xuICAgIGxldCBsb29rYWhlYWRfOTEgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgbGFiZWxfOTIgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWRfOTEsIFwiO1wiKSkge1xuICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJDb250aW51ZVN0YXRlbWVudFwiLCB7bGFiZWw6IGxhYmVsXzkyfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxpbmVOdW1iZXJFcShrd2RfOTAsIGxvb2thaGVhZF85MSkgJiYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF85MSkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzkxLCBcInlpZWxkXCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF85MSwgXCJsZXRcIikpKSB7XG4gICAgICBsYWJlbF85MiA9IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbnRpbnVlU3RhdGVtZW50XCIsIHtsYWJlbDogbGFiZWxfOTJ9KTtcbiAgfVxuICBlbmZvcmVzdFN3aXRjaFN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcInN3aXRjaFwiKTtcbiAgICBsZXQgY29uZF85MyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mXzk0ID0gbmV3IEVuZm9yZXN0ZXJfNDYoY29uZF85MywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBkaXNjcmltaW5hbnRfOTUgPSBlbmZfOTQuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgbGV0IGJvZHlfOTYgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIGlmIChib2R5Xzk2LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFwiLCB7ZGlzY3JpbWluYW50OiBkaXNjcmltaW5hbnRfOTUsIGNhc2VzOiBMaXN0KCl9KTtcbiAgICB9XG4gICAgZW5mXzk0ID0gbmV3IEVuZm9yZXN0ZXJfNDYoYm9keV85NiwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBjYXNlc185NyA9IGVuZl85NC5lbmZvcmVzdFN3aXRjaENhc2VzKCk7XG4gICAgbGV0IGxvb2thaGVhZF85OCA9IGVuZl85NC5wZWVrKCk7XG4gICAgaWYgKGVuZl85NC5pc0tleXdvcmQobG9va2FoZWFkXzk4LCBcImRlZmF1bHRcIikpIHtcbiAgICAgIGxldCBkZWZhdWx0Q2FzZSA9IGVuZl85NC5lbmZvcmVzdFN3aXRjaERlZmF1bHQoKTtcbiAgICAgIGxldCBwb3N0RGVmYXVsdENhc2VzID0gZW5mXzk0LmVuZm9yZXN0U3dpdGNoQ2FzZXMoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0XCIsIHtkaXNjcmltaW5hbnQ6IGRpc2NyaW1pbmFudF85NSwgcHJlRGVmYXVsdENhc2VzOiBjYXNlc185NywgZGVmYXVsdENhc2U6IGRlZmF1bHRDYXNlLCBwb3N0RGVmYXVsdENhc2VzOiBwb3N0RGVmYXVsdENhc2VzfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFwiLCB7ZGlzY3JpbWluYW50OiBkaXNjcmltaW5hbnRfOTUsIGNhc2VzOiBjYXNlc185N30pO1xuICB9XG4gIGVuZm9yZXN0U3dpdGNoQ2FzZXMoKSB7XG4gICAgbGV0IGNhc2VzXzk5ID0gW107XG4gICAgd2hpbGUgKCEodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksIFwiZGVmYXVsdFwiKSkpIHtcbiAgICAgIGNhc2VzXzk5LnB1c2godGhpcy5lbmZvcmVzdFN3aXRjaENhc2UoKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KGNhc2VzXzk5KTtcbiAgfVxuICBlbmZvcmVzdFN3aXRjaENhc2UoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJjYXNlXCIpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaENhc2VcIiwge3Rlc3Q6IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCksIGNvbnNlcXVlbnQ6IHRoaXMuZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpIHtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIjpcIik7XG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnRMaXN0SW5Td2l0Y2hDYXNlQm9keSgpO1xuICB9XG4gIGVuZm9yZXN0U3RhdGVtZW50TGlzdEluU3dpdGNoQ2FzZUJvZHkoKSB7XG4gICAgbGV0IHJlc3VsdF8xMDAgPSBbXTtcbiAgICB3aGlsZSAoISh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCB0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJkZWZhdWx0XCIpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImNhc2VcIikpKSB7XG4gICAgICByZXN1bHRfMTAwLnB1c2godGhpcy5lbmZvcmVzdFN0YXRlbWVudExpc3RJdGVtKCkpO1xuICAgIH1cbiAgICByZXR1cm4gTGlzdChyZXN1bHRfMTAwKTtcbiAgfVxuICBlbmZvcmVzdFN3aXRjaERlZmF1bHQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJkZWZhdWx0XCIpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaERlZmF1bHRcIiwge2NvbnNlcXVlbnQ6IHRoaXMuZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RGb3JTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJmb3JcIik7XG4gICAgbGV0IGNvbmRfMTAxID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmZfMTAyID0gbmV3IEVuZm9yZXN0ZXJfNDYoY29uZF8xMDEsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkXzEwMywgdGVzdF8xMDQsIGluaXRfMTA1LCByaWdodF8xMDYsIHR5cGVfMTA3LCBsZWZ0XzEwOCwgdXBkYXRlXzEwOTtcbiAgICBpZiAoZW5mXzEwMi5pc1B1bmN0dWF0b3IoZW5mXzEwMi5wZWVrKCksIFwiO1wiKSkge1xuICAgICAgZW5mXzEwMi5hZHZhbmNlKCk7XG4gICAgICBpZiAoIWVuZl8xMDIuaXNQdW5jdHVhdG9yKGVuZl8xMDIucGVlaygpLCBcIjtcIikpIHtcbiAgICAgICAgdGVzdF8xMDQgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgfVxuICAgICAgZW5mXzEwMi5tYXRjaFB1bmN0dWF0b3IoXCI7XCIpO1xuICAgICAgaWYgKGVuZl8xMDIucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICAgIHJpZ2h0XzEwNiA9IGVuZl8xMDIuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJGb3JTdGF0ZW1lbnRcIiwge2luaXQ6IG51bGwsIHRlc3Q6IHRlc3RfMTA0LCB1cGRhdGU6IHJpZ2h0XzEwNiwgYm9keTogdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvb2thaGVhZF8xMDMgPSBlbmZfMTAyLnBlZWsoKTtcbiAgICAgIGlmIChlbmZfMTAyLmlzVmFyRGVjbFRyYW5zZm9ybShsb29rYWhlYWRfMTAzKSB8fCBlbmZfMTAyLmlzTGV0RGVjbFRyYW5zZm9ybShsb29rYWhlYWRfMTAzKSB8fCBlbmZfMTAyLmlzQ29uc3REZWNsVHJhbnNmb3JtKGxvb2thaGVhZF8xMDMpKSB7XG4gICAgICAgIGluaXRfMTA1ID0gZW5mXzEwMi5lbmZvcmVzdFZhcmlhYmxlRGVjbGFyYXRpb24oKTtcbiAgICAgICAgbG9va2FoZWFkXzEwMyA9IGVuZl8xMDIucGVlaygpO1xuICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzEwMywgXCJpblwiKSB8fCB0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTAzLCBcIm9mXCIpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xMDMsIFwiaW5cIikpIHtcbiAgICAgICAgICAgIGVuZl8xMDIuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmlnaHRfMTA2ID0gZW5mXzEwMi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIHR5cGVfMTA3ID0gXCJGb3JJblN0YXRlbWVudFwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzEwMywgXCJvZlwiKSkge1xuICAgICAgICAgICAgZW5mXzEwMi5hZHZhbmNlKCk7XG4gICAgICAgICAgICByaWdodF8xMDYgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgdHlwZV8xMDcgPSBcIkZvck9mU3RhdGVtZW50XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzEwNywge2xlZnQ6IGluaXRfMTA1LCByaWdodDogcmlnaHRfMTA2LCBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCl9KTtcbiAgICAgICAgfVxuICAgICAgICBlbmZfMTAyLm1hdGNoUHVuY3R1YXRvcihcIjtcIik7XG4gICAgICAgIGlmIChlbmZfMTAyLmlzUHVuY3R1YXRvcihlbmZfMTAyLnBlZWsoKSwgXCI7XCIpKSB7XG4gICAgICAgICAgZW5mXzEwMi5hZHZhbmNlKCk7XG4gICAgICAgICAgdGVzdF8xMDQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlc3RfMTA0ID0gZW5mXzEwMi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICBlbmZfMTAyLm1hdGNoUHVuY3R1YXRvcihcIjtcIik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlXzEwOSA9IGVuZl8xMDIuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQoZW5mXzEwMi5wZWVrKDEpLCBcImluXCIpIHx8IHRoaXMuaXNJZGVudGlmaWVyKGVuZl8xMDIucGVlaygxKSwgXCJvZlwiKSkge1xuICAgICAgICAgIGxlZnRfMTA4ID0gZW5mXzEwMi5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgICAgICAgbGV0IGtpbmQgPSBlbmZfMTAyLmFkdmFuY2UoKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQoa2luZCwgXCJpblwiKSkge1xuICAgICAgICAgICAgdHlwZV8xMDcgPSBcIkZvckluU3RhdGVtZW50XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGVfMTA3ID0gXCJGb3JPZlN0YXRlbWVudFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByaWdodF8xMDYgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzEwNywge2xlZnQ6IGxlZnRfMTA4LCByaWdodDogcmlnaHRfMTA2LCBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCl9KTtcbiAgICAgICAgfVxuICAgICAgICBpbml0XzEwNSA9IGVuZl8xMDIuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgIGVuZl8xMDIubWF0Y2hQdW5jdHVhdG9yKFwiO1wiKTtcbiAgICAgICAgaWYgKGVuZl8xMDIuaXNQdW5jdHVhdG9yKGVuZl8xMDIucGVlaygpLCBcIjtcIikpIHtcbiAgICAgICAgICBlbmZfMTAyLmFkdmFuY2UoKTtcbiAgICAgICAgICB0ZXN0XzEwNCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVzdF8xMDQgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgIGVuZl8xMDIubWF0Y2hQdW5jdHVhdG9yKFwiO1wiKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVfMTA5ID0gZW5mXzEwMi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIkZvclN0YXRlbWVudFwiLCB7aW5pdDogaW5pdF8xMDUsIHRlc3Q6IHRlc3RfMTA0LCB1cGRhdGU6IHVwZGF0ZV8xMDksIGJvZHk6IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKX0pO1xuICAgIH1cbiAgfVxuICBlbmZvcmVzdElmU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwiaWZcIik7XG4gICAgbGV0IGNvbmRfMTEwID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmZfMTExID0gbmV3IEVuZm9yZXN0ZXJfNDYoY29uZF8xMTAsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkXzExMiA9IGVuZl8xMTEucGVlaygpO1xuICAgIGxldCB0ZXN0XzExMyA9IGVuZl8xMTEuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgaWYgKHRlc3RfMTEzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBlbmZfMTExLmNyZWF0ZUVycm9yKGxvb2thaGVhZF8xMTIsIFwiZXhwZWN0aW5nIGFuIGV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIGxldCBjb25zZXF1ZW50XzExNCA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICBsZXQgYWx0ZXJuYXRlXzExNSA9IG51bGw7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImVsc2VcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgYWx0ZXJuYXRlXzExNSA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSWZTdGF0ZW1lbnRcIiwge3Rlc3Q6IHRlc3RfMTEzLCBjb25zZXF1ZW50OiBjb25zZXF1ZW50XzExNCwgYWx0ZXJuYXRlOiBhbHRlcm5hdGVfMTE1fSk7XG4gIH1cbiAgZW5mb3Jlc3RXaGlsZVN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcIndoaWxlXCIpO1xuICAgIGxldCBjb25kXzExNiA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mXzExNyA9IG5ldyBFbmZvcmVzdGVyXzQ2KGNvbmRfMTE2LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGxvb2thaGVhZF8xMTggPSBlbmZfMTE3LnBlZWsoKTtcbiAgICBsZXQgdGVzdF8xMTkgPSBlbmZfMTE3LmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGlmICh0ZXN0XzExOSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgZW5mXzExNy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMTE4LCBcImV4cGVjdGluZyBhbiBleHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICBsZXQgYm9keV8xMjAgPSB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiV2hpbGVTdGF0ZW1lbnRcIiwge3Rlc3Q6IHRlc3RfMTE5LCBib2R5OiBib2R5XzEyMH0pO1xuICB9XG4gIGVuZm9yZXN0QmxvY2tTdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmxvY2tTdGF0ZW1lbnRcIiwge2Jsb2NrOiB0aGlzLmVuZm9yZXN0QmxvY2soKX0pO1xuICB9XG4gIGVuZm9yZXN0QmxvY2soKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmxvY2tcIiwge3N0YXRlbWVudHM6IHRoaXMubWF0Y2hDdXJsaWVzKCl9KTtcbiAgfVxuICBlbmZvcmVzdENsYXNzKHtpc0V4cHIsIGluRGVmYXVsdH0pIHtcbiAgICBsZXQga3dfMTIxID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IG5hbWVfMTIyID0gbnVsbCwgc3Vwcl8xMjMgPSBudWxsO1xuICAgIGxldCB0eXBlXzEyNCA9IGlzRXhwciA/IFwiQ2xhc3NFeHByZXNzaW9uXCIgOiBcIkNsYXNzRGVjbGFyYXRpb25cIjtcbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lXzEyMiA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICAgIH0gZWxzZSBpZiAoIWlzRXhwcikge1xuICAgICAgaWYgKGluRGVmYXVsdCkge1xuICAgICAgICBuYW1lXzEyMiA9IG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IFN5bnRheC5mcm9tSWRlbnRpZmllcihcIl9kZWZhdWx0XCIsIGt3XzEyMSl9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IodGhpcy5wZWVrKCksIFwidW5leHBlY3RlZCBzeW50YXhcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJleHRlbmRzXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHN1cHJfMTIzID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfVxuICAgIGxldCBlbGVtZW50c18xMjUgPSBbXTtcbiAgICBsZXQgZW5mXzEyNiA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB3aGlsZSAoZW5mXzEyNi5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIGlmIChlbmZfMTI2LmlzUHVuY3R1YXRvcihlbmZfMTI2LnBlZWsoKSwgXCI7XCIpKSB7XG4gICAgICAgIGVuZl8xMjYuYWR2YW5jZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBpc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgbGV0IHttZXRob2RPcktleSwga2luZH0gPSBlbmZfMTI2LmVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiaWRlbnRpZmllclwiICYmIG1ldGhvZE9yS2V5LnZhbHVlLnZhbCgpID09PSBcInN0YXRpY1wiKSB7XG4gICAgICAgIGlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgKHttZXRob2RPcktleSwga2luZH0gPSBlbmZfMTI2LmVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpKTtcbiAgICAgIH1cbiAgICAgIGlmIChraW5kID09PSBcIm1ldGhvZFwiKSB7XG4gICAgICAgIGVsZW1lbnRzXzEyNS5wdXNoKG5ldyBUZXJtKFwiQ2xhc3NFbGVtZW50XCIsIHtpc1N0YXRpYzogaXNTdGF0aWMsIG1ldGhvZDogbWV0aG9kT3JLZXl9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGVuZl8xMjYucGVlaygpLCBcIk9ubHkgbWV0aG9kcyBhcmUgYWxsb3dlZCBpbiBjbGFzc2VzXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZV8xMjQsIHtuYW1lOiBuYW1lXzEyMiwgc3VwZXI6IHN1cHJfMTIzLCBlbGVtZW50czogTGlzdChlbGVtZW50c18xMjUpfSk7XG4gIH1cbiAgZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KHthbGxvd1B1bmN0dWF0b3J9ID0ge30pIHtcbiAgICBsZXQgbG9va2FoZWFkXzEyNyA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTI3KSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTI3KSB8fCBhbGxvd1B1bmN0dWF0b3IgJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzEyNykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoe2FsbG93UHVuY3R1YXRvcjogYWxsb3dQdW5jdHVhdG9yfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2tldHMobG9va2FoZWFkXzEyNykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QXJyYXlCaW5kaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZF8xMjcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdE9iamVjdEJpbmRpbmcoKTtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCBcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIik7XG4gIH1cbiAgZW5mb3Jlc3RPYmplY3RCaW5kaW5nKCkge1xuICAgIGxldCBlbmZfMTI4ID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5tYXRjaEN1cmxpZXMoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBwcm9wZXJ0aWVzXzEyOSA9IFtdO1xuICAgIHdoaWxlIChlbmZfMTI4LnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgcHJvcGVydGllc18xMjkucHVzaChlbmZfMTI4LmVuZm9yZXN0QmluZGluZ1Byb3BlcnR5KCkpO1xuICAgICAgZW5mXzEyOC5jb25zdW1lQ29tbWEoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0QmluZGluZ1wiLCB7cHJvcGVydGllczogTGlzdChwcm9wZXJ0aWVzXzEyOSl9KTtcbiAgfVxuICBlbmZvcmVzdEJpbmRpbmdQcm9wZXJ0eSgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzEzMCA9IHRoaXMucGVlaygpO1xuICAgIGxldCB7bmFtZSwgYmluZGluZ30gPSB0aGlzLmVuZm9yZXN0UHJvcGVydHlOYW1lKCk7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF8xMzApIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xMzAsIFwibGV0XCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xMzAsIFwieWllbGRcIikpIHtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiOlwiKSkge1xuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNBc3NpZ24odGhpcy5wZWVrKCkpKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgbGV0IGV4cHIgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBleHByO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJcIiwge2JpbmRpbmc6IGJpbmRpbmcsIGluaXQ6IGRlZmF1bHRWYWx1ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIjpcIik7XG4gICAgYmluZGluZyA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XCIsIHtuYW1lOiBuYW1lLCBiaW5kaW5nOiBiaW5kaW5nfSk7XG4gIH1cbiAgZW5mb3Jlc3RBcnJheUJpbmRpbmcoKSB7XG4gICAgbGV0IGJyYWNrZXRfMTMxID0gdGhpcy5tYXRjaFNxdWFyZXMoKTtcbiAgICBsZXQgZW5mXzEzMiA9IG5ldyBFbmZvcmVzdGVyXzQ2KGJyYWNrZXRfMTMxLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGVsZW1lbnRzXzEzMyA9IFtdLCByZXN0RWxlbWVudF8xMzQgPSBudWxsO1xuICAgIHdoaWxlIChlbmZfMTMyLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgbGV0IGVsO1xuICAgICAgaWYgKGVuZl8xMzIuaXNQdW5jdHVhdG9yKGVuZl8xMzIucGVlaygpLCBcIixcIikpIHtcbiAgICAgICAgZW5mXzEzMi5jb25zdW1lQ29tbWEoKTtcbiAgICAgICAgZWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGVuZl8xMzIuaXNQdW5jdHVhdG9yKGVuZl8xMzIucGVlaygpLCBcIi4uLlwiKSkge1xuICAgICAgICAgIGVuZl8xMzIuYWR2YW5jZSgpO1xuICAgICAgICAgIHJlc3RFbGVtZW50XzEzNCA9IGVuZl8xMzIuZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwgPSBlbmZfMTMyLmVuZm9yZXN0QmluZGluZ0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbmZfMTMyLmNvbnN1bWVDb21tYSgpO1xuICAgICAgfVxuICAgICAgZWxlbWVudHNfMTMzLnB1c2goZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiBMaXN0KGVsZW1lbnRzXzEzMyksIHJlc3RFbGVtZW50OiByZXN0RWxlbWVudF8xMzR9KTtcbiAgfVxuICBlbmZvcmVzdEJpbmRpbmdFbGVtZW50KCkge1xuICAgIGxldCBiaW5kaW5nXzEzNSA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KCk7XG4gICAgaWYgKHRoaXMuaXNBc3NpZ24odGhpcy5wZWVrKCkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCBpbml0ID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICBiaW5kaW5nXzEzNSA9IG5ldyBUZXJtKFwiQmluZGluZ1dpdGhEZWZhdWx0XCIsIHtiaW5kaW5nOiBiaW5kaW5nXzEzNSwgaW5pdDogaW5pdH0pO1xuICAgIH1cbiAgICByZXR1cm4gYmluZGluZ18xMzU7XG4gIH1cbiAgZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcih7YWxsb3dQdW5jdHVhdG9yfSA9IHt9KSB7XG4gICAgbGV0IG5hbWVfMTM2O1xuICAgIGlmIChhbGxvd1B1bmN0dWF0b3IgJiYgdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lXzEzNiA9IHRoaXMuZW5mb3Jlc3RQdW5jdHVhdG9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVfMTM2ID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IG5hbWVfMTM2fSk7XG4gIH1cbiAgZW5mb3Jlc3RQdW5jdHVhdG9yKCkge1xuICAgIGxldCBsb29rYWhlYWRfMTM3ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xMzcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzEzNywgXCJleHBlY3RpbmcgYSBwdW5jdHVhdG9yXCIpO1xuICB9XG4gIGVuZm9yZXN0SWRlbnRpZmllcigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzEzOCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTM4KSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTM4KSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZF8xMzgsIFwiZXhwZWN0aW5nIGFuIGlkZW50aWZpZXJcIik7XG4gIH1cbiAgZW5mb3Jlc3RSZXR1cm5TdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGt3XzEzOSA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWRfMTQwID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwIHx8IGxvb2thaGVhZF8xNDAgJiYgIXRoaXMubGluZU51bWJlckVxKGt3XzEzOSwgbG9va2FoZWFkXzE0MCkpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogbnVsbH0pO1xuICAgIH1cbiAgICBsZXQgdGVybV8xNDEgPSBudWxsO1xuICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE0MCwgXCI7XCIpKSB7XG4gICAgICB0ZXJtXzE0MSA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICBleHBlY3QodGVybV8xNDEgIT0gbnVsbCwgXCJFeHBlY3RpbmcgYW4gZXhwcmVzc2lvbiB0byBmb2xsb3cgcmV0dXJuIGtleXdvcmRcIiwgbG9va2FoZWFkXzE0MCwgdGhpcy5yZXN0KTtcbiAgICB9XG4gICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiUmV0dXJuU3RhdGVtZW50XCIsIHtleHByZXNzaW9uOiB0ZXJtXzE0MX0pO1xuICB9XG4gIGVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpIHtcbiAgICBsZXQga2luZF8xNDI7XG4gICAgbGV0IGxvb2thaGVhZF8xNDMgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQga2luZFN5bl8xNDQgPSBsb29rYWhlYWRfMTQzO1xuICAgIGxldCBwaGFzZV8xNDUgPSB0aGlzLmNvbnRleHQucGhhc2U7XG4gICAgaWYgKGtpbmRTeW5fMTQ0ICYmIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW5fMTQ0LnJlc29sdmUocGhhc2VfMTQ1KSkgPT09IFZhcmlhYmxlRGVjbFRyYW5zZm9ybSkge1xuICAgICAga2luZF8xNDIgPSBcInZhclwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5bl8xNDQgJiYgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bl8xNDQucmVzb2x2ZShwaGFzZV8xNDUpKSA9PT0gTGV0RGVjbFRyYW5zZm9ybSkge1xuICAgICAga2luZF8xNDIgPSBcImxldFwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5bl8xNDQgJiYgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bl8xNDQucmVzb2x2ZShwaGFzZV8xNDUpKSA9PT0gQ29uc3REZWNsVHJhbnNmb3JtKSB7XG4gICAgICBraW5kXzE0MiA9IFwiY29uc3RcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW5fMTQ0ICYmIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW5fMTQ0LnJlc29sdmUocGhhc2VfMTQ1KSkgPT09IFN5bnRheERlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmRfMTQyID0gXCJzeW50YXhcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW5fMTQ0ICYmIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW5fMTQ0LnJlc29sdmUocGhhc2VfMTQ1KSkgPT09IFN5bnRheHJlY0RlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmRfMTQyID0gXCJzeW50YXhyZWNcIjtcbiAgICB9XG4gICAgbGV0IGRlY2xzXzE0NiA9IExpc3QoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdG9yKHtpc1N5bnRheDoga2luZF8xNDIgPT09IFwic3ludGF4XCIgfHwga2luZF8xNDIgPT09IFwic3ludGF4cmVjXCJ9KTtcbiAgICAgIGxldCBsb29rYWhlYWRfMTQzID0gdGhpcy5wZWVrKCk7XG4gICAgICBkZWNsc18xNDYgPSBkZWNsc18xNDYuY29uY2F0KHRlcm0pO1xuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xNDMsIFwiLFwiKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsIHtraW5kOiBraW5kXzE0MiwgZGVjbGFyYXRvcnM6IGRlY2xzXzE0Nn0pO1xuICB9XG4gIGVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdG9yKHtpc1N5bnRheH0pIHtcbiAgICBsZXQgaWRfMTQ3ID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoe2FsbG93UHVuY3R1YXRvcjogaXNTeW50YXh9KTtcbiAgICBsZXQgbG9va2FoZWFkXzE0OCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBpbml0XzE0OSwgcmVzdF8xNTA7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xNDgsIFwiPVwiKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5yZXN0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBpbml0XzE0OSA9IGVuZi5lbmZvcmVzdChcImV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdF8xNDkgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0b3JcIiwge2JpbmRpbmc6IGlkXzE0NywgaW5pdDogaW5pdF8xNDl9KTtcbiAgfVxuICBlbmZvcmVzdEV4cHJlc3Npb25TdGF0ZW1lbnQoKSB7XG4gICAgbGV0IHN0YXJ0XzE1MSA9IHRoaXMucmVzdC5nZXQoMCk7XG4gICAgbGV0IGV4cHJfMTUyID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAoZXhwcl8xNTIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3Ioc3RhcnRfMTUxLCBcIm5vdCBhIHZhbGlkIGV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge2V4cHJlc3Npb246IGV4cHJfMTUyfSk7XG4gIH1cbiAgZW5mb3Jlc3RFeHByZXNzaW9uKCkge1xuICAgIGxldCBsZWZ0XzE1MyA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgIGxldCBsb29rYWhlYWRfMTU0ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xNTQsIFwiLFwiKSkge1xuICAgICAgd2hpbGUgKHRoaXMucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiLFwiKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRvciA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBsZXQgcmlnaHQgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgbGVmdF8xNTMgPSBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge2xlZnQ6IGxlZnRfMTUzLCBvcGVyYXRvcjogb3BlcmF0b3IsIHJpZ2h0OiByaWdodH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuICAgIHJldHVybiBsZWZ0XzE1MztcbiAgfVxuICBlbmZvcmVzdEV4cHJlc3Npb25Mb29wKCkge1xuICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgdGhpcy5vcEN0eCA9IHtwcmVjOiAwLCBjb21iaW5lOiB4XzE1NSA9PiB4XzE1NSwgc3RhY2s6IExpc3QoKX07XG4gICAgZG8ge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0QXNzaWdubWVudEV4cHJlc3Npb24oKTtcbiAgICAgIGlmICh0ZXJtID09PSBFWFBSX0xPT1BfTk9fQ0hBTkdFXzQ0ICYmIHRoaXMub3BDdHguc3RhY2suc2l6ZSA+IDApIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5vcEN0eC5jb21iaW5lKHRoaXMudGVybSk7XG4gICAgICAgIGxldCB7cHJlYywgY29tYmluZX0gPSB0aGlzLm9wQ3R4LnN0YWNrLmxhc3QoKTtcbiAgICAgICAgdGhpcy5vcEN0eC5wcmVjID0gcHJlYztcbiAgICAgICAgdGhpcy5vcEN0eC5jb21iaW5lID0gY29tYmluZTtcbiAgICAgICAgdGhpcy5vcEN0eC5zdGFjayA9IHRoaXMub3BDdHguc3RhY2sucG9wKCk7XG4gICAgICB9IGVsc2UgaWYgKHRlcm0gPT09IEVYUFJfTE9PUF9OT19DSEFOR0VfNDQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKHRlcm0gPT09IEVYUFJfTE9PUF9PUEVSQVRPUl80MyB8fCB0ZXJtID09PSBFWFBSX0xPT1BfRVhQQU5TSU9OXzQ1KSB7XG4gICAgICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cbiAgZW5mb3Jlc3RBc3NpZ25tZW50RXhwcmVzc2lvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzE1NiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0NvbXBpbGV0aW1lVHJhbnNmb3JtKGxvb2thaGVhZF8xNTYpKSB7XG4gICAgICB0aGlzLmV4cGFuZE1hY3JvKCk7XG4gICAgICBsb29rYWhlYWRfMTU2ID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1Rlcm0obG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTU2LCBcInlpZWxkXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFlpZWxkRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwiY2xhc3NcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0Q2xhc3Moe2lzRXhwcjogdHJ1ZX0pO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTYpKSAmJiB0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoMSksIFwiPT5cIikgJiYgdGhpcy5saW5lTnVtYmVyRXEobG9va2FoZWFkXzE1NiwgdGhpcy5wZWVrKDEpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzU3ludGF4VGVtcGxhdGUobG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4VGVtcGxhdGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzU3ludGF4UXVvdGVUcmFuc2Zvcm0obG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4UXVvdGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTYpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiLCB7aW5uZXI6IHRoaXMuYWR2YW5jZSgpLmlubmVyKCl9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzE1NiwgXCJ0aGlzXCIpIHx8IHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwibGV0XCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwieWllbGRcIikgfHwgdGhpcy5pc051bWVyaWNMaXRlcmFsKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzQm9vbGVhbkxpdGVyYWwobG9va2FoZWFkXzE1NikgfHwgdGhpcy5pc051bGxMaXRlcmFsKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNSZWd1bGFyRXhwcmVzc2lvbihsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzE1NikgfHwgdGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZF8xNTYpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RQcmltYXJ5RXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNPcGVyYXRvcihsb29rYWhlYWRfMTU2KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RVbmFyeUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVmFyQmluZGluZ1RyYW5zZm9ybShsb29rYWhlYWRfMTU2KSkge1xuICAgICAgbGV0IGlkID0gdGhpcy5nZXRGcm9tQ29tcGlsZXRpbWVFbnZpcm9ubWVudChsb29rYWhlYWRfMTU2KS5pZDtcbiAgICAgIGlmIChpZCAhPT0gbG9va2FoZWFkXzE1Nikge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5yZXN0ID0gTGlzdC5vZihpZCkuY29uY2F0KHRoaXMucmVzdCk7XG4gICAgICAgIHJldHVybiBFWFBSX0xPT1BfRVhQQU5TSU9OXzQ1O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmICh0aGlzLmlzTmV3VHJhbnNmb3JtKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwic3VwZXJcIikpIHx8IHRoaXMudGVybSAmJiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE1NiwgXCIuXCIpICYmICh0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSkpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygxKSkpIHx8IHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTYpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKHthbGxvd0NhbGw6IHRydWV9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSAmJiB0aGlzLmlzVGVtcGxhdGUobG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0VGVtcGxhdGVMaXRlcmFsKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gJiYgdGhpcy5pc1VwZGF0ZU9wZXJhdG9yKGxvb2thaGVhZF8xNTYpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFVwZGF0ZUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSAmJiB0aGlzLmlzT3BlcmF0b3IobG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmluYXJ5RXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNBc3NpZ24obG9va2FoZWFkXzE1NikpIHtcbiAgICAgIGxldCBiaW5kaW5nID0gdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRoaXMudGVybSk7XG4gICAgICBsZXQgb3AgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcl80Nih0aGlzLnJlc3QsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICAgIGxldCBpbml0ID0gZW5mLmVuZm9yZXN0KFwiZXhwcmVzc2lvblwiKTtcbiAgICAgIHRoaXMucmVzdCA9IGVuZi5yZXN0O1xuICAgICAgaWYgKG9wLnZhbCgpID09PSBcIj1cIikge1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7YmluZGluZzogYmluZGluZywgZXhwcmVzc2lvbjogaW5pdH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7YmluZGluZzogYmluZGluZywgb3BlcmF0b3I6IG9wLnZhbCgpLCBleHByZXNzaW9uOiBpbml0fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE1NiwgXCI/XCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENvbmRpdGlvbmFsRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICByZXR1cm4gRVhQUl9MT09QX05PX0NIQU5HRV80NDtcbiAgfVxuICBlbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCkge1xuICAgIGxldCBsb29rYWhlYWRfMTU3ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTU3LCBcInRoaXNcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0VGhpc0V4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzE1NykgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzE1NywgXCJsZXRcIikgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzE1NywgXCJ5aWVsZFwiKSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SWRlbnRpZmllckV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkXzE1NykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TnVtZXJpY0xpdGVyYWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdHJpbmdMaXRlcmFsKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZF8xNTcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCb29sZWFuTGl0ZXJhbChsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCb29sZWFuTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNOdWxsTGl0ZXJhbChsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3ROdWxsTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNSZWd1bGFyRXhwcmVzc2lvbihsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZF8xNTcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEZ1bmN0aW9uRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzE1NykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0T2JqZWN0RXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RBcnJheUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCBcIk5vdCBhIHByaW1hcnkgZXhwcmVzc2lvblwiKTtcbiAgfVxuICBlbmZvcmVzdExlZnRIYW5kU2lkZUV4cHJlc3Npb24oe2FsbG93Q2FsbH0pIHtcbiAgICBsZXQgbG9va2FoZWFkXzE1OCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTU4LCBcInN1cGVyXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKFwiU3VwZXJcIiwge30pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1RyYW5zZm9ybShsb29rYWhlYWRfMTU4KSkge1xuICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdE5ld0V4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGxvb2thaGVhZF8xNTggPSB0aGlzLnBlZWsoKTtcbiAgICAgIGlmICh0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTgpKSB7XG4gICAgICAgIGlmICghYWxsb3dDYWxsKSB7XG4gICAgICAgICAgaWYgKHRoaXMudGVybSAmJiBpc0lkZW50aWZpZXJFeHByZXNzaW9uKHRoaXMudGVybSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlcm07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGVybSA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGVybSA9IHRoaXMuZW5mb3Jlc3RDYWxsRXhwcmVzc2lvbigpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTU4KSkge1xuICAgICAgICB0aGlzLnRlcm0gPSBhbGxvd0NhbGwgPyB0aGlzLmVuZm9yZXN0Q29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uKCkgOiB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE1OCwgXCIuXCIpICYmICh0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSkpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygxKSkpKSB7XG4gICAgICAgIHRoaXMudGVybSA9IHRoaXMuZW5mb3Jlc3RTdGF0aWNNZW1iZXJFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWRfMTU4KSkge1xuICAgICAgICB0aGlzLnRlcm0gPSB0aGlzLmVuZm9yZXN0VGVtcGxhdGVMaXRlcmFsKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzE1OCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF8xNTgpKSB7XG4gICAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge25hbWU6IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCl9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXJtO1xuICB9XG4gIGVuZm9yZXN0Qm9vbGVhbkxpdGVyYWwoKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uXCIsIHt2YWx1ZTogdGhpcy5hZHZhbmNlKCl9KTtcbiAgfVxuICBlbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiwge3RhZzogdGhpcy50ZXJtLCBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKX0pO1xuICB9XG4gIGVuZm9yZXN0U3RyaW5nTGl0ZXJhbCgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMaXRlcmFsU3RyaW5nRXhwcmVzc2lvblwiLCB7dmFsdWU6IHRoaXMuYWR2YW5jZSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3ROdW1lcmljTGl0ZXJhbCgpIHtcbiAgICBsZXQgbnVtXzE1OSA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmIChudW1fMTU5LnZhbCgpID09PSAxIC8gMCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvblwiLCB7fSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwiLCB7dmFsdWU6IG51bV8xNTl9KTtcbiAgfVxuICBlbmZvcmVzdElkZW50aWZpZXJFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiB0aGlzLmFkdmFuY2UoKX0pO1xuICB9XG4gIGVuZm9yZXN0UmVndWxhckV4cHJlc3Npb25MaXRlcmFsKCkge1xuICAgIGxldCByZVN0eF8xNjAgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQgbGFzdFNsYXNoXzE2MSA9IHJlU3R4XzE2MC50b2tlbi52YWx1ZS5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgbGV0IHBhdHRlcm5fMTYyID0gcmVTdHhfMTYwLnRva2VuLnZhbHVlLnNsaWNlKDEsIGxhc3RTbGFzaF8xNjEpO1xuICAgIGxldCBmbGFnc18xNjMgPSByZVN0eF8xNjAudG9rZW4udmFsdWUuc2xpY2UobGFzdFNsYXNoXzE2MSArIDEpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxSZWdFeHBFeHByZXNzaW9uXCIsIHtwYXR0ZXJuOiBwYXR0ZXJuXzE2MiwgZmxhZ3M6IGZsYWdzXzE2M30pO1xuICB9XG4gIGVuZm9yZXN0TnVsbExpdGVyYWwoKSB7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbE51bGxFeHByZXNzaW9uXCIsIHt9KTtcbiAgfVxuICBlbmZvcmVzdFRoaXNFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlRoaXNFeHByZXNzaW9uXCIsIHtzdHg6IHRoaXMuYWR2YW5jZSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RBcmd1bWVudExpc3QoKSB7XG4gICAgbGV0IHJlc3VsdF8xNjQgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5yZXN0LnNpemUgPiAwKSB7XG4gICAgICBsZXQgYXJnO1xuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCBcIi4uLlwiKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgYXJnID0gbmV3IFRlcm0oXCJTcHJlYWRFbGVtZW50XCIsIHtleHByZXNzaW9uOiB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKX0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJnID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZXN0LnNpemUgPiAwKSB7XG4gICAgICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiLFwiKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdF8xNjQucHVzaChhcmcpO1xuICAgIH1cbiAgICByZXR1cm4gTGlzdChyZXN1bHRfMTY0KTtcbiAgfVxuICBlbmZvcmVzdE5ld0V4cHJlc3Npb24oKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJuZXdcIik7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCBcIi5cIikgJiYgdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKDEpLCBcInRhcmdldFwiKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIk5ld1RhcmdldEV4cHJlc3Npb25cIiwge30pO1xuICAgIH1cbiAgICBsZXQgY2FsbGVlXzE2NSA9IHRoaXMuZW5mb3Jlc3RMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKHthbGxvd0NhbGw6IGZhbHNlfSk7XG4gICAgbGV0IGFyZ3NfMTY2O1xuICAgIGlmICh0aGlzLmlzUGFyZW5zKHRoaXMucGVlaygpKSkge1xuICAgICAgYXJnc18xNjYgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3NfMTY2ID0gTGlzdCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJOZXdFeHByZXNzaW9uXCIsIHtjYWxsZWU6IGNhbGxlZV8xNjUsIGFyZ3VtZW50czogYXJnc18xNjZ9KTtcbiAgfVxuICBlbmZvcmVzdENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgZW5mXzE2NyA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hTcXVhcmVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogdGhpcy50ZXJtLCBleHByZXNzaW9uOiBlbmZfMTY3LmVuZm9yZXN0RXhwcmVzc2lvbigpfSk7XG4gIH1cbiAgdHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0ZXJtXzE2OCkge1xuICAgIHN3aXRjaCAodGVybV8xNjgudHlwZSkge1xuICAgICAgY2FzZSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiB0ZXJtXzE2OC5uYW1lfSk7XG4gICAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICAgICAgaWYgKHRlcm1fMTY4LmlubmVyLnNpemUgPT09IDEgJiYgdGhpcy5pc0lkZW50aWZpZXIodGVybV8xNjguaW5uZXIuZ2V0KDApKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiB0ZXJtXzE2OC5pbm5lci5nZXQoMCl9KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcIkRhdGFQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eVwiLCB7bmFtZTogdGVybV8xNjgubmFtZSwgYmluZGluZzogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nV2l0aERlZmF1bHQodGVybV8xNjguZXhwcmVzc2lvbil9KTtcbiAgICAgIGNhc2UgXCJTaG9ydGhhbmRQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXCIsIHtiaW5kaW5nOiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiB0ZXJtXzE2OC5uYW1lfSksIGluaXQ6IG51bGx9KTtcbiAgICAgIGNhc2UgXCJPYmplY3RFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEJpbmRpbmdcIiwge3Byb3BlcnRpZXM6IHRlcm1fMTY4LnByb3BlcnRpZXMubWFwKHRfMTY5ID0+IHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0XzE2OSkpfSk7XG4gICAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICAgIGxldCBsYXN0ID0gdGVybV8xNjguZWxlbWVudHMubGFzdCgpO1xuICAgICAgICBpZiAobGFzdCAhPSBudWxsICYmIGxhc3QudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiB0ZXJtXzE2OC5lbGVtZW50cy5zbGljZSgwLCAtMSkubWFwKHRfMTcwID0+IHRfMTcwICYmIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZ1dpdGhEZWZhdWx0KHRfMTcwKSksIHJlc3RFbGVtZW50OiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdChsYXN0LmV4cHJlc3Npb24pfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQXJyYXlCaW5kaW5nXCIsIHtlbGVtZW50czogdGVybV8xNjguZWxlbWVudHMubWFwKHRfMTcxID0+IHRfMTcxICYmIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZ1dpdGhEZWZhdWx0KHRfMTcxKSksIHJlc3RFbGVtZW50OiBudWxsfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQXJyYXlCaW5kaW5nXCIsIHtlbGVtZW50czogdGVybV8xNjguZWxlbWVudHMubWFwKHRfMTcyID0+IHRfMTcyICYmIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0XzE3MikpLCByZXN0RWxlbWVudDogbnVsbH0pO1xuICAgICAgY2FzZSBcIlN0YXRpY1Byb3BlcnR5TmFtZVwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogdGVybV8xNjgudmFsdWV9KTtcbiAgICAgIGNhc2UgXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQXJyYXlCaW5kaW5nXCI6XG4gICAgICBjYXNlIFwiQmluZGluZ0lkZW50aWZpZXJcIjpcbiAgICAgIGNhc2UgXCJCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXCI6XG4gICAgICBjYXNlIFwiQmluZGluZ1Byb3BlcnR5UHJvcGVydHlcIjpcbiAgICAgIGNhc2UgXCJCaW5kaW5nV2l0aERlZmF1bHRcIjpcbiAgICAgIGNhc2UgXCJPYmplY3RCaW5kaW5nXCI6XG4gICAgICAgIHJldHVybiB0ZXJtXzE2ODtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCBcIm5vdCBpbXBsZW1lbnRlZCB5ZXQgZm9yIFwiICsgdGVybV8xNjgudHlwZSk7XG4gIH1cbiAgdHJhbnNmb3JtRGVzdHJ1Y3R1cmluZ1dpdGhEZWZhdWx0KHRlcm1fMTczKSB7XG4gICAgc3dpdGNoICh0ZXJtXzE3My50eXBlKSB7XG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ1dpdGhEZWZhdWx0XCIsIHtiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodGVybV8xNzMuYmluZGluZyksIGluaXQ6IHRlcm1fMTczLmV4cHJlc3Npb259KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0ZXJtXzE3Myk7XG4gIH1cbiAgZW5mb3Jlc3RDYWxsRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgcGFyZW5fMTc0ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ2FsbEV4cHJlc3Npb25cIiwge2NhbGxlZTogdGhpcy50ZXJtLCBhcmd1bWVudHM6IHBhcmVuXzE3NC5pbm5lcigpfSk7XG4gIH1cbiAgZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKSB7XG4gICAgbGV0IGVuZl8xNzU7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpKSkge1xuICAgICAgZW5mXzE3NSA9IG5ldyBFbmZvcmVzdGVyXzQ2KExpc3Qub2YodGhpcy5hZHZhbmNlKCkpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgICAgZW5mXzE3NSA9IG5ldyBFbmZvcmVzdGVyXzQ2KHAsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG4gICAgbGV0IHBhcmFtc18xNzYgPSBlbmZfMTc1LmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiPT5cIik7XG4gICAgbGV0IGJvZHlfMTc3O1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKHRoaXMucGVlaygpKSkge1xuICAgICAgYm9keV8xNzcgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmZfMTc1ID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5yZXN0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBib2R5XzE3NyA9IGVuZl8xNzUuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgdGhpcy5yZXN0ID0gZW5mXzE3NS5yZXN0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJvd0V4cHJlc3Npb25cIiwge3BhcmFtczogcGFyYW1zXzE3NiwgYm9keTogYm9keV8xNzd9KTtcbiAgfVxuICBlbmZvcmVzdFlpZWxkRXhwcmVzc2lvbigpIHtcbiAgICBsZXQga3dkXzE3OCA9IHRoaXMubWF0Y2hLZXl3b3JkKFwieWllbGRcIik7XG4gICAgbGV0IGxvb2thaGVhZF8xNzkgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgbG9va2FoZWFkXzE3OSAmJiAhdGhpcy5saW5lTnVtYmVyRXEoa3dkXzE3OCwgbG9va2FoZWFkXzE3OSkpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIllpZWxkRXhwcmVzc2lvblwiLCB7ZXhwcmVzc2lvbjogbnVsbH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaXNHZW5lcmF0b3IgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoKSwgXCIqXCIpKSB7XG4gICAgICAgIGlzR2VuZXJhdG9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgICBsZXQgZXhwciA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICBsZXQgdHlwZSA9IGlzR2VuZXJhdG9yID8gXCJZaWVsZEdlbmVyYXRvckV4cHJlc3Npb25cIiA6IFwiWWllbGRFeHByZXNzaW9uXCI7XG4gICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge2V4cHJlc3Npb246IGV4cHJ9KTtcbiAgICB9XG4gIH1cbiAgZW5mb3Jlc3RTeW50YXhUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTeW50YXhUZW1wbGF0ZVwiLCB7dGVtcGxhdGU6IHRoaXMuYWR2YW5jZSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RTeW50YXhRdW90ZSgpIHtcbiAgICBsZXQgbmFtZV8xODAgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTeW50YXhRdW90ZVwiLCB7bmFtZTogbmFtZV8xODAsIHRlbXBsYXRlOiBuZXcgVGVybShcIlRlbXBsYXRlRXhwcmVzc2lvblwiLCB7dGFnOiBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiBuYW1lXzE4MH0pLCBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKX0pfSk7XG4gIH1cbiAgZW5mb3Jlc3RTdGF0aWNNZW1iZXJFeHByZXNzaW9uKCkge1xuICAgIGxldCBvYmplY3RfMTgxID0gdGhpcy50ZXJtO1xuICAgIGxldCBkb3RfMTgyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IHByb3BlcnR5XzE4MyA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlN0YXRpY01lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogb2JqZWN0XzE4MSwgcHJvcGVydHk6IHByb3BlcnR5XzE4M30pO1xuICB9XG4gIGVuZm9yZXN0QXJyYXlFeHByZXNzaW9uKCkge1xuICAgIGxldCBhcnJfMTg0ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGVsZW1lbnRzXzE4NSA9IFtdO1xuICAgIGxldCBlbmZfMTg2ID0gbmV3IEVuZm9yZXN0ZXJfNDYoYXJyXzE4NC5pbm5lcigpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgd2hpbGUgKGVuZl8xODYucmVzdC5zaXplID4gMCkge1xuICAgICAgbGV0IGxvb2thaGVhZCA9IGVuZl8xODYucGVlaygpO1xuICAgICAgaWYgKGVuZl8xODYuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIsXCIpKSB7XG4gICAgICAgIGVuZl8xODYuYWR2YW5jZSgpO1xuICAgICAgICBlbGVtZW50c18xODUucHVzaChudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoZW5mXzE4Ni5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCBcIi4uLlwiKSkge1xuICAgICAgICBlbmZfMTg2LmFkdmFuY2UoKTtcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gPSBlbmZfMTg2LmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IGVuZl8xODYuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBleHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzXzE4NS5wdXNoKG5ldyBUZXJtKFwiU3ByZWFkRWxlbWVudFwiLCB7ZXhwcmVzc2lvbjogZXhwcmVzc2lvbn0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB0ZXJtID0gZW5mXzE4Ni5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIGlmICh0ZXJtID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBlbmZfMTg2LmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgXCJleHBlY3RlZCBleHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzXzE4NS5wdXNoKHRlcm0pO1xuICAgICAgICBlbmZfMTg2LmNvbnN1bWVDb21tYSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUV4cHJlc3Npb25cIiwge2VsZW1lbnRzOiBMaXN0KGVsZW1lbnRzXzE4NSl9KTtcbiAgfVxuICBlbmZvcmVzdE9iamVjdEV4cHJlc3Npb24oKSB7XG4gICAgbGV0IG9ial8xODcgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQgcHJvcGVydGllc18xODggPSBMaXN0KCk7XG4gICAgbGV0IGVuZl8xODkgPSBuZXcgRW5mb3Jlc3Rlcl80NihvYmpfMTg3LmlubmVyKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbGFzdFByb3BfMTkwID0gbnVsbDtcbiAgICB3aGlsZSAoZW5mXzE4OS5yZXN0LnNpemUgPiAwKSB7XG4gICAgICBsZXQgcHJvcCA9IGVuZl8xODkuZW5mb3Jlc3RQcm9wZXJ0eURlZmluaXRpb24oKTtcbiAgICAgIGVuZl8xODkuY29uc3VtZUNvbW1hKCk7XG4gICAgICBwcm9wZXJ0aWVzXzE4OCA9IHByb3BlcnRpZXNfMTg4LmNvbmNhdChwcm9wKTtcbiAgICAgIGlmIChsYXN0UHJvcF8xOTAgPT09IHByb3ApIHtcbiAgICAgICAgdGhyb3cgZW5mXzE4OS5jcmVhdGVFcnJvcihwcm9wLCBcImludmFsaWQgc3ludGF4IGluIG9iamVjdFwiKTtcbiAgICAgIH1cbiAgICAgIGxhc3RQcm9wXzE5MCA9IHByb3A7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEV4cHJlc3Npb25cIiwge3Byb3BlcnRpZXM6IHByb3BlcnRpZXNfMTg4fSk7XG4gIH1cbiAgZW5mb3Jlc3RQcm9wZXJ0eURlZmluaXRpb24oKSB7XG4gICAgbGV0IHttZXRob2RPcktleSwga2luZH0gPSB0aGlzLmVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBcIm1ldGhvZFwiOlxuICAgICAgICByZXR1cm4gbWV0aG9kT3JLZXk7XG4gICAgICBjYXNlIFwiaWRlbnRpZmllclwiOlxuICAgICAgICBpZiAodGhpcy5pc0Fzc2lnbih0aGlzLnBlZWsoKSkpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICBsZXQgaW5pdCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJcIiwge2luaXQ6IGluaXQsIGJpbmRpbmc6IHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyhtZXRob2RPcktleSl9KTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiOlwiKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybShcIlNob3J0aGFuZFByb3BlcnR5XCIsIHtuYW1lOiBtZXRob2RPcktleS52YWx1ZX0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiOlwiKTtcbiAgICBsZXQgZXhwcl8xOTEgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge25hbWU6IG1ldGhvZE9yS2V5LCBleHByZXNzaW9uOiBleHByXzE5MX0pO1xuICB9XG4gIGVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzE5MiA9IHRoaXMucGVlaygpO1xuICAgIGxldCBpc0dlbmVyYXRvcl8xOTMgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE5MiwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvcl8xOTMgPSB0cnVlO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTkyLCBcImdldFwiKSAmJiB0aGlzLmlzUHJvcGVydHlOYW1lKHRoaXMucGVlaygxKSkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IHtuYW1lfSA9IHRoaXMuZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKTtcbiAgICAgIHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICAgIGxldCBib2R5ID0gdGhpcy5tYXRjaEN1cmxpZXMoKTtcbiAgICAgIHJldHVybiB7bWV0aG9kT3JLZXk6IG5ldyBUZXJtKFwiR2V0dGVyXCIsIHtuYW1lOiBuYW1lLCBib2R5OiBib2R5fSksIGtpbmQ6IFwibWV0aG9kXCJ9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzE5MiwgXCJzZXRcIikgJiYgdGhpcy5pc1Byb3BlcnR5TmFtZSh0aGlzLnBlZWsoMSkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCB7bmFtZX0gPSB0aGlzLmVuZm9yZXN0UHJvcGVydHlOYW1lKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5tYXRjaFBhcmVucygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgcGFyYW0gPSBlbmYuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHttZXRob2RPcktleTogbmV3IFRlcm0oXCJTZXR0ZXJcIiwge25hbWU6IG5hbWUsIHBhcmFtOiBwYXJhbSwgYm9keTogYm9keX0pLCBraW5kOiBcIm1ldGhvZFwifTtcbiAgICB9XG4gICAgbGV0IHtuYW1lfSA9IHRoaXMuZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAodGhpcy5pc1BhcmVucyh0aGlzLnBlZWsoKSkpIHtcbiAgICAgIGxldCBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXJfNDYocGFyYW1zLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgZm9ybWFsUGFyYW1zID0gZW5mLmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHttZXRob2RPcktleTogbmV3IFRlcm0oXCJNZXRob2RcIiwge2lzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcl8xOTMsIG5hbWU6IG5hbWUsIHBhcmFtczogZm9ybWFsUGFyYW1zLCBib2R5OiBib2R5fSksIGtpbmQ6IFwibWV0aG9kXCJ9O1xuICAgIH1cbiAgICByZXR1cm4ge21ldGhvZE9yS2V5OiBuYW1lLCBraW5kOiB0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTkyKSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTkyKSA/IFwiaWRlbnRpZmllclwiIDogXCJwcm9wZXJ0eVwifTtcbiAgfVxuICBlbmZvcmVzdFByb3BlcnR5TmFtZSgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzE5NCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWRfMTk0KSB8fCB0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkXzE5NCkpIHtcbiAgICAgIHJldHVybiB7bmFtZTogbmV3IFRlcm0oXCJTdGF0aWNQcm9wZXJ0eU5hbWVcIiwge3ZhbHVlOiB0aGlzLmFkdmFuY2UoKX0pLCBiaW5kaW5nOiBudWxsfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTk0KSkge1xuICAgICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hTcXVhcmVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICAgIGxldCBleHByID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgIHJldHVybiB7bmFtZTogbmV3IFRlcm0oXCJDb21wdXRlZFByb3BlcnR5TmFtZVwiLCB7ZXhwcmVzc2lvbjogZXhwcn0pLCBiaW5kaW5nOiBudWxsfTtcbiAgICB9XG4gICAgbGV0IG5hbWVfMTk1ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHtuYW1lOiBuZXcgVGVybShcIlN0YXRpY1Byb3BlcnR5TmFtZVwiLCB7dmFsdWU6IG5hbWVfMTk1fSksIGJpbmRpbmc6IG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IG5hbWVfMTk1fSl9O1xuICB9XG4gIGVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwciwgaW5EZWZhdWx0LCBhbGxvd0dlbmVyYXRvcn0pIHtcbiAgICBsZXQgbmFtZV8xOTYgPSBudWxsLCBwYXJhbXNfMTk3LCBib2R5XzE5OCwgcmVzdF8xOTk7XG4gICAgbGV0IGlzR2VuZXJhdG9yXzIwMCA9IGZhbHNlO1xuICAgIGxldCBmbktleXdvcmRfMjAxID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZF8yMDIgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgdHlwZV8yMDMgPSBpc0V4cHIgPyBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIDogXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8yMDIsIFwiKlwiKSkge1xuICAgICAgaXNHZW5lcmF0b3JfMjAwID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbG9va2FoZWFkXzIwMiA9IHRoaXMucGVlaygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNQYXJlbnMobG9va2FoZWFkXzIwMikpIHtcbiAgICAgIG5hbWVfMTk2ID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfSBlbHNlIGlmIChpbkRlZmF1bHQpIHtcbiAgICAgIG5hbWVfMTk2ID0gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogU3ludGF4LmZyb21JZGVudGlmaWVyKFwiKmRlZmF1bHQqXCIsIGZuS2V5d29yZF8yMDEpfSk7XG4gICAgfVxuICAgIHBhcmFtc18xOTcgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgYm9keV8xOTggPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIGxldCBlbmZfMjA0ID0gbmV3IEVuZm9yZXN0ZXJfNDYocGFyYW1zXzE5NywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXNfMjA1ID0gZW5mXzIwNC5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZV8yMDMsIHtuYW1lOiBuYW1lXzE5NiwgaXNHZW5lcmF0b3I6IGlzR2VuZXJhdG9yXzIwMCwgcGFyYW1zOiBmb3JtYWxQYXJhbXNfMjA1LCBib2R5OiBib2R5XzE5OH0pO1xuICB9XG4gIGVuZm9yZXN0RnVuY3Rpb25FeHByZXNzaW9uKCkge1xuICAgIGxldCBuYW1lXzIwNiA9IG51bGwsIHBhcmFtc18yMDcsIGJvZHlfMjA4LCByZXN0XzIwOTtcbiAgICBsZXQgaXNHZW5lcmF0b3JfMjEwID0gZmFsc2U7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZF8yMTEgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzIxMSwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvcl8yMTAgPSB0cnVlO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsb29rYWhlYWRfMjExID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1BhcmVucyhsb29rYWhlYWRfMjExKSkge1xuICAgICAgbmFtZV8yMDYgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgcGFyYW1zXzIwNyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBib2R5XzIwOCA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG4gICAgbGV0IGVuZl8yMTIgPSBuZXcgRW5mb3Jlc3Rlcl80NihwYXJhbXNfMjA3LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGZvcm1hbFBhcmFtc18yMTMgPSBlbmZfMjEyLmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCB7bmFtZTogbmFtZV8yMDYsIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcl8yMTAsIHBhcmFtczogZm9ybWFsUGFyYW1zXzIxMywgYm9keTogYm9keV8yMDh9KTtcbiAgfVxuICBlbmZvcmVzdEZ1bmN0aW9uRGVjbGFyYXRpb24oKSB7XG4gICAgbGV0IG5hbWVfMjE0LCBwYXJhbXNfMjE1LCBib2R5XzIxNiwgcmVzdF8yMTc7XG4gICAgbGV0IGlzR2VuZXJhdG9yXzIxOCA9IGZhbHNlO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWRfMjE5ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8yMTksIFwiKlwiKSkge1xuICAgICAgaXNHZW5lcmF0b3JfMjE4ID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICBuYW1lXzIxNCA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICAgIHBhcmFtc18yMTUgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgYm9keV8yMTYgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIGxldCBlbmZfMjIwID0gbmV3IEVuZm9yZXN0ZXJfNDYocGFyYW1zXzIxNSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXNfMjIxID0gZW5mXzIyMC5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIsIHtuYW1lOiBuYW1lXzIxNCwgaXNHZW5lcmF0b3I6IGlzR2VuZXJhdG9yXzIxOCwgcGFyYW1zOiBmb3JtYWxQYXJhbXNfMjIxLCBib2R5OiBib2R5XzIxNn0pO1xuICB9XG4gIGVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpIHtcbiAgICBsZXQgaXRlbXNfMjIyID0gW107XG4gICAgbGV0IHJlc3RfMjIzID0gbnVsbDtcbiAgICB3aGlsZSAodGhpcy5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsIFwiLi4uXCIpKSB7XG4gICAgICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiLi4uXCIpO1xuICAgICAgICByZXN0XzIyMyA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGl0ZW1zXzIyMi5wdXNoKHRoaXMuZW5mb3Jlc3RQYXJhbSgpKTtcbiAgICAgIHRoaXMuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge2l0ZW1zOiBMaXN0KGl0ZW1zXzIyMiksIHJlc3Q6IHJlc3RfMjIzfSk7XG4gIH1cbiAgZW5mb3Jlc3RQYXJhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJpbmRpbmdFbGVtZW50KCk7XG4gIH1cbiAgZW5mb3Jlc3RVcGRhdGVFeHByZXNzaW9uKCkge1xuICAgIGxldCBvcGVyYXRvcl8yMjQgPSB0aGlzLm1hdGNoVW5hcnlPcGVyYXRvcigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlVwZGF0ZUV4cHJlc3Npb25cIiwge2lzUHJlZml4OiBmYWxzZSwgb3BlcmF0b3I6IG9wZXJhdG9yXzIyNC52YWwoKSwgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRoaXMudGVybSl9KTtcbiAgfVxuICBlbmZvcmVzdFVuYXJ5RXhwcmVzc2lvbigpIHtcbiAgICBsZXQgb3BlcmF0b3JfMjI1ID0gdGhpcy5tYXRjaFVuYXJ5T3BlcmF0b3IoKTtcbiAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wdXNoKHtwcmVjOiB0aGlzLm9wQ3R4LnByZWMsIGNvbWJpbmU6IHRoaXMub3BDdHguY29tYmluZX0pO1xuICAgIHRoaXMub3BDdHgucHJlYyA9IDE0O1xuICAgIHRoaXMub3BDdHguY29tYmluZSA9IHJpZ2h0VGVybV8yMjYgPT4ge1xuICAgICAgbGV0IHR5cGVfMjI3LCB0ZXJtXzIyOCwgaXNQcmVmaXhfMjI5O1xuICAgICAgaWYgKG9wZXJhdG9yXzIyNS52YWwoKSA9PT0gXCIrK1wiIHx8IG9wZXJhdG9yXzIyNS52YWwoKSA9PT0gXCItLVwiKSB7XG4gICAgICAgIHR5cGVfMjI3ID0gXCJVcGRhdGVFeHByZXNzaW9uXCI7XG4gICAgICAgIHRlcm1fMjI4ID0gdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHJpZ2h0VGVybV8yMjYpO1xuICAgICAgICBpc1ByZWZpeF8yMjkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZV8yMjcgPSBcIlVuYXJ5RXhwcmVzc2lvblwiO1xuICAgICAgICBpc1ByZWZpeF8yMjkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRlcm1fMjI4ID0gcmlnaHRUZXJtXzIyNjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzIyNywge29wZXJhdG9yOiBvcGVyYXRvcl8yMjUudmFsKCksIG9wZXJhbmQ6IHRlcm1fMjI4LCBpc1ByZWZpeDogaXNQcmVmaXhfMjI5fSk7XG4gICAgfTtcbiAgICByZXR1cm4gRVhQUl9MT09QX09QRVJBVE9SXzQzO1xuICB9XG4gIGVuZm9yZXN0Q29uZGl0aW9uYWxFeHByZXNzaW9uKCkge1xuICAgIGxldCB0ZXN0XzIzMCA9IHRoaXMub3BDdHguY29tYmluZSh0aGlzLnRlcm0pO1xuICAgIGlmICh0aGlzLm9wQ3R4LnN0YWNrLnNpemUgPiAwKSB7XG4gICAgICBsZXQge3ByZWMsIGNvbWJpbmV9ID0gdGhpcy5vcEN0eC5zdGFjay5sYXN0KCk7XG4gICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IHByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgIH1cbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIj9cIik7XG4gICAgbGV0IGVuZl8yMzEgPSBuZXcgRW5mb3Jlc3Rlcl80Nih0aGlzLnJlc3QsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgY29uc2VxdWVudF8yMzIgPSBlbmZfMjMxLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICBlbmZfMjMxLm1hdGNoUHVuY3R1YXRvcihcIjpcIik7XG4gICAgZW5mXzIzMSA9IG5ldyBFbmZvcmVzdGVyXzQ2KGVuZl8yMzEucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBhbHRlcm5hdGVfMjMzID0gZW5mXzIzMS5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgdGhpcy5yZXN0ID0gZW5mXzIzMS5yZXN0O1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiLCB7dGVzdDogdGVzdF8yMzAsIGNvbnNlcXVlbnQ6IGNvbnNlcXVlbnRfMjMyLCBhbHRlcm5hdGU6IGFsdGVybmF0ZV8yMzN9KTtcbiAgfVxuICBlbmZvcmVzdEJpbmFyeUV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGxlZnRUZXJtXzIzNCA9IHRoaXMudGVybTtcbiAgICBsZXQgb3BTdHhfMjM1ID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IG9wXzIzNiA9IG9wU3R4XzIzNS52YWwoKTtcbiAgICBsZXQgb3BQcmVjXzIzNyA9IGdldE9wZXJhdG9yUHJlYyhvcF8yMzYpO1xuICAgIGxldCBvcEFzc29jXzIzOCA9IGdldE9wZXJhdG9yQXNzb2Mob3BfMjM2KTtcbiAgICBpZiAob3BlcmF0b3JMdCh0aGlzLm9wQ3R4LnByZWMsIG9wUHJlY18yMzcsIG9wQXNzb2NfMjM4KSkge1xuICAgICAgdGhpcy5vcEN0eC5zdGFjayA9IHRoaXMub3BDdHguc3RhY2sucHVzaCh7cHJlYzogdGhpcy5vcEN0eC5wcmVjLCBjb21iaW5lOiB0aGlzLm9wQ3R4LmNvbWJpbmV9KTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IG9wUHJlY18yMzc7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSByaWdodFRlcm1fMjM5ID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluYXJ5RXhwcmVzc2lvblwiLCB7bGVmdDogbGVmdFRlcm1fMjM0LCBvcGVyYXRvcjogb3BTdHhfMjM1LCByaWdodDogcmlnaHRUZXJtXzIzOX0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIEVYUFJfTE9PUF9PUEVSQVRPUl80MztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLm9wQ3R4LmNvbWJpbmUobGVmdFRlcm1fMjM0KTtcbiAgICAgIGxldCB7cHJlYywgY29tYmluZX0gPSB0aGlzLm9wQ3R4LnN0YWNrLmxhc3QoKTtcbiAgICAgIHRoaXMub3BDdHguc3RhY2sgPSB0aGlzLm9wQ3R4LnN0YWNrLnBvcCgpO1xuICAgICAgdGhpcy5vcEN0eC5wcmVjID0gcHJlYztcbiAgICAgIHRoaXMub3BDdHguY29tYmluZSA9IGNvbWJpbmU7XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gIH1cbiAgZW5mb3Jlc3RUZW1wbGF0ZUVsZW1lbnRzKCkge1xuICAgIGxldCBsb29rYWhlYWRfMjQwID0gdGhpcy5tYXRjaFRlbXBsYXRlKCk7XG4gICAgbGV0IGVsZW1lbnRzXzI0MSA9IGxvb2thaGVhZF8yNDAudG9rZW4uaXRlbXMubWFwKGl0XzI0MiA9PiB7XG4gICAgICBpZiAodGhpcy5pc0RlbGltaXRlcihpdF8yNDIpKSB7XG4gICAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcl80NihpdF8yNDIuaW5uZXIoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICByZXR1cm4gZW5mLmVuZm9yZXN0KFwiZXhwcmVzc2lvblwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIlRlbXBsYXRlRWxlbWVudFwiLCB7cmF3VmFsdWU6IGl0XzI0Mi5zbGljZS50ZXh0fSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzXzI0MTtcbiAgfVxuICBleHBhbmRNYWNybygpIHtcbiAgICBsZXQgbG9va2FoZWFkXzI0MyA9IHRoaXMucGVlaygpO1xuICAgIHdoaWxlICh0aGlzLmlzQ29tcGlsZXRpbWVUcmFuc2Zvcm0obG9va2FoZWFkXzI0MykpIHtcbiAgICAgIGxldCBuYW1lID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgc3ludGF4VHJhbnNmb3JtID0gdGhpcy5nZXRGcm9tQ29tcGlsZXRpbWVFbnZpcm9ubWVudChuYW1lKTtcbiAgICAgIGlmIChzeW50YXhUcmFuc2Zvcm0gPT0gbnVsbCB8fCB0eXBlb2Ygc3ludGF4VHJhbnNmb3JtLnZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihuYW1lLCBcInRoZSBtYWNybyBuYW1lIHdhcyBub3QgYm91bmQgdG8gYSB2YWx1ZSB0aGF0IGNvdWxkIGJlIGludm9rZWRcIik7XG4gICAgICB9XG4gICAgICBsZXQgdXNlU2l0ZVNjb3BlID0gZnJlc2hTY29wZShcInVcIik7XG4gICAgICBsZXQgaW50cm9kdWNlZFNjb3BlID0gZnJlc2hTY29wZShcImlcIik7XG4gICAgICB0aGlzLmNvbnRleHQudXNlU2NvcGUgPSB1c2VTaXRlU2NvcGU7XG4gICAgICBsZXQgY3R4ID0gbmV3IE1hY3JvQ29udGV4dCh0aGlzLCBuYW1lLCB0aGlzLmNvbnRleHQsIHVzZVNpdGVTY29wZSwgaW50cm9kdWNlZFNjb3BlKTtcbiAgICAgIGxldCByZXN1bHQgPSBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKHN5bnRheFRyYW5zZm9ybS52YWx1ZS5jYWxsKG51bGwsIGN0eCkpO1xuICAgICAgaWYgKCFMaXN0LmlzTGlzdChyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSwgXCJtYWNybyBtdXN0IHJldHVybiBhIGxpc3QgYnV0IGdvdDogXCIgKyByZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChzdHhfMjQ0ID0+IHtcbiAgICAgICAgaWYgKCEoc3R4XzI0NCAmJiB0eXBlb2Ygc3R4XzI0NC5hZGRTY29wZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSwgXCJtYWNybyBtdXN0IHJldHVybiBzeW50YXggb2JqZWN0cyBvciB0ZXJtcyBidXQgZ290OiBcIiArIHN0eF8yNDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHhfMjQ0LmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTLCB7ZmxpcDogdHJ1ZX0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc3QgPSByZXN1bHQuY29uY2F0KGN0eC5fcmVzdCh0aGlzKSk7XG4gICAgICBsb29rYWhlYWRfMjQzID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICB9XG4gIGNvbnN1bWVTZW1pY29sb24oKSB7XG4gICAgbGV0IGxvb2thaGVhZF8yNDUgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAobG9va2FoZWFkXzI0NSAmJiB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWRfMjQ1LCBcIjtcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfVxuICBjb25zdW1lQ29tbWEoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8yNDYgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAobG9va2FoZWFkXzI0NiAmJiB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWRfMjQ2LCBcIixcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfVxuICBzYWZlQ2hlY2sob2JqXzI0NywgdHlwZV8yNDgsIHZhbF8yNDkgPSBudWxsKSB7XG4gICAgcmV0dXJuIG9ial8yNDcgJiYgKHR5cGVvZiBvYmpfMjQ3Lm1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBvYmpfMjQ3Lm1hdGNoKHR5cGVfMjQ4LCB2YWxfMjQ5KSA6IGZhbHNlKTtcbiAgfVxuICBpc1Rlcm0odGVybV8yNTApIHtcbiAgICByZXR1cm4gdGVybV8yNTAgJiYgdGVybV8yNTAgaW5zdGFuY2VvZiBUZXJtO1xuICB9XG4gIGlzRU9GKG9ial8yNTEpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI1MSwgXCJlb2ZcIik7XG4gIH1cbiAgaXNJZGVudGlmaWVyKG9ial8yNTIsIHZhbF8yNTMgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9ial8yNTIsIFwiaWRlbnRpZmllclwiLCB2YWxfMjUzKTtcbiAgfVxuICBpc1Byb3BlcnR5TmFtZShvYmpfMjU0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJZGVudGlmaWVyKG9ial8yNTQpIHx8IHRoaXMuaXNLZXl3b3JkKG9ial8yNTQpIHx8IHRoaXMuaXNOdW1lcmljTGl0ZXJhbChvYmpfMjU0KSB8fCB0aGlzLmlzU3RyaW5nTGl0ZXJhbChvYmpfMjU0KSB8fCB0aGlzLmlzQnJhY2tldHMob2JqXzI1NCk7XG4gIH1cbiAgaXNOdW1lcmljTGl0ZXJhbChvYmpfMjU1LCB2YWxfMjU2ID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjU1LCBcIm51bWJlclwiLCB2YWxfMjU2KTtcbiAgfVxuICBpc1N0cmluZ0xpdGVyYWwob2JqXzI1NywgdmFsXzI1OCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI1NywgXCJzdHJpbmdcIiwgdmFsXzI1OCk7XG4gIH1cbiAgaXNUZW1wbGF0ZShvYmpfMjU5LCB2YWxfMjYwID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjU5LCBcInRlbXBsYXRlXCIsIHZhbF8yNjApO1xuICB9XG4gIGlzU3ludGF4VGVtcGxhdGUob2JqXzI2MSkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjYxLCBcInN5bnRheFRlbXBsYXRlXCIpO1xuICB9XG4gIGlzQm9vbGVhbkxpdGVyYWwob2JqXzI2MiwgdmFsXzI2MyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2MiwgXCJib29sZWFuXCIsIHZhbF8yNjMpO1xuICB9XG4gIGlzTnVsbExpdGVyYWwob2JqXzI2NCwgdmFsXzI2NSA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2NCwgXCJudWxsXCIsIHZhbF8yNjUpO1xuICB9XG4gIGlzUmVndWxhckV4cHJlc3Npb24ob2JqXzI2NiwgdmFsXzI2NyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2NiwgXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWxfMjY3KTtcbiAgfVxuICBpc0RlbGltaXRlcihvYmpfMjY4KSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9ial8yNjgsIFwiZGVsaW1pdGVyXCIpO1xuICB9XG4gIGlzUGFyZW5zKG9ial8yNjkpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2OSwgXCJwYXJlbnNcIik7XG4gIH1cbiAgaXNCcmFjZXMob2JqXzI3MCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjcwLCBcImJyYWNlc1wiKTtcbiAgfVxuICBpc0JyYWNrZXRzKG9ial8yNzEpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI3MSwgXCJicmFja2V0c1wiKTtcbiAgfVxuICBpc0Fzc2lnbihvYmpfMjcyLCB2YWxfMjczID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjcyLCBcImFzc2lnblwiLCB2YWxfMjczKTtcbiAgfVxuICBpc0tleXdvcmQob2JqXzI3NCwgdmFsXzI3NSA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI3NCwgXCJrZXl3b3JkXCIsIHZhbF8yNzUpO1xuICB9XG4gIGlzUHVuY3R1YXRvcihvYmpfMjc2LCB2YWxfMjc3ID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjc2LCBcInB1bmN0dWF0b3JcIiwgdmFsXzI3Nyk7XG4gIH1cbiAgaXNPcGVyYXRvcihvYmpfMjc4KSB7XG4gICAgcmV0dXJuICh0aGlzLnNhZmVDaGVjayhvYmpfMjc4LCBcInB1bmN0dWF0b3JcIikgfHwgdGhpcy5zYWZlQ2hlY2sob2JqXzI3OCwgXCJpZGVudGlmaWVyXCIpIHx8IHRoaXMuc2FmZUNoZWNrKG9ial8yNzgsIFwia2V5d29yZFwiKSkgJiYgaXNPcGVyYXRvcihvYmpfMjc4KTtcbiAgfVxuICBpc1VwZGF0ZU9wZXJhdG9yKG9ial8yNzkpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI3OSwgXCJwdW5jdHVhdG9yXCIsIFwiKytcIikgfHwgdGhpcy5zYWZlQ2hlY2sob2JqXzI3OSwgXCJwdW5jdHVhdG9yXCIsIFwiLS1cIik7XG4gIH1cbiAgc2FmZVJlc29sdmUob2JqXzI4MCwgcGhhc2VfMjgxKSB7XG4gICAgcmV0dXJuIG9ial8yODAgJiYgdHlwZW9mIG9ial8yODAucmVzb2x2ZSA9PT0gXCJmdW5jdGlvblwiID8gSnVzdF80MShvYmpfMjgwLnJlc29sdmUocGhhc2VfMjgxKSkgOiBOb3RoaW5nXzQyKCk7XG4gIH1cbiAgaXNUcmFuc2Zvcm0ob2JqXzI4MiwgdHJhbnNfMjgzKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZVJlc29sdmUob2JqXzI4MiwgdGhpcy5jb250ZXh0LnBoYXNlKS5tYXAobmFtZV8yODQgPT4gdGhpcy5jb250ZXh0LmVudi5nZXQobmFtZV8yODQpID09PSB0cmFuc18yODMgfHwgdGhpcy5jb250ZXh0LnN0b3JlLmdldChuYW1lXzI4NCkgPT09IHRyYW5zXzI4MykuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuICBpc1RyYW5zZm9ybUluc3RhbmNlKG9ial8yODUsIHRyYW5zXzI4Nikge1xuICAgIHJldHVybiB0aGlzLnNhZmVSZXNvbHZlKG9ial8yODUsIHRoaXMuY29udGV4dC5waGFzZSkubWFwKG5hbWVfMjg3ID0+IHRoaXMuY29udGV4dC5lbnYuZ2V0KG5hbWVfMjg3KSBpbnN0YW5jZW9mIHRyYW5zXzI4NiB8fCB0aGlzLmNvbnRleHQuc3RvcmUuZ2V0KG5hbWVfMjg3KSBpbnN0YW5jZW9mIHRyYW5zXzI4NikuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuICBpc0ZuRGVjbFRyYW5zZm9ybShvYmpfMjg4KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI4OCwgRnVuY3Rpb25EZWNsVHJhbnNmb3JtKTtcbiAgfVxuICBpc1ZhckRlY2xUcmFuc2Zvcm0ob2JqXzI4OSkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yODksIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNMZXREZWNsVHJhbnNmb3JtKG9ial8yOTApIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmpfMjkwLCBMZXREZWNsVHJhbnNmb3JtKTtcbiAgfVxuICBpc0NvbnN0RGVjbFRyYW5zZm9ybShvYmpfMjkxKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5MSwgQ29uc3REZWNsVHJhbnNmb3JtKTtcbiAgfVxuICBpc1N5bnRheERlY2xUcmFuc2Zvcm0ob2JqXzI5Mikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yOTIsIFN5bnRheERlY2xUcmFuc2Zvcm0pO1xuICB9XG4gIGlzU3ludGF4cmVjRGVjbFRyYW5zZm9ybShvYmpfMjkzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5MywgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNTeW50YXhRdW90ZVRyYW5zZm9ybShvYmpfMjk0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5NCwgU3ludGF4UXVvdGVUcmFuc2Zvcm0pO1xuICB9XG4gIGlzUmV0dXJuU3RtdFRyYW5zZm9ybShvYmpfMjk1KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5NSwgUmV0dXJuU3RhdGVtZW50VHJhbnNmb3JtKTtcbiAgfVxuICBpc1doaWxlVHJhbnNmb3JtKG9ial8yOTYpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmpfMjk2LCBXaGlsZVRyYW5zZm9ybSk7XG4gIH1cbiAgaXNGb3JUcmFuc2Zvcm0ob2JqXzI5Nykge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yOTcsIEZvclRyYW5zZm9ybSk7XG4gIH1cbiAgaXNTd2l0Y2hUcmFuc2Zvcm0ob2JqXzI5OCkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yOTgsIFN3aXRjaFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNCcmVha1RyYW5zZm9ybShvYmpfMjk5KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5OSwgQnJlYWtUcmFuc2Zvcm0pO1xuICB9XG4gIGlzQ29udGludWVUcmFuc2Zvcm0ob2JqXzMwMCkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8zMDAsIENvbnRpbnVlVHJhbnNmb3JtKTtcbiAgfVxuICBpc0RvVHJhbnNmb3JtKG9ial8zMDEpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmpfMzAxLCBEb1RyYW5zZm9ybSk7XG4gIH1cbiAgaXNEZWJ1Z2dlclRyYW5zZm9ybShvYmpfMzAyKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwMiwgRGVidWdnZXJUcmFuc2Zvcm0pO1xuICB9XG4gIGlzV2l0aFRyYW5zZm9ybShvYmpfMzAzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwMywgV2l0aFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNUcnlUcmFuc2Zvcm0ob2JqXzMwNCkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8zMDQsIFRyeVRyYW5zZm9ybSk7XG4gIH1cbiAgaXNUaHJvd1RyYW5zZm9ybShvYmpfMzA1KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwNSwgVGhyb3dUcmFuc2Zvcm0pO1xuICB9XG4gIGlzSWZUcmFuc2Zvcm0ob2JqXzMwNikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8zMDYsIElmVHJhbnNmb3JtKTtcbiAgfVxuICBpc05ld1RyYW5zZm9ybShvYmpfMzA3KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwNywgTmV3VHJhbnNmb3JtKTtcbiAgfVxuICBpc0NvbXBpbGV0aW1lVHJhbnNmb3JtKG9ial8zMDgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybUluc3RhbmNlKG9ial8zMDgsIENvbXBpbGV0aW1lVHJhbnNmb3JtKTtcbiAgfVxuICBpc1ZhckJpbmRpbmdUcmFuc2Zvcm0ob2JqXzMwOSkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtSW5zdGFuY2Uob2JqXzMwOSwgVmFyQmluZGluZ1RyYW5zZm9ybSk7XG4gIH1cbiAgZ2V0RnJvbUNvbXBpbGV0aW1lRW52aXJvbm1lbnQodGVybV8zMTApIHtcbiAgICBpZiAodGhpcy5jb250ZXh0LmVudi5oYXModGVybV8zMTAucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5lbnYuZ2V0KHRlcm1fMzEwLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRleHQuc3RvcmUuZ2V0KHRlcm1fMzEwLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKSk7XG4gIH1cbiAgbGluZU51bWJlckVxKGFfMzExLCBiXzMxMikge1xuICAgIGlmICghKGFfMzExICYmIGJfMzEyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYV8zMTEubGluZU51bWJlcigpID09PSBiXzMxMi5saW5lTnVtYmVyKCk7XG4gIH1cbiAgbWF0Y2hJZGVudGlmaWVyKHZhbF8zMTMpIHtcbiAgICBsZXQgbG9va2FoZWFkXzMxNCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMzE0KSkge1xuICAgICAgcmV0dXJuIGxvb2thaGVhZF8zMTQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMxNCwgXCJleHBlY3RpbmcgYW4gaWRlbnRpZmllclwiKTtcbiAgfVxuICBtYXRjaEtleXdvcmQodmFsXzMxNSkge1xuICAgIGxldCBsb29rYWhlYWRfMzE2ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8zMTYsIHZhbF8zMTUpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxNjtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE2LCBcImV4cGVjdGluZyBcIiArIHZhbF8zMTUpO1xuICB9XG4gIG1hdGNoTGl0ZXJhbCgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzMxNyA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkXzMxNykgfHwgdGhpcy5pc1N0cmluZ0xpdGVyYWwobG9va2FoZWFkXzMxNykgfHwgdGhpcy5pc0Jvb2xlYW5MaXRlcmFsKGxvb2thaGVhZF8zMTcpIHx8IHRoaXMuaXNOdWxsTGl0ZXJhbChsb29rYWhlYWRfMzE3KSB8fCB0aGlzLmlzVGVtcGxhdGUobG9va2FoZWFkXzMxNykgfHwgdGhpcy5pc1JlZ3VsYXJFeHByZXNzaW9uKGxvb2thaGVhZF8zMTcpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxNztcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE3LCBcImV4cGVjdGluZyBhIGxpdGVyYWxcIik7XG4gIH1cbiAgbWF0Y2hTdHJpbmdMaXRlcmFsKCkge1xuICAgIGxldCBsb29rYWhlYWRfMzE4ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZF8zMTgpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxODtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE4LCBcImV4cGVjdGluZyBhIHN0cmluZyBsaXRlcmFsXCIpO1xuICB9XG4gIG1hdGNoVGVtcGxhdGUoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMTkgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZF8zMTkpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxOTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE5LCBcImV4cGVjdGluZyBhIHRlbXBsYXRlIGxpdGVyYWxcIik7XG4gIH1cbiAgbWF0Y2hQYXJlbnMoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMjAgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1BhcmVucyhsb29rYWhlYWRfMzIwKSkge1xuICAgICAgcmV0dXJuIGxvb2thaGVhZF8zMjAuaW5uZXIoKTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzIwLCBcImV4cGVjdGluZyBwYXJlbnNcIik7XG4gIH1cbiAgbWF0Y2hDdXJsaWVzKCkge1xuICAgIGxldCBsb29rYWhlYWRfMzIxID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzMyMSkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWRfMzIxLmlubmVyKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMyMSwgXCJleHBlY3RpbmcgY3VybHkgYnJhY2VzXCIpO1xuICB9XG4gIG1hdGNoU3F1YXJlcygpIHtcbiAgICBsZXQgbG9va2FoZWFkXzMyMiA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzQnJhY2tldHMobG9va2FoZWFkXzMyMikpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWRfMzIyLmlubmVyKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMyMiwgXCJleHBlY3Rpbmcgc3FhdXJlIGJyYWNlc1wiKTtcbiAgfVxuICBtYXRjaFVuYXJ5T3BlcmF0b3IoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMjMgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAoaXNVbmFyeU9wZXJhdG9yKGxvb2thaGVhZF8zMjMpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMyMztcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzIzLCBcImV4cGVjdGluZyBhIHVuYXJ5IG9wZXJhdG9yXCIpO1xuICB9XG4gIG1hdGNoUHVuY3R1YXRvcih2YWxfMzI0KSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMjUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzMyNSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsXzMyNCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAobG9va2FoZWFkXzMyNS52YWwoKSA9PT0gdmFsXzMyNCkge1xuICAgICAgICAgIHJldHVybiBsb29rYWhlYWRfMzI1O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMyNSwgXCJleHBlY3RpbmcgYSBcIiArIHZhbF8zMjQgKyBcIiBwdW5jdHVhdG9yXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMyNTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzI1LCBcImV4cGVjdGluZyBhIHB1bmN0dWF0b3JcIik7XG4gIH1cbiAgY3JlYXRlRXJyb3Ioc3R4XzMyNiwgbWVzc2FnZV8zMjcpIHtcbiAgICBsZXQgY3R4XzMyOCA9IFwiXCI7XG4gICAgbGV0IG9mZmVuZGluZ18zMjkgPSBzdHhfMzI2O1xuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgIGN0eF8zMjggPSB0aGlzLnJlc3Quc2xpY2UoMCwgMjApLm1hcCh0ZXJtXzMzMCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKHRlcm1fMzMwKSkge1xuICAgICAgICAgIHJldHVybiB0ZXJtXzMzMC5pbm5lcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMaXN0Lm9mKHRlcm1fMzMwKTtcbiAgICAgIH0pLmZsYXR0ZW4oKS5tYXAoc18zMzEgPT4ge1xuICAgICAgICBpZiAoc18zMzEgPT09IG9mZmVuZGluZ18zMjkpIHtcbiAgICAgICAgICByZXR1cm4gXCJfX1wiICsgc18zMzEudmFsKCkgKyBcIl9fXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNfMzMxLnZhbCgpO1xuICAgICAgfSkuam9pbihcIiBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eF8zMjggPSBvZmZlbmRpbmdfMzI5LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IobWVzc2FnZV8zMjcgKyBcIlxcblwiICsgY3R4XzMyOCk7XG4gIH1cbn1cbmV4cG9ydCB7RW5mb3Jlc3Rlcl80NiBhcyBFbmZvcmVzdGVyfSJdfQ== + } -/***/ }, -/* 52 */ -/***/ function(module, exports) { + this.eatDecimalLiteralSuffix(); - "use strict"; + if (this.index !== this.source.length && (0, _utils.isIdentifierStart)(this.source.charCodeAt(this.index))) { + throw this.createILLEGAL(); + } - Object.defineProperty(exports, "__esModule", { - value: true - }); - const unaryOperators_558 = { "+": true, "-": true, "!": true, "~": true, "++": true, "--": true, typeof: true, void: true, delete: true }; - const binaryOperatorPrecedence_559 = { "*": 13, "/": 13, "%": 13, "+": 12, "-": 12, ">>": 11, "<<": 11, ">>>": 11, "<": 10, "<=": 10, ">": 10, ">=": 10, in: 10, instanceof: 10, "==": 9, "!=": 9, "===": 9, "!==": 9, "&": 8, "^": 7, "|": 6, "&&": 5, "||": 4 }; - var operatorAssoc_560 = { "*": "left", "/": "left", "%": "left", "+": "left", "-": "left", ">>": "left", "<<": "left", ">>>": "left", "<": "left", "<=": "left", ">": "left", ">=": "left", in: "left", instanceof: "left", "==": "left", "!=": "left", "===": "left", "!==": "left", "&": "left", "^": "left", "|": "left", "&&": "left", "||": "left" }; - function operatorLt_561(left_566, right_567, assoc_568) { - if (assoc_568 === "left") { - return left_566 < right_567; - } else { - return left_566 <= right_567; - } - } - function getOperatorPrec_562(op_569) { - return binaryOperatorPrecedence_559[op_569]; - } - function getOperatorAssoc_563(op_570) { - return operatorAssoc_560[op_570]; - } - function isUnaryOperator_564(op_571) { - return (op_571.match("punctuator") || op_571.match("identifier") || op_571.match("keyword")) && unaryOperators_558.hasOwnProperty(op_571.val()); - } - function isOperator_565(op_572) { - if (op_572.match("punctuator") || op_572.match("identifier") || op_572.match("keyword")) { - return binaryOperatorPrecedence_559.hasOwnProperty(op_572) || unaryOperators_558.hasOwnProperty(op_572.val()); - } - return false; - } - exports.operatorLt = operatorLt_561; - exports.getOperatorPrec = getOperatorPrec_562; - exports.getOperatorAssoc = getOperatorAssoc_563; - exports.isUnaryOperator = isUnaryOperator_564; - exports.isOperator = isOperator_565; - //# sourceMappingURL=data:application/json;base64,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QixjO1FBQ3VCLGUsR0FBdkIsbUI7UUFDd0IsZ0IsR0FBeEIsb0I7UUFDdUIsZSxHQUF2QixtQjtRQUNrQixVLEdBQWxCLGMiLCJmaWxlIjoib3BlcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdW5hcnlPcGVyYXRvcnNfNTU4ID0ge1wiK1wiOiB0cnVlLCBcIi1cIjogdHJ1ZSwgXCIhXCI6IHRydWUsIFwiflwiOiB0cnVlLCBcIisrXCI6IHRydWUsIFwiLS1cIjogdHJ1ZSwgdHlwZW9mOiB0cnVlLCB2b2lkOiB0cnVlLCBkZWxldGU6IHRydWV9O1xuY29uc3QgYmluYXJ5T3BlcmF0b3JQcmVjZWRlbmNlXzU1OSA9IHtcIipcIjogMTMsIFwiL1wiOiAxMywgXCIlXCI6IDEzLCBcIitcIjogMTIsIFwiLVwiOiAxMiwgXCI+PlwiOiAxMSwgXCI8PFwiOiAxMSwgXCI+Pj5cIjogMTEsIFwiPFwiOiAxMCwgXCI8PVwiOiAxMCwgXCI+XCI6IDEwLCBcIj49XCI6IDEwLCBpbjogMTAsIGluc3RhbmNlb2Y6IDEwLCBcIj09XCI6IDksIFwiIT1cIjogOSwgXCI9PT1cIjogOSwgXCIhPT1cIjogOSwgXCImXCI6IDgsIFwiXlwiOiA3LCBcInxcIjogNiwgXCImJlwiOiA1LCBcInx8XCI6IDR9O1xudmFyIG9wZXJhdG9yQXNzb2NfNTYwID0ge1wiKlwiOiBcImxlZnRcIiwgXCIvXCI6IFwibGVmdFwiLCBcIiVcIjogXCJsZWZ0XCIsIFwiK1wiOiBcImxlZnRcIiwgXCItXCI6IFwibGVmdFwiLCBcIj4+XCI6IFwibGVmdFwiLCBcIjw8XCI6IFwibGVmdFwiLCBcIj4+PlwiOiBcImxlZnRcIiwgXCI8XCI6IFwibGVmdFwiLCBcIjw9XCI6IFwibGVmdFwiLCBcIj5cIjogXCJsZWZ0XCIsIFwiPj1cIjogXCJsZWZ0XCIsIGluOiBcImxlZnRcIiwgaW5zdGFuY2VvZjogXCJsZWZ0XCIsIFwiPT1cIjogXCJsZWZ0XCIsIFwiIT1cIjogXCJsZWZ0XCIsIFwiPT09XCI6IFwibGVmdFwiLCBcIiE9PVwiOiBcImxlZnRcIiwgXCImXCI6IFwibGVmdFwiLCBcIl5cIjogXCJsZWZ0XCIsIFwifFwiOiBcImxlZnRcIiwgXCImJlwiOiBcImxlZnRcIiwgXCJ8fFwiOiBcImxlZnRcIn07XG5mdW5jdGlvbiBvcGVyYXRvckx0XzU2MShsZWZ0XzU2NiwgcmlnaHRfNTY3LCBhc3NvY181NjgpIHtcbiAgaWYgKGFzc29jXzU2OCA9PT0gXCJsZWZ0XCIpIHtcbiAgICByZXR1cm4gbGVmdF81NjYgPCByaWdodF81Njc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxlZnRfNTY2IDw9IHJpZ2h0XzU2NztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0T3BlcmF0b3JQcmVjXzU2MihvcF81NjkpIHtcbiAgcmV0dXJuIGJpbmFyeU9wZXJhdG9yUHJlY2VkZW5jZV81NTlbb3BfNTY5XTtcbn1cbmZ1bmN0aW9uIGdldE9wZXJhdG9yQXNzb2NfNTYzKG9wXzU3MCkge1xuICByZXR1cm4gb3BlcmF0b3JBc3NvY181NjBbb3BfNTcwXTtcbn1cbmZ1bmN0aW9uIGlzVW5hcnlPcGVyYXRvcl81NjQob3BfNTcxKSB7XG4gIHJldHVybiAob3BfNTcxLm1hdGNoKFwicHVuY3R1YXRvclwiKSB8fCBvcF81NzEubWF0Y2goXCJpZGVudGlmaWVyXCIpIHx8IG9wXzU3MS5tYXRjaChcImtleXdvcmRcIikpICYmIHVuYXJ5T3BlcmF0b3JzXzU1OC5oYXNPd25Qcm9wZXJ0eShvcF81NzEudmFsKCkpO1xufVxuZnVuY3Rpb24gaXNPcGVyYXRvcl81NjUob3BfNTcyKSB7XG4gIGlmIChvcF81NzIubWF0Y2goXCJwdW5jdHVhdG9yXCIpIHx8IG9wXzU3Mi5tYXRjaChcImlkZW50aWZpZXJcIikgfHwgb3BfNTcyLm1hdGNoKFwia2V5d29yZFwiKSkge1xuICAgIHJldHVybiBiaW5hcnlPcGVyYXRvclByZWNlZGVuY2VfNTU5Lmhhc093blByb3BlcnR5KG9wXzU3MikgfHwgdW5hcnlPcGVyYXRvcnNfNTU4Lmhhc093blByb3BlcnR5KG9wXzU3Mi52YWwoKSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IHtvcGVyYXRvckx0XzU2MSBhcyBvcGVyYXRvckx0fTtcbmV4cG9ydCB7Z2V0T3BlcmF0b3JQcmVjXzU2MiBhcyBnZXRPcGVyYXRvclByZWN9O1xuZXhwb3J0IHtnZXRPcGVyYXRvckFzc29jXzU2MyBhcyBnZXRPcGVyYXRvckFzc29jfTtcbmV4cG9ydCB7aXNVbmFyeU9wZXJhdG9yXzU2NCBhcyBpc1VuYXJ5T3BlcmF0b3J9O1xuZXhwb3J0IHtpc09wZXJhdG9yXzU2NSBhcyBpc09wZXJhdG9yfSJdfQ== + var slice = this.getSlice(start, startLocation); + return { + type: TokenType.NUMBER, + value: +slice.text, + slice: slice, + octal: false, + noctal: false + }; + } + }, { + key: "eatDecimalLiteralSuffix", + value: function eatDecimalLiteralSuffix() { + var ch = this.source.charAt(this.index); + if (ch === ".") { + this.index++; + if (this.index === this.source.length) { + return; + } -/***/ }, -/* 53 */ -/***/ function(module, exports, __webpack_require__) { + ch = this.source.charAt(this.index); + while ("0" <= ch && ch <= "9") { + this.index++; + if (this.index === this.source.length) { + return; + } + ch = this.source.charAt(this.index); + } + } - "use strict"; + // EOF not reached here + if (ch === "e" || ch === "E") { + this.index++; + if (this.index === this.source.length) { + throw this.createILLEGAL(); + } - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.evalCompiletimeValue = exports.evalRuntimeValues = exports.sanitizeReplacementValues = undefined; + ch = this.source.charAt(this.index); + if (ch === "+" || ch === "-") { + this.index++; + if (this.index === this.source.length) { + throw this.createILLEGAL(); + } + ch = this.source.charAt(this.index); + } - var _termExpander = __webpack_require__(54); + if ("0" <= ch && ch <= "9") { + while ("0" <= ch && ch <= "9") { + this.index++; + if (this.index === this.source.length) { + break; + } + ch = this.source.charAt(this.index); + } + } else { + throw this.createILLEGAL(); + } + } + } + }, { + key: "scanStringEscape", + value: function scanStringEscape(str, octal) { + this.index++; + if (this.index === this.source.length) { + throw this.createILLEGAL(); + } + var ch = this.source.charAt(this.index); + if (!(0, _utils.isLineTerminator)(ch.charCodeAt(0))) { + switch (ch) { + case "n": + str += "\n"; + this.index++; + break; + case "r": + str += "\r"; + this.index++; + break; + case "t": + str += "\t"; + this.index++; + break; + case "u": + case "x": + var unescaped = void 0; + this.index++; + if (this.index >= this.source.length) { + throw this.createILLEGAL(); + } + unescaped = ch === "u" ? this.scanUnicode() : this.scanHexEscape2(); + if (unescaped < 0) { + throw this.createILLEGAL(); + } + str += fromCodePoint(unescaped); + break; + case "b": + str += "\b"; + this.index++; + break; + case "f": + str += "\f"; + this.index++; + break; + case "v": + str += "\u000b"; + this.index++; + break; + default: + if ("0" <= ch && ch <= "7") { + var octalStart = this.index; + var octLen = 1; + // 3 digits are only allowed when string starts + // with 0, 1, 2, 3 + if ("0" <= ch && ch <= "3") { + octLen = 0; + } + var code = 0; + while (octLen < 3 && "0" <= ch && ch <= "7") { + this.index++; + if (octLen > 0 || ch !== "0") { + octal = this.source.slice(octalStart, this.index); + } + code *= 8; + code += ch - "0"; + octLen++; + if (this.index === this.source.length) { + throw this.createILLEGAL(); + } + ch = this.source.charAt(this.index); + } + str += String.fromCharCode(code); + } else if (ch === "8" || ch === "9") { + throw this.createILLEGAL(); + } else { + str += ch; + this.index++; + } + } + } else { + this.index++; + if (ch === "\r" && this.source.charAt(this.index) === "\n") { + this.index++; + } + this.lineStart = this.index; + this.line++; + } + return [str, octal]; + } + // 7.8.4 String Literals - var _termExpander2 = _interopRequireDefault(_termExpander); + }, { + key: "scanStringLiteral", + value: function scanStringLiteral() { + var str = ""; - var _immutable = __webpack_require__(11); + var quote = this.source.charAt(this.index); + // assert((quote === "\"" || quote === """), "String literal must starts with a quote") - var _parseReducer = __webpack_require__(37); + var startLocation = this.getLocation(); + var start = this.index; + this.index++; - var _parseReducer2 = _interopRequireDefault(_parseReducer); + var octal = null; + while (this.index < this.source.length) { + var ch = this.source.charAt(this.index); + if (ch === quote) { + this.index++; + return { type: TokenType.STRING, slice: this.getSlice(start, startLocation), str: str, octal: octal }; + } else if (ch === "\\") { + var _scanStringEscape = this.scanStringEscape(str, octal); - var _shiftReducer = __webpack_require__(33); + var _scanStringEscape2 = _slicedToArray(_scanStringEscape, 2); - var _shiftReducer2 = _interopRequireDefault(_shiftReducer); + str = _scanStringEscape2[0]; + octal = _scanStringEscape2[1]; + } else if ((0, _utils.isLineTerminator)(ch.charCodeAt(0))) { + throw this.createILLEGAL(); + } else { + str += ch; + this.index++; + } + } - var _serializer = __webpack_require__(57); + throw this.createILLEGAL(); + } + }, { + key: "scanTemplateElement", + value: function scanTemplateElement() { + var startLocation = this.getLocation(); + var start = this.index; + this.index++; + while (this.index < this.source.length) { + var ch = this.source.charCodeAt(this.index); + switch (ch) { + case 0x60: + // ` + this.index++; + return { type: TokenType.TEMPLATE, tail: true, slice: this.getSlice(start, startLocation) }; + case 0x24: + // $ + if (this.source.charCodeAt(this.index + 1) === 0x7B) { + // { + this.index += 2; + return { type: TokenType.TEMPLATE, tail: false, slice: this.getSlice(start, startLocation) }; + } + this.index++; + break; + case 0x5C: + // \\ + { + var octal = this.scanStringEscape("", null)[1]; + if (octal != null) { + throw this.createILLEGAL(); + } + break; + } + default: + this.index++; + } + } - var _syntax = __webpack_require__(12); + throw this.createILLEGAL(); + } + }, { + key: "scanRegExp", + value: function scanRegExp(str) { + var startLocation = this.getLocation(); + var start = this.index; - var _syntax2 = _interopRequireDefault(_syntax); + var terminated = false; + var classMarker = false; + while (this.index < this.source.length) { + var ch = this.source.charAt(this.index); + if (ch === "\\") { + str += ch; + this.index++; + ch = this.source.charAt(this.index); + // ECMA-262 7.8.5 + if ((0, _utils.isLineTerminator)(ch.charCodeAt(0))) { + throw this.createError(_errors.ErrorMessages.UNTERMINATED_REGEXP); + } + str += ch; + this.index++; + } else if ((0, _utils.isLineTerminator)(ch.charCodeAt(0))) { + throw this.createError(_errors.ErrorMessages.UNTERMINATED_REGEXP); + } else { + if (classMarker) { + if (ch === "]") { + classMarker = false; + } + } else { + if (ch === "/") { + terminated = true; + str += ch; + this.index++; + break; + } else if (ch === "[") { + classMarker = true; + } + } + str += ch; + this.index++; + } + } - var _shiftCodegen = __webpack_require__(38); + if (!terminated) { + throw this.createError(_errors.ErrorMessages.UNTERMINATED_REGEXP); + } - var _shiftCodegen2 = _interopRequireDefault(_shiftCodegen); + while (this.index < this.source.length) { + var _ch3 = this.source.charAt(this.index); + if (_ch3 === "\\") { + throw this.createError(_errors.ErrorMessages.INVALID_REGEXP_FLAGS); + } + if (!(0, _utils.isIdentifierPart)(_ch3.charCodeAt(0))) { + break; + } + this.index++; + str += _ch3; + } + return { type: TokenType.REGEXP, value: str, slice: this.getSlice(start, startLocation) }; + } + }, { + key: "advance", + value: function advance() { + var startLocation = this.getLocation(); - var _transforms = __webpack_require__(32); + this.lastIndex = this.index; + this.lastLine = this.line; + this.lastLineStart = this.lineStart; - var _terms = __webpack_require__(28); + this.skipComment(); - var _terms2 = _interopRequireDefault(_terms); + this.startIndex = this.index; + this.startLine = this.line; + this.startLineStart = this.lineStart; - var _shiftReader = __webpack_require__(3); + if (this.lastIndex === 0) { + this.lastIndex = this.index; + this.lastLine = this.line; + this.lastLineStart = this.lineStart; + } - var _shiftReader2 = _interopRequireDefault(_shiftReader); + if (this.index >= this.source.length) { + return { type: TokenType.EOS, slice: this.getSlice(this.index, startLocation) }; + } - var _macroContext = __webpack_require__(65); + var charCode = this.source.charCodeAt(this.index); - var _templateProcessor = __webpack_require__(63); + if (charCode < 0x80) { + if (PUNCTUATOR_START[charCode]) { + return this.scanPunctuator(); + } - var _vm = __webpack_require__(48); + if ((0, _utils.isIdentifierStart)(charCode) || charCode === 0x5C /* backslash (\) */) { + return this.scanIdentifier(); + } - var _vm2 = _interopRequireDefault(_vm); + // Dot (.) U+002E can also start a floating-point number, hence the need + // to check the next character. + if (charCode === 0x2E) { + if (this.index + 1 < this.source.length && (0, _utils.isDecimalDigit)(this.source.charCodeAt(this.index + 1))) { + return this.scanNumericLiteral(); + } + return this.scanPunctuator(); + } - var _ramda = __webpack_require__(27); + // String literal starts with single quote (U+0027) or double quote (U+0022). + if (charCode === 0x27 || charCode === 0x22) { + return this.scanStringLiteral(); + } - var _ = _interopRequireWildcard(_ramda); + // Template literal starts with back quote (U+0060) + if (charCode === 0x60) { + return this.scanTemplateElement(); + } - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + if (0x30 /* "0" */ <= charCode && charCode <= 0x39 /* "9" */) { + return this.scanNumericLiteral(); + } - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + // Slash (/) U+002F can also start a regex. + throw this.createILLEGAL(); + } else { + if ((0, _utils.isIdentifierStart)(charCode) || 0xD800 <= charCode && charCode <= 0xDBFF) { + return this.scanIdentifier(); + } - let geval_361 = eval; - function sanitizeReplacementValues_362(values_365) { - if (Array.isArray(values_365)) { - return sanitizeReplacementValues_362((0, _immutable.List)(values_365)); - } else if (_immutable.List.isList(values_365)) { - return values_365.map(sanitizeReplacementValues_362); - } else if (values_365 == null) { - throw new Error("replacement values for syntax template must not be null or undefined"); - } else if (typeof values_365.next === "function") { - return sanitizeReplacementValues_362((0, _immutable.List)(values_365)); - } - return (0, _macroContext.unwrap)(values_365); - } - function evalRuntimeValues_363(terms_366, context_367) { - let prepped_368 = terms_366.reduce((acc_374, term_375) => { - let result_376 = (0, _immutable.List)(); - if ((0, _terms.isExport)(term_375)) { - if ((0, _terms.isVariableDeclaration)(term_375.declaration)) { - return acc_374.concat(new _terms2.default("VariableDeclarationStatement", { declaration: term_375.declaration })).concat(term_375.declaration.declarators.map(decl_377 => { - return new _terms2.default("ExpressionStatement", { expression: new _terms2.default("AssignmentExpression", { binding: new _terms2.default("StaticMemberExpression", { object: new _terms2.default("IdentifierExpression", { name: _syntax2.default.fromIdentifier("exports") }), property: decl_377.binding.name }), expression: new _terms2.default("IdentifierExpression", { name: decl_377.binding.name }) }) }); - })); + throw this.createILLEGAL(); } - } else if ((0, _terms.isImport)(term_375)) { - return acc_374; } - return acc_374.concat(term_375); - }, (0, _immutable.List)()); - let parsed_369 = (0, _shiftReducer2.default)(new _parseReducer2.default(context_367, false), new _terms2.default("Module", { directives: (0, _immutable.List)(), items: prepped_368 }).gen({ includeImports: false })); - let gen_370 = (0, _shiftCodegen2.default)(parsed_369, new _shiftCodegen.FormattedCodeGen()); - let result_371 = context_367.transform(gen_370, { babelrc: true, filename: context_367.filename }); - let exportsObj_372 = {}; - context_367.store.set("exports", exportsObj_372); - let val_373 = _vm2.default.runInContext(result_371.code, context_367.store.getNodeContext()); - return exportsObj_372; - } - function evalCompiletimeValue_364(expr_378, context_379) { - let deserializer_380 = (0, _serializer.makeDeserializer)(context_379.bindings); - let sandbox_381 = { syntaxQuote: function syntaxQuote(strings_389) { - for (var _len = arguments.length, values_388 = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - values_388[_key - 1] = arguments[_key]; - } - - let ctx_390 = deserializer_380.read(_.last(values_388)); - let reader_391 = new _shiftReader2.default(strings_389, ctx_390, _.take(values_388.length - 1, values_388)); - return reader_391.read(); - }, syntaxTemplate: function syntaxTemplate(str_393) { - for (var _len2 = arguments.length, values_392 = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - values_392[_key2 - 1] = arguments[_key2]; - } - - return (0, _templateProcessor.replaceTemplate)(deserializer_380.read(str_393), sanitizeReplacementValues_362(values_392)); - } }; - let sandboxKeys_382 = (0, _immutable.List)(Object.keys(sandbox_381)); - let sandboxVals_383 = sandboxKeys_382.map(k_394 => sandbox_381[k_394]).toArray(); - let parsed_384 = (0, _shiftReducer2.default)(new _parseReducer2.default(context_379), new _terms2.default("Module", { directives: (0, _immutable.List)(), items: _immutable.List.of(new _terms2.default("ExpressionStatement", { expression: new _terms2.default("FunctionExpression", { isGenerator: false, name: null, params: new _terms2.default("FormalParameters", { items: sandboxKeys_382.map(param_395 => { - return new _terms2.default("BindingIdentifier", { name: _syntax2.default.from("identifier", param_395) }); - }), rest: null }), body: new _terms2.default("FunctionBody", { directives: _immutable.List.of(new _terms2.default("Directive", { rawValue: "use strict" })), statements: _immutable.List.of(new _terms2.default("ReturnStatement", { expression: expr_378 })) }) }) })) })); - let gen_385 = (0, _shiftCodegen2.default)(parsed_384, new _shiftCodegen.FormattedCodeGen()); - let result_386 = context_379.transform(gen_385, { babelrc: true, filename: context_379.filename }); - let val_387 = _vm2.default.runInContext(result_386.code, context_379.store.getNodeContext()); - return val_387.apply(undefined, sandboxVals_383); - } - exports.sanitizeReplacementValues = sanitizeReplacementValues_362; - exports.evalRuntimeValues = evalRuntimeValues_363; - exports.evalCompiletimeValue = evalCompiletimeValue_364; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2xvYWQtc3ludGF4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7O0lBQWEsQzs7Ozs7O0FBQ2IsSUFBSSxZQUFZLElBQWhCO0FBQ0EsU0FBUyw2QkFBVCxDQUF1QyxVQUF2QyxFQUFtRDtBQUNqRCxNQUFJLE1BQU0sT0FBTixDQUFjLFVBQWQsQ0FBSixFQUErQjtBQUM3QixXQUFPLDhCQUE4QixxQkFBSyxVQUFMLENBQTlCLENBQVA7QUFDRCxHQUZELE1BRU8sSUFBSSxnQkFBSyxNQUFMLENBQVksVUFBWixDQUFKLEVBQTZCO0FBQ2xDLFdBQU8sV0FBVyxHQUFYLENBQWUsNkJBQWYsQ0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDN0IsVUFBTSxJQUFJLEtBQUosQ0FBVSxzRUFBVixDQUFOO0FBQ0QsR0FGTSxNQUVBLElBQUksT0FBTyxXQUFXLElBQWxCLEtBQTJCLFVBQS9CLEVBQTJDO0FBQ2hELFdBQU8sOEJBQThCLHFCQUFLLFVBQUwsQ0FBOUIsQ0FBUDtBQUNEO0FBQ0QsU0FBTywwQkFBTyxVQUFQLENBQVA7QUFDRDtBQUNELFNBQVMscUJBQVQsQ0FBK0IsU0FBL0IsRUFBMEMsV0FBMUMsRUFBdUQ7QUFDckQsTUFBSSxjQUFjLFVBQVUsTUFBVixDQUFpQixDQUFDLE9BQUQsRUFBVSxRQUFWLEtBQXVCO0FBQ3hELFFBQUksYUFBYSxzQkFBakI7QUFDQSxRQUFJLHFCQUFTLFFBQVQsQ0FBSixFQUF3QjtBQUN0QixVQUFJLGtDQUFzQixTQUFTLFdBQS9CLENBQUosRUFBaUQ7QUFDL0MsZUFBTyxRQUFRLE1BQVIsQ0FBZSxvQkFBUyw4QkFBVCxFQUF5QyxFQUFDLGFBQWEsU0FBUyxXQUF2QixFQUF6QyxDQUFmLEVB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QixFQUFDLGFBQWEsS0FBZCxFQUFxQixNQUFNLElBQTNCLEVBQWlDLFFBQVEsb0JBQVMsa0JBQVQsRUFBNkIsRUFBQyxPQUFPLGdCQUFnQixHQUFoQixDQUFvQixhQUFhO0FBQ3hTLG1CQUFPLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsTUFBTSxpQkFBTyxJQUFQLENBQVksWUFBWixFQUEwQixTQUExQixDQUFQLEVBQTlCLENBQVA7QUFDRCxXQUZ3USxDQUFSLEVBRTdQLE1BQU0sSUFGdVAsRUFBN0IsQ0FBekMsRUFFekssTUFBTSxvQkFBUyxjQUFULEVBQXlCLEVBQUMsWUFBWSxnQkFBSyxFQUFMLENBQVEsb0JBQVMsV0FBVCxFQUFzQixFQUFDLFVBQVUsWUFBWCxFQUF0QixDQUFSLENBQWIsRUFBdUUsWUFBWSxnQkFBSyxFQUFMLENBQVEsb0JBQVMsaUJBQVQsRUFBNEIsRUFBQyxZQUFZLFFBQWIsRUFBNUIsQ0FBUixDQUFuRixFQUF6QixDQUZtSyxFQUEvQixDQUFiLEVBQWhDLENBQVIsQ0FBNUIsRUFBbkIsQ0FBdkMsQ0FBakI7QUFHQSxNQUFJLFVBQVUsNEJBQVEsVUFBUixFQUFvQixvQ0FBcEIsQ0FBZDtBQUNBLE1BQUksYUFBYSxZQUFZLFNBQVosQ0FBc0IsT0FBdEIsRUFBK0IsRUFBQyxTQUFTLElBQVYsRUFBZ0IsVUFBVSxZQUFZLFFBQXRDLEVBQS9CLENBQWpCO0FBQ0EsTUFBSSxVQUFVLGFBQUcsWUFBSCxDQUFnQixXQUFXLElBQTNCLEVBQWlDLFlBQVksS0FBWixDQUFrQixjQUFsQixFQUFqQyxDQUFkO0FBQ0EsU0FBTyxRQUFRLEtBQVIsQ0FBYyxTQUFkLEVBQXlCLGVBQXpCLENBQVA7QUFDRDtRQUN3Qyx5QixHQUFqQyw2QjtRQUN5QixpQixHQUF6QixxQjtRQUM0QixvQixHQUE1Qix3QiIsImZpbGUiOiJsb2FkLXN5bnRheC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlclwiO1xuaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgUGFyc2VSZWR1Y2VyIGZyb20gXCIuL3BhcnNlLXJlZHVjZXIuanNcIjtcbmltcG9ydCByZWR1Y2VyLCB7TW9ub2lkYWxSZWR1Y2VyfSBmcm9tIFwic2hpZnQtcmVkdWNlclwiO1xuaW1wb3J0IHttYWtlRGVzZXJpYWxpemVyfSBmcm9tIFwiLi9zZXJpYWxpemVyXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IGNvZGVnZW4sIHtGb3JtYXR0ZWRDb2RlR2VufSBmcm9tIFwic2hpZnQtY29kZWdlblwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IFRlcm0sIHtpc0VPRiwgaXNCaW5kaW5nSWRlbnRpZmllciwgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLCBpc0Z1bmN0aW9uRXhwcmVzc2lvbiwgaXNGdW5jdGlvblRlcm0sIGlzRnVuY3Rpb25XaXRoTmFtZSwgaXNTeW50YXhEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uLCBpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQsIGlzSW1wb3J0LCBpc0V4cG9ydH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCBSZWFkZXIgZnJvbSBcIi4vc2hpZnQtcmVhZGVyXCI7XG5pbXBvcnQge3Vud3JhcH0gZnJvbSBcIi4vbWFjcm8tY29udGV4dFwiO1xuaW1wb3J0IHtyZXBsYWNlVGVtcGxhdGV9IGZyb20gXCIuL3RlbXBsYXRlLXByb2Nlc3NvclwiO1xuaW1wb3J0IHZtIGZyb20gXCJ2bVwiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5sZXQgZ2V2YWxfMzYxID0gZXZhbDtcbmZ1bmN0aW9uIHNhbml0aXplUmVwbGFjZW1lbnRWYWx1ZXNfMzYyKHZhbHVlc18zNjUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzXzM2NSkpIHtcbiAgICByZXR1cm4gc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIoTGlzdCh2YWx1ZXNfMzY1KSk7XG4gIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodmFsdWVzXzM2NSkpIHtcbiAgICByZXR1cm4gdmFsdWVzXzM2NS5tYXAoc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIpO1xuICB9IGVsc2UgaWYgKHZhbHVlc18zNjUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInJlcGxhY2VtZW50IHZhbHVlcyBmb3Igc3ludGF4IHRlbXBsYXRlIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXNfMzY1Lm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzXzM2MihMaXN0KHZhbHVlc18zNjUpKTtcbiAgfVxuICByZXR1cm4gdW53cmFwKHZhbHVlc18zNjUpO1xufVxuZnVuY3Rpb24gZXZhbFJ1bnRpbWVWYWx1ZXNfMzYzKHRlcm1zXzM2NiwgY29udGV4dF8zNjcpIHtcbiAgbGV0IHByZXBwZWRfMzY4ID0gdGVybXNfMzY2LnJlZHVjZSgoYWNjXzM3NCwgdGVybV8zNzUpID0+IHtcbiAgICBsZXQgcmVzdWx0XzM3NiA9IExpc3QoKTtcbiAgICBpZiAoaXNFeHBvcnQodGVybV8zNzUpKSB7XG4gICAgICBpZiAoaXNWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm1fMzc1LmRlY2xhcmF0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWNjXzM3NC5jb25jYXQobmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XCIsIHtkZWNsYXJhdGlvbjogdGVybV8zNzUuZGVjbGFyYXRpb259KSkuY29uY2F0KHRlcm1fMzc1LmRlY2xhcmF0aW9uLmRlY2xhcmF0b3JzLm1hcChkZWNsXzM3NyA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogbmV3IFRlcm0oXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7YmluZGluZzogbmV3IFRlcm0oXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCIsIHtvYmplY3Q6IG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge25hbWU6IFN5bnRheC5mcm9tSWRlbnRpZmllcihcImV4cG9ydHNcIil9KSwgcHJvcGVydHk6IGRlY2xfMzc3LmJpbmRpbmcubmFtZX0pLCBleHByZXNzaW9uOiBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiBkZWNsXzM3Ny5iaW5kaW5nLm5hbWV9KX0pfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzSW1wb3J0KHRlcm1fMzc1KSkge1xuICAgICAgcmV0dXJuIGFjY18zNzQ7XG4gICAgfVxuICAgIHJldHVybiBhY2NfMzc0LmNvbmNhdCh0ZXJtXzM3NSk7XG4gIH0sIExpc3QoKSk7XG4gIGxldCBwYXJzZWRfMzY5ID0gcmVkdWNlcihuZXcgUGFyc2VSZWR1Y2VyKGNvbnRleHRfMzY3LCBmYWxzZSksIG5ldyBUZXJtKFwiTW9kdWxlXCIsIHtkaXJlY3RpdmVzOiBMaXN0KCksIGl0ZW1zOiBwcmVwcGVkXzM2OH0pLmdlbih7aW5jbHVkZUltcG9ydHM6IGZhbHNlfSkpO1xuICBsZXQgZ2VuXzM3MCA9IGNvZGVnZW4ocGFyc2VkXzM2OSwgbmV3IEZvcm1hdHRlZENvZGVHZW4pO1xuICBsZXQgcmVzdWx0XzM3MSA9IGNvbnRleHRfMzY3LnRyYW5zZm9ybShnZW5fMzcwLCB7YmFiZWxyYzogdHJ1ZSwgZmlsZW5hbWU6IGNvbnRleHRfMzY3LmZpbGVuYW1lfSk7XG4gIGxldCBleHBvcnRzT2JqXzM3MiA9IHt9O1xuICBjb250ZXh0XzM2Ny5zdG9yZS5zZXQoXCJleHBvcnRzXCIsIGV4cG9ydHNPYmpfMzcyKTtcbiAgbGV0IHZhbF8zNzMgPSB2bS5ydW5JbkNvbnRleHQocmVzdWx0XzM3MS5jb2RlLCBjb250ZXh0XzM2Ny5zdG9yZS5nZXROb2RlQ29udGV4dCgpKTtcbiAgcmV0dXJuIGV4cG9ydHNPYmpfMzcyO1xufVxuZnVuY3Rpb24gZXZhbENvbXBpbGV0aW1lVmFsdWVfMzY0KGV4cHJfMzc4LCBjb250ZXh0XzM3OSkge1xuICBsZXQgZGVzZXJpYWxpemVyXzM4MCA9IG1ha2VEZXNlcmlhbGl6ZXIoY29udGV4dF8zNzkuYmluZGluZ3MpO1xuICBsZXQgc2FuZGJveF8zODEgPSB7c3ludGF4UXVvdGU6IGZ1bmN0aW9uIChzdHJpbmdzXzM4OSwgLi4udmFsdWVzXzM4OCkge1xuICAgIGxldCBjdHhfMzkwID0gZGVzZXJpYWxpemVyXzM4MC5yZWFkKF8ubGFzdCh2YWx1ZXNfMzg4KSk7XG4gICAgbGV0IHJlYWRlcl8zOTEgPSBuZXcgUmVhZGVyKHN0cmluZ3NfMzg5LCBjdHhfMzkwLCBfLnRha2UodmFsdWVzXzM4OC5sZW5ndGggLSAxLCB2YWx1ZXNfMzg4KSk7XG4gICAgcmV0dXJuIHJlYWRlcl8zOTEucmVhZCgpO1xuICB9LCBzeW50YXhUZW1wbGF0ZTogZnVuY3Rpb24gKHN0cl8zOTMsIC4uLnZhbHVlc18zOTIpIHtcbiAgICByZXR1cm4gcmVwbGFjZVRlbXBsYXRlKGRlc2VyaWFsaXplcl8zODAucmVhZChzdHJfMzkzKSwgc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIodmFsdWVzXzM5MikpO1xuICB9fTtcbiAgbGV0IHNhbmRib3hLZXlzXzM4MiA9IExpc3QoT2JqZWN0LmtleXMoc2FuZGJveF8zODEpKTtcbiAgbGV0IHNhbmRib3hWYWxzXzM4MyA9IHNhbmRib3hLZXlzXzM4Mi5tYXAoa18zOTQgPT4gc2FuZGJveF8zODFba18zOTRdKS50b0FycmF5KCk7XG4gIGxldCBwYXJzZWRfMzg0ID0gcmVkdWNlcihuZXcgUGFyc2VSZWR1Y2VyKGNvbnRleHRfMzc5KSwgbmV3IFRlcm0oXCJNb2R1bGVcIiwge2RpcmVjdGl2ZXM6IExpc3QoKSwgaXRlbXM6IExpc3Qub2YobmV3IFRlcm0oXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsIHtleHByZXNzaW9uOiBuZXcgVGVybShcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCB7aXNHZW5lcmF0b3I6IGZhbHNlLCBuYW1lOiBudWxsLCBwYXJhbXM6IG5ldyBUZXJtKFwiRm9ybWFsUGFyYW1ldGVyc1wiLCB7aXRlbXM6IHNhbmRib3hLZXlzXzM4Mi5tYXAocGFyYW1fMzk1ID0+IHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogU3ludGF4LmZyb20oXCJpZGVudGlmaWVyXCIsIHBhcmFtXzM5NSl9KTtcbiAgfSksIHJlc3Q6IG51bGx9KSwgYm9keTogbmV3IFRlcm0oXCJGdW5jdGlvbkJvZHlcIiwge2RpcmVjdGl2ZXM6IExpc3Qub2YobmV3IFRlcm0oXCJEaXJlY3RpdmVcIiwge3Jhd1ZhbHVlOiBcInVzZSBzdHJpY3RcIn0pKSwgc3RhdGVtZW50czogTGlzdC5vZihuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogZXhwcl8zNzh9KSl9KX0pfSkpfSkpO1xuICBsZXQgZ2VuXzM4NSA9IGNvZGVnZW4ocGFyc2VkXzM4NCwgbmV3IEZvcm1hdHRlZENvZGVHZW4pO1xuICBsZXQgcmVzdWx0XzM4NiA9IGNvbnRleHRfMzc5LnRyYW5zZm9ybShnZW5fMzg1LCB7YmFiZWxyYzogdHJ1ZSwgZmlsZW5hbWU6IGNvbnRleHRfMzc5LmZpbGVuYW1lfSk7XG4gIGxldCB2YWxfMzg3ID0gdm0ucnVuSW5Db250ZXh0KHJlc3VsdF8zODYuY29kZSwgY29udGV4dF8zNzkuc3RvcmUuZ2V0Tm9kZUNvbnRleHQoKSk7XG4gIHJldHVybiB2YWxfMzg3LmFwcGx5KHVuZGVmaW5lZCwgc2FuZGJveFZhbHNfMzgzKTtcbn1cbmV4cG9ydCB7c2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIgYXMgc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc307XG5leHBvcnQge2V2YWxSdW50aW1lVmFsdWVzXzM2MyBhcyBldmFsUnVudGltZVZhbHVlc307XG5leHBvcnQge2V2YWxDb21waWxldGltZVZhbHVlXzM2NCBhcyBldmFsQ29tcGlsZXRpbWVWYWx1ZX0iXX0= + }, { + key: "eof", + value: function eof() { + return this.lookahead.type === TokenType.EOS; + } + }, { + key: "lex", + value: function lex() { + var prevToken = this.lookahead; + this.lookahead = this.advance(); + this.tokenIndex++; + return prevToken; + } + }], [{ + key: "cse2", + value: function cse2(id, ch1, ch2) { + return id.charAt(1) === ch1 && id.charAt(2) === ch2; + } + }, { + key: "cse3", + value: function cse3(id, ch1, ch2, ch3) { + return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3; + } + }, { + key: "cse4", + value: function cse4(id, ch1, ch2, ch3, ch4) { + return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4; + } + }, { + key: "cse5", + value: function cse5(id, ch1, ch2, ch3, ch4, ch5) { + return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4 && id.charAt(5) === ch5; + } + }, { + key: "cse6", + value: function cse6(id, ch1, ch2, ch3, ch4, ch5, ch6) { + return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4 && id.charAt(5) === ch5 && id.charAt(6) === ch6; + } + }, { + key: "cse7", + value: function cse7(id, ch1, ch2, ch3, ch4, ch5, ch6, ch7) { + return id.charAt(1) === ch1 && id.charAt(2) === ch2 && id.charAt(3) === ch3 && id.charAt(4) === ch4 && id.charAt(5) === ch5 && id.charAt(6) === ch6 && id.charAt(7) === ch7; + } + }]); -/***/ }, -/* 54 */ -/***/ function(module, exports, __webpack_require__) { + return Tokenizer; + }(); + + exports.default = Tokenizer; + +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); + exports.isDecimalDigit = exports.isLineTerminator = exports.isWhiteSpace = exports.isIdentifierPart = exports.isIdentifierStart = exports.isRestrictedWord = undefined; + exports.isStrictModeReservedWord = isStrictModeReservedWord; + exports.getHexValue = getHexValue; - var _immutable = __webpack_require__(11); + var _esutils = __webpack_require__(15); - var _terms = __webpack_require__(28); + var isReservedWordES6 = _esutils.keyword.isReservedWordES6; /** + * 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. + */ - var _terms2 = _interopRequireDefault(_terms); + var isRestrictedWord = _esutils.keyword.isRestrictedWord; + var isIdentifierStartES6 = _esutils.code.isIdentifierStartES6; + var isIdentifierPartES6 = _esutils.code.isIdentifierPartES6; + var isWhiteSpace = _esutils.code.isWhiteSpace; + var isLineTerminator = _esutils.code.isLineTerminator; + var isDecimalDigit = _esutils.code.isDecimalDigit; + exports.isRestrictedWord = isRestrictedWord; + exports.isIdentifierStart = isIdentifierStartES6; + exports.isIdentifierPart = isIdentifierPartES6; + exports.isWhiteSpace = isWhiteSpace; + exports.isLineTerminator = isLineTerminator; + exports.isDecimalDigit = isDecimalDigit; + function isStrictModeReservedWord(id) { + return isReservedWordES6(id, true); + } + + function getHexValue(rune) { + if ("0" <= rune && rune <= "9") { + return rune.charCodeAt(0) - 48; + } + if ("a" <= rune && rune <= "f") { + return rune.charCodeAt(0) - 87; + } + if ("A" <= rune && rune <= "F") { + return rune.charCodeAt(0) - 55; + } + return -1; + } - var _scope = __webpack_require__(44); +/***/ }, +/* 45 */ +/***/ function(module, exports) { - var _applyScopeInParamsReducer = __webpack_require__(55); + "use strict"; - var _applyScopeInParamsReducer2 = _interopRequireDefault(_applyScopeInParamsReducer); + Object.defineProperty(exports, "__esModule", { + value: true + }); + /** + * 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. + */ + + var ErrorMessages = exports.ErrorMessages = { + UNEXPECTED_TOKEN: "Unexpected token {0}", + UNEXPECTED_ILLEGAL_TOKEN: "Unexpected {0}", + UNEXPECTED_NUMBER: "Unexpected number", + UNEXPECTED_STRING: "Unexpected string", + UNEXPECTED_IDENTIFIER: "Unexpected identifier", + UNEXPECTED_RESERVED_WORD: "Unexpected reserved word", + UNEXPECTED_TEMPLATE: "Unexpected template", + UNEXPECTED_EOS: "Unexpected end of input", + UNEXPECTED_LINE_TERMINATOR: "Unexpected line terminator", + NEWLINE_AFTER_THROW: "Illegal newline after throw", + UNTERMINATED_REGEXP: "Invalid regular expression: missing /", + INVALID_REGEXP_FLAGS: "Invalid regular expression flags", + INVALID_LHS_IN_ASSIGNMENT: "Invalid left-hand side in assignment", + INVALID_LHS_IN_FOR_IN: "Invalid left-hand side in for-in", + INVALID_LHS_IN_FOR_OF: "Invalid left-hand side in for-of", + INVALID_UPDATE_OPERAND: "Increment/decrement target must be an identifier or member expression", + MULTIPLE_DEFAULTS_IN_SWITCH: "More than one default clause in switch statement", + NO_CATCH_OR_FINALLY: "Missing catch or finally after try", + ILLEGAL_RETURN: "Illegal return statement", + ILLEGAL_ARROW_FUNCTION_PARAMS: "Illegal arrow function parameter list", + INVALID_VAR_INIT_FOR_IN: "Invalid variable declaration in for-in statement", + INVALID_VAR_INIT_FOR_OF: "Invalid variable declaration in for-of statement", + ILLEGAL_PROPERTY: "Illegal property initializer" + }; - var _shiftReducer = __webpack_require__(33); +/***/ }, +/* 46 */ +/***/ function(module, exports, __webpack_require__) { - var _shiftReducer2 = _interopRequireDefault(_shiftReducer); + "use strict"; - var _compiler = __webpack_require__(56); + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.ALL_PHASES = exports.Types = undefined; - var _compiler2 = _interopRequireDefault(_compiler); + var _immutable = __webpack_require__(3); - var _syntax = __webpack_require__(12); + var _errors = __webpack_require__(23); - var _syntax2 = _interopRequireDefault(_syntax); + var _bindingMap = __webpack_require__(22); - var _serializer = __webpack_require__(57); + var _bindingMap2 = _interopRequireDefault(_bindingMap); - var _enforester = __webpack_require__(51); + var _ramdaFantasy = __webpack_require__(24); - var _errors = __webpack_require__(13); + var _ramda = __webpack_require__(10); - var _templateProcessor = __webpack_require__(63); + var _ = _interopRequireWildcard(_ramda); - var _astDispatcher = __webpack_require__(64); + var _tokenizer = __webpack_require__(43); - var _astDispatcher2 = _interopRequireDefault(_astDispatcher); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - class TermExpander extends _astDispatcher2.default { - constructor(context_999) { - super("expand", true); - this.context = context_999; - } - expand(term_1000) { - return this.dispatch(term_1000); - } - expandPragma(term_1001) { - return term_1001; - } - expandTemplateExpression(term_1002) { - return new _terms2.default("TemplateExpression", { tag: term_1002.tag == null ? null : this.expand(term_1002.tag), elements: term_1002.elements.toArray() }); - } - expandBreakStatement(term_1003) { - return new _terms2.default("BreakStatement", { label: term_1003.label ? term_1003.label.val() : null }); - } - expandDoWhileStatement(term_1004) { - return new _terms2.default("DoWhileStatement", { body: this.expand(term_1004.body), test: this.expand(term_1004.test) }); - } - expandWithStatement(term_1005) { - return new _terms2.default("WithStatement", { body: this.expand(term_1005.body), object: this.expand(term_1005.object) }); - } - expandDebuggerStatement(term_1006) { - return term_1006; - } - expandContinueStatement(term_1007) { - return new _terms2.default("ContinueStatement", { label: term_1007.label ? term_1007.label.val() : null }); + function getFirstSlice(stx) { + if (!stx || typeof stx.isDelimiter !== 'function') return null; // TODO: should not have to do this + if (!stx.isDelimiter()) { + return stx.token.slice; } - expandSwitchStatementWithDefault(term_1008) { - return new _terms2.default("SwitchStatementWithDefault", { discriminant: this.expand(term_1008.discriminant), preDefaultCases: term_1008.preDefaultCases.map(c_1009 => this.expand(c_1009)).toArray(), defaultCase: this.expand(term_1008.defaultCase), postDefaultCases: term_1008.postDefaultCases.map(c_1010 => this.expand(c_1010)).toArray() }); + return stx.token.get(0).token.slice; + } + + function sizeDecending(a, b) { + if (a.scopes.size > b.scopes.size) { + return -1; + } else if (b.scopes.size > a.scopes.size) { + return 1; + } else { + return 0; } - expandComputedMemberExpression(term_1011) { - return new _terms2.default("ComputedMemberExpression", { object: this.expand(term_1011.object), expression: this.expand(term_1011.expression) }); + } + + let Types = exports.Types = { + null: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.NULL, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.NULL, + value: null + }, stx) + }, + number: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.NumericLiteral, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.NUMBER, + value: value + }, stx) + }, + string: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.StringLiteral, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.STRING, + str: value + }, stx) + }, + punctuator: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.Punctuator, + create: (value, stx) => new Syntax({ + type: { + klass: _tokenizer.TokenClass.Punctuator, + name: value + }, + value: value + }, stx) + }, + keyword: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.Keyword, + create: (value, stx) => new Syntax({ + type: { + klass: _tokenizer.TokenClass.Keyword, + name: value + }, + value: value + }, stx) + }, + identifier: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.Ident, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.IDENTIFIER, + value: value + }, stx) + }, + regularExpression: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.RegularExpression, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.REGEXP, + value: value + }, stx) + }, + braces: { + match: token => Types.delimiter.match(token) && token.get(0).token.type === _tokenizer.TokenType.LBRACE, + create: (inner, stx) => { + let left = new Syntax({ + type: _tokenizer.TokenType.LBRACE, + value: "{", + slice: getFirstSlice(stx) + }); + let right = new Syntax({ + type: _tokenizer.TokenType.RBRACE, + value: "}", + slice: getFirstSlice(stx) + }); + return new Syntax(_immutable.List.of(left).concat(inner).push(right), stx); + } + }, + brackets: { + match: token => Types.delimiter.match(token) && token.get(0).token.type === _tokenizer.TokenType.LBRACK, + create: (inner, stx) => { + let left = new Syntax({ + type: _tokenizer.TokenType.LBRACK, + value: "[", + slice: getFirstSlice(stx) + }); + let right = new Syntax({ + type: _tokenizer.TokenType.RBRACK, + value: "]", + slice: getFirstSlice(stx) + }); + return new Syntax(_immutable.List.of(left).concat(inner).push(right), stx); + } + }, + parens: { + match: token => Types.delimiter.match(token) && token.get(0).token.type === _tokenizer.TokenType.LPAREN, + create: (inner, stx) => { + let left = new Syntax({ + type: _tokenizer.TokenType.LPAREN, + value: "(", + slice: getFirstSlice(stx) + }); + let right = new Syntax({ + type: _tokenizer.TokenType.RPAREN, + value: ")", + slice: getFirstSlice(stx) + }); + return new Syntax(_immutable.List.of(left).concat(inner).push(right), stx); + } + }, + + assign: { + match: token => { + if (Types.punctuator.match(token)) { + switch (token.value) { + case "=": + case "|=": + case "^=": + case "&=": + case "<<=": + case ">>=": + case ">>>=": + case "+=": + case "-=": + case "*=": + case "/=": + case "%=": + return true; + default: + return false; + } + } + return false; + } + }, + + boolean: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.TRUE || token.type === _tokenizer.TokenType.FALSE + }, + + template: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.TEMPLATE + }, + + delimiter: { + match: token => _immutable.List.isList(token) + }, + + syntaxTemplate: { + match: token => Types.delimiter.match(token) && token.get(0).val() === '#`' + }, + + eof: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.EOS } - expandSwitchStatement(term_1012) { - return new _terms2.default("SwitchStatement", { discriminant: this.expand(term_1012.discriminant), cases: term_1012.cases.map(c_1013 => this.expand(c_1013)).toArray() }); + }; + const ALL_PHASES = exports.ALL_PHASES = {}; + + class Syntax { + + constructor(token, oldstx) { + this.token = token; + this.bindings = oldstx && oldstx.bindings != null ? oldstx.bindings : new _bindingMap2.default(); + this.scopesets = oldstx && oldstx.scopesets != null ? oldstx.scopesets : { + all: (0, _immutable.List)(), + phase: (0, _immutable.Map)() + }; + Object.freeze(this); } - expandFormalParameters(term_1014) { - let rest_1015 = term_1014.rest == null ? null : this.expand(term_1014.rest); - return new _terms2.default("FormalParameters", { items: term_1014.items.map(i_1016 => this.expand(i_1016)), rest: rest_1015 }); + // token: Token | List; + + + static of(token, stx) { + return new Syntax(token, stx); } - expandArrowExpression(term_1017) { - return this.doFunctionExpansion(term_1017, "ArrowExpression"); + + static from(type, value, stx) { + if (!Types[type]) { + throw new Error(type + " is not a valid type"); + } else if (!Types[type].create) { + throw new Error("Cannot create a syntax from type " + type); + } + let newstx = Types[type].create(value, stx); + let slice = getFirstSlice(stx); + if (slice != null) { + newstx.token.slice = slice; + } + return newstx; } - expandSwitchDefault(term_1018) { - return new _terms2.default("SwitchDefault", { consequent: term_1018.consequent.map(c_1019 => this.expand(c_1019)).toArray() }); + + from(type, value) { + return Syntax.from(type, value, this); } - expandSwitchCase(term_1020) { - return new _terms2.default("SwitchCase", { test: this.expand(term_1020.test), consequent: term_1020.consequent.map(c_1021 => this.expand(c_1021)).toArray() }); + + fromNull() { + return this.from("null", null); } - expandForInStatement(term_1022) { - return new _terms2.default("ForInStatement", { left: this.expand(term_1022.left), right: this.expand(term_1022.right), body: this.expand(term_1022.body) }); + + fromNumber(value) { + return this.from('number', value); } - expandTryCatchStatement(term_1023) { - return new _terms2.default("TryCatchStatement", { body: this.expand(term_1023.body), catchClause: this.expand(term_1023.catchClause) }); + + fromString(value) { + return this.from("string", value); } - expandTryFinallyStatement(term_1024) { - let catchClause_1025 = term_1024.catchClause == null ? null : this.expand(term_1024.catchClause); - return new _terms2.default("TryFinallyStatement", { body: this.expand(term_1024.body), catchClause: catchClause_1025, finalizer: this.expand(term_1024.finalizer) }); + + fromPunctuator(value) { + return this.from("punctuator", value); } - expandCatchClause(term_1026) { - return new _terms2.default("CatchClause", { binding: this.expand(term_1026.binding), body: this.expand(term_1026.body) }); + + fromKeyword(value) { + return this.from("keyword", value); } - expandThrowStatement(term_1027) { - return new _terms2.default("ThrowStatement", { expression: this.expand(term_1027.expression) }); + + fromIdentifier(value) { + return this.from("identifier", value); } - expandForOfStatement(term_1028) { - return new _terms2.default("ForOfStatement", { left: this.expand(term_1028.left), right: this.expand(term_1028.right), body: this.expand(term_1028.body) }); + + fromRegularExpression(value) { + return this.from("regularExpression", value); } - expandBindingIdentifier(term_1029) { - return term_1029; + + fromBraces(inner) { + return this.from("braces", inner); } - expandBindingPropertyIdentifier(term_1030) { - return term_1030; + + fromBrackets(inner) { + return this.from("brackets", inner); } - expandBindingPropertyProperty(term_1031) { - return new _terms2.default("BindingPropertyProperty", { name: this.expand(term_1031.name), binding: this.expand(term_1031.binding) }); + + fromParens(inner) { + return this.from("parens", inner); } - expandComputedPropertyName(term_1032) { - return new _terms2.default("ComputedPropertyName", { expression: this.expand(term_1032.expression) }); + + static fromNull(stx) { + return Syntax.from("null", null, stx); } - expandObjectBinding(term_1033) { - return new _terms2.default("ObjectBinding", { properties: term_1033.properties.map(t_1034 => this.expand(t_1034)).toArray() }); + + static fromNumber(value, stx) { + return Syntax.from("number", value, stx); } - expandArrayBinding(term_1035) { - let restElement_1036 = term_1035.restElement == null ? null : this.expand(term_1035.restElement); - return new _terms2.default("ArrayBinding", { elements: term_1035.elements.map(t_1037 => t_1037 == null ? null : this.expand(t_1037)).toArray(), restElement: restElement_1036 }); + + static fromString(value, stx) { + return Syntax.from("string", value, stx); } - expandBindingWithDefault(term_1038) { - return new _terms2.default("BindingWithDefault", { binding: this.expand(term_1038.binding), init: this.expand(term_1038.init) }); + + static fromPunctuator(value, stx) { + return Syntax.from("punctuator", value, stx); } - expandShorthandProperty(term_1039) { - return new _terms2.default("DataProperty", { name: new _terms2.default("StaticPropertyName", { value: term_1039.name }), expression: new _terms2.default("IdentifierExpression", { name: term_1039.name }) }); + + static fromKeyword(value, stx) { + return Syntax.from("keyword", value, stx); } - expandForStatement(term_1040) { - let init_1041 = term_1040.init == null ? null : this.expand(term_1040.init); - let test_1042 = term_1040.test == null ? null : this.expand(term_1040.test); - let update_1043 = term_1040.update == null ? null : this.expand(term_1040.update); - let body_1044 = this.expand(term_1040.body); - return new _terms2.default("ForStatement", { init: init_1041, test: test_1042, update: update_1043, body: body_1044 }); + + static fromIdentifier(value, stx) { + return Syntax.from("identifier", value, stx); } - expandYieldExpression(term_1045) { - let expr_1046 = term_1045.expression == null ? null : this.expand(term_1045.expression); - return new _terms2.default("YieldExpression", { expression: expr_1046 }); + + static fromRegularExpression(value, stx) { + return Syntax.from("regularExpression", value, stx); } - expandYieldGeneratorExpression(term_1047) { - let expr_1048 = term_1047.expression == null ? null : this.expand(term_1047.expression); - return new _terms2.default("YieldGeneratorExpression", { expression: expr_1048 }); + + static fromBraces(inner, stx) { + return Syntax.from("braces", inner, stx); } - expandWhileStatement(term_1049) { - return new _terms2.default("WhileStatement", { test: this.expand(term_1049.test), body: this.expand(term_1049.body) }); + + static fromBrackets(inner, stx) { + return Syntax.from("brackets", inner, stx); } - expandIfStatement(term_1050) { - let consequent_1051 = term_1050.consequent == null ? null : this.expand(term_1050.consequent); - let alternate_1052 = term_1050.alternate == null ? null : this.expand(term_1050.alternate); - return new _terms2.default("IfStatement", { test: this.expand(term_1050.test), consequent: consequent_1051, alternate: alternate_1052 }); + + static fromParens(inner, stx) { + return Syntax.from("parens", inner, stx); } - expandBlockStatement(term_1053) { - return new _terms2.default("BlockStatement", { block: this.expand(term_1053.block) }); + + // () -> string + resolve(phase) { + (0, _errors.assert)(phase != null, "must provide a phase to resolve"); + let allScopes = this.scopesets.all; + let stxScopes = this.scopesets.phase.has(phase) ? this.scopesets.phase.get(phase) : (0, _immutable.List)(); + stxScopes = allScopes.concat(stxScopes); + if (stxScopes.size === 0 || !(this.match('identifier') || this.match('keyword'))) { + return this.token.value; + } + let scope = stxScopes.last(); + let bindings = this.bindings; + if (scope) { + // List<{ scopes: List, binding: Symbol }> + let scopesetBindingList = bindings.get(this); + + if (scopesetBindingList) { + // { scopes: List, binding: Symbol } + let biggestBindingPair = scopesetBindingList.filter(_ref => { + let scopes = _ref.scopes; + + return scopes.isSubset(stxScopes); + }).sort(sizeDecending); + + if (biggestBindingPair.size >= 2 && biggestBindingPair.get(0).scopes.size === biggestBindingPair.get(1).scopes.size) { + let debugBase = '{' + stxScopes.map(s => s.toString()).join(', ') + '}'; + let debugAmbigousScopesets = biggestBindingPair.map(_ref2 => { + let scopes = _ref2.scopes; + + return '{' + scopes.map(s => s.toString()).join(', ') + '}'; + }).join(', '); + throw new Error('Scopeset ' + debugBase + ' has ambiguous subsets ' + debugAmbigousScopesets); + } else if (biggestBindingPair.size !== 0) { + let bindingStr = biggestBindingPair.get(0).binding.toString(); + if (_ramdaFantasy.Maybe.isJust(biggestBindingPair.get(0).alias)) { + // null never happens because we just checked if it is a Just + return biggestBindingPair.get(0).alias.getOrElse(null).resolve(phase); + } + return bindingStr; + } + } + } + return this.token.value; } - expandBlock(term_1054) { - let scope_1055 = (0, _scope.freshScope)("block"); - this.context.currentScope.push(scope_1055); - let compiler_1056 = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); - let markedBody_1057, bodyTerm_1058; - markedBody_1057 = term_1054.statements.map(b_1059 => b_1059.addScope(scope_1055, this.context.bindings, _syntax.ALL_PHASES)); - bodyTerm_1058 = new _terms2.default("Block", { statements: compiler_1056.compile(markedBody_1057) }); - this.context.currentScope.pop(); - return bodyTerm_1058; + + val() { + (0, _errors.assert)(!this.match("delimiter"), "cannot get the val of a delimiter"); + if (this.match("string")) { + return this.token.str; + } + if (this.match("template")) { + return this.token.items.map(el => { + if (typeof el.match === 'function' && el.match("delimiter")) { + return '${...}'; + } + return el.slice.text; + }).join(''); + } + return this.token.value; } - expandVariableDeclarationStatement(term_1060) { - return new _terms2.default("VariableDeclarationStatement", { declaration: this.expand(term_1060.declaration) }); + + lineNumber() { + if (!this.match("delimiter")) { + return this.token.slice.startLocation.line; + } else { + return this.token.get(0).lineNumber(); + } } - expandReturnStatement(term_1061) { - if (term_1061.expression == null) { - return term_1061; + + setLineNumber(line) { + let newTok = {}; + if (this.isDelimiter()) { + newTok = this.token.map(s => s.setLineNumber(line)); + } else { + for (let key of Object.keys(this.token)) { + newTok[key] = this.token[key]; + } + (0, _errors.assert)(newTok.slice && newTok.slice.startLocation, 'all tokens must have line info'); + newTok.slice.startLocation.line = line; } - return new _terms2.default("ReturnStatement", { expression: this.expand(term_1061.expression) }); + return new Syntax(newTok, this); } - expandClassDeclaration(term_1062) { - return new _terms2.default("ClassDeclaration", { name: term_1062.name == null ? null : this.expand(term_1062.name), super: term_1062.super == null ? null : this.expand(term_1062.super), elements: term_1062.elements.map(el_1063 => this.expand(el_1063)).toArray() }); + + // () -> List + inner() { + (0, _errors.assert)(this.match("delimiter"), "can only get the inner of a delimiter"); + return this.token.slice(1, this.token.size - 1); } - expandClassExpression(term_1064) { - return new _terms2.default("ClassExpression", { name: term_1064.name == null ? null : this.expand(term_1064.name), super: term_1064.super == null ? null : this.expand(term_1064.super), elements: term_1064.elements.map(el_1065 => this.expand(el_1065)).toArray() }); + + addScope(scope, bindings, phase) { + let options = arguments.length <= 3 || arguments[3] === undefined ? { flip: false } : arguments[3]; + + let token = this.match('delimiter') ? this.token.map(s => s.addScope(scope, bindings, phase, options)) : this.token; + if (this.match('template')) { + token = _.merge(token, { + items: token.items.map(it => { + if (it instanceof Syntax && it.match('delimiter')) { + return it.addScope(scope, bindings, phase, options); + } + return it; + }) + }); + } + let oldScopeset; + if (phase === ALL_PHASES) { + oldScopeset = this.scopesets.all; + } else { + oldScopeset = this.scopesets.phase.has(phase) ? this.scopesets.phase.get(phase) : (0, _immutable.List)(); + } + let newScopeset; + if (options.flip) { + let index = oldScopeset.indexOf(scope); + if (index !== -1) { + newScopeset = oldScopeset.remove(index); + } else { + newScopeset = oldScopeset.push(scope); + } + } else { + newScopeset = oldScopeset.push(scope); + } + let newstx = { + bindings: bindings, + scopesets: { + all: this.scopesets.all, + phase: this.scopesets.phase + } + }; + + if (phase === ALL_PHASES) { + newstx.scopesets.all = newScopeset; + } else { + newstx.scopesets.phase = newstx.scopesets.phase.set(phase, newScopeset); + } + return new Syntax(token, newstx); } - expandClassElement(term_1066) { - return new _terms2.default("ClassElement", { isStatic: term_1066.isStatic, method: this.expand(term_1066.method) }); + + removeScope(scope, phase) { + let token = this.match('delimiter') ? this.token.map(s => s.removeScope(scope, phase)) : this.token; + let phaseScopeset = this.scopesets.phase.has(phase) ? this.scopesets.phase.get(phase) : (0, _immutable.List)(); + let allScopeset = this.scopesets.all; + let newstx = { + bindings: this.bindings, + scopesets: { + all: this.scopesets.all, + phase: this.scopesets.phase + } + }; + + let phaseIndex = phaseScopeset.indexOf(scope); + let allIndex = allScopeset.indexOf(scope); + if (phaseIndex !== -1) { + newstx.scopesets.phase = this.scopesets.phase.set(phase, phaseScopeset.remove(phaseIndex)); + } else if (allIndex !== -1) { + newstx.scopesets.all = allScopeset.remove(allIndex); + } + return new Syntax(token, newstx); } - expandThisExpression(term_1067) { - return term_1067; + + match(type, value) { + if (!Types[type]) { + throw new Error(type + " is an invalid type"); + } + return Types[type].match(this.token) && (value == null || (value instanceof RegExp ? value.test(this.val()) : this.val() == value)); } - expandSyntaxTemplate(term_1068) { - let r_1069 = (0, _templateProcessor.processTemplate)(term_1068.template.inner()); - let str_1070 = _syntax2.default.from("string", _serializer.serializer.write(r_1069.template)); - let callee_1071 = new _terms2.default("IdentifierExpression", { name: _syntax2.default.from("identifier", "syntaxTemplate") }); - let expandedInterps_1072 = r_1069.interp.map(i_1074 => { - let enf_1075 = new _enforester.Enforester(i_1074, (0, _immutable.List)(), this.context); - return this.expand(enf_1075.enforest("expression")); - }); - let args_1073 = _immutable.List.of(new _terms2.default("LiteralStringExpression", { value: str_1070 })).concat(expandedInterps_1072); - return new _terms2.default("CallExpression", { callee: callee_1071, arguments: args_1073 }); + + isIdentifier(value) { + return this.match("identifier", value); } - expandSyntaxQuote(term_1076) { - let str_1077 = new _terms2.default("LiteralStringExpression", { value: _syntax2.default.from("string", _serializer.serializer.write(term_1076.name)) }); - return new _terms2.default("TemplateExpression", { tag: term_1076.template.tag, elements: term_1076.template.elements.push(str_1077).push(new _terms2.default("TemplateElement", { rawValue: "" })).toArray() }); + + isAssign(value) { + return this.match("assign", value); } - expandStaticMemberExpression(term_1078) { - return new _terms2.default("StaticMemberExpression", { object: this.expand(term_1078.object), property: term_1078.property }); + + isBooleanLiteral(value) { + return this.match("boolean", value); } - expandArrayExpression(term_1079) { - return new _terms2.default("ArrayExpression", { elements: term_1079.elements.map(t_1080 => t_1080 == null ? t_1080 : this.expand(t_1080)) }); + + isKeyword(value) { + return this.match("keyword", value); } - expandImport(term_1081) { - return term_1081; + + isNullLiteral(value) { + return this.match("null", value); } - expandImportNamespace(term_1082) { - return term_1082; + + isNumericLiteral(value) { + return this.match("number", value); } - expandExport(term_1083) { - return new _terms2.default("Export", { declaration: this.expand(term_1083.declaration) }); + + isPunctuator(value) { + return this.match("punctuator", value); } - expandExportDefault(term_1084) { - return new _terms2.default("ExportDefault", { body: this.expand(term_1084.body) }); + + isStringLiteral(value) { + return this.match("string", value); } - expandExportFrom(term_1085) { - return term_1085; + + isRegularExpression(value) { + return this.match("regularExpression", value); } - expandExportAllFrom(term_1086) { - return term_1086; + + isTemplate(value) { + return this.match("template", value); } - expandExportSpecifier(term_1087) { - return term_1087; + + isDelimiter(value) { + return this.match("delimiter", value); } - expandStaticPropertyName(term_1088) { - return term_1088; + + isParens(value) { + return this.match("parens", value); } - expandDataProperty(term_1089) { - return new _terms2.default("DataProperty", { name: this.expand(term_1089.name), expression: this.expand(term_1089.expression) }); + + isBraces(value) { + return this.match("braces", value); } - expandObjectExpression(term_1090) { - return new _terms2.default("ObjectExpression", { properties: term_1090.properties.map(t_1091 => this.expand(t_1091)) }); + + isBrackets(value) { + return this.match("brackets", value); } - expandVariableDeclarator(term_1092) { - let init_1093 = term_1092.init == null ? null : this.expand(term_1092.init); - return new _terms2.default("VariableDeclarator", { binding: this.expand(term_1092.binding), init: init_1093 }); + + isSyntaxTemplate(value) { + return this.match("syntaxTemplate", value); } - expandVariableDeclaration(term_1094) { - if (term_1094.kind === "syntax" || term_1094.kind === "syntaxrec") { - return term_1094; - } - return new _terms2.default("VariableDeclaration", { kind: term_1094.kind, declarators: term_1094.declarators.map(d_1095 => this.expand(d_1095)) }); + + isEOF(value) { + return this.match("eof", value); } - expandParenthesizedExpression(term_1096) { - if (term_1096.inner.size === 0) { - throw new Error("unexpected end of input"); - } - let enf_1097 = new _enforester.Enforester(term_1096.inner, (0, _immutable.List)(), this.context); - let lookahead_1098 = enf_1097.peek(); - let t_1099 = enf_1097.enforestExpression(); - if (t_1099 == null || enf_1097.rest.size > 0) { - throw enf_1097.createError(lookahead_1098, "unexpected syntax"); - } - return this.expand(t_1099); - } - expandUnaryExpression(term_1100) { - return new _terms2.default("UnaryExpression", { operator: term_1100.operator, operand: this.expand(term_1100.operand) }); - } - expandUpdateExpression(term_1101) { - return new _terms2.default("UpdateExpression", { isPrefix: term_1101.isPrefix, operator: term_1101.operator, operand: this.expand(term_1101.operand) }); - } - expandBinaryExpression(term_1102) { - let left_1103 = this.expand(term_1102.left); - let right_1104 = this.expand(term_1102.right); - return new _terms2.default("BinaryExpression", { left: left_1103, operator: term_1102.operator, right: right_1104 }); - } - expandConditionalExpression(term_1105) { - return new _terms2.default("ConditionalExpression", { test: this.expand(term_1105.test), consequent: this.expand(term_1105.consequent), alternate: this.expand(term_1105.alternate) }); - } - expandNewTargetExpression(term_1106) { - return term_1106; - } - expandNewExpression(term_1107) { - let callee_1108 = this.expand(term_1107.callee); - let enf_1109 = new _enforester.Enforester(term_1107.arguments, (0, _immutable.List)(), this.context); - let args_1110 = enf_1109.enforestArgumentList().map(arg_1111 => this.expand(arg_1111)); - return new _terms2.default("NewExpression", { callee: callee_1108, arguments: args_1110.toArray() }); - } - expandSuper(term_1112) { - return term_1112; - } - expandCallExpression(term_1113) { - let callee_1114 = this.expand(term_1113.callee); - let enf_1115 = new _enforester.Enforester(term_1113.arguments, (0, _immutable.List)(), this.context); - let args_1116 = enf_1115.enforestArgumentList().map(arg_1117 => this.expand(arg_1117)); - return new _terms2.default("CallExpression", { callee: callee_1114, arguments: args_1116 }); - } - expandSpreadElement(term_1118) { - return new _terms2.default("SpreadElement", { expression: this.expand(term_1118.expression) }); - } - expandExpressionStatement(term_1119) { - let child_1120 = this.expand(term_1119.expression); - return new _terms2.default("ExpressionStatement", { expression: child_1120 }); - } - expandLabeledStatement(term_1121) { - return new _terms2.default("LabeledStatement", { label: term_1121.label.val(), body: this.expand(term_1121.body) }); - } - doFunctionExpansion(term_1122, type_1123) { - let scope_1124 = (0, _scope.freshScope)("fun"); - let red_1125 = new _applyScopeInParamsReducer2.default(scope_1124, this.context); - let params_1126; - if (type_1123 !== "Getter" && type_1123 !== "Setter") { - params_1126 = red_1125.transform(term_1122.params); - params_1126 = this.expand(params_1126); - } - this.context.currentScope.push(scope_1124); - let compiler_1127 = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); - let markedBody_1128, bodyTerm_1129; - if (term_1122.body instanceof _terms2.default) { - bodyTerm_1129 = this.expand(term_1122.body.addScope(scope_1124, this.context.bindings, _syntax.ALL_PHASES)); - } else { - markedBody_1128 = term_1122.body.map(b_1130 => b_1130.addScope(scope_1124, this.context.bindings, _syntax.ALL_PHASES)); - bodyTerm_1129 = new _terms2.default("FunctionBody", { directives: (0, _immutable.List)(), statements: compiler_1127.compile(markedBody_1128) }); + + toString() { + if (this.match("delimiter")) { + return this.token.map(s => s.toString()).join(" "); } - this.context.currentScope.pop(); - if (type_1123 === "Getter") { - return new _terms2.default(type_1123, { name: this.expand(term_1122.name), body: bodyTerm_1129 }); - } else if (type_1123 === "Setter") { - return new _terms2.default(type_1123, { name: this.expand(term_1122.name), param: term_1122.param, body: bodyTerm_1129 }); + if (this.match("string")) { + return "'" + this.token.str; } - return new _terms2.default(type_1123, { name: term_1122.name, isGenerator: term_1122.isGenerator, params: params_1126, body: bodyTerm_1129 }); - } - expandMethod(term_1131) { - return this.doFunctionExpansion(term_1131, "Method"); - } - expandSetter(term_1132) { - return this.doFunctionExpansion(term_1132, "Setter"); - } - expandGetter(term_1133) { - return this.doFunctionExpansion(term_1133, "Getter"); - } - expandFunctionDeclaration(term_1134) { - return this.doFunctionExpansion(term_1134, "FunctionDeclaration"); - } - expandFunctionExpression(term_1135) { - return this.doFunctionExpansion(term_1135, "FunctionExpression"); - } - expandCompoundAssignmentExpression(term_1136) { - return new _terms2.default("CompoundAssignmentExpression", { binding: this.expand(term_1136.binding), operator: term_1136.operator, expression: this.expand(term_1136.expression) }); - } - expandAssignmentExpression(term_1137) { - return new _terms2.default("AssignmentExpression", { binding: this.expand(term_1137.binding), expression: this.expand(term_1137.expression) }); - } - expandEmptyStatement(term_1138) { - return term_1138; - } - expandLiteralBooleanExpression(term_1139) { - return term_1139; - } - expandLiteralNumericExpression(term_1140) { - return term_1140; - } - expandLiteralInfinityExpression(term_1141) { - return term_1141; - } - expandIdentifierExpression(term_1142) { - let trans_1143 = this.context.env.get(term_1142.name.resolve(this.context.phase)); - if (trans_1143) { - return new _terms2.default("IdentifierExpression", { name: trans_1143.id }); + if (this.match("template")) { + return this.val(); } - return term_1142; - } - expandLiteralNullExpression(term_1144) { - return term_1144; - } - expandLiteralStringExpression(term_1145) { - return term_1145; - } - expandLiteralRegExpExpression(term_1146) { - return term_1146; + return this.token.value; } } - exports.default = TermExpander; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3Rlcm0tZXhwYW5kZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFDZSxNQUFNLFlBQU4saUNBQXlDO0FBQ3RELGNBQVksV0FBWixFQUF5QjtBQUN2QixVQUFNLFFBQU4sRUFBZ0IsSUFBaEI7QUFDQSxTQUFLLE9BQUwsR0FBZSxXQUFmO0FBQ0Q7QUFDRCxTQUFPLFNBQVAsRUFBa0I7QUFDaEIsV0FBTyxLQUFLLFFBQUwsQ0FBYyxTQUFkLENBQVA7QUFDRDtBQUNELGVBQWEsU0FBYixFQUF3QjtBQUN0QixXQUFPLFNBQVA7QUFDRDtBQUNELDJCQUF5QixTQUF6QixFQUFvQztBQUNsQyxXQUFPLG9CQUFTLG9CQUFULEVBQStCLEVBQUMsS0FBSyxVQUFVLEdBQVYsSUFBaUIsSUFBakIsR0FBd0IsSUFBeEIsR0FBK0IsS0FBSyxNQUFMLENBQVksVUFBVSxHQUF0QixDQUFyQyxFQUFpRSxVQUFVLFVBQVUsUUFBVixDQUFtQixPQUFuQixFQUEzRSxFQUEvQixDQUFQO0FBQ0Q7QUFDRCx1QkFBcUIsU0FBckIsRUFBZ0M7QUFDOUIsV0FBTyxvQkFBUyxnQkFBVCxFQUEyQixFQUFDLE9BQU8sVUFBVSxLQUFWLEdBQWtCLFVBQVUsS0FBVixDQUFnQixHQUFoQixFQUFsQixHQUEwQyxJQUFsRCxFQUEzQixDQUFQO0FBQ0Q7QUFDRCx5QkFBdUIsU0FBdkIsRUFBa0M7QUFDaEMsV0FBTyxvQkFBUyxrQkFBVCxFQUE2QixFQUFDLE1BQU0sS0FBSyxNQUFMLENBQVksVUFBVSxJQUF0QixDQUFQLEVBQW9DLE1BQU0sS0FBSyxNQUFMLENBQVksVUFBVSxJQUF0QixDQUExQyxFQUE3QixDQUFQO0FBQ0Q7QUFDRCxzQkFBb0IsU0FBcEIsRUFBK0I7QUFDN0IsV0FBTyxvQkFBUyxlQUFULEVB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RDtBQUNELHVCQUFxQixTQUFyQixFQUFnQztBQUM5QixXQUFPLFNBQVA7QUFDRDtBQUNELGlDQUErQixTQUEvQixFQUEwQztBQUN4QyxXQUFPLFNBQVA7QUFDRDtBQUNELGlDQUErQixTQUEvQixFQUEwQztBQUN4QyxXQUFPLFNBQVA7QUFDRDtBQUNELGtDQUFnQyxTQUFoQyxFQUEyQztBQUN6QyxXQUFPLFNBQVA7QUFDRDtBQUNELDZCQUEyQixTQUEzQixFQUFzQztBQUNwQyxRQUFJLGFBQWEsS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixVQUFVLElBQVYsQ0FBZSxPQUFmLENBQXVCLEtBQUssT0FBTCxDQUFhLEtBQXBDLENBQXJCLENBQWpCO0FBQ0EsUUFBSSxVQUFKLEVBQWdCO0FBQ2QsYUFBTyxvQkFBUyxzQkFBVCxFQUFpQyxFQUFDLE1BQU0sV0FBVyxFQUFsQixFQUFqQyxDQUFQO0FBQ0Q7QUFDRCxXQUFPLFNBQVA7QUFDRDtBQUNELDhCQUE0QixTQUE1QixFQUF1QztBQUNyQyxXQUFPLFNBQVA7QUFDRDtBQUNELGdDQUE4QixTQUE5QixFQUF5QztBQUN2QyxXQUFPLFNBQVA7QUFDRDtBQUNELGdDQUE4QixTQUE5QixFQUF5QztBQUN2QyxXQUFPLFNBQVA7QUFDRDtBQXBWcUQ7a0JBQW5DLFkiLCJmaWxlIjoidGVybS1leHBhbmRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IFRlcm0sIHtpc0VPRiwgaXNCaW5kaW5nSWRlbnRpZmllciwgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLCBpc0Z1bmN0aW9uRXhwcmVzc2lvbiwgaXNGdW5jdGlvblRlcm0sIGlzRnVuY3Rpb25XaXRoTmFtZSwgaXNTeW50YXhEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uLCBpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQsIGlzSW1wb3J0LCBpc0V4cG9ydH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7U2NvcGUsIGZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgQXBwbHlTY29wZUluUGFyYW1zUmVkdWNlciBmcm9tIFwiLi9hcHBseS1zY29wZS1pbi1wYXJhbXMtcmVkdWNlclwiO1xuaW1wb3J0IHJlZHVjZXIsIHtNb25vaWRhbFJlZHVjZXJ9IGZyb20gXCJzaGlmdC1yZWR1Y2VyXCI7XG5pbXBvcnQgQ29tcGlsZXIgZnJvbSBcIi4vY29tcGlsZXJcIjtcbmltcG9ydCBTeW50YXgsIHtBTExfUEhBU0VTfSBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCB7c2VyaWFsaXplciwgbWFrZURlc2VyaWFsaXplcn0gZnJvbSBcIi4vc2VyaWFsaXplclwiO1xuaW1wb3J0IHtlbmZvcmVzdEV4cHIsIEVuZm9yZXN0ZXJ9IGZyb20gXCIuL2VuZm9yZXN0ZXJcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7cHJvY2Vzc1RlbXBsYXRlfSBmcm9tIFwiLi90ZW1wbGF0ZS1wcm9jZXNzb3IuanNcIjtcbmltcG9ydCBBU1REaXNwYXRjaGVyIGZyb20gXCIuL2FzdC1kaXNwYXRjaGVyXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXJtRXhwYW5kZXIgZXh0ZW5kcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dF85OTkpIHtcbiAgICBzdXBlcihcImV4cGFuZFwiLCB0cnVlKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Xzk5OTtcbiAgfVxuICBleHBhbmQodGVybV8xMDAwKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2godGVybV8xMDAwKTtcbiAgfVxuICBleHBhbmRQcmFnbWEodGVybV8xMDAxKSB7XG4gICAgcmV0dXJuIHRlcm1fMTAwMTtcbiAgfVxuICBleHBhbmRUZW1wbGF0ZUV4cHJlc3Npb24odGVybV8xMDAyKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVGVtcGxhdGVFeHByZXNzaW9uXCIsIHt0YWc6IHRlcm1fMTAwMi50YWcgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMDIudGFnKSwgZWxlbWVudHM6IHRlcm1fMTAwMi5lbGVtZW50cy50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRCcmVha1N0YXRlbWVudCh0ZXJtXzEwMDMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCcmVha1N0YXRlbWVudFwiLCB7bGFiZWw6IHRlcm1fMTAwMy5sYWJlbCA/IHRlcm1fMTAwMy5sYWJlbC52YWwoKSA6IG51bGx9KTtcbiAgfVxuICBleHBhbmREb1doaWxlU3RhdGVtZW50KHRlcm1fMTAwNCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkRvV2hpbGVTdGF0ZW1lbnRcIiwge2JvZHk6IHRoaXMuZXhwYW5kKHRlcm1fMTAwNC5ib2R5KSwgdGVzdDogdGhpcy5leHBhbmQodGVybV8xMDA0LnRlc3QpfSk7XG4gIH1cbiAgZXhwYW5kV2l0aFN0YXRlbWVudCh0ZXJtXzEwMDUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJXaXRoU3RhdGVtZW50XCIsIHtib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMDUuYm9keSksIG9iamVjdDogdGhpcy5leHBhbmQodGVybV8xMDA1Lm9iamVjdCl9KTtcbiAgfVxuICBleHBhbmREZWJ1Z2dlclN0YXRlbWVudCh0ZXJtXzEwMDYpIHtcbiAgICByZXR1cm4gdGVybV8xMDA2O1xuICB9XG4gIGV4cGFuZENvbnRpbnVlU3RhdGVtZW50KHRlcm1fMTAwNykge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbnRpbnVlU3RhdGVtZW50XCIsIHtsYWJlbDogdGVybV8xMDA3LmxhYmVsID8gdGVybV8xMDA3LmxhYmVsLnZhbCgpIDogbnVsbH0pO1xuICB9XG4gIGV4cGFuZFN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0KHRlcm1fMTAwOCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0XCIsIHtkaXNjcmltaW5hbnQ6IHRoaXMuZXhwYW5kKHRlcm1fMTAwOC5kaXNjcmltaW5hbnQpLCBwcmVEZWZhdWx0Q2FzZXM6IHRlcm1fMTAwOC5wcmVEZWZhdWx0Q2FzZXMubWFwKGNfMTAwOSA9PiB0aGlzLmV4cGFuZChjXzEwMDkpKS50b0FycmF5KCksIGRlZmF1bHRDYXNlOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMDguZGVmYXVsdENhc2UpLCBwb3N0RGVmYXVsdENhc2VzOiB0ZXJtXzEwMDgucG9zdERlZmF1bHRDYXNlcy5tYXAoY18xMDEwID0+IHRoaXMuZXhwYW5kKGNfMTAxMCkpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbih0ZXJtXzEwMTEpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogdGhpcy5leHBhbmQodGVybV8xMDExLm9iamVjdCksIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm1fMTAxMS5leHByZXNzaW9uKX0pO1xuICB9XG4gIGV4cGFuZFN3aXRjaFN0YXRlbWVudCh0ZXJtXzEwMTIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTd2l0Y2hTdGF0ZW1lbnRcIiwge2Rpc2NyaW1pbmFudDogdGhpcy5leHBhbmQodGVybV8xMDEyLmRpc2NyaW1pbmFudCksIGNhc2VzOiB0ZXJtXzEwMTIuY2FzZXMubWFwKGNfMTAxMyA9PiB0aGlzLmV4cGFuZChjXzEwMTMpKS50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRGb3JtYWxQYXJhbWV0ZXJzKHRlcm1fMTAxNCkge1xuICAgIGxldCByZXN0XzEwMTUgPSB0ZXJtXzEwMTQucmVzdCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTAxNC5yZXN0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGb3JtYWxQYXJhbWV0ZXJzXCIsIHtpdGVtczogdGVybV8xMDE0Lml0ZW1zLm1hcChpXzEwMTYgPT4gdGhpcy5leHBhbmQoaV8xMDE2KSksIHJlc3Q6IHJlc3RfMTAxNX0pO1xuICB9XG4gIGV4cGFuZEFycm93RXhwcmVzc2lvbih0ZXJtXzEwMTcpIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm1fMTAxNywgXCJBcnJvd0V4cHJlc3Npb25cIik7XG4gIH1cbiAgZXhwYW5kU3dpdGNoRGVmYXVsdCh0ZXJtXzEwMTgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTd2l0Y2hEZWZhdWx0XCIsIHtjb25zZXF1ZW50OiB0ZXJtXzEwMTguY29uc2VxdWVudC5tYXAoY18xMDE5ID0+IHRoaXMuZXhwYW5kKGNfMTAxOSkpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZFN3aXRjaENhc2UodGVybV8xMDIwKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3dpdGNoQ2FzZVwiLCB7dGVzdDogdGhpcy5leHBhbmQodGVybV8xMDIwLnRlc3QpLCBjb25zZXF1ZW50OiB0ZXJtXzEwMjAuY29uc2VxdWVudC5tYXAoY18xMDIxID0+IHRoaXMuZXhwYW5kKGNfMTAyMSkpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZEZvckluU3RhdGVtZW50KHRlcm1fMTAyMikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvckluU3RhdGVtZW50XCIsIHtsZWZ0OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjIubGVmdCksIHJpZ2h0OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjIucmlnaHQpLCBib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjIuYm9keSl9KTtcbiAgfVxuICBleHBhbmRUcnlDYXRjaFN0YXRlbWVudCh0ZXJtXzEwMjMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUcnlDYXRjaFN0YXRlbWVudFwiLCB7Ym9keTogdGhpcy5leHBhbmQodGVybV8xMDIzLmJvZHkpLCBjYXRjaENsYXVzZTogdGhpcy5leHBhbmQodGVybV8xMDIzLmNhdGNoQ2xhdXNlKX0pO1xuICB9XG4gIGV4cGFuZFRyeUZpbmFsbHlTdGF0ZW1lbnQodGVybV8xMDI0KSB7XG4gICAgbGV0IGNhdGNoQ2xhdXNlXzEwMjUgPSB0ZXJtXzEwMjQuY2F0Y2hDbGF1c2UgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjQuY2F0Y2hDbGF1c2UpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlRyeUZpbmFsbHlTdGF0ZW1lbnRcIiwge2JvZHk6IHRoaXMuZXhwYW5kKHRlcm1fMTAyNC5ib2R5KSwgY2F0Y2hDbGF1c2U6IGNhdGNoQ2xhdXNlXzEwMjUsIGZpbmFsaXplcjogdGhpcy5leHBhbmQodGVybV8xMDI0LmZpbmFsaXplcil9KTtcbiAgfVxuICBleHBhbmRDYXRjaENsYXVzZSh0ZXJtXzEwMjYpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYXRjaENsYXVzZVwiLCB7YmluZGluZzogdGhpcy5leHBhbmQodGVybV8xMDI2LmJpbmRpbmcpLCBib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjYuYm9keSl9KTtcbiAgfVxuICBleHBhbmRUaHJvd1N0YXRlbWVudCh0ZXJtXzEwMjcpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUaHJvd1N0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMDI3LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kRm9yT2ZTdGF0ZW1lbnQodGVybV8xMDI4KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRm9yT2ZTdGF0ZW1lbnRcIiwge2xlZnQ6IHRoaXMuZXhwYW5kKHRlcm1fMTAyOC5sZWZ0KSwgcmlnaHQ6IHRoaXMuZXhwYW5kKHRlcm1fMTAyOC5yaWdodCksIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm1fMTAyOC5ib2R5KX0pO1xuICB9XG4gIGV4cGFuZEJpbmRpbmdJZGVudGlmaWVyKHRlcm1fMTAyOSkge1xuICAgIHJldHVybiB0ZXJtXzEwMjk7XG4gIH1cbiAgZXhwYW5kQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcih0ZXJtXzEwMzApIHtcbiAgICByZXR1cm4gdGVybV8xMDMwO1xuICB9XG4gIGV4cGFuZEJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5KHRlcm1fMTAzMSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XCIsIHtuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMzEubmFtZSksIGJpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTAzMS5iaW5kaW5nKX0pO1xuICB9XG4gIGV4cGFuZENvbXB1dGVkUHJvcGVydHlOYW1lKHRlcm1fMTAzMikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbXB1dGVkUHJvcGVydHlOYW1lXCIsIHtleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMzIuZXhwcmVzc2lvbil9KTtcbiAgfVxuICBleHBhbmRPYmplY3RCaW5kaW5nKHRlcm1fMTAzMykge1xuICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEJpbmRpbmdcIiwge3Byb3BlcnRpZXM6IHRlcm1fMTAzMy5wcm9wZXJ0aWVzLm1hcCh0XzEwMzQgPT4gdGhpcy5leHBhbmQodF8xMDM0KSkudG9BcnJheSgpfSk7XG4gIH1cbiAgZXhwYW5kQXJyYXlCaW5kaW5nKHRlcm1fMTAzNSkge1xuICAgIGxldCByZXN0RWxlbWVudF8xMDM2ID0gdGVybV8xMDM1LnJlc3RFbGVtZW50ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDM1LnJlc3RFbGVtZW50KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiB0ZXJtXzEwMzUuZWxlbWVudHMubWFwKHRfMTAzNyA9PiB0XzEwMzcgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0XzEwMzcpKS50b0FycmF5KCksIHJlc3RFbGVtZW50OiByZXN0RWxlbWVudF8xMDM2fSk7XG4gIH1cbiAgZXhwYW5kQmluZGluZ1dpdGhEZWZhdWx0KHRlcm1fMTAzOCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdXaXRoRGVmYXVsdFwiLCB7YmluZGluZzogdGhpcy5leHBhbmQodGVybV8xMDM4LmJpbmRpbmcpLCBpbml0OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMzguaW5pdCl9KTtcbiAgfVxuICBleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eSh0ZXJtXzEwMzkpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge25hbWU6IG5ldyBUZXJtKFwiU3RhdGljUHJvcGVydHlOYW1lXCIsIHt2YWx1ZTogdGVybV8xMDM5Lm5hbWV9KSwgZXhwcmVzc2lvbjogbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7bmFtZTogdGVybV8xMDM5Lm5hbWV9KX0pO1xuICB9XG4gIGV4cGFuZEZvclN0YXRlbWVudCh0ZXJtXzEwNDApIHtcbiAgICBsZXQgaW5pdF8xMDQxID0gdGVybV8xMDQwLmluaXQgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNDAuaW5pdCk7XG4gICAgbGV0IHRlc3RfMTA0MiA9IHRlcm1fMTA0MC50ZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDQwLnRlc3QpO1xuICAgIGxldCB1cGRhdGVfMTA0MyA9IHRlcm1fMTA0MC51cGRhdGUgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNDAudXBkYXRlKTtcbiAgICBsZXQgYm9keV8xMDQ0ID0gdGhpcy5leHBhbmQodGVybV8xMDQwLmJvZHkpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvclN0YXRlbWVudFwiLCB7aW5pdDogaW5pdF8xMDQxLCB0ZXN0OiB0ZXN0XzEwNDIsIHVwZGF0ZTogdXBkYXRlXzEwNDMsIGJvZHk6IGJvZHlfMTA0NH0pO1xuICB9XG4gIGV4cGFuZFlpZWxkRXhwcmVzc2lvbih0ZXJtXzEwNDUpIHtcbiAgICBsZXQgZXhwcl8xMDQ2ID0gdGVybV8xMDQ1LmV4cHJlc3Npb24gPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNDUuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiWWllbGRFeHByZXNzaW9uXCIsIHtleHByZXNzaW9uOiBleHByXzEwNDZ9KTtcbiAgfVxuICBleHBhbmRZaWVsZEdlbmVyYXRvckV4cHJlc3Npb24odGVybV8xMDQ3KSB7XG4gICAgbGV0IGV4cHJfMTA0OCA9IHRlcm1fMTA0Ny5leHByZXNzaW9uID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDQ3LmV4cHJlc3Npb24pO1xuICAgIHJldHVybiBuZXcgVGVybShcIllpZWxkR2VuZXJhdG9yRXhwcmVzc2lvblwiLCB7ZXhwcmVzc2lvbjogZXhwcl8xMDQ4fSk7XG4gIH1cbiAgZXhwYW5kV2hpbGVTdGF0ZW1lbnQodGVybV8xMDQ5KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiV2hpbGVTdGF0ZW1lbnRcIiwge3Rlc3Q6IHRoaXMuZXhwYW5kKHRlcm1fMTA0OS50ZXN0KSwgYm9keTogdGhpcy5leHBhbmQodGVybV8xMDQ5LmJvZHkpfSk7XG4gIH1cbiAgZXhwYW5kSWZTdGF0ZW1lbnQodGVybV8xMDUwKSB7XG4gICAgbGV0IGNvbnNlcXVlbnRfMTA1MSA9IHRlcm1fMTA1MC5jb25zZXF1ZW50ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDUwLmNvbnNlcXVlbnQpO1xuICAgIGxldCBhbHRlcm5hdGVfMTA1MiA9IHRlcm1fMTA1MC5hbHRlcm5hdGUgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNTAuYWx0ZXJuYXRlKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJZlN0YXRlbWVudFwiLCB7dGVzdDogdGhpcy5leHBhbmQodGVybV8xMDUwLnRlc3QpLCBjb25zZXF1ZW50OiBjb25zZXF1ZW50XzEwNTEsIGFsdGVybmF0ZTogYWx0ZXJuYXRlXzEwNTJ9KTtcbiAgfVxuICBleHBhbmRCbG9ja1N0YXRlbWVudCh0ZXJtXzEwNTMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCbG9ja1N0YXRlbWVudFwiLCB7YmxvY2s6IHRoaXMuZXhwYW5kKHRlcm1fMTA1My5ibG9jayl9KTtcbiAgfVxuICBleHBhbmRCbG9jayh0ZXJtXzEwNTQpIHtcbiAgICBsZXQgc2NvcGVfMTA1NSA9IGZyZXNoU2NvcGUoXCJibG9ja1wiKTtcbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnB1c2goc2NvcGVfMTA1NSk7XG4gICAgbGV0IGNvbXBpbGVyXzEwNTYgPSBuZXcgQ29tcGlsZXIodGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuZW52LCB0aGlzLmNvbnRleHQuc3RvcmUsIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IG1hcmtlZEJvZHlfMTA1NywgYm9keVRlcm1fMTA1ODtcbiAgICBtYXJrZWRCb2R5XzEwNTcgPSB0ZXJtXzEwNTQuc3RhdGVtZW50cy5tYXAoYl8xMDU5ID0+IGJfMTA1OS5hZGRTY29wZShzY29wZV8xMDU1LCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpKTtcbiAgICBib2R5VGVybV8xMDU4ID0gbmV3IFRlcm0oXCJCbG9ja1wiLCB7c3RhdGVtZW50czogY29tcGlsZXJfMTA1Ni5jb21waWxlKG1hcmtlZEJvZHlfMTA1Nyl9KTtcbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnBvcCgpO1xuICAgIHJldHVybiBib2R5VGVybV8xMDU4O1xuICB9XG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybV8xMDYwKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudFwiLCB7ZGVjbGFyYXRpb246IHRoaXMuZXhwYW5kKHRlcm1fMTA2MC5kZWNsYXJhdGlvbil9KTtcbiAgfVxuICBleHBhbmRSZXR1cm5TdGF0ZW1lbnQodGVybV8xMDYxKSB7XG4gICAgaWYgKHRlcm1fMTA2MS5leHByZXNzaW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0ZXJtXzEwNjE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMDYxLmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kQ2xhc3NEZWNsYXJhdGlvbih0ZXJtXzEwNjIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDbGFzc0RlY2xhcmF0aW9uXCIsIHtuYW1lOiB0ZXJtXzEwNjIubmFtZSA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTA2Mi5uYW1lKSwgc3VwZXI6IHRlcm1fMTA2Mi5zdXBlciA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTA2Mi5zdXBlciksIGVsZW1lbnRzOiB0ZXJtXzEwNjIuZWxlbWVudHMubWFwKGVsXzEwNjMgPT4gdGhpcy5leHBhbmQoZWxfMTA2MykpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZENsYXNzRXhwcmVzc2lvbih0ZXJtXzEwNjQpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDbGFzc0V4cHJlc3Npb25cIiwge25hbWU6IHRlcm1fMTA2NC5uYW1lID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDY0Lm5hbWUpLCBzdXBlcjogdGVybV8xMDY0LnN1cGVyID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDY0LnN1cGVyKSwgZWxlbWVudHM6IHRlcm1fMTA2NC5lbGVtZW50cy5tYXAoZWxfMTA2NSA9PiB0aGlzLmV4cGFuZChlbF8xMDY1KSkudG9BcnJheSgpfSk7XG4gIH1cbiAgZXhwYW5kQ2xhc3NFbGVtZW50KHRlcm1fMTA2Nikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNsYXNzRWxlbWVudFwiLCB7aXNTdGF0aWM6IHRlcm1fMTA2Ni5pc1N0YXRpYywgbWV0aG9kOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNjYubWV0aG9kKX0pO1xuICB9XG4gIGV4cGFuZFRoaXNFeHByZXNzaW9uKHRlcm1fMTA2Nykge1xuICAgIHJldHVybiB0ZXJtXzEwNjc7XG4gIH1cbiAgZXhwYW5kU3ludGF4VGVtcGxhdGUodGVybV8xMDY4KSB7XG4gICAgbGV0IHJfMTA2OSA9IHByb2Nlc3NUZW1wbGF0ZSh0ZXJtXzEwNjgudGVtcGxhdGUuaW5uZXIoKSk7XG4gICAgbGV0IHN0cl8xMDcwID0gU3ludGF4LmZyb20oXCJzdHJpbmdcIiwgc2VyaWFsaXplci53cml0ZShyXzEwNjkudGVtcGxhdGUpKTtcbiAgICBsZXQgY2FsbGVlXzEwNzEgPSBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiBTeW50YXguZnJvbShcImlkZW50aWZpZXJcIiwgXCJzeW50YXhUZW1wbGF0ZVwiKX0pO1xuICAgIGxldCBleHBhbmRlZEludGVycHNfMTA3MiA9IHJfMTA2OS5pbnRlcnAubWFwKGlfMTA3NCA9PiB7XG4gICAgICBsZXQgZW5mXzEwNzUgPSBuZXcgRW5mb3Jlc3RlcihpXzEwNzQsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICAgIHJldHVybiB0aGlzLmV4cGFuZChlbmZfMTA3NS5lbmZvcmVzdChcImV4cHJlc3Npb25cIikpO1xuICAgIH0pO1xuICAgIGxldCBhcmdzXzEwNzMgPSBMaXN0Lm9mKG5ldyBUZXJtKFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIiwge3ZhbHVlOiBzdHJfMTA3MH0pKS5jb25jYXQoZXhwYW5kZWRJbnRlcnBzXzEwNzIpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNhbGxFeHByZXNzaW9uXCIsIHtjYWxsZWU6IGNhbGxlZV8xMDcxLCBhcmd1bWVudHM6IGFyZ3NfMTA3M30pO1xuICB9XG4gIGV4cGFuZFN5bnRheFF1b3RlKHRlcm1fMTA3Nikge1xuICAgIGxldCBzdHJfMTA3NyA9IG5ldyBUZXJtKFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIiwge3ZhbHVlOiBTeW50YXguZnJvbShcInN0cmluZ1wiLCBzZXJpYWxpemVyLndyaXRlKHRlcm1fMTA3Ni5uYW1lKSl9KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiwge3RhZzogdGVybV8xMDc2LnRlbXBsYXRlLnRhZywgZWxlbWVudHM6IHRlcm1fMTA3Ni50ZW1wbGF0ZS5lbGVtZW50cy5wdXNoKHN0cl8xMDc3KS5wdXNoKG5ldyBUZXJtKFwiVGVtcGxhdGVFbGVtZW50XCIsIHtyYXdWYWx1ZTogXCJcIn0pKS50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRTdGF0aWNNZW1iZXJFeHByZXNzaW9uKHRlcm1fMTA3OCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlN0YXRpY01lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogdGhpcy5leHBhbmQodGVybV8xMDc4Lm9iamVjdCksIHByb3BlcnR5OiB0ZXJtXzEwNzgucHJvcGVydHl9KTtcbiAgfVxuICBleHBhbmRBcnJheUV4cHJlc3Npb24odGVybV8xMDc5KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQXJyYXlFeHByZXNzaW9uXCIsIHtlbGVtZW50czogdGVybV8xMDc5LmVsZW1lbnRzLm1hcCh0XzEwODAgPT4gdF8xMDgwID09IG51bGwgPyB0XzEwODAgOiB0aGlzLmV4cGFuZCh0XzEwODApKX0pO1xuICB9XG4gIGV4cGFuZEltcG9ydCh0ZXJtXzEwODEpIHtcbiAgICByZXR1cm4gdGVybV8xMDgxO1xuICB9XG4gIGV4cGFuZEltcG9ydE5hbWVzcGFjZSh0ZXJtXzEwODIpIHtcbiAgICByZXR1cm4gdGVybV8xMDgyO1xuICB9XG4gIGV4cGFuZEV4cG9ydCh0ZXJtXzEwODMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmV4cGFuZCh0ZXJtXzEwODMuZGVjbGFyYXRpb24pfSk7XG4gIH1cbiAgZXhwYW5kRXhwb3J0RGVmYXVsdCh0ZXJtXzEwODQpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnREZWZhdWx0XCIsIHtib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwODQuYm9keSl9KTtcbiAgfVxuICBleHBhbmRFeHBvcnRGcm9tKHRlcm1fMTA4NSkge1xuICAgIHJldHVybiB0ZXJtXzEwODU7XG4gIH1cbiAgZXhwYW5kRXhwb3J0QWxsRnJvbSh0ZXJtXzEwODYpIHtcbiAgICByZXR1cm4gdGVybV8xMDg2O1xuICB9XG4gIGV4cGFuZEV4cG9ydFNwZWNpZmllcih0ZXJtXzEwODcpIHtcbiAgICByZXR1cm4gdGVybV8xMDg3O1xuICB9XG4gIGV4cGFuZFN0YXRpY1Byb3BlcnR5TmFtZSh0ZXJtXzEwODgpIHtcbiAgICByZXR1cm4gdGVybV8xMDg4O1xuICB9XG4gIGV4cGFuZERhdGFQcm9wZXJ0eSh0ZXJtXzEwODkpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge25hbWU6IHRoaXMuZXhwYW5kKHRlcm1fMTA4OS5uYW1lKSwgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMDg5LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kT2JqZWN0RXhwcmVzc2lvbih0ZXJtXzEwOTApIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJPYmplY3RFeHByZXNzaW9uXCIsIHtwcm9wZXJ0aWVzOiB0ZXJtXzEwOTAucHJvcGVydGllcy5tYXAodF8xMDkxID0+IHRoaXMuZXhwYW5kKHRfMTA5MSkpfSk7XG4gIH1cbiAgZXhwYW5kVmFyaWFibGVEZWNsYXJhdG9yKHRlcm1fMTA5Mikge1xuICAgIGxldCBpbml0XzEwOTMgPSB0ZXJtXzEwOTIuaW5pdCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTA5Mi5pbml0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0b3JcIiwge2JpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTA5Mi5iaW5kaW5nKSwgaW5pdDogaW5pdF8xMDkzfSk7XG4gIH1cbiAgZXhwYW5kVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtXzEwOTQpIHtcbiAgICBpZiAodGVybV8xMDk0LmtpbmQgPT09IFwic3ludGF4XCIgfHwgdGVybV8xMDk0LmtpbmQgPT09IFwic3ludGF4cmVjXCIpIHtcbiAgICAgIHJldHVybiB0ZXJtXzEwOTQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiwge2tpbmQ6IHRlcm1fMTA5NC5raW5kLCBkZWNsYXJhdG9yczogdGVybV8xMDk0LmRlY2xhcmF0b3JzLm1hcChkXzEwOTUgPT4gdGhpcy5leHBhbmQoZF8xMDk1KSl9KTtcbiAgfVxuICBleHBhbmRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbih0ZXJtXzEwOTYpIHtcbiAgICBpZiAodGVybV8xMDk2LmlubmVyLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0XCIpO1xuICAgIH1cbiAgICBsZXQgZW5mXzEwOTcgPSBuZXcgRW5mb3Jlc3Rlcih0ZXJtXzEwOTYuaW5uZXIsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkXzEwOTggPSBlbmZfMTA5Ny5wZWVrKCk7XG4gICAgbGV0IHRfMTA5OSA9IGVuZl8xMDk3LmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGlmICh0XzEwOTkgPT0gbnVsbCB8fCBlbmZfMTA5Ny5yZXN0LnNpemUgPiAwKSB7XG4gICAgICB0aHJvdyBlbmZfMTA5Ny5jcmVhdGVFcnJvcihsb29rYWhlYWRfMTA5OCwgXCJ1bmV4cGVjdGVkIHN5bnRheFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kKHRfMTA5OSk7XG4gIH1cbiAgZXhwYW5kVW5hcnlFeHByZXNzaW9uKHRlcm1fMTEwMCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlVuYXJ5RXhwcmVzc2lvblwiLCB7b3BlcmF0b3I6IHRlcm1fMTEwMC5vcGVyYXRvciwgb3BlcmFuZDogdGhpcy5leHBhbmQodGVybV8xMTAwLm9wZXJhbmQpfSk7XG4gIH1cbiAgZXhwYW5kVXBkYXRlRXhwcmVzc2lvbih0ZXJtXzExMDEpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJVcGRhdGVFeHByZXNzaW9uXCIsIHtpc1ByZWZpeDogdGVybV8xMTAxLmlzUHJlZml4LCBvcGVyYXRvcjogdGVybV8xMTAxLm9wZXJhdG9yLCBvcGVyYW5kOiB0aGlzLmV4cGFuZCh0ZXJtXzExMDEub3BlcmFuZCl9KTtcbiAgfVxuICBleHBhbmRCaW5hcnlFeHByZXNzaW9uKHRlcm1fMTEwMikge1xuICAgIGxldCBsZWZ0XzExMDMgPSB0aGlzLmV4cGFuZCh0ZXJtXzExMDIubGVmdCk7XG4gICAgbGV0IHJpZ2h0XzExMDQgPSB0aGlzLmV4cGFuZCh0ZXJtXzExMDIucmlnaHQpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge2xlZnQ6IGxlZnRfMTEwMywgb3BlcmF0b3I6IHRlcm1fMTEwMi5vcGVyYXRvciwgcmlnaHQ6IHJpZ2h0XzExMDR9KTtcbiAgfVxuICBleHBhbmRDb25kaXRpb25hbEV4cHJlc3Npb24odGVybV8xMTA1KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsIHt0ZXN0OiB0aGlzLmV4cGFuZCh0ZXJtXzExMDUudGVzdCksIGNvbnNlcXVlbnQ6IHRoaXMuZXhwYW5kKHRlcm1fMTEwNS5jb25zZXF1ZW50KSwgYWx0ZXJuYXRlOiB0aGlzLmV4cGFuZCh0ZXJtXzExMDUuYWx0ZXJuYXRlKX0pO1xuICB9XG4gIGV4cGFuZE5ld1RhcmdldEV4cHJlc3Npb24odGVybV8xMTA2KSB7XG4gICAgcmV0dXJuIHRlcm1fMTEwNjtcbiAgfVxuICBleHBhbmROZXdFeHByZXNzaW9uKHRlcm1fMTEwNykge1xuICAgIGxldCBjYWxsZWVfMTEwOCA9IHRoaXMuZXhwYW5kKHRlcm1fMTEwNy5jYWxsZWUpO1xuICAgIGxldCBlbmZfMTEwOSA9IG5ldyBFbmZvcmVzdGVyKHRlcm1fMTEwNy5hcmd1bWVudHMsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYXJnc18xMTEwID0gZW5mXzExMDkuZW5mb3Jlc3RBcmd1bWVudExpc3QoKS5tYXAoYXJnXzExMTEgPT4gdGhpcy5leHBhbmQoYXJnXzExMTEpKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJOZXdFeHByZXNzaW9uXCIsIHtjYWxsZWU6IGNhbGxlZV8xMTA4LCBhcmd1bWVudHM6IGFyZ3NfMTExMC50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRTdXBlcih0ZXJtXzExMTIpIHtcbiAgICByZXR1cm4gdGVybV8xMTEyO1xuICB9XG4gIGV4cGFuZENhbGxFeHByZXNzaW9uKHRlcm1fMTExMykge1xuICAgIGxldCBjYWxsZWVfMTExNCA9IHRoaXMuZXhwYW5kKHRlcm1fMTExMy5jYWxsZWUpO1xuICAgIGxldCBlbmZfMTExNSA9IG5ldyBFbmZvcmVzdGVyKHRlcm1fMTExMy5hcmd1bWVudHMsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYXJnc18xMTE2ID0gZW5mXzExMTUuZW5mb3Jlc3RBcmd1bWVudExpc3QoKS5tYXAoYXJnXzExMTcgPT4gdGhpcy5leHBhbmQoYXJnXzExMTcpKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYWxsRXhwcmVzc2lvblwiLCB7Y2FsbGVlOiBjYWxsZWVfMTExNCwgYXJndW1lbnRzOiBhcmdzXzExMTZ9KTtcbiAgfVxuICBleHBhbmRTcHJlYWRFbGVtZW50KHRlcm1fMTExOCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlNwcmVhZEVsZW1lbnRcIiwge2V4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm1fMTExOC5leHByZXNzaW9uKX0pO1xuICB9XG4gIGV4cGFuZEV4cHJlc3Npb25TdGF0ZW1lbnQodGVybV8xMTE5KSB7XG4gICAgbGV0IGNoaWxkXzExMjAgPSB0aGlzLmV4cGFuZCh0ZXJtXzExMTkuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogY2hpbGRfMTEyMH0pO1xuICB9XG4gIGV4cGFuZExhYmVsZWRTdGF0ZW1lbnQodGVybV8xMTIxKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGFiZWxlZFN0YXRlbWVudFwiLCB7bGFiZWw6IHRlcm1fMTEyMS5sYWJlbC52YWwoKSwgYm9keTogdGhpcy5leHBhbmQodGVybV8xMTIxLmJvZHkpfSk7XG4gIH1cbiAgZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtXzExMjIsIHR5cGVfMTEyMykge1xuICAgIGxldCBzY29wZV8xMTI0ID0gZnJlc2hTY29wZShcImZ1blwiKTtcbiAgICBsZXQgcmVkXzExMjUgPSBuZXcgQXBwbHlTY29wZUluUGFyYW1zUmVkdWNlcihzY29wZV8xMTI0LCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBwYXJhbXNfMTEyNjtcbiAgICBpZiAodHlwZV8xMTIzICE9PSBcIkdldHRlclwiICYmIHR5cGVfMTEyMyAhPT0gXCJTZXR0ZXJcIikge1xuICAgICAgcGFyYW1zXzExMjYgPSByZWRfMTEyNS50cmFuc2Zvcm0odGVybV8xMTIyLnBhcmFtcyk7XG4gICAgICBwYXJhbXNfMTEyNiA9IHRoaXMuZXhwYW5kKHBhcmFtc18xMTI2KTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZS5wdXNoKHNjb3BlXzExMjQpO1xuICAgIGxldCBjb21waWxlcl8xMTI3ID0gbmV3IENvbXBpbGVyKHRoaXMuY29udGV4dC5waGFzZSwgdGhpcy5jb250ZXh0LmVudiwgdGhpcy5jb250ZXh0LnN0b3JlLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBtYXJrZWRCb2R5XzExMjgsIGJvZHlUZXJtXzExMjk7XG4gICAgaWYgKHRlcm1fMTEyMi5ib2R5IGluc3RhbmNlb2YgVGVybSkge1xuICAgICAgYm9keVRlcm1fMTEyOSA9IHRoaXMuZXhwYW5kKHRlcm1fMTEyMi5ib2R5LmFkZFNjb3BlKHNjb3BlXzExMjQsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrZWRCb2R5XzExMjggPSB0ZXJtXzExMjIuYm9keS5tYXAoYl8xMTMwID0+IGJfMTEzMC5hZGRTY29wZShzY29wZV8xMTI0LCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpKTtcbiAgICAgIGJvZHlUZXJtXzExMjkgPSBuZXcgVGVybShcIkZ1bmN0aW9uQm9keVwiLCB7ZGlyZWN0aXZlczogTGlzdCgpLCBzdGF0ZW1lbnRzOiBjb21waWxlcl8xMTI3LmNvbXBpbGUobWFya2VkQm9keV8xMTI4KX0pO1xuICAgIH1cbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnBvcCgpO1xuICAgIGlmICh0eXBlXzExMjMgPT09IFwiR2V0dGVyXCIpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzExMjMsIHtuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtXzExMjIubmFtZSksIGJvZHk6IGJvZHlUZXJtXzExMjl9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVfMTEyMyA9PT0gXCJTZXR0ZXJcIikge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKHR5cGVfMTEyMywge25hbWU6IHRoaXMuZXhwYW5kKHRlcm1fMTEyMi5uYW1lKSwgcGFyYW06IHRlcm1fMTEyMi5wYXJhbSwgYm9keTogYm9keVRlcm1fMTEyOX0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZV8xMTIzLCB7bmFtZTogdGVybV8xMTIyLm5hbWUsIGlzR2VuZXJhdG9yOiB0ZXJtXzExMjIuaXNHZW5lcmF0b3IsIHBhcmFtczogcGFyYW1zXzExMjYsIGJvZHk6IGJvZHlUZXJtXzExMjl9KTtcbiAgfVxuICBleHBhbmRNZXRob2QodGVybV8xMTMxKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtXzExMzEsIFwiTWV0aG9kXCIpO1xuICB9XG4gIGV4cGFuZFNldHRlcih0ZXJtXzExMzIpIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm1fMTEzMiwgXCJTZXR0ZXJcIik7XG4gIH1cbiAgZXhwYW5kR2V0dGVyKHRlcm1fMTEzMykge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybV8xMTMzLCBcIkdldHRlclwiKTtcbiAgfVxuICBleHBhbmRGdW5jdGlvbkRlY2xhcmF0aW9uKHRlcm1fMTEzNCkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybV8xMTM0LCBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIik7XG4gIH1cbiAgZXhwYW5kRnVuY3Rpb25FeHByZXNzaW9uKHRlcm1fMTEzNSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybV8xMTM1LCBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKTtcbiAgfVxuICBleHBhbmRDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uKHRlcm1fMTEzNikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb25cIiwge2JpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTEzNi5iaW5kaW5nKSwgb3BlcmF0b3I6IHRlcm1fMTEzNi5vcGVyYXRvciwgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMTM2LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kQXNzaWdubWVudEV4cHJlc3Npb24odGVybV8xMTM3KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiwge2JpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTEzNy5iaW5kaW5nKSwgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMTM3LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kRW1wdHlTdGF0ZW1lbnQodGVybV8xMTM4KSB7XG4gICAgcmV0dXJuIHRlcm1fMTEzODtcbiAgfVxuICBleHBhbmRMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb24odGVybV8xMTM5KSB7XG4gICAgcmV0dXJuIHRlcm1fMTEzOTtcbiAgfVxuICBleHBhbmRMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24odGVybV8xMTQwKSB7XG4gICAgcmV0dXJuIHRlcm1fMTE0MDtcbiAgfVxuICBleHBhbmRMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uKHRlcm1fMTE0MSkge1xuICAgIHJldHVybiB0ZXJtXzExNDE7XG4gIH1cbiAgZXhwYW5kSWRlbnRpZmllckV4cHJlc3Npb24odGVybV8xMTQyKSB7XG4gICAgbGV0IHRyYW5zXzExNDMgPSB0aGlzLmNvbnRleHQuZW52LmdldCh0ZXJtXzExNDIubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkpO1xuICAgIGlmICh0cmFuc18xMTQzKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7bmFtZTogdHJhbnNfMTE0My5pZH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVybV8xMTQyO1xuICB9XG4gIGV4cGFuZExpdGVyYWxOdWxsRXhwcmVzc2lvbih0ZXJtXzExNDQpIHtcbiAgICByZXR1cm4gdGVybV8xMTQ0O1xuICB9XG4gIGV4cGFuZExpdGVyYWxTdHJpbmdFeHByZXNzaW9uKHRlcm1fMTE0NSkge1xuICAgIHJldHVybiB0ZXJtXzExNDU7XG4gIH1cbiAgZXhwYW5kTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb24odGVybV8xMTQ2KSB7XG4gICAgcmV0dXJuIHRlcm1fMTE0NjtcbiAgfVxufVxuIl19 + exports.default = Syntax; + //# sourceMappingURL=data:application/json;base64,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R0FBTCxFQUFQO0FBQ0Q7QUFDRCxXQUFPLEtBQUssS0FBTCxDQUFXLEtBQWxCO0FBQ0Q7QUFsV3lCO2tCQUFQLE0iLCJmaWxlIjoic3ludGF4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbmltcG9ydCB7IExpc3QsIE1hcCB9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXBcIjtcbmltcG9ydCB7IE1heWJlIH0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQgeyBUb2tlblR5cGUsIFRva2VuQ2xhc3MgfSBmcm9tIFwic2hpZnQtcGFyc2VyL2Rpc3QvdG9rZW5pemVyXCI7XG5cbnR5cGUgVG9rZW4gPSB7XG4gIHR5cGU6IGFueTtcbiAgdmFsdWU6IGFueTtcbiAgc2xpY2U6IGFueTtcbn07XG5cbnR5cGUgVG9rZW5UYWcgPVxuICAnbnVsbCcgfFxuICAnbnVtYmVyJyB8XG4gICdzdHJpbmcnIHxcbiAgJ3B1bmN0dWF0b3InIHxcbiAgJ2tleXdvcmQnIHxcbiAgJ2lkZW50aWZpZXInIHxcbiAgJ3JlZ3VsYXJFeHByZXNzaW9uJyB8XG4gICdib29sZWFuJyB8XG4gICdicmFjZXMnIHxcbiAgJ3BhcmVucycgfFxuICAnZGVsaW1pdGVyJyB8XG4gICdlb2YnIHxcbiAgJ3RlbXBsYXRlJyB8XG4gICdhc3NpZ24nIHxcbiAgJ3N5bnRheFRlbXBsYXRlJyB8XG4gICdicmFja2V0cydcblxuZnVuY3Rpb24gZ2V0Rmlyc3RTbGljZShzdHg6ID9TeW50YXgpIHtcbiAgaWYgKCghc3R4KSB8fCB0eXBlb2Ygc3R4LmlzRGVsaW1pdGVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDsgLy8gVE9ETzogc2hvdWxkIG5vdCBoYXZlIHRvIGRvIHRoaXNcbiAgaWYgKCFzdHguaXNEZWxpbWl0ZXIoKSkge1xuICAgIHJldHVybiBzdHgudG9rZW4uc2xpY2U7XG4gIH1cbiAgcmV0dXJuIHN0eC50b2tlbi5nZXQoMCkudG9rZW4uc2xpY2U7XG59XG5cbmZ1bmN0aW9uIHNpemVEZWNlbmRpbmcoYSwgYikge1xuICBpZiAoYS5zY29wZXMuc2l6ZSA+IGIuc2NvcGVzLnNpemUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYi5zY29wZXMuc2l6ZSA+IGEuc2NvcGVzLnNpemUpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG50eXBlIFR5cGVzSGVscGVyID0ge1xuICBba2V5OiBUb2tlblRhZ106IHtcbiAgICBtYXRjaCh0b2tlbjogYW55KTogYm9vbGVhbjtcbiAgICBjcmVhdGU/OiAodmFsdWU6IGFueSwgc3R4OiA/U3ludGF4KSA9PiBTeW50YXg7XG4gIH1cbn1cblxuZXhwb3J0IGxldCBUeXBlczogVHlwZXNIZWxwZXIgPSB7XG4gIG51bGw6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZSA9PT0gVG9rZW5UeXBlLk5VTEwsXG4gICAgY3JlYXRlOiAodmFsdWUsIHN0eCkgPT4gbmV3IFN5bnRheCh7XG4gICAgICB0eXBlOiBUb2tlblR5cGUuTlVMTCxcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfSwgc3R4KVxuICB9LFxuICBudW1iZXI6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5OdW1lcmljTGl0ZXJhbCxcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IFRva2VuVHlwZS5OVU1CRVIsXG4gICAgICB2YWx1ZVxuICAgIH0sIHN0eClcbiAgfSxcbiAgc3RyaW5nOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+ICFUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmIHRva2VuLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuU3RyaW5nTGl0ZXJhbCxcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IFRva2VuVHlwZS5TVFJJTkcsXG4gICAgICBzdHI6IHZhbHVlXG4gICAgfSwgc3R4KVxuICB9LFxuICBwdW5jdHVhdG9yOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+ICFUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmIHRva2VuLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuUHVuY3R1YXRvcixcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IHtcbiAgICAgICAga2xhc3M6IFRva2VuQ2xhc3MuUHVuY3R1YXRvcixcbiAgICAgICAgbmFtZTogdmFsdWVcbiAgICAgIH0sXG4gICAgICB2YWx1ZVxuICAgIH0sIHN0eClcbiAgfSxcbiAga2V5d29yZDoge1xuXHRcdG1hdGNoOiB0b2tlbiA9PiAhVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi50eXBlLmtsYXNzID09PSBUb2tlbkNsYXNzLktleXdvcmQsXG4gICAgY3JlYXRlOiAodmFsdWUsIHN0eCkgPT4gbmV3IFN5bnRheCh7XG4gICAgICB0eXBlOiB7XG4gICAgICAgIGtsYXNzOiBUb2tlbkNsYXNzLktleXdvcmQsXG4gICAgICAgIG5hbWU6IHZhbHVlXG4gICAgICB9LFxuICAgICAgdmFsdWVcbiAgICB9LCBzdHgpXG4gIH0sXG4gIGlkZW50aWZpZXI6IHtcblx0XHRtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5JZGVudCxcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IFRva2VuVHlwZS5JREVOVElGSUVSLFxuICAgICAgdmFsdWVcbiAgICB9LCBzdHgpXG4gIH0sXG4gIHJlZ3VsYXJFeHByZXNzaW9uOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+ICFUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmIHRva2VuLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuUmVndWxhckV4cHJlc3Npb24sXG4gICAgY3JlYXRlOiAodmFsdWUsIHN0eCkgPT4gbmV3IFN5bnRheCh7XG4gICAgICB0eXBlOiBUb2tlblR5cGUuUkVHRVhQLFxuICAgICAgdmFsdWVcbiAgICB9LCBzdHgpXG4gIH0sXG4gIGJyYWNlczoge1xuXHRcdG1hdGNoOiB0b2tlbiA9PiBUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmXG4gICAgICAgICAgIHRva2VuLmdldCgwKS50b2tlbi50eXBlID09PSBUb2tlblR5cGUuTEJSQUNFLFxuICAgIGNyZWF0ZTogKGlubmVyLCBzdHgpID0+IHtcbiAgICAgIGxldCBsZWZ0ID0gbmV3IFN5bnRheCh7XG4gICAgICAgIHR5cGU6IFRva2VuVHlwZS5MQlJBQ0UsXG4gICAgICAgIHZhbHVlOiBcIntcIixcbiAgICAgICAgc2xpY2U6IGdldEZpcnN0U2xpY2Uoc3R4KVxuICAgICAgfSk7XG4gICAgICBsZXQgcmlnaHQgPSBuZXcgU3ludGF4KHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLlJCUkFDRSxcbiAgICAgICAgdmFsdWU6IFwifVwiLFxuICAgICAgICBzbGljZTogZ2V0Rmlyc3RTbGljZShzdHgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgU3ludGF4KExpc3Qub2YobGVmdCkuY29uY2F0KGlubmVyKS5wdXNoKHJpZ2h0KSwgc3R4KTtcbiAgICB9XG4gIH0sXG4gIGJyYWNrZXRzOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+IFR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiZcbiAgICAgICAgICAgdG9rZW4uZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MQlJBQ0ssXG4gICAgY3JlYXRlOiAoaW5uZXIsIHN0eCkgPT4ge1xuICAgICAgbGV0IGxlZnQgPSBuZXcgU3ludGF4KHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLkxCUkFDSyxcbiAgICAgICAgdmFsdWU6IFwiW1wiLFxuICAgICAgICBzbGljZTogZ2V0Rmlyc3RTbGljZShzdHgpXG4gICAgICB9KTtcbiAgICAgIGxldCByaWdodCA9IG5ldyBTeW50YXgoe1xuICAgICAgICB0eXBlOiBUb2tlblR5cGUuUkJSQUNLLFxuICAgICAgICB2YWx1ZTogXCJdXCIsXG4gICAgICAgIHNsaWNlOiBnZXRGaXJzdFNsaWNlKHN0eClcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0KS5jb25jYXQoaW5uZXIpLnB1c2gocmlnaHQpLCBzdHgpO1xuICAgIH1cbiAgfSxcbiAgcGFyZW5zOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+IFR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiZcbiAgICAgICAgICAgdG9rZW4uZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MUEFSRU4sXG4gICAgY3JlYXRlOiAoaW5uZXIsIHN0eCkgPT4ge1xuICAgICAgbGV0IGxlZnQgPSBuZXcgU3ludGF4KHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLkxQQVJFTixcbiAgICAgICAgdmFsdWU6IFwiKFwiLFxuICAgICAgICBzbGljZTogZ2V0Rmlyc3RTbGljZShzdHgpXG4gICAgICB9KTtcbiAgICAgIGxldCByaWdodCA9IG5ldyBTeW50YXgoe1xuICAgICAgICB0eXBlOiBUb2tlblR5cGUuUlBBUkVOLFxuICAgICAgICB2YWx1ZTogXCIpXCIsXG4gICAgICAgIHNsaWNlOiBnZXRGaXJzdFNsaWNlKHN0eClcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0KS5jb25jYXQoaW5uZXIpLnB1c2gocmlnaHQpLCBzdHgpO1xuICAgIH1cbiAgfSxcblxuICBhc3NpZ246IHtcbiAgICBtYXRjaDogdG9rZW4gPT4ge1xuICAgICAgaWYgKFR5cGVzLnB1bmN0dWF0b3IubWF0Y2godG9rZW4pKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiPVwiOlxuICAgICAgICAgIGNhc2UgXCJ8PVwiOlxuICAgICAgICAgIGNhc2UgXCJePVwiOlxuICAgICAgICAgIGNhc2UgXCImPVwiOlxuICAgICAgICAgIGNhc2UgXCI8PD1cIjpcbiAgICAgICAgICBjYXNlIFwiPj49XCI6XG4gICAgICAgICAgY2FzZSBcIj4+Pj1cIjpcbiAgICAgICAgICBjYXNlIFwiKz1cIjpcbiAgICAgICAgICBjYXNlIFwiLT1cIjpcbiAgICAgICAgICBjYXNlIFwiKj1cIjpcbiAgICAgICAgICBjYXNlIFwiLz1cIjpcbiAgICAgICAgICBjYXNlIFwiJT1cIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgYm9vbGVhbjoge1xuICAgIG1hdGNoOiB0b2tlbiA9PiAhVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi50eXBlID09PSBUb2tlblR5cGUuVFJVRSB8fFxuICAgICAgICAgICB0b2tlbi50eXBlID09PSBUb2tlblR5cGUuRkFMU0VcbiAgfSxcblxuICB0ZW1wbGF0ZToge1xuICAgIG1hdGNoOiB0b2tlbiA9PiAhVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi50eXBlID09PSBUb2tlblR5cGUuVEVNUExBVEVcbiAgfSxcblxuICBkZWxpbWl0ZXI6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gTGlzdC5pc0xpc3QodG9rZW4pXG4gIH0sXG5cbiAgc3ludGF4VGVtcGxhdGU6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi5nZXQoMCkudmFsKCkgPT09ICcjYCdcbiAgfSxcblxuICBlb2Y6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZSA9PT0gVG9rZW5UeXBlLkVPU1xuICB9LFxufTtcbmV4cG9ydCBjb25zdCBBTExfUEhBU0VTID0ge307XG5cbnR5cGUgU2NvcGVzZXQgPSB7XG4gIGFsbDogTGlzdDxhbnk+O1xuICBwaGFzZTogTWFwPG51bWJlciwgYW55Pjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3ludGF4IHtcbiAgLy8gdG9rZW46IFRva2VuIHwgTGlzdDxUb2tlbj47XG4gIHRva2VuOiBhbnk7XG4gIGJpbmRpbmdzOiBCaW5kaW5nTWFwO1xuICBzY29wZXNldHM6IFNjb3Blc2V0O1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuOiBhbnksIG9sZHN0eDogP3sgYmluZGluZ3M6IGFueTsgc2NvcGVzZXRzOiBhbnl9KSB7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuYmluZGluZ3MgPSBvbGRzdHggJiYgKG9sZHN0eC5iaW5kaW5ncyAhPSBudWxsKSA/IG9sZHN0eC5iaW5kaW5ncyA6IG5ldyBCaW5kaW5nTWFwKCk7XG4gICAgdGhpcy5zY29wZXNldHMgPSBvbGRzdHggJiYgKG9sZHN0eC5zY29wZXNldHMgIT0gbnVsbCkgPyBvbGRzdHguc2NvcGVzZXRzIDoge1xuICAgICAgYWxsOiBMaXN0KCksXG4gICAgICBwaGFzZTogTWFwKClcbiAgICB9O1xuICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gIH1cblxuICBzdGF0aWMgb2YodG9rZW46IFRva2VuLCBzdHg6ID9TeW50YXgpIHtcbiAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbiwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHR5cGUsIHZhbHVlLCBzdHg6ID9TeW50YXgpIHtcbiAgICBpZiAoIVR5cGVzW3R5cGVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIG5vdCBhIHZhbGlkIHR5cGVcIik7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFUeXBlc1t0eXBlXS5jcmVhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjcmVhdGUgYSBzeW50YXggZnJvbSB0eXBlIFwiICsgdHlwZSk7XG4gICAgfVxuICAgIGxldCBuZXdzdHggPSBUeXBlc1t0eXBlXS5jcmVhdGUodmFsdWUsIHN0eCk7XG4gICAgbGV0IHNsaWNlID0gZ2V0Rmlyc3RTbGljZShzdHgpO1xuICAgIGlmIChzbGljZSAhPSBudWxsKSB7XG4gICAgICBuZXdzdHgudG9rZW4uc2xpY2UgPSBzbGljZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld3N0eDtcbiAgfVxuXG4gIGZyb20odHlwZTogVG9rZW5UYWcsIHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20odHlwZSwgdmFsdWUsIHRoaXMpO1xuICB9XG5cbiAgZnJvbU51bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcIm51bGxcIiwgbnVsbCk7XG4gIH1cblxuICBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKCdudW1iZXInLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwic3RyaW5nXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21QdW5jdHVhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tS2V5d29yZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImtleXdvcmRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnJvbUlkZW50aWZpZXIodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21SZWd1bGFyRXhwcmVzc2lvbih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcInJlZ3VsYXJFeHByZXNzaW9uXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21CcmFjZXMoaW5uZXI6IExpc3Q8U3ludGF4Pikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJicmFjZXNcIiwgaW5uZXIpO1xuICB9XG5cbiAgZnJvbUJyYWNrZXRzKGlubmVyOiBMaXN0PFN5bnRheD4pIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXIpO1xuICB9XG5cbiAgZnJvbVBhcmVucyhpbm5lcjogTGlzdDxTeW50YXg+KSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcInBhcmVuc1wiLCBpbm5lcik7XG4gIH1cblxuICBzdGF0aWMgZnJvbU51bGwoc3R4OiBTeW50YXgpIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20oXCJudWxsXCIsIG51bGwsIHN0eCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwibnVtYmVyXCIsIHZhbHVlLCBzdHgpO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdHJpbmcodmFsdWUsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInN0cmluZ1wiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUHVuY3R1YXRvcih2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tS2V5d29yZCh2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwia2V5d29yZFwiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSWRlbnRpZmllcih2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwiaWRlbnRpZmllclwiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUmVndWxhckV4cHJlc3Npb24odmFsdWUsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInJlZ3VsYXJFeHByZXNzaW9uXCIsIHZhbHVlLCBzdHgpO1xuICB9XG5cbiAgc3RhdGljIGZyb21CcmFjZXMoaW5uZXIsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcImJyYWNlc1wiLCBpbm5lciwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQnJhY2tldHMoaW5uZXIsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcImJyYWNrZXRzXCIsIGlubmVyLCBzdHgpO1xuICB9XG5cbiAgc3RhdGljIGZyb21QYXJlbnMoaW5uZXIsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInBhcmVuc1wiLCBpbm5lciwgc3R4KTtcbiAgfVxuXG4gIC8vICgpIC0+IHN0cmluZ1xuICByZXNvbHZlKHBoYXNlOiBhbnkpIHtcbiAgICBhc3NlcnQocGhhc2UgIT0gbnVsbCwgXCJtdXN0IHByb3ZpZGUgYSBwaGFzZSB0byByZXNvbHZlXCIpO1xuICAgIGxldCBhbGxTY29wZXMgPSB0aGlzLnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHN0eFNjb3BlcyA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmhhcyhwaGFzZSkgPyB0aGlzLnNjb3Blc2V0cy5waGFzZS5nZXQocGhhc2UpIDogTGlzdCgpO1xuICAgIHN0eFNjb3BlcyA9IGFsbFNjb3Blcy5jb25jYXQoc3R4U2NvcGVzKTtcbiAgICBpZiAoc3R4U2NvcGVzLnNpemUgPT09IDAgfHwgISh0aGlzLm1hdGNoKCdpZGVudGlmaWVyJykgfHwgdGhpcy5tYXRjaCgna2V5d29yZCcpKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW4udmFsdWU7XG4gICAgfVxuICAgIGxldCBzY29wZSA9IHN0eFNjb3Blcy5sYXN0KCk7XG4gICAgbGV0IGJpbmRpbmdzID0gdGhpcy5iaW5kaW5ncztcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIC8vIExpc3Q8eyBzY29wZXM6IExpc3Q8U2NvcGU+LCBiaW5kaW5nOiBTeW1ib2wgfT5cbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gYmluZGluZ3MuZ2V0KHRoaXMpO1xuXG4gICAgICBpZiAoc2NvcGVzZXRCaW5kaW5nTGlzdCkge1xuICAgICAgICAvLyB7IHNjb3BlczogTGlzdDxTY29wZT4sIGJpbmRpbmc6IFN5bWJvbCB9XG4gICAgICAgIGxldCBiaWdnZXN0QmluZGluZ1BhaXIgPSBzY29wZXNldEJpbmRpbmdMaXN0LmZpbHRlcigoe3Njb3Blc30pID0+IHtcbiAgICAgICAgICByZXR1cm4gc2NvcGVzLmlzU3Vic2V0KHN0eFNjb3Blcyk7XG4gICAgICAgIH0pLnNvcnQoc2l6ZURlY2VuZGluZyk7XG5cbiAgICAgICAgaWYgKGJpZ2dlc3RCaW5kaW5nUGFpci5zaXplID49IDIgJiZcbiAgICAgICAgICAgIGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMCkuc2NvcGVzLnNpemUgPT09IGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMSkuc2NvcGVzLnNpemUpIHtcbiAgICAgICAgICBsZXQgZGVidWdCYXNlID0gJ3snICsgc3R4U2NvcGVzLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbignLCAnKSArICd9JztcbiAgICAgICAgICBsZXQgZGVidWdBbWJpZ291c1Njb3Blc2V0cyA9IGJpZ2dlc3RCaW5kaW5nUGFpci5tYXAoKHtzY29wZXN9KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gJ3snICsgc2NvcGVzLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbignLCAnKSArICd9JztcbiAgICAgICAgICB9KS5qb2luKCcsICcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2NvcGVzZXQgJyArIGRlYnVnQmFzZSArICcgaGFzIGFtYmlndW91cyBzdWJzZXRzICcgKyBkZWJ1Z0FtYmlnb3VzU2NvcGVzZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaWdnZXN0QmluZGluZ1BhaXIuc2l6ZSAhPT0gMCkge1xuICAgICAgICAgIGxldCBiaW5kaW5nU3RyID0gYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgwKS5iaW5kaW5nLnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKE1heWJlLmlzSnVzdChiaWdnZXN0QmluZGluZ1BhaXIuZ2V0KDApLmFsaWFzKSkge1xuICAgICAgICAgICAgLy8gbnVsbCBuZXZlciBoYXBwZW5zIGJlY2F1c2Ugd2UganVzdCBjaGVja2VkIGlmIGl0IGlzIGEgSnVzdFxuICAgICAgICAgICAgcmV0dXJuIGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMCkuYWxpYXMuZ2V0T3JFbHNlKG51bGwpLnJlc29sdmUocGhhc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYmluZGluZ1N0cjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlbi52YWx1ZTtcbiAgfVxuXG4gIHZhbCgpIHtcbiAgICBhc3NlcnQoIXRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2Fubm90IGdldCB0aGUgdmFsIG9mIGEgZGVsaW1pdGVyXCIpO1xuICAgIGlmICh0aGlzLm1hdGNoKFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5zdHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFwidGVtcGxhdGVcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLml0ZW1zLm1hcChlbCA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZWwubWF0Y2ggPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgICAgICByZXR1cm4gJyR7Li4ufSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsLnNsaWNlLnRleHQ7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9rZW4udmFsdWU7XG4gIH1cblxuICBsaW5lTnVtYmVyKCkge1xuICAgIGlmICghdGhpcy5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbi5saW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5nZXQoMCkubGluZU51bWJlcigpO1xuICAgIH1cbiAgfVxuXG4gIHNldExpbmVOdW1iZXIobGluZTogbnVtYmVyKSB7XG4gICAgbGV0IG5ld1RvayA9IHt9O1xuICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKCkpIHtcbiAgICAgIG5ld1RvayA9IHRoaXMudG9rZW4ubWFwKHMgPT4gcy5zZXRMaW5lTnVtYmVyKGxpbmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudG9rZW4pKSB7XG4gICAgICAgIG5ld1Rva1trZXldID0gdGhpcy50b2tlbltrZXldO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KG5ld1Rvay5zbGljZSAmJiBuZXdUb2suc2xpY2Uuc3RhcnRMb2NhdGlvbiwgJ2FsbCB0b2tlbnMgbXVzdCBoYXZlIGxpbmUgaW5mbycpO1xuICAgICAgbmV3VG9rLnNsaWNlLnN0YXJ0TG9jYXRpb24ubGluZSA9IGxpbmU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3ludGF4KG5ld1RvaywgdGhpcyk7XG4gIH1cblxuICAvLyAoKSAtPiBMaXN0PFN5bnRheD5cbiAgaW5uZXIoKSB7XG4gICAgYXNzZXJ0KHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2FuIG9ubHkgZ2V0IHRoZSBpbm5lciBvZiBhIGRlbGltaXRlclwiKTtcbiAgICByZXR1cm4gdGhpcy50b2tlbi5zbGljZSgxLCB0aGlzLnRva2VuLnNpemUgLSAxKTtcbiAgfVxuXG4gIGFkZFNjb3BlKHNjb3BlOiBhbnksIGJpbmRpbmdzOiBhbnksIHBoYXNlOiBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHsgZmxpcDogZmFsc2UgfSkge1xuICAgIGxldCB0b2tlbiA9IHRoaXMubWF0Y2goJ2RlbGltaXRlcicpID8gdGhpcy50b2tlbi5tYXAocyA9PiBzLmFkZFNjb3BlKHNjb3BlLCBiaW5kaW5ncywgcGhhc2UsIG9wdGlvbnMpKSA6IHRoaXMudG9rZW47XG4gICAgaWYgKHRoaXMubWF0Y2goJ3RlbXBsYXRlJykpIHtcbiAgICAgIHRva2VuID0gXy5tZXJnZSh0b2tlbiwge1xuICAgICAgICBpdGVtczogdG9rZW4uaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBTeW50YXggJiYgaXQubWF0Y2goJ2RlbGltaXRlcicpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXQuYWRkU2NvcGUoc2NvcGUsIGJpbmRpbmdzLCBwaGFzZSwgb3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgb2xkU2NvcGVzZXQ7XG4gICAgaWYgKHBoYXNlID09PSBBTExfUEhBU0VTKSB7XG4gICAgICBvbGRTY29wZXNldCA9IHRoaXMuc2NvcGVzZXRzLmFsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkU2NvcGVzZXQgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2UpID8gdGhpcy5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlKSA6IExpc3QoKTtcbiAgICB9XG4gICAgbGV0IG5ld1Njb3Blc2V0O1xuICAgIGlmIChvcHRpb25zLmZsaXApIHtcbiAgICAgIGxldCBpbmRleCA9IG9sZFNjb3Blc2V0LmluZGV4T2Yoc2NvcGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBuZXdTY29wZXNldCA9IG9sZFNjb3Blc2V0LnJlbW92ZShpbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTY29wZXNldCA9IG9sZFNjb3Blc2V0LnB1c2goc2NvcGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTY29wZXNldCA9IG9sZFNjb3Blc2V0LnB1c2goc2NvcGUpO1xuICAgIH1cbiAgICBsZXQgbmV3c3R4ID0ge1xuICAgICAgYmluZGluZ3MsXG4gICAgICBzY29wZXNldHM6IHtcbiAgICAgICAgYWxsOiB0aGlzLnNjb3Blc2V0cy5hbGwsXG4gICAgICAgIHBoYXNlOiB0aGlzLnNjb3Blc2V0cy5waGFzZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocGhhc2UgPT09IEFMTF9QSEFTRVMpIHtcbiAgICAgIG5ld3N0eC5zY29wZXNldHMuYWxsID0gbmV3U2NvcGVzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld3N0eC5zY29wZXNldHMucGhhc2UgPSBuZXdzdHguc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZSwgbmV3U2NvcGVzZXQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbiwgbmV3c3R4KTtcbiAgfVxuXG4gIHJlbW92ZVNjb3BlKHNjb3BlOiBhbnksIHBoYXNlOiBudW1iZXIpIHtcbiAgICBsZXQgdG9rZW4gPSB0aGlzLm1hdGNoKCdkZWxpbWl0ZXInKSA/IHRoaXMudG9rZW4ubWFwKHMgPT4gcy5yZW1vdmVTY29wZShzY29wZSwgcGhhc2UpKSA6IHRoaXMudG9rZW47XG4gICAgbGV0IHBoYXNlU2NvcGVzZXQgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2UpID8gdGhpcy5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlKSA6IExpc3QoKTtcbiAgICBsZXQgYWxsU2NvcGVzZXQgPSB0aGlzLnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IG5ld3N0eCA9IHtcbiAgICAgIGJpbmRpbmdzOiB0aGlzLmJpbmRpbmdzLFxuICAgICAgc2NvcGVzZXRzOiB7XG4gICAgICAgIGFsbDogdGhpcy5zY29wZXNldHMuYWxsLFxuICAgICAgICBwaGFzZTogdGhpcy5zY29wZXNldHMucGhhc2VcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHBoYXNlSW5kZXggPSBwaGFzZVNjb3Blc2V0LmluZGV4T2Yoc2NvcGUpO1xuICAgIGxldCBhbGxJbmRleCA9IGFsbFNjb3Blc2V0LmluZGV4T2Yoc2NvcGUpO1xuICAgIGlmIChwaGFzZUluZGV4ICE9PSAtMSkge1xuICAgICAgbmV3c3R4LnNjb3Blc2V0cy5waGFzZSA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZSwgcGhhc2VTY29wZXNldC5yZW1vdmUocGhhc2VJbmRleCkpO1xuICAgIH0gZWxzZSBpZiAoYWxsSW5kZXggIT09IC0xKSB7XG4gICAgICBuZXdzdHguc2NvcGVzZXRzLmFsbCA9IGFsbFNjb3Blc2V0LnJlbW92ZShhbGxJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuLCBuZXdzdHgpO1xuICB9XG5cbiAgbWF0Y2godHlwZTogVG9rZW5UYWcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIVR5cGVzW3R5cGVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIGFuIGludmFsaWQgdHlwZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFR5cGVzW3R5cGVdLm1hdGNoKHRoaXMudG9rZW4pICYmICh2YWx1ZSA9PSBudWxsIHx8XG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWx1ZS50ZXN0KHRoaXMudmFsKCkpIDogdGhpcy52YWwoKSA9PSB2YWx1ZSkpO1xuICB9XG5cbiAgaXNJZGVudGlmaWVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImlkZW50aWZpZXJcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNBc3NpZ24odmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYXNzaWduXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzQm9vbGVhbkxpdGVyYWwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJvb2xlYW5cIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNLZXl3b3JkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImtleXdvcmRcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNOdWxsTGl0ZXJhbCh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJudWxsXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzTnVtZXJpY0xpdGVyYWwodmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwibnVtYmVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzUHVuY3R1YXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwdW5jdHVhdG9yXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzU3RyaW5nTGl0ZXJhbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzdHJpbmdcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNSZWd1bGFyRXhwcmVzc2lvbih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1RlbXBsYXRlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInRlbXBsYXRlXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzRGVsaW1pdGVyKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImRlbGltaXRlclwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1BhcmVucyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwYXJlbnNcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNCcmFjZXModmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYnJhY2VzXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzQnJhY2tldHModmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYnJhY2tldHNcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNTeW50YXhUZW1wbGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzeW50YXhUZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0VPRih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJlb2ZcIiwgdmFsdWUpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbihcIiBcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gXCInXCIgKyB0aGlzLnRva2VuLnN0cjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goXCJ0ZW1wbGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuICB9XG59XG4iXX0= /***/ }, -/* 55 */ -/***/ function(module, exports, __webpack_require__) { +/* 47 */ +/***/ function(module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); + exports.gensym = gensym; + let internedMap = new Map(); - var _terms = __webpack_require__(28); - - var _terms2 = _interopRequireDefault(_terms); - - var _symbol = __webpack_require__(45); + let counter = 0; - var _transforms = __webpack_require__(32); - - var _errors = __webpack_require__(13); - - var _syntax = __webpack_require__(12); + function gensym(name) { + let prefix = name == null ? "s_" : name + "_"; + let sym = new Symbol(prefix + counter); + counter++; + return sym; + } - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + function Symbol(name) { + this.name = name; + } + Symbol.prototype.toString = function () { + return this.name; + }; - class ScopeApplyingReducer { - constructor(scope_0, context_1) { - this.context = context_1; - this.scope = scope_0; - } - transform(term_2) { - let field_3 = "transform" + term_2.type; - if (typeof this[field_3] === "function") { - return this[field_3](term_2); - } - (0, _errors.assert)(false, "transform not implemented yet for: " + term_2.type); - } - transformFormalParameters(term_4) { - let rest_5 = term_4.rest == null ? null : this.transform(term_4.rest); - return new _terms2.default("FormalParameters", { items: term_4.items.map(it_6 => this.transform(it_6)), rest: rest_5 }); - } - transformBindingWithDefault(term_7) { - return new _terms2.default("BindingWithDefault", { binding: this.transform(term_7.binding), init: term_7.init }); - } - transformObjectBinding(term_8) { - return term_8; - } - transformBindingPropertyIdentifier(term_9) { - return new _terms2.default("BindingPropertyIdentifier", { binding: this.transform(term_9.binding), init: term_9.init }); - } - transformBindingPropertyProperty(term_10) { - return new _terms2.default("BindingPropertyProperty", { name: term_10.name, binding: this.transform(term_10.binding) }); - } - transformArrayBinding(term_11) { - return new _terms2.default("ArrayBinding", { elements: term_11.elements.map(el_12 => this.transform(el_12)), restElement: term_11.restElement == null ? null : this.transform(term_11.restElement) }); - } - transformBindingIdentifier(term_13) { - let name_14 = term_13.name.addScope(this.scope, this.context.bindings, _syntax.ALL_PHASES); - let newBinding_15 = (0, _symbol.gensym)(name_14.val()); - this.context.env.set(newBinding_15.toString(), new _transforms.VarBindingTransform(name_14)); - this.context.bindings.add(name_14, { binding: newBinding_15, phase: this.context.phase, skipDup: true }); - return new _terms2.default("BindingIdentifier", { name: name_14 }); + function makeSymbol(name) { + if (internedMap.has(name)) { + return internedMap.get(name); + } else { + let sym = new Symbol(name); + internedMap.set(name, sym); + return sym; } } - exports.default = ScopeApplyingReducer; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2FwcGx5LXNjb3BlLWluLXBhcmFtcy1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDZSxNQUFNLG9CQUFOLENBQTJCO0FBQ3hDLGNBQVksT0FBWixFQUFxQixTQUFyQixFQUFnQztBQUM5QixTQUFLLE9BQUwsR0FBZSxTQUFmO0FBQ0EsU0FBSyxLQUFMLEdBQWEsT0FBYjtBQUNEO0FBQ0QsWUFBVSxNQUFWLEVBQWtCO0FBQ2hCLFFBQUksVUFBVSxjQUFjLE9BQU8sSUFBbkM7QUFDQSxRQUFJLE9BQU8sS0FBSyxPQUFMLENBQVAsS0FBeUIsVUFBN0IsRUFBeUM7QUFDdkMsYUFBTyxLQUFLLE9BQUwsRUFBYyxNQUFkLENBQVA7QUFDRDtBQUNELHdCQUFPLEtBQVAsRUFBYyx3Q0FBd0MsT0FBTyxJQUE3RDtBQUNEO0FBQ0QsNEJBQTBCLE1BQTFCLEVBQWtDO0FBQ2hDLFFBQUksU0FBUyxPQUFPLElBQVAsSUFBZSxJQUFmLEdBQXNCLElBQXRCLEdBQTZCLEtBQUssU0FBTCxDQUFlLE9BQU8sSUFBdEIsQ0FBMUM7QUFDQSxXQUFPLG9CQUFTLGtCQUFULEVBQTZCLEVBQUMsT0FBTyxPQUFPLEtBQVAsQ0FBYSxHQUFiLENBQWlCLFFBQVEsS0FBSyxTQUFMLENBQWUsSUFBZixDQUF6QixDQUFSLEVBQXdELE1BQU0sTUFBOUQsRUFBN0IsQ0FBUDtBQUNEO0FBQ0QsOEJBQTRCLE1BQTVCLEVBQW9DO0FBQ2xDLFdBQU8sb0JBQVMsb0JBQVQsRUFBK0IsRUFBQyxTQUFTLEtBQUssU0FBTCxDQUFlLE9BQU8sT0FBdEIsQ0FBVixFQUEwQyxNQUFNLE9BQU8sSUFBdkQsRUFBL0IsQ0FBUDtBQUNEO0FBQ0QseUJBQXVCLE1BQXZCLEVBQStCO0FBQzdCLFdBQU8sTUFBUDtBQUNEO0FBQ0QscUNBQW1DLE1BQW5DLEVBQTJDO0FBQ3pDLFdBQU8sb0JBQVMsMkJBQVQsRUFBc0MsRUFBQyxTQUFTLEtBQUssU0FBTCxDQUFlLE9BQU8sT0FBdEIsQ0FBVixFQUEwQyxNQUFNLE9BQU8sSUFBdkQsRUFBdEMsQ0FBUDtBQUNEO0FBQ0QsbUNBQWlDLE9BQWpDLEVBQTBDO0FBQ3hDLFdBQU8sb0JBQVMseUJBQVQsRUFBb0MsRUFBQyxNQUFNLFFBQVEsSUFBZixFQUFxQixTQUFTLEtBQUssU0FBTCxDQUFlLFFBQVEsT0FBdkIsQ0FBOUIsRUFBcEMsQ0FBUDtBQUNEO0FBQ0Qsd0JBQXNCLE9BQXRCLEVBQStCO0FBQzdCLFdBQU8sb0JBQVMsY0FBVCxFQUF5QixFQUFDLFVBQVUsUUFBUSxRQUFSLENBQWlCLEdBQWpCLENBQXFCLFNBQVMsS0FBSyxTQUFMLENBQWUsS0FBZixDQUE5QixDQUFYLEVBQWlFLGFBQWEsUUFBUSxXQUFSLElBQXVCLElBQXZCLEdBQThCLElBQTlCLEdBQXFDLEtBQUssU0FBTCxDQUFlLFFBQVEsV0FBdkIsQ0FBbkgsRUFBekIsQ0FBUDtBQUNEO0FBQ0QsNkJBQTJCLE9BQTNCLEVBQW9DO0FBQ2xDLFFBQUksVUFBVSxRQUFRLElBQVIsQ0FBYSxRQUFiLENBQXNCLEtBQUssS0FBM0IsRUFBa0MsS0FBSyxPQUFMLENBQWEsUUFBL0MscUJBQWQ7QUFDQSxRQUFJLGdCQUFnQixvQkFBTyxRQUFRLEdBQVIsRUFBUCxDQUFwQjtBQUNBLFNBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsY0FBYyxRQUFkLEVBQXJCLEVBQStDLG9DQUF3QixPQUF4QixDQUEvQztBQUNBLFNBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsR0FBdEIsQ0FBMEIsT0FBMUIsRUFBbUMsRUFBQyxTQUFTLGFBQVYsRUFBeUIsT0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUE3QyxFQUFvRCxTQUFTLElBQTdELEVBQW5DO0FBQ0EsV0FBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sT0FBUCxFQUE5QixDQUFQO0FBQ0Q7QUFyQ3VDO2tCQUFyQixvQiIsImZpbGUiOiJhcHBseS1zY29wZS1pbi1wYXJhbXMtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge2dlbnN5bX0gZnJvbSBcIi4vc3ltYm9sXCI7XG5pbXBvcnQge1ZhckJpbmRpbmdUcmFuc2Zvcm19IGZyb20gXCIuL3RyYW5zZm9ybXNcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY29wZUFwcGx5aW5nUmVkdWNlciB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlXzAsIGNvbnRleHRfMSkge1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRfMTtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGVfMDtcbiAgfVxuICB0cmFuc2Zvcm0odGVybV8yKSB7XG4gICAgbGV0IGZpZWxkXzMgPSBcInRyYW5zZm9ybVwiICsgdGVybV8yLnR5cGU7XG4gICAgaWYgKHR5cGVvZiB0aGlzW2ZpZWxkXzNdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0aGlzW2ZpZWxkXzNdKHRlcm1fMik7XG4gICAgfVxuICAgIGFzc2VydChmYWxzZSwgXCJ0cmFuc2Zvcm0gbm90IGltcGxlbWVudGVkIHlldCBmb3I6IFwiICsgdGVybV8yLnR5cGUpO1xuICB9XG4gIHRyYW5zZm9ybUZvcm1hbFBhcmFtZXRlcnModGVybV80KSB7XG4gICAgbGV0IHJlc3RfNSA9IHRlcm1fNC5yZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy50cmFuc2Zvcm0odGVybV80LnJlc3QpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge2l0ZW1zOiB0ZXJtXzQuaXRlbXMubWFwKGl0XzYgPT4gdGhpcy50cmFuc2Zvcm0oaXRfNikpLCByZXN0OiByZXN0XzV9KTtcbiAgfVxuICB0cmFuc2Zvcm1CaW5kaW5nV2l0aERlZmF1bHQodGVybV83KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ1dpdGhEZWZhdWx0XCIsIHtiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybSh0ZXJtXzcuYmluZGluZyksIGluaXQ6IHRlcm1fNy5pbml0fSk7XG4gIH1cbiAgdHJhbnNmb3JtT2JqZWN0QmluZGluZyh0ZXJtXzgpIHtcbiAgICByZXR1cm4gdGVybV84O1xuICB9XG4gIHRyYW5zZm9ybUJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXIodGVybV85KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllclwiLCB7YmluZGluZzogdGhpcy50cmFuc2Zvcm0odGVybV85LmJpbmRpbmcpLCBpbml0OiB0ZXJtXzkuaW5pdH0pO1xuICB9XG4gIHRyYW5zZm9ybUJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5KHRlcm1fMTApIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eVwiLCB7bmFtZTogdGVybV8xMC5uYW1lLCBiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybSh0ZXJtXzEwLmJpbmRpbmcpfSk7XG4gIH1cbiAgdHJhbnNmb3JtQXJyYXlCaW5kaW5nKHRlcm1fMTEpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiB0ZXJtXzExLmVsZW1lbnRzLm1hcChlbF8xMiA9PiB0aGlzLnRyYW5zZm9ybShlbF8xMikpLCByZXN0RWxlbWVudDogdGVybV8xMS5yZXN0RWxlbWVudCA9PSBudWxsID8gbnVsbCA6IHRoaXMudHJhbnNmb3JtKHRlcm1fMTEucmVzdEVsZW1lbnQpfSk7XG4gIH1cbiAgdHJhbnNmb3JtQmluZGluZ0lkZW50aWZpZXIodGVybV8xMykge1xuICAgIGxldCBuYW1lXzE0ID0gdGVybV8xMy5uYW1lLmFkZFNjb3BlKHRoaXMuc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUyk7XG4gICAgbGV0IG5ld0JpbmRpbmdfMTUgPSBnZW5zeW0obmFtZV8xNC52YWwoKSk7XG4gICAgdGhpcy5jb250ZXh0LmVudi5zZXQobmV3QmluZGluZ18xNS50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShuYW1lXzE0KSk7XG4gICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChuYW1lXzE0LCB7YmluZGluZzogbmV3QmluZGluZ18xNSwgcGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSwgc2tpcER1cDogdHJ1ZX0pO1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiBuYW1lXzE0fSk7XG4gIH1cbn1cbiJdfQ== + + exports.Symbol = makeSymbol; + exports.SymbolClass = Symbol; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW1ib2wuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFJZ0IsTSxHQUFBLE07QUFKaEIsSUFBSSxjQUFjLElBQUksR0FBSixFQUFsQjs7QUFFQSxJQUFJLFVBQVUsQ0FBZDs7QUFFTyxTQUFTLE1BQVQsQ0FBZ0IsSUFBaEIsRUFBc0I7QUFDM0IsTUFBSSxTQUFTLFFBQVEsSUFBUixHQUFlLElBQWYsR0FBc0IsT0FBTyxHQUExQztBQUNBLE1BQUksTUFBTSxJQUFJLE1BQUosQ0FBVyxTQUFTLE9BQXBCLENBQVY7QUFDQTtBQUNBLFNBQU8sR0FBUDtBQUNEOztBQUVELFNBQVMsTUFBVCxDQUFnQixJQUFoQixFQUFzQjtBQUNwQixPQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0Q7QUFDRCxPQUFPLFNBQVAsQ0FBaUIsUUFBakIsR0FBNEIsWUFBWTtBQUN0QyxTQUFPLEtBQUssSUFBWjtBQUNELENBRkQ7O0FBSUEsU0FBUyxVQUFULENBQW9CLElBQXBCLEVBQTBCO0FBQ3hCLE1BQUksWUFBWSxHQUFaLENBQWdCLElBQWhCLENBQUosRUFBMkI7QUFDekIsV0FBTyxZQUFZLEdBQVosQ0FBZ0IsSUFBaEIsQ0FBUDtBQUNELEdBRkQsTUFFTztBQUNMLFFBQUksTUFBTSxJQUFJLE1BQUosQ0FBVyxJQUFYLENBQVY7QUFDQSxnQkFBWSxHQUFaLENBQWdCLElBQWhCLEVBQXNCLEdBQXRCO0FBQ0EsV0FBTyxHQUFQO0FBQ0Q7QUFDRjs7UUFHZSxNLEdBQWQsVTtRQUNVLFcsR0FBVixNIiwiZmlsZSI6InN5bWJvbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImxldCBpbnRlcm5lZE1hcCA9IG5ldyBNYXAoKTtcblxubGV0IGNvdW50ZXIgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2Vuc3ltKG5hbWUpIHtcbiAgbGV0IHByZWZpeCA9IG5hbWUgPT0gbnVsbCA/IFwic19cIiA6IG5hbWUgKyBcIl9cIjtcbiAgbGV0IHN5bSA9IG5ldyBTeW1ib2wocHJlZml4ICsgY291bnRlcik7XG4gIGNvdW50ZXIrKztcbiAgcmV0dXJuIHN5bTtcbn1cblxuZnVuY3Rpb24gU3ltYm9sKG5hbWUpIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbn1cblN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5hbWU7XG59O1xuXG5mdW5jdGlvbiBtYWtlU3ltYm9sKG5hbWUpIHtcbiAgaWYgKGludGVybmVkTWFwLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiBpbnRlcm5lZE1hcC5nZXQobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHN5bSA9IG5ldyBTeW1ib2wobmFtZSk7XG4gICAgaW50ZXJuZWRNYXAuc2V0KG5hbWUsIHN5bSk7XG4gICAgcmV0dXJuIHN5bTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBtYWtlU3ltYm9sIGFzIFN5bWJvbCxcbiAgU3ltYm9sIGFzIFN5bWJvbENsYXNzXG59O1xuIl19 /***/ }, -/* 56 */ +/* 48 */ /***/ function(module, exports, __webpack_require__) { - "use strict"; + 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); + exports.sanitizeReplacementValues = sanitizeReplacementValues; + exports.evalRuntimeValues = evalRuntimeValues; + exports.evalCompiletimeValue = evalCompiletimeValue; - var _immutable = __webpack_require__(11); + var _ramda = __webpack_require__(10); - var _termExpander = __webpack_require__(54); + var _ = _interopRequireWildcard(_ramda); - var _termExpander2 = _interopRequireDefault(_termExpander); + var _immutable = __webpack_require__(3); - var _tokenExpander = __webpack_require__(50); + var _parseReducer = __webpack_require__(8); - var _tokenExpander2 = _interopRequireDefault(_tokenExpander); + var _parseReducer2 = _interopRequireDefault(_parseReducer); - var _scope = __webpack_require__(44); + var _shiftReducer = __webpack_require__(4); - var _ramda = __webpack_require__(27); + var _shiftReducer2 = _interopRequireDefault(_shiftReducer); - var _ = _interopRequireWildcard(_ramda); + var _serializer = __webpack_require__(49); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + var _syntax = __webpack_require__(46); + + var _syntax2 = _interopRequireDefault(_syntax); + + var _shiftCodegen = __webpack_require__(12); + + var _shiftCodegen2 = _interopRequireDefault(_shiftCodegen); + + var _terms = __webpack_require__(9); + + var _terms2 = _interopRequireDefault(_terms); + + var _shiftReader = __webpack_require__(42); + + var _shiftReader2 = _interopRequireDefault(_shiftReader); + + var _macroContext = __webpack_require__(55); + + var _templateProcessor = __webpack_require__(59); + + var _vm = __webpack_require__(40); + + var _vm2 = _interopRequireDefault(_vm); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - class Compiler { - constructor(phase_33, env_34, store_35, context_36) { - this.phase = phase_33; - this.env = env_34; - this.store = store_35; - this.context = context_36; - } - compile(stxl_37) { - let tokenExpander_38 = new _tokenExpander2.default(_.merge(this.context, { phase: this.phase, env: this.env, store: this.store })); - let termExpander_39 = new _termExpander2.default(_.merge(this.context, { phase: this.phase, env: this.env, store: this.store })); - return _.pipe(_.bind(tokenExpander_38.expand, tokenExpander_38), _.map(t_40 => termExpander_39.expand(t_40)))(stxl_37); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function sanitizeReplacementValues(values) { + if (Array.isArray(values)) { + return sanitizeReplacementValues((0, _immutable.List)(values)); + } else if (_immutable.List.isList(values)) { + return values.map(sanitizeReplacementValues); + } else if (values == null) { + throw new Error("replacement values for syntax template must not be null or undefined"); + } else if (typeof values.next === 'function') { + return sanitizeReplacementValues((0, _immutable.List)(values)); } + return (0, _macroContext.unwrap)(values); } - exports.default = Compiler; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2NvbXBpbGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7SUFBYSxDOzs7Ozs7QUFDRSxNQUFNLFFBQU4sQ0FBZTtBQUM1QixjQUFZLFFBQVosRUFBc0IsTUFBdEIsRUFBOEIsUUFBOUIsRUFBd0MsVUFBeEMsRUFBb0Q7QUFDbEQsU0FBSyxLQUFMLEdBQWEsUUFBYjtBQUNBLFNBQUssR0FBTCxHQUFXLE1BQVg7QUFDQSxTQUFLLEtBQUwsR0FBYSxRQUFiO0FBQ0EsU0FBSyxPQUFMLEdBQWUsVUFBZjtBQUNEO0FBQ0QsVUFBUSxPQUFSLEVBQWlCO0FBQ2YsUUFBSSxtQkFBbUIsNEJBQWtCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQixFQUFDLE9BQU8sS0FBSyxLQUFiLEVBQW9CLEtBQUssS0FBSyxHQUE5QixFQUFtQyxPQUFPLEtBQUssS0FBL0MsRUFBdEIsQ0FBbEIsQ0FBdkI7QUFDQSxRQUFJLGtCQUFrQiwyQkFBaUIsRUFBRSxLQUFGLENBQVEsS0FBSyxPQUFiLEVBQXNCLEVBQUMsT0FBTyxLQUFLLEtBQWIsRUFBb0IsS0FBSyxLQUFLLEdBQTlCLEVBQW1DLE9BQU8sS0FBSyxLQUEvQyxFQUF0QixDQUFqQixDQUF0QjtBQUNBLFdBQU8sRUFBRSxJQUFGLENBQU8sRUFBRSxJQUFGLENBQU8saUJBQWlCLE1BQXhCLEVBQWdDLGdCQUFoQyxDQUFQLEVBQTBELEVBQUUsR0FBRixDQUFNLFFBQVEsZ0JBQWdCLE1BQWhCLENBQXVCLElBQXZCLENBQWQsQ0FBMUQsRUFBdUcsT0FBdkcsQ0FBUDtBQUNEO0FBWDJCO2tCQUFULFEiLCJmaWxlIjoiY29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3R9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlci5qc1wiO1xuaW1wb3J0IFRva2VuRXhwYW5kZXIgZnJvbSBcIi4vdG9rZW4tZXhwYW5kZXJcIjtcbmltcG9ydCB7U2NvcGUsIGZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgICogYXMgXyBmcm9tIFwicmFtZGFcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBpbGVyIHtcbiAgY29uc3RydWN0b3IocGhhc2VfMzMsIGVudl8zNCwgc3RvcmVfMzUsIGNvbnRleHRfMzYpIHtcbiAgICB0aGlzLnBoYXNlID0gcGhhc2VfMzM7XG4gICAgdGhpcy5lbnYgPSBlbnZfMzQ7XG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlXzM1O1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRfMzY7XG4gIH1cbiAgY29tcGlsZShzdHhsXzM3KSB7XG4gICAgbGV0IHRva2VuRXhwYW5kZXJfMzggPSBuZXcgVG9rZW5FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge3BoYXNlOiB0aGlzLnBoYXNlLCBlbnY6IHRoaXMuZW52LCBzdG9yZTogdGhpcy5zdG9yZX0pKTtcbiAgICBsZXQgdGVybUV4cGFuZGVyXzM5ID0gbmV3IFRlcm1FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge3BoYXNlOiB0aGlzLnBoYXNlLCBlbnY6IHRoaXMuZW52LCBzdG9yZTogdGhpcy5zdG9yZX0pKTtcbiAgICByZXR1cm4gXy5waXBlKF8uYmluZCh0b2tlbkV4cGFuZGVyXzM4LmV4cGFuZCwgdG9rZW5FeHBhbmRlcl8zOCksIF8ubWFwKHRfNDAgPT4gdGVybUV4cGFuZGVyXzM5LmV4cGFuZCh0XzQwKSkpKHN0eGxfMzcpO1xuICB9XG59XG4iXX0= + + function evalRuntimeValues(terms, context) { + let prepped = terms.reduce((acc, term) => { + if ((0, _terms.isExport)(term)) { + if ((0, _terms.isVariableDeclaration)(term.declaration)) { + return acc.concat(new _terms2.default('VariableDeclarationStatement', { + declaration: term.declaration + })).concat(term.declaration.declarators.map(decl => { + return new _terms2.default('ExpressionStatement', { + expression: new _terms2.default('AssignmentExpression', { + binding: new _terms2.default('StaticMemberExpression', { + object: new _terms2.default('IdentifierExpression', { + name: _syntax2.default.fromIdentifier('exports') + }), + property: decl.binding.name + }), + expression: new _terms2.default('IdentifierExpression', { + name: decl.binding.name + }) + }) + }); + })); + } + } else if ((0, _terms.isImport)(term)) { + return acc; + } + return acc.concat(term); + }, (0, _immutable.List)()); + let parsed = (0, _shiftReducer2.default)(new _parseReducer2.default(context, false), new _terms2.default('Module', { + directives: (0, _immutable.List)(), + items: prepped + }).gen(false)); + + let gen = (0, _shiftCodegen2.default)(parsed, new _shiftCodegen.FormattedCodeGen()); + let result = context.transform(gen, { + babelrc: true, + filename: context.filename + }); + + let exportsObj = {}; + context.store.set('exports', exportsObj); + + _vm2.default.runInContext(result.code, context.store.getNodeContext()); + return exportsObj; + } + + // (Expression, Context) -> [function] + function evalCompiletimeValue(expr, context) { + let deserializer = (0, _serializer.makeDeserializer)(context.bindings); + let sandbox = { + syntaxQuote: function syntaxQuote(strings) { + for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + values[_key - 1] = arguments[_key]; + } + + let ctx = deserializer.read(_.last(values)); + let reader = new _shiftReader2.default(strings, ctx, _.take(values.length - 1, values)); + return reader.read(); + }, + syntaxTemplate: function syntaxTemplate(str) { + for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + values[_key2 - 1] = arguments[_key2]; + } + + return (0, _templateProcessor.replaceTemplate)(deserializer.read(str), sanitizeReplacementValues(values)); + } + }; + + let sandboxKeys = (0, _immutable.List)(Object.keys(sandbox)); + let sandboxVals = sandboxKeys.map(k => sandbox[k]).toArray(); + + let parsed = (0, _shiftReducer2.default)(new _parseReducer2.default(context), new _terms2.default("Module", { + directives: (0, _immutable.List)(), + items: _immutable.List.of(new _terms2.default("ExpressionStatement", { + expression: new _terms2.default("FunctionExpression", { + isGenerator: false, + name: null, + params: new _terms2.default("FormalParameters", { + items: sandboxKeys.map(param => { + return new _terms2.default("BindingIdentifier", { + name: _syntax2.default.from("identifier", param) + }); + }), + rest: null + }), + body: new _terms2.default("FunctionBody", { + directives: _immutable.List.of(new _terms2.default('Directive', { + rawValue: 'use strict' + })), + statements: _immutable.List.of(new _terms2.default("ReturnStatement", { + expression: expr + })) + }) + }) + })) + })); + + let gen = (0, _shiftCodegen2.default)(parsed, new _shiftCodegen.FormattedCodeGen()); + let result = context.transform(gen, { + babelrc: true, + filename: context.filename + }); + + let val = _vm2.default.runInContext(result.code, context.store.getNodeContext()); + return val.apply(undefined, sandboxVals); + } + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2FkLXN5bnRheC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQWdCZ0IseUIsR0FBQSx5QjtRQWFBLGlCLEdBQUEsaUI7UUE4Q0Esb0IsR0FBQSxvQjs7QUEzRWhCOztJQUFZLEM7O0FBQ1o7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7O0FBRUE7O0FBRUE7Ozs7Ozs7O0FBRU8sU0FBUyx5QkFBVCxDQUFtQyxNQUFuQyxFQUEyQztBQUNoRCxNQUFJLE1BQU0sT0FBTixDQUFjLE1BQWQsQ0FBSixFQUEyQjtBQUN6QixXQUFPLDBCQUEwQixxQkFBSyxNQUFMLENBQTFCLENBQVA7QUFDRCxHQUZELE1BRU8sSUFBSSxnQkFBSyxNQUFMLENBQVksTUFBWixDQUFKLEVBQXlCO0FBQzlCLFdBQU8sT0FBTyxHQUFQLENBQVcseUJBQVgsQ0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJLFVBQVUsSUFBZCxFQUFvQjtBQUN6QixVQUFNLElBQUksS0FBSixDQUFVLHNFQUFWLENBQU47QUFDRCxHQUZNLE1BRUEsSUFBSSxPQUFPLE9BQU8sSUFBZCxLQUF1QixVQUEzQixFQUF1QztBQUM1QyxXQUFPLDBCQUEwQixxQkFBSyxNQUFMLENBQTFCLENBQVA7QUFDRDtBQUNELFNBQU8sMEJBQU8sTUFBUCxDQUFQO0FBQ0Q7O0FBRU0sU0FBUyxpQkFBVCxDQUEyQixLQUEzQixFQUFrQyxPQUFsQyxFQUEyQztBQUNoRCxNQUFJLFVBQVUsTUFBTSxNQUFOLENBQWEsQ0FBQyxHQUFELEVBQU0sSUFBTixLQUFlO0FBQ3hDLFFBQUkscUJBQVMsSUFBVCxDQUFKLEVBQW9CO0FBQ2xCLFVBQUksa0NBQXNCLEtBQUssV0FBM0IsQ0FBSixFQUE2QztBQUMzQyxlQUFPLElBQUksTUFBSixDQUFXLG9CQUFTLDhCQUFULEVBQXlDO0FBQ3pELHVCQUFhLEtBQUs7QUFEdUMsU0FBekMsQ0FBWCxFQUVILE1BRkcsQ0FFSSxLQUFLLFdBQUwsQ0FBaUIsV0FBakIsQ0FBNkIsR0FBN0IsQ0FBaUMsUUFBUTtBQUNsRCxpQkFBTyxvQkFBUyxxQkFBVCxFQUFnQztBQUNyQyx3QkFBWSxvQkFBUyxzQkFBVCxFQUFpQztBQUMzQyx1QkFBUyxvQkFBUyx3QkFBVCxFQUFtQztBQUMxQyx3QkFBUSxvQkFBUyxzQkFBVCxFQUFpQztBQUN2Qyx3QkFBTSxpQkFBTyxjQUFQLENBQXNCLFNBQXRCO0FBRGlDLGlCQUFqQyxDQURrQztBQUkxQywwQkFBVSxLQUFLLE9BQUwsQ0FBYTtBQUptQixlQUFuQyxDQURrQztBQU8zQywwQkFBWSxvQkFBUyxzQkFBVCxFQUFpQztBQUMzQyxzQkFBTSxLQUFLLE9BQUwsQ0FBYTtBQUR3QixlQUFqQztBQVArQixhQUFqQztBQUR5QixXQUFoQyxDQUFQO0FBYUQsU0FkVSxDQUZKLENBQVA7QUFpQkQ7QUFDRixLQXBCRCxNQW9CTyxJQUFJLHFCQUFTLElBQVQsQ0FBSixFQUFvQjtBQUN6QixhQUFPLEdBQVA7QUFDRDtBQUNELFdBQU8sSUFBSSxNQUFKLENBQVcsSUFBWCxDQUFQO0FBQ0QsR0F6QmEsRUF5Qlgsc0JBekJXLENBQWQ7QUEwQkEsTUFBSSxTQUFTLDRCQUFRLDJCQUFpQixPQUFqQixFQUEwQixLQUExQixDQUFSLEVBQTBDLG9CQUFTLFFBQVQsRUFBbUI7QUFDeEUsZ0JBQVksc0JBRDREO0FBRXhFLFdBQU87QUFGaUUsR0FBbkIsRUFHcEQsR0FIb0QsQ0FHaEQsS0FIZ0QsQ0FBMUMsQ0FBYjs7QUFLQSxNQUFJLE1BQU0sNEJBQVEsTUFBUixFQUFnQixvQ0FBaEIsQ0FBVjtBQUNBLE1BQUksU0FBUyxRQUFRLFNBQVIsQ0FBa0IsR0FBbEIsRUFBdUI7QUFDbEMsYUFBUyxJQUR5QjtBQUVsQyxjQUFVLFFBQVE7QUFGZ0IsR0FBdkIsQ0FBYjs7QUFLQSxNQUFJLGFBQWEsRUFBakI7QUFDQSxVQUFRLEtBQVIsQ0FBYyxHQUFkLENBQWtCLFNBQWxCLEVBQTZCLFVBQTdCOztBQUVBLGVBQUcsWUFBSCxDQUFnQixPQUFPLElBQXZCLEVBQTZCLFFBQVEsS0FBUixDQUFjLGNBQWQsRUFBN0I7QUFDQSxTQUFPLFVBQVA7QUFDRDs7QUFFRDtBQUNPLFNBQVMsb0JBQVQsQ0FBOEIsSUFBOUIsRUFBb0MsT0FBcEMsRUFBNkM7QUFDbEQsTUFBSSxlQUFlLGtDQUFpQixRQUFRLFFBQXpCLENBQW5CO0FBQ0EsTUFBSSxVQUFVO0FBQ1osaUJBQWEscUJBQVUsT0FBVixFQUE4QjtBQUFBLHdDQUFSLE1BQVE7QUFBUixjQUFRO0FBQUE7O0FBQ3pDLFVBQUksTUFBTSxhQUFhLElBQWIsQ0FBa0IsRUFBRSxJQUFGLENBQU8sTUFBUCxDQUFsQixDQUFWO0FBQ0EsVUFBSSxTQUFTLDBCQUFXLE9BQVgsRUFBb0IsR0FBcEIsRUFBeUIsRUFBRSxJQUFGLENBQU8sT0FBTyxNQUFQLEdBQWdCLENBQXZCLEVBQTBCLE1BQTFCLENBQXpCLENBQWI7QUFDQSxhQUFPLE9BQU8sSUFBUCxFQUFQO0FBQ0QsS0FMVztBQU1aLG9CQUFnQix3QkFBUyxHQUFULEVBQXlCO0FBQUEseUNBQVIsTUFBUTtBQUFSLGNBQVE7QUFBQTs7QUFDdkMsYUFBTyx3Q0FBZ0IsYUFBYSxJQUFiLENBQWtCLEdBQWxCLENBQWhCLEVBQXdDLDBCQUEwQixNQUExQixDQUF4QyxDQUFQO0FBQ0Q7QUFSVyxHQUFkOztBQVdBLE1BQUksY0FBYyxxQkFBSyxPQUFPLElBQVAsQ0FBWSxPQUFaLENBQUwsQ0FBbEI7QUFDQSxNQUFJLGNBQWMsWUFBWSxHQUFaLENBQWdCLEtBQUssUUFBUSxDQUFSLENBQXJCLEVBQWlDLE9BQWpDLEVBQWxCOztBQUVBLE1BQUksU0FBUyw0QkFBUSwyQkFBaUIsT0FBakIsQ0FBUixFQUFtQyxvQkFBUyxRQUFULEVBQW1CO0FBQ2pFLGdCQUFZLHNCQURxRDtBQUVqRSxXQUFPLGdCQUFLLEVBQUwsQ0FBUSxvQkFBUyxxQkFBVCxFQUFnQztBQUM3QyxrQkFBWSxvQkFBUyxvQkFBVCxFQUErQjtBQUN6QyxxQkFBYSxLQUQ0QjtBQUV6QyxjQUFNLElBRm1DO0FBR3pDLGdCQUFRLG9CQUFTLGtCQUFULEVBQTZCO0FBQ25DLGlCQUFPLFlBQVksR0FBWixDQUFnQixTQUFTO0FBQzlCLG1CQUFPLG9CQUFTLG1CQUFULEVBQThCO0FBQ25DLG9CQUFNLGlCQUFPLElBQVAsQ0FBWSxZQUFaLEVBQTBCLEtBQTFCO0FBRDZCLGFBQTlCLENBQVA7QUFHRCxXQUpNLENBRDRCO0FBTW5DLGdCQUFNO0FBTjZCLFNBQTdCLENBSGlDO0FBV3pDLGNBQU0sb0JBQVMsY0FBVCxFQUF5QjtBQUM3QixzQkFBWSxnQkFBSyxFQUFMLENBQVEsb0JBQVMsV0FBVCxFQUFzQjtBQUN4QyxzQkFBVTtBQUQ4QixXQUF0QixDQUFSLENBRGlCO0FBSTdCLHNCQUFZLGdCQUFLLEVBQUwsQ0FBUSxvQkFBUyxpQkFBVCxFQUE0QjtBQUM5Qyx3QkFBWTtBQURrQyxXQUE1QixDQUFSO0FBSmlCLFNBQXpCO0FBWG1DLE9BQS9CO0FBRGlDLEtBQWhDLENBQVI7QUFGMEQsR0FBbkIsQ0FBbkMsQ0FBYjs7QUEwQkEsTUFBSSxNQUFNLDRCQUFRLE1BQVIsRUFBZ0Isb0NBQWhCLENBQVY7QUFDQSxNQUFJLFNBQVMsUUFBUSxTQUFSLENBQWtCLEdBQWxCLEVBQXVCO0FBQ2xDLGFBQVMsSUFEeUI7QUFFbEMsY0FBVSxRQUFRO0FBRmdCLEdBQXZCLENBQWI7O0FBS0EsTUFBSSxNQUFNLGFBQUcsWUFBSCxDQUFnQixPQUFPLElBQXZCLEVBQTZCLFFBQVEsS0FBUixDQUFjLGNBQWQsRUFBN0IsQ0FBVjtBQUNBLFNBQU8sSUFBSSxLQUFKLENBQVUsU0FBVixFQUFxQixXQUFyQixDQUFQO0FBQ0QiLCJmaWxlIjoibG9hZC1zeW50YXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IExpc3QgfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IFBhcnNlUmVkdWNlciBmcm9tICcuL3BhcnNlLXJlZHVjZXIuanMnO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmltcG9ydCB7IG1ha2VEZXNlcmlhbGl6ZXIgfSBmcm9tICcuL3NlcmlhbGl6ZXInO1xuaW1wb3J0IFN5bnRheCBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBjb2RlZ2VuLCB7IEZvcm1hdHRlZENvZGVHZW4gfSBmcm9tICdzaGlmdC1jb2RlZ2VuJztcbmltcG9ydCBUZXJtLCB7IGlzVmFyaWFibGVEZWNsYXJhdGlvbiwgaXNJbXBvcnQsIGlzRXhwb3J0IH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCBSZWFkZXIgZnJvbSAnLi9zaGlmdC1yZWFkZXInO1xuXG5pbXBvcnQgeyB1bndyYXAgfSBmcm9tICcuL21hY3JvLWNvbnRleHQnO1xuXG5pbXBvcnQgeyByZXBsYWNlVGVtcGxhdGUgfSBmcm9tICcuL3RlbXBsYXRlLXByb2Nlc3Nvcic7XG5cbmltcG9ydCB2bSBmcm9tIFwidm1cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUmVwbGFjZW1lbnRWYWx1ZXModmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICByZXR1cm4gc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlcyhMaXN0KHZhbHVlcykpO1xuICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHZhbHVlcykpIHtcbiAgICByZXR1cm4gdmFsdWVzLm1hcChzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKTtcbiAgfSBlbHNlIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInJlcGxhY2VtZW50IHZhbHVlcyBmb3Igc3ludGF4IHRlbXBsYXRlIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXMubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKExpc3QodmFsdWVzKSk7XG4gIH1cbiAgcmV0dXJuIHVud3JhcCh2YWx1ZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbFJ1bnRpbWVWYWx1ZXModGVybXMsIGNvbnRleHQpIHtcbiAgbGV0IHByZXBwZWQgPSB0ZXJtcy5yZWR1Y2UoKGFjYywgdGVybSkgPT4ge1xuICAgIGlmIChpc0V4cG9ydCh0ZXJtKSkge1xuICAgICAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtLmRlY2xhcmF0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChuZXcgVGVybSgnVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCcsIHtcbiAgICAgICAgICBkZWNsYXJhdGlvbjogdGVybS5kZWNsYXJhdGlvblxuICAgICAgICB9KSkuY29uY2F0KHRlcm0uZGVjbGFyYXRpb24uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwcmVzc2lvblN0YXRlbWVudCcsIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IG5ldyBUZXJtKCdBc3NpZ25tZW50RXhwcmVzc2lvbicsIHtcbiAgICAgICAgICAgICAgYmluZGluZzogbmV3IFRlcm0oJ1N0YXRpY01lbWJlckV4cHJlc3Npb24nLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiBuZXcgVGVybSgnSWRlbnRpZmllckV4cHJlc3Npb24nLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBTeW50YXguZnJvbUlkZW50aWZpZXIoJ2V4cG9ydHMnKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBkZWNsLmJpbmRpbmcubmFtZVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbmV3IFRlcm0oJ0lkZW50aWZpZXJFeHByZXNzaW9uJywge1xuICAgICAgICAgICAgICAgIG5hbWU6IGRlY2wuYmluZGluZy5uYW1lXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0ltcG9ydCh0ZXJtKSkge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG4gICAgcmV0dXJuIGFjYy5jb25jYXQodGVybSk7XG4gIH0sIExpc3QoKSk7XG4gIGxldCBwYXJzZWQgPSByZWR1Y2VyKG5ldyBQYXJzZVJlZHVjZXIoY29udGV4dCwgZmFsc2UpLCBuZXcgVGVybSgnTW9kdWxlJywge1xuICAgIGRpcmVjdGl2ZXM6IExpc3QoKSxcbiAgICBpdGVtczogcHJlcHBlZFxuICB9KS5nZW4oZmFsc2UpKTtcblxuICBsZXQgZ2VuID0gY29kZWdlbihwYXJzZWQsIG5ldyBGb3JtYXR0ZWRDb2RlR2VuKTtcbiAgbGV0IHJlc3VsdCA9IGNvbnRleHQudHJhbnNmb3JtKGdlbiwge1xuICAgIGJhYmVscmM6IHRydWUsXG4gICAgZmlsZW5hbWU6IGNvbnRleHQuZmlsZW5hbWVcbiAgfSk7XG5cbiAgbGV0IGV4cG9ydHNPYmogPSB7fTtcbiAgY29udGV4dC5zdG9yZS5zZXQoJ2V4cG9ydHMnLCBleHBvcnRzT2JqKTtcblxuICB2bS5ydW5JbkNvbnRleHQocmVzdWx0LmNvZGUsIGNvbnRleHQuc3RvcmUuZ2V0Tm9kZUNvbnRleHQoKSk7XG4gIHJldHVybiBleHBvcnRzT2JqO1xufVxuXG4vLyAoRXhwcmVzc2lvbiwgQ29udGV4dCkgLT4gW2Z1bmN0aW9uXVxuZXhwb3J0IGZ1bmN0aW9uIGV2YWxDb21waWxldGltZVZhbHVlKGV4cHIsIGNvbnRleHQpIHtcbiAgbGV0IGRlc2VyaWFsaXplciA9IG1ha2VEZXNlcmlhbGl6ZXIoY29udGV4dC5iaW5kaW5ncyk7XG4gIGxldCBzYW5kYm94ID0ge1xuICAgIHN5bnRheFF1b3RlOiBmdW5jdGlvbiAoc3RyaW5ncywgLi4udmFsdWVzKSB7XG4gICAgICBsZXQgY3R4ID0gZGVzZXJpYWxpemVyLnJlYWQoXy5sYXN0KHZhbHVlcykpO1xuICAgICAgbGV0IHJlYWRlciA9IG5ldyBSZWFkZXIoc3RyaW5ncywgY3R4LCBfLnRha2UodmFsdWVzLmxlbmd0aCAtIDEsIHZhbHVlcykpO1xuICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7XG4gICAgfSxcbiAgICBzeW50YXhUZW1wbGF0ZTogZnVuY3Rpb24oc3RyLCAuLi52YWx1ZXMpIHtcbiAgICAgIHJldHVybiByZXBsYWNlVGVtcGxhdGUoZGVzZXJpYWxpemVyLnJlYWQoc3RyKSwgc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlcyh2YWx1ZXMpKTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IHNhbmRib3hLZXlzID0gTGlzdChPYmplY3Qua2V5cyhzYW5kYm94KSk7XG4gIGxldCBzYW5kYm94VmFscyA9IHNhbmRib3hLZXlzLm1hcChrID0+IHNhbmRib3hba10pLnRvQXJyYXkoKTtcblxuICBsZXQgcGFyc2VkID0gcmVkdWNlcihuZXcgUGFyc2VSZWR1Y2VyKGNvbnRleHQpLCBuZXcgVGVybShcIk1vZHVsZVwiLCB7XG4gICAgZGlyZWN0aXZlczogTGlzdCgpLFxuICAgIGl0ZW1zOiBMaXN0Lm9mKG5ldyBUZXJtKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCB7XG4gICAgICBleHByZXNzaW9uOiBuZXcgVGVybShcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCB7XG4gICAgICAgIGlzR2VuZXJhdG9yOiBmYWxzZSxcbiAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgcGFyYW1zOiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge1xuICAgICAgICAgIGl0ZW1zOiBzYW5kYm94S2V5cy5tYXAocGFyYW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge1xuICAgICAgICAgICAgICBuYW1lOiBTeW50YXguZnJvbShcImlkZW50aWZpZXJcIiwgcGFyYW0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByZXN0OiBudWxsXG4gICAgICAgIH0pLFxuICAgICAgICBib2R5OiBuZXcgVGVybShcIkZ1bmN0aW9uQm9keVwiLCB7XG4gICAgICAgICAgZGlyZWN0aXZlczogTGlzdC5vZihuZXcgVGVybSgnRGlyZWN0aXZlJywge1xuICAgICAgICAgICAgcmF3VmFsdWU6ICd1c2Ugc3RyaWN0J1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBMaXN0Lm9mKG5ldyBUZXJtKFwiUmV0dXJuU3RhdGVtZW50XCIsIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IGV4cHJcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSkpXG4gIH0pKTtcblxuICBsZXQgZ2VuID0gY29kZWdlbihwYXJzZWQsIG5ldyBGb3JtYXR0ZWRDb2RlR2VuKTtcbiAgbGV0IHJlc3VsdCA9IGNvbnRleHQudHJhbnNmb3JtKGdlbiwge1xuICAgIGJhYmVscmM6IHRydWUsXG4gICAgZmlsZW5hbWU6IGNvbnRleHQuZmlsZW5hbWVcbiAgfSk7XG5cbiAgbGV0IHZhbCA9IHZtLnJ1bkluQ29udGV4dChyZXN1bHQuY29kZSwgY29udGV4dC5zdG9yZS5nZXROb2RlQ29udGV4dCgpKTtcbiAgcmV0dXJuIHZhbC5hcHBseSh1bmRlZmluZWQsIHNhbmRib3hWYWxzKTtcbn1cbiJdfQ== /***/ }, -/* 57 */ +/* 49 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -33148,73 +31433,110 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack }); exports.serializer = exports.makeDeserializer = undefined; - var _transitJs = __webpack_require__(58); + var _transitJs = __webpack_require__(50); var _transitJs2 = _interopRequireDefault(_transitJs); - var _immutable = __webpack_require__(11); + var _immutable = __webpack_require__(3); - var _syntax = __webpack_require__(12); + var _syntax = __webpack_require__(46); var _syntax2 = _interopRequireDefault(_syntax); - var _symbol = __webpack_require__(45); + var _symbol = __webpack_require__(47); - var _tokenizer = __webpack_require__(4); + var _tokenizer = __webpack_require__(43); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - let typeMap_630 = [_tokenizer.TokenType.STRING, _tokenizer.TokenType.EOS, _tokenizer.TokenType.LPAREN, _tokenizer.TokenType.RPAREN, _tokenizer.TokenType.LBRACK, _tokenizer.TokenType.RBRACK, _tokenizer.TokenType.LBRACE, _tokenizer.TokenType.RBRACE, _tokenizer.TokenType.COLON, _tokenizer.TokenType.SEMICOLON, _tokenizer.TokenType.PERIOD, _tokenizer.TokenType.ELLIPSIS, _tokenizer.TokenType.ARROW, _tokenizer.TokenType.CONDITIONAL, _tokenizer.TokenType.INC, _tokenizer.TokenType.DEC, _tokenizer.TokenType.ASSIGN, _tokenizer.TokenType.ASSIGN_BIT_OR, _tokenizer.TokenType.ASSIGN_BIT_XOR, _tokenizer.TokenType.ASSIGN_BIT_AND, _tokenizer.TokenType.ASSIGN_SHL, _tokenizer.TokenType.ASSIGN_SHR, _tokenizer.TokenType.ASSIGN_SHR_UNSIGNED, _tokenizer.TokenType.ASSIGN_ADD, _tokenizer.TokenType.ASSIGN_SUB, _tokenizer.TokenType.ASSIGN_MUL, _tokenizer.TokenType.ASSIGN_DIV, _tokenizer.TokenType.ASSIGN_MOD, _tokenizer.TokenType.COMMA, _tokenizer.TokenType.OR, _tokenizer.TokenType.AND, _tokenizer.TokenType.BIT_OR, _tokenizer.TokenType.BIT_XOR, _tokenizer.TokenType.BIT_AND, _tokenizer.TokenType.SHL, _tokenizer.TokenType.SHR, _tokenizer.TokenType.SHR_UNSIGNED, _tokenizer.TokenType.ADD, _tokenizer.TokenType.SUB, _tokenizer.TokenType.MUL, _tokenizer.TokenType.DIV, _tokenizer.TokenType.MOD, _tokenizer.TokenType.EQ, _tokenizer.TokenType.NE, _tokenizer.TokenType.EQ_STRICT, _tokenizer.TokenType.NE_STRICT, _tokenizer.TokenType.LT, _tokenizer.TokenType.GT, _tokenizer.TokenType.LTE, _tokenizer.TokenType.GTE, _tokenizer.TokenType.INSTANCEOF, _tokenizer.TokenType.IN, _tokenizer.TokenType.NOT, _tokenizer.TokenType.BIT_NOT, _tokenizer.TokenType.AWAIT, _tokenizer.TokenType.DELETE, _tokenizer.TokenType.TYPEOF, _tokenizer.TokenType.VOID, _tokenizer.TokenType.BREAK, _tokenizer.TokenType.CASE, _tokenizer.TokenType.CATCH, _tokenizer.TokenType.CLASS, _tokenizer.TokenType.CONTINUE, _tokenizer.TokenType.DEBUGGER, _tokenizer.TokenType.DEFAULT, _tokenizer.TokenType.DO, _tokenizer.TokenType.ELSE, _tokenizer.TokenType.EXPORT, _tokenizer.TokenType.EXTENDS, _tokenizer.TokenType.FINALLY, _tokenizer.TokenType.FOR, _tokenizer.TokenType.FUNCTION, _tokenizer.TokenType.IF, _tokenizer.TokenType.IMPORT, _tokenizer.TokenType.LET, _tokenizer.TokenType.NEW, _tokenizer.TokenType.RETURN, _tokenizer.TokenType.SUPER, _tokenizer.TokenType.SWITCH, _tokenizer.TokenType.THIS, _tokenizer.TokenType.THROW, _tokenizer.TokenType.TRY, _tokenizer.TokenType.VAR, _tokenizer.TokenType.WHILE, _tokenizer.TokenType.WITH, _tokenizer.TokenType.NULL, _tokenizer.TokenType.TRUE, _tokenizer.TokenType.FALSE, _tokenizer.TokenType.YIELD, _tokenizer.TokenType.NUMBER, _tokenizer.TokenType.STRING, _tokenizer.TokenType.REGEXP, _tokenizer.TokenType.IDENTIFIER, _tokenizer.TokenType.CONST, _tokenizer.TokenType.TEMPLATE, _tokenizer.TokenType.ILLEGAL]; - let ListHandler_631 = _transitJs2.default.makeWriteHandler({ tag: () => "array", rep: v_637 => v_637 }); - let MapHandler_632 = _transitJs2.default.makeWriteHandler({ tag: function tag(v_638) { + let typeMap = [_tokenizer.TokenType.STRING, _tokenizer.TokenType.EOS, _tokenizer.TokenType.LPAREN, _tokenizer.TokenType.RPAREN, _tokenizer.TokenType.LBRACK, _tokenizer.TokenType.RBRACK, _tokenizer.TokenType.LBRACE, _tokenizer.TokenType.RBRACE, _tokenizer.TokenType.COLON, _tokenizer.TokenType.SEMICOLON, _tokenizer.TokenType.PERIOD, _tokenizer.TokenType.ELLIPSIS, _tokenizer.TokenType.ARROW, _tokenizer.TokenType.CONDITIONAL, _tokenizer.TokenType.INC, _tokenizer.TokenType.DEC, _tokenizer.TokenType.ASSIGN, _tokenizer.TokenType.ASSIGN_BIT_OR, _tokenizer.TokenType.ASSIGN_BIT_XOR, _tokenizer.TokenType.ASSIGN_BIT_AND, _tokenizer.TokenType.ASSIGN_SHL, _tokenizer.TokenType.ASSIGN_SHR, _tokenizer.TokenType.ASSIGN_SHR_UNSIGNED, _tokenizer.TokenType.ASSIGN_ADD, _tokenizer.TokenType.ASSIGN_SUB, _tokenizer.TokenType.ASSIGN_MUL, _tokenizer.TokenType.ASSIGN_DIV, _tokenizer.TokenType.ASSIGN_MOD, _tokenizer.TokenType.COMMA, _tokenizer.TokenType.OR, _tokenizer.TokenType.AND, _tokenizer.TokenType.BIT_OR, _tokenizer.TokenType.BIT_XOR, _tokenizer.TokenType.BIT_AND, _tokenizer.TokenType.SHL, _tokenizer.TokenType.SHR, _tokenizer.TokenType.SHR_UNSIGNED, _tokenizer.TokenType.ADD, _tokenizer.TokenType.SUB, _tokenizer.TokenType.MUL, _tokenizer.TokenType.DIV, _tokenizer.TokenType.MOD, _tokenizer.TokenType.EQ, _tokenizer.TokenType.NE, _tokenizer.TokenType.EQ_STRICT, _tokenizer.TokenType.NE_STRICT, _tokenizer.TokenType.LT, _tokenizer.TokenType.GT, _tokenizer.TokenType.LTE, _tokenizer.TokenType.GTE, _tokenizer.TokenType.INSTANCEOF, _tokenizer.TokenType.IN, _tokenizer.TokenType.NOT, _tokenizer.TokenType.BIT_NOT, _tokenizer.TokenType.AWAIT, _tokenizer.TokenType.DELETE, _tokenizer.TokenType.TYPEOF, _tokenizer.TokenType.VOID, _tokenizer.TokenType.BREAK, _tokenizer.TokenType.CASE, _tokenizer.TokenType.CATCH, _tokenizer.TokenType.CLASS, _tokenizer.TokenType.CONTINUE, _tokenizer.TokenType.DEBUGGER, _tokenizer.TokenType.DEFAULT, _tokenizer.TokenType.DO, _tokenizer.TokenType.ELSE, _tokenizer.TokenType.EXPORT, _tokenizer.TokenType.EXTENDS, _tokenizer.TokenType.FINALLY, _tokenizer.TokenType.FOR, _tokenizer.TokenType.FUNCTION, _tokenizer.TokenType.IF, _tokenizer.TokenType.IMPORT, _tokenizer.TokenType.LET, _tokenizer.TokenType.NEW, _tokenizer.TokenType.RETURN, _tokenizer.TokenType.SUPER, _tokenizer.TokenType.SWITCH, _tokenizer.TokenType.THIS, _tokenizer.TokenType.THROW, _tokenizer.TokenType.TRY, _tokenizer.TokenType.VAR, _tokenizer.TokenType.WHILE, _tokenizer.TokenType.WITH, _tokenizer.TokenType.NULL, _tokenizer.TokenType.TRUE, _tokenizer.TokenType.FALSE, _tokenizer.TokenType.YIELD, _tokenizer.TokenType.NUMBER, _tokenizer.TokenType.STRING, _tokenizer.TokenType.REGEXP, _tokenizer.TokenType.IDENTIFIER, _tokenizer.TokenType.CONST, _tokenizer.TokenType.TEMPLATE, _tokenizer.TokenType.ILLEGAL]; + + let ListHandler = _transitJs2.default.makeWriteHandler({ + tag: () => "array", + rep: v => v + }); + + let MapHandler = _transitJs2.default.makeWriteHandler({ + tag: function tag() { return "map"; - }, rep: function rep(v_639) { - return v_639; - }, stringRep: function stringRep(v_640) { + }, + rep: function rep(v) { + return v; + }, + stringRep: function stringRep() { return null; - } }); - let SyntaxHandler_633 = _transitJs2.default.makeWriteHandler({ tag: () => "stx", rep: v_641 => { - if (_immutable.List.isList(v_641.token)) { - return [v_641.token, v_641.scopesets]; + } + }); + + let SyntaxHandler = _transitJs2.default.makeWriteHandler({ + tag: () => "stx", + rep: v => { + if (_immutable.List.isList(v.token)) { + return [v.token, v.scopesets]; } else { - let t = _transitJs2.default.objectToMap(v_641.token); - t.set("type", typeMap_630.indexOf(v_641.token.type)); - return [t, v_641.scopesets]; - } - } }); - let SymbolHandler_634 = _transitJs2.default.makeWriteHandler({ tag: () => "symb", rep: v_642 => [v_642.name] }); - let writer_635 = _transitJs2.default.writer("json", { handlers: _transitJs2.default.map([_immutable.List, ListHandler_631, _immutable.Map, MapHandler_632, _syntax2.default, SyntaxHandler_633, _symbol.SymbolClass, SymbolHandler_634]) }); - function makeReader_636(bindings_643) { - return _transitJs2.default.reader("json", { arrayBuilder: { init: node_644 => (0, _immutable.List)().asMutable(), add: (ret_645, val_646, node_647) => ret_645.push(val_646), finalize: (ret_648, node_649) => ret_648.asImmutable(), fromArray: (arr_650, node_651) => (0, _immutable.List)(arr_650) }, mapBuilder: { init: function init(node_652) { + let t = _transitJs2.default.objectToMap(v.token); + t.set("type", typeMap.indexOf(v.token.type)); + return [t, v.scopesets]; + } + } + }); + let SymbolHandler = _transitJs2.default.makeWriteHandler({ + tag: () => "symb", + rep: v => [v.name] + }); + + let writer = _transitJs2.default.writer("json", { + handlers: _transitJs2.default.map([_immutable.List, ListHandler, _immutable.Map, MapHandler, _syntax2.default, SyntaxHandler, _symbol.SymbolClass, SymbolHandler]) + }); + + function makeReader(bindings) { + return _transitJs2.default.reader("json", { + arrayBuilder: { + init: () => (0, _immutable.List)().asMutable(), + add: (ret, val) => ret.push(val), + finalize: ret => ret.asImmutable(), + fromArray: arr => (0, _immutable.List)(arr) + }, + mapBuilder: { + init: function init() { return (0, _immutable.Map)().asMutable(); - }, add: function add(ret_653, key_654, val_655, node_656) { - return ret_653.set(key_654, val_655); - }, finalize: function finalize(ret_657, node_658) { - return ret_657.asImmutable(); - } }, handlers: { stx: rep_659 => { - let scopesets_660 = _transitJs2.default.mapToObject(rep_659[1]); - if (_immutable.List.isList(rep_659[0])) { - let token = rep_659[0]; - return new _syntax2.default(token, { bindings: bindings_643, scopesets: scopesets_660 }); + }, + add: function add(ret, key, val) { + return ret.set(key, val); + }, + finalize: function finalize(ret) { + return ret.asImmutable(); + } + }, + handlers: { + "stx": rep => { + let scopesets = _transitJs2.default.mapToObject(rep[1]); + if (_immutable.List.isList(rep[0])) { + let token = rep[0]; + return new _syntax2.default(token, { bindings: bindings, scopesets: scopesets }); } else { - let token = _transitJs2.default.mapToObject(rep_659[0]); - token.type = typeMap_630[rep_659[0].get("type")]; - token.slice = rep_659[0].has("slice") ? _transitJs2.default.mapToObject(rep_659[0].get("slice")) : undefined; + let token = _transitJs2.default.mapToObject(rep[0]); + token.type = typeMap[rep[0].get("type")]; + token.slice = rep[0].has("slice") ? _transitJs2.default.mapToObject(rep[0].get("slice")) : undefined; if (token.slice) { token.slice.startLocation = _transitJs2.default.mapToObject(token.slice.startLocation); } - return new _syntax2.default(token, { bindings: bindings_643, scopesets: scopesets_660 }); + return new _syntax2.default(token, { bindings: bindings, scopesets: scopesets }); } - }, symb: rep_661 => { - return (0, _symbol.Symbol)(rep_661[0]); - } } }); + }, + "symb": rep => { + return (0, _symbol.Symbol)(rep[0]); + } + } + }); } - exports.makeDeserializer = makeReader_636; - exports.serializer = writer_635; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3NlcmlhbGl6ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBLElBQUksY0FBYyxDQUFDLHFCQUFVLE1BQVgsRUFBbUIscUJBQVUsR0FBN0IsRUFBa0MscUJBQVUsTUFBNUMsRUFBb0QscUJBQVUsTUFBOUQsRUFBc0UscUJBQVUsTUFBaEYsRUFBd0YscUJBQVUsTUFBbEcsRUFBMEcscUJBQVUsTUFBcEgsRUFBNEgscUJBQVUsTUFBdEksRUFBOEkscUJBQVUsS0FBeEosRUFBK0oscUJBQVUsU0FBekssRUFBb0wscUJBQVUsTUFBOUwsRUFBc00scUJBQVUsUUFBaE4sRUFBME4scUJBQVUsS0FBcE8sRUFBMk8scUJBQVUsV0FBclAsRUFBa1EscUJBQVUsR0FBNVEsRUFBaVIscUJBQVUsR0FBM1IsRUFBZ1MscUJBQVUsTUFBMVMsRUFBa1QscUJBQVUsYUFBNVQsRUFBMlUscUJBQVUsY0FBclYsRUFBcVcscUJBQVUsY0FBL1csRUFBK1gscUJBQVUsVUFBelksRUFBcVoscUJBQVUsVUFBL1osRUFBMmEscUJBQVUsbUJBQXJiLEVBQTBjLHFCQUFVLFVBQXBkLEVBQWdlLHFCQUFVLFVBQTFlLEVBQXNmLHFCQUFVLFVBQWhnQixFQUE0Z0IscUJBQVUsVUFBdGhCLEVBQWtpQixxQkFBVSxVQUE1aUIsRUFBd2pCLHFCQUFVLEtBQWxrQixFQUF5a0IscUJBQVUsRUFBbmxCLEVBQXVsQixxQkFBVSxHQUFqbUIsRUFBc21CLHFCQUFVLE1BQWhuQixFQUF3bkIscUJBQVUsT0FBbG9CLEVBQTJvQixxQkFBVSxPQUFycEIsRUFBOHBCLHFCQUFVLEdBQXhxQixFQUE2cUIscUJBQVUsR0FBdnJCLEVBQTRyQixxQkFBVSxZQUF0c0IsRUFBb3RCLHFCQUFVLEdBQTl0QixFQUFtdUIscUJBQVUsR0FBN3VCLEVBQWt2QixxQkFBVSxHQUE1dkIsRUFBaXdCLHFCQUFVLEdBQTN3QixFQUFneEIscUJBQVUsR0FBMXhCLEVBQSt4QixxQkFBVSxFQUF6eUIsRUFBNnlCLHFCQUFVLEVBQXZ6QixFQUEyekIscUJBQVUsU0FBcjBCLEVBQWcxQixxQkFBVSxTQUExMUIsRUFBcTJCLHFCQUFVLEVBQS8yQixFQUFtM0IscUJBQVUsRUFBNzNCLEVBQWk0QixxQkFBVSxHQUEzNEIsRUFBZzVCLHFCQUFVLEdBQTE1QixFQUErNUIscUJBQVUsVUFBejZCLEVBQXE3QixxQkFBVSxFQUEvN0IsRUFBbThCLHFCQUFVLEdBQTc4QixFQUFrOUIscUJBQVUsT0FBNTlCLEVBQXErQixxQkFBVSxLQUEvK0IsRUFBcy9CLHFCQUFVLE1BQWhnQyxFQUF3Z0MscUJBQVUsTUFBbGhDLEVBQTBoQyxxQkFBVSxJQUFwaUMsRUFBMGlDLHFCQUFVLEtBQXBqQyxFQUEyakMscUJBQVUsSUFBcmtDLEVBQTJrQyxxQkFBVSxLQUFybEMsRUFBNGxDLHFCQUFVLEtBQXRtQyxFQUE2bUMscUJBQVUsUUFBdm5DLEVBQWlvQyxxQkFBVSxRQUEzb0MsRUFBcXBDLHFCQUFVLE9BQS9wQyxFQUF3cUMscUJBQVUsRUFBbHJDLEVBQXNyQyxxQkFBVSxJQUFoc0MsRUFBc3NDLHFCQUFVLE1BQWh0QyxFQUF3dEMscUJBQVUsT0FBbHVDLEVBQTJ1QyxxQkFBVSxPQUFydkMsRUFBOHZDLHFCQUFVLEdBQXh3QyxFQUE2d0MscUJBQVUsUUFBdnhDLEVBQWl5QyxxQkFBVSxFQUEzeUMsRUFBK3lDLHFCQUFVLE1BQXp6QyxFQUFpMEMscUJBQVUsR0FBMzBDLEVBQWcxQyxxQkFBVSxHQUExMUMsRUFBKzFDLHFCQUFVLE1BQXoyQyxFQUFpM0MscUJBQVUsS0FBMzNDLEVBQWs0QyxxQkFBVSxNQUE1NEMsRUFBbzVDLHFCQUFVLElBQTk1QyxFQUFvNkMscUJBQVUsS0FBOTZDLEVBQXE3QyxxQkFBVSxHQUEvN0MsRUFBbzhDLHFCQUFVLEdBQTk4QyxFQUFtOUMscUJBQVUsS0FBNzlDLEVBQW8rQyxxQkFBVSxJQUE5K0MsRUFBby9DLHFCQUFVLElBQTkvQyxFQUFvZ0QscUJBQVUsSUFBOWdELEVBQW9oRCxxQkFBVSxLQUE5aEQsRUFBcWlELHFCQUFVLEtBQS9pRCxFQUFzakQscUJBQVUsTUFBaGtELEVBQXdrRCxxQkFBVSxNQUFsbEQsRUFBMGxELHFCQUFVLE1BQXBtRCxFQUE0bUQscUJBQVUsVUFBdG5ELEVBQWtvRCxxQkFBVSxLQUE1b0QsRUFBbXBELHFCQUFVLFFBQTdwRCxFQUF1cUQscUJBQVUsT0FBanJELENBQWxCO0FBQ0EsSUFBSSxrQkFBa0Isb0JBQVEsZ0JBQVIsQ0FBeUIsRUFBQyxLQUFLLE1BQU0sT0FBWixFQUFxQixLQUFLLFNBQVMsS0FBbkMsRUFBekIsQ0FBdEI7QUFDQSxJQUFJLGlCQUFpQixvQkFBUSxnQkFBUixDQUF5QixFQUFDLEtBQUssYUFBVSxLQUFWLEVBQWlCO0FBQ25FLFdBQU8sS0FBUDtBQUNELEdBRjZDLEVBRTNDLEtBQUssYUFBVSxLQUFWLEVBQWlCO0FBQ3ZCLFdBQU8sS0FBUDtBQUNELEdBSjZDLEVBSTNDLFdBQVcsbUJBQVUsS0FBVixFQUFpQjtBQUM3QixXQUFPLElBQVA7QUFDRCxHQU42QyxFQUF6QixDQUFyQjtBQU9BLElBQUksb0JBQW9CLG9CQUFRLGdCQUFSLENBQXlCLEVBQUMsS0FBSyxNQUFNLEtBQVosRUFBbUIsS0FBSyxTQUFTO0FBQ2hGLFFBQUksZ0JBQUssTUFBTCxDQUFZLE1BQU0sS0FBbEIsQ0FBSixFQUE4QjtBQUM1QixhQUFPLENBQUMsTUFBTSxLQUFQLEVBQWMsTUFBTSxTQUFwQixDQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsVUFBSSxJQUFJLG9CQUFRLFdBQVIsQ0FBb0IsTUFBTSxLQUExQixDQUFSO0FBQ0EsUUFBRSxHQUFGLENBQU0sTUFBTixFQUFjLFlBQVksT0FBWixDQUFvQixNQUFNLEtBQU4sQ0FBWSxJQUFoQyxDQUFkO0FBQ0EsYUFBTyxDQUFDLENBQUQsRUFBSSxNQUFNLFNBQVYsQ0FBUDtBQUNEO0FBQ0YsR0FSZ0QsRUFBekIsQ0FBeEI7QUFTQSxJQUFJLG9CQUFvQixvQkFBUSxnQkFBUixDQUF5QixFQUFDLEtBQUssTUFBTSxNQUFaLEVBQW9CLEtBQUssU0FBUyxDQUFDLE1BQU0sSUFBUCxDQUFsQyxFQUF6QixDQUF4QjtBQUNBLElBQUksYUFBYSxvQkFBUSxNQUFSLENBQWUsTUFBZixFQUF1QixFQUFDLFVBQVUsb0JBQVEsR0FBUixDQUFZLGtCQUFPLGVBQVAsa0JBQTZCLGNBQTdCLG9CQUFxRCxpQkFBckQsdUJBQXFGLGlCQUFyRixDQUFaLENBQVgsRUFBdkIsQ0FBakI7QUFDQSxTQUFTLGNBQVQsQ0FBd0IsWUFBeEIsRUFBc0M7QUFDcEMsU0FBTyxvQkFBUSxNQUFSLENBQWUsTUFBZixFQUF1QixFQUFDLGNBQWMsRUFBQyxNQUFNLFlBQVksdUJBQU8sU0FBUCxFQUFuQixFQUF1QyxLQUFLLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsUUFBbkIsS0FBZ0MsUUFBUSxJQUFSLENBQWEsT0FBYixDQUE1RSxFQUFtRyxVQUFVLENBQUMsT0FBRCxFQUFVLFFBQVYsS0FBdUIsUUFBUSxXQUFSLEVBQXBJLEVBQTJKLFdBQVcsQ0FBQyxPQUFELEVBQVUsUUFBVixLQUF1QixxQkFBSyxPQUFMLENBQTdMLEVBQWYsRUFBNE4sWUFBWSxFQUFDLE1BQU0sY0FBVSxRQUFWLEVBQW9CO0FBQy9SLGVBQU8sc0JBQU0sU0FBTixFQUFQO0FBQ0QsT0FGcVEsRUFFblEsS0FBSyxhQUFVLE9BQVYsRUFBbUIsT0FBbkIsRUFBNEIsT0FBNUIsRUFBcUMsUUFBckMsRUFBK0M7QUFDckQsZUFBTyxRQUFRLEdBQVIsQ0FBWSxPQUFaLEVBQXFCLE9BQXJCLENBQVA7QUFDRCxPQUpxUSxFQUluUSxVQUFVLGtCQUFVLE9BQVYsRUFBbUIsUUFBbkIsRUFBNkI7QUFDeEMsZUFBTyxRQUFRLFdBQVIsRUFBUDtBQUNELE9BTnFRLEVBQXhPLEVBTTFCLFVBQVUsRUFBQyxLQUFLLFdBQVc7QUFDN0IsWUFBSSxnQkFBZ0Isb0JBQVEsV0FBUixDQUFvQixRQUFRLENBQVIsQ0FBcEIsQ0FBcEI7QUFDQSxZQUFJLGdCQUFLLE1BQUwsQ0FBWSxRQUFRLENBQVIsQ0FBWixDQUFKLEVBQTZCO0FBQzNCLGNBQUksUUFBUSxRQUFRLENBQVIsQ0FBWjtBQUNBLGlCQUFPLHFCQUFXLEtBQVgsRUFBa0IsRUFBQyxVQUFVLFlBQVgsRUFBeUIsV0FBVyxhQUFwQyxFQUFsQixDQUFQO0FBQ0QsU0FIRCxNQUdPO0FBQ0wsY0FBSSxRQUFRLG9CQUFRLFdBQVIsQ0FBb0IsUUFBUSxDQUFSLENBQXBCLENBQVo7QUFDQSxnQkFBTSxJQUFOLEdBQWEsWUFBWSxRQUFRLENBQVIsRUFBVyxHQUFYLENBQWUsTUFBZixDQUFaLENBQWI7QUFDQSxnQkFBTSxLQUFOLEdBQWMsUUFBUSxDQUFSLEVBQVcsR0FBWCxDQUFlLE9BQWYsSUFBMEIsb0JBQVEsV0FBUixDQUFvQixRQUFRLENBQVIsRUFBVyxHQUFYLENBQWUsT0FBZixDQUFwQixDQUExQixHQUF5RSxTQUF2RjtBQUNBLGNBQUksTUFBTSxLQUFWLEVBQWlCO0FBQ2Ysa0JBQU0sS0FBTixDQUFZLGFBQVosR0FBNEIsb0JBQVEsV0FBUixDQUFvQixNQUFNLEtBQU4sQ0FBWSxhQUFoQyxDQUE1QjtBQUNEO0FBQ0QsaUJBQU8scUJBQVcsS0FBWCxFQUFrQixFQUFDLFVBQVUsWUFBWCxFQUF5QixXQUFXLGFBQXBDLEVBQWxCLENBQVA7QUFDRDtBQUNGLE9BZGEsRUFjWCxNQUFNLFdBQVc7QUFDbEIsZUFBTyxvQkFBTyxRQUFRLENBQVIsQ0FBUCxDQUFQO0FBQ0QsT0FoQmEsRUFOZ0IsRUFBdkIsQ0FBUDtBQXVCRDtRQUN5QixnQixHQUFsQixjO1FBQWtELFUsR0FBZCxVIiwiZmlsZSI6InNlcmlhbGl6ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHJhbnNpdCBmcm9tIFwidHJhbnNpdC1qc1wiO1xuaW1wb3J0IHtMaXN0LCBNYXB9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCBTeW50YXggZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge1N5bWJvbCwgZ2Vuc3ltLCBTeW1ib2xDbGFzc30gZnJvbSBcIi4vc3ltYm9sXCI7XG5pbXBvcnQge1Rva2VuQ2xhc3MsIFRva2VuVHlwZX0gZnJvbSBcInNoaWZ0LXBhcnNlci9kaXN0L3Rva2VuaXplclwiO1xubGV0IHR5cGVNYXBfNjMwID0gW1Rva2VuVHlwZS5TVFJJTkcsIFRva2VuVHlwZS5FT1MsIFRva2VuVHlwZS5MUEFSRU4sIFRva2VuVHlwZS5SUEFSRU4sIFRva2VuVHlwZS5MQlJBQ0ssIFRva2VuVHlwZS5SQlJBQ0ssIFRva2VuVHlwZS5MQlJBQ0UsIFRva2VuVHlwZS5SQlJBQ0UsIFRva2VuVHlwZS5DT0xPTiwgVG9rZW5UeXBlLlNFTUlDT0xPTiwgVG9rZW5UeXBlLlBFUklPRCwgVG9rZW5UeXBlLkVMTElQU0lTLCBUb2tlblR5cGUuQVJST1csIFRva2VuVHlwZS5DT05ESVRJT05BTCwgVG9rZW5UeXBlLklOQywgVG9rZW5UeXBlLkRFQywgVG9rZW5UeXBlLkFTU0lHTiwgVG9rZW5UeXBlLkFTU0lHTl9CSVRfT1IsIFRva2VuVHlwZS5BU1NJR05fQklUX1hPUiwgVG9rZW5UeXBlLkFTU0lHTl9CSVRfQU5ELCBUb2tlblR5cGUuQVNTSUdOX1NITCwgVG9rZW5UeXBlLkFTU0lHTl9TSFIsIFRva2VuVHlwZS5BU1NJR05fU0hSX1VOU0lHTkVELCBUb2tlblR5cGUuQVNTSUdOX0FERCwgVG9rZW5UeXBlLkFTU0lHTl9TVUIsIFRva2VuVHlwZS5BU1NJR05fTVVMLCBUb2tlblR5cGUuQVNTSUdOX0RJViwgVG9rZW5UeXBlLkFTU0lHTl9NT0QsIFRva2VuVHlwZS5DT01NQSwgVG9rZW5UeXBlLk9SLCBUb2tlblR5cGUuQU5ELCBUb2tlblR5cGUuQklUX09SLCBUb2tlblR5cGUuQklUX1hPUiwgVG9rZW5UeXBlLkJJVF9BTkQsIFRva2VuVHlwZS5TSEwsIFRva2VuVHlwZS5TSFIsIFRva2VuVHlwZS5TSFJfVU5TSUdORUQsIFRva2VuVHlwZS5BREQsIFRva2VuVHlwZS5TVUIsIFRva2VuVHlwZS5NVUwsIFRva2VuVHlwZS5ESVYsIFRva2VuVHlwZS5NT0QsIFRva2VuVHlwZS5FUSwgVG9rZW5UeXBlLk5FLCBUb2tlblR5cGUuRVFfU1RSSUNULCBUb2tlblR5cGUuTkVfU1RSSUNULCBUb2tlblR5cGUuTFQsIFRva2VuVHlwZS5HVCwgVG9rZW5UeXBlLkxURSwgVG9rZW5UeXBlLkdURSwgVG9rZW5UeXBlLklOU1RBTkNFT0YsIFRva2VuVHlwZS5JTiwgVG9rZW5UeXBlLk5PVCwgVG9rZW5UeXBlLkJJVF9OT1QsIFRva2VuVHlwZS5BV0FJVCwgVG9rZW5UeXBlLkRFTEVURSwgVG9rZW5UeXBlLlRZUEVPRiwgVG9rZW5UeXBlLlZPSUQsIFRva2VuVHlwZS5CUkVBSywgVG9rZW5UeXBlLkNBU0UsIFRva2VuVHlwZS5DQVRDSCwgVG9rZW5UeXBlLkNMQVNTLCBUb2tlblR5cGUuQ09OVElOVUUsIFRva2VuVHlwZS5ERUJVR0dFUiwgVG9rZW5UeXBlLkRFRkFVTFQsIFRva2VuVHlwZS5ETywgVG9rZW5UeXBlLkVMU0UsIFRva2VuVHlwZS5FWFBPUlQsIFRva2VuVHlwZS5FWFRFTkRTLCBUb2tlblR5cGUuRklOQUxMWSwgVG9rZW5UeXBlLkZPUiwgVG9rZW5UeXBlLkZVTkNUSU9OLCBUb2tlblR5cGUuSUYsIFRva2VuVHlwZS5JTVBPUlQsIFRva2VuVHlwZS5MRVQsIFRva2VuVHlwZS5ORVcsIFRva2VuVHlwZS5SRVRVUk4sIFRva2VuVHlwZS5TVVBFUiwgVG9rZW5UeXBlLlNXSVRDSCwgVG9rZW5UeXBlLlRISVMsIFRva2VuVHlwZS5USFJPVywgVG9rZW5UeXBlLlRSWSwgVG9rZW5UeXBlLlZBUiwgVG9rZW5UeXBlLldISUxFLCBUb2tlblR5cGUuV0lUSCwgVG9rZW5UeXBlLk5VTEwsIFRva2VuVHlwZS5UUlVFLCBUb2tlblR5cGUuRkFMU0UsIFRva2VuVHlwZS5ZSUVMRCwgVG9rZW5UeXBlLk5VTUJFUiwgVG9rZW5UeXBlLlNUUklORywgVG9rZW5UeXBlLlJFR0VYUCwgVG9rZW5UeXBlLklERU5USUZJRVIsIFRva2VuVHlwZS5DT05TVCwgVG9rZW5UeXBlLlRFTVBMQVRFLCBUb2tlblR5cGUuSUxMRUdBTF07XG5sZXQgTGlzdEhhbmRsZXJfNjMxID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHt0YWc6ICgpID0+IFwiYXJyYXlcIiwgcmVwOiB2XzYzNyA9PiB2XzYzN30pO1xubGV0IE1hcEhhbmRsZXJfNjMyID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHt0YWc6IGZ1bmN0aW9uICh2XzYzOCkge1xuICByZXR1cm4gXCJtYXBcIjtcbn0sIHJlcDogZnVuY3Rpb24gKHZfNjM5KSB7XG4gIHJldHVybiB2XzYzOTtcbn0sIHN0cmluZ1JlcDogZnVuY3Rpb24gKHZfNjQwKSB7XG4gIHJldHVybiBudWxsO1xufX0pO1xubGV0IFN5bnRheEhhbmRsZXJfNjMzID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHt0YWc6ICgpID0+IFwic3R4XCIsIHJlcDogdl82NDEgPT4ge1xuICBpZiAoTGlzdC5pc0xpc3Qodl82NDEudG9rZW4pKSB7XG4gICAgcmV0dXJuIFt2XzY0MS50b2tlbiwgdl82NDEuc2NvcGVzZXRzXTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdCA9IHRyYW5zaXQub2JqZWN0VG9NYXAodl82NDEudG9rZW4pO1xuICAgIHQuc2V0KFwidHlwZVwiLCB0eXBlTWFwXzYzMC5pbmRleE9mKHZfNjQxLnRva2VuLnR5cGUpKTtcbiAgICByZXR1cm4gW3QsIHZfNjQxLnNjb3Blc2V0c107XG4gIH1cbn19KTtcbmxldCBTeW1ib2xIYW5kbGVyXzYzNCA9IHRyYW5zaXQubWFrZVdyaXRlSGFuZGxlcih7dGFnOiAoKSA9PiBcInN5bWJcIiwgcmVwOiB2XzY0MiA9PiBbdl82NDIubmFtZV19KTtcbmxldCB3cml0ZXJfNjM1ID0gdHJhbnNpdC53cml0ZXIoXCJqc29uXCIsIHtoYW5kbGVyczogdHJhbnNpdC5tYXAoW0xpc3QsIExpc3RIYW5kbGVyXzYzMSwgTWFwLCBNYXBIYW5kbGVyXzYzMiwgU3ludGF4LCBTeW50YXhIYW5kbGVyXzYzMywgU3ltYm9sQ2xhc3MsIFN5bWJvbEhhbmRsZXJfNjM0XSl9KTtcbmZ1bmN0aW9uIG1ha2VSZWFkZXJfNjM2KGJpbmRpbmdzXzY0Mykge1xuICByZXR1cm4gdHJhbnNpdC5yZWFkZXIoXCJqc29uXCIsIHthcnJheUJ1aWxkZXI6IHtpbml0OiBub2RlXzY0NCA9PiBMaXN0KCkuYXNNdXRhYmxlKCksIGFkZDogKHJldF82NDUsIHZhbF82NDYsIG5vZGVfNjQ3KSA9PiByZXRfNjQ1LnB1c2godmFsXzY0NiksIGZpbmFsaXplOiAocmV0XzY0OCwgbm9kZV82NDkpID0+IHJldF82NDguYXNJbW11dGFibGUoKSwgZnJvbUFycmF5OiAoYXJyXzY1MCwgbm9kZV82NTEpID0+IExpc3QoYXJyXzY1MCl9LCBtYXBCdWlsZGVyOiB7aW5pdDogZnVuY3Rpb24gKG5vZGVfNjUyKSB7XG4gICAgcmV0dXJuIE1hcCgpLmFzTXV0YWJsZSgpO1xuICB9LCBhZGQ6IGZ1bmN0aW9uIChyZXRfNjUzLCBrZXlfNjU0LCB2YWxfNjU1LCBub2RlXzY1Nikge1xuICAgIHJldHVybiByZXRfNjUzLnNldChrZXlfNjU0LCB2YWxfNjU1KTtcbiAgfSwgZmluYWxpemU6IGZ1bmN0aW9uIChyZXRfNjU3LCBub2RlXzY1OCkge1xuICAgIHJldHVybiByZXRfNjU3LmFzSW1tdXRhYmxlKCk7XG4gIH19LCBoYW5kbGVyczoge3N0eDogcmVwXzY1OSA9PiB7XG4gICAgbGV0IHNjb3Blc2V0c182NjAgPSB0cmFuc2l0Lm1hcFRvT2JqZWN0KHJlcF82NTlbMV0pO1xuICAgIGlmIChMaXN0LmlzTGlzdChyZXBfNjU5WzBdKSkge1xuICAgICAgbGV0IHRva2VuID0gcmVwXzY1OVswXTtcbiAgICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuLCB7YmluZGluZ3M6IGJpbmRpbmdzXzY0Mywgc2NvcGVzZXRzOiBzY29wZXNldHNfNjYwfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB0b2tlbiA9IHRyYW5zaXQubWFwVG9PYmplY3QocmVwXzY1OVswXSk7XG4gICAgICB0b2tlbi50eXBlID0gdHlwZU1hcF82MzBbcmVwXzY1OVswXS5nZXQoXCJ0eXBlXCIpXTtcbiAgICAgIHRva2VuLnNsaWNlID0gcmVwXzY1OVswXS5oYXMoXCJzbGljZVwiKSA/IHRyYW5zaXQubWFwVG9PYmplY3QocmVwXzY1OVswXS5nZXQoXCJzbGljZVwiKSkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAodG9rZW4uc2xpY2UpIHtcbiAgICAgICAgdG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbiA9IHRyYW5zaXQubWFwVG9PYmplY3QodG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbiwge2JpbmRpbmdzOiBiaW5kaW5nc182NDMsIHNjb3Blc2V0czogc2NvcGVzZXRzXzY2MH0pO1xuICAgIH1cbiAgfSwgc3ltYjogcmVwXzY2MSA9PiB7XG4gICAgcmV0dXJuIFN5bWJvbChyZXBfNjYxWzBdKTtcbiAgfX19KTtcbn1cbmV4cG9ydCB7bWFrZVJlYWRlcl82MzYgYXMgbWFrZURlc2VyaWFsaXplciwgd3JpdGVyXzYzNSBhcyBzZXJpYWxpemVyfTtcbiJdfQ== + + exports.makeDeserializer = makeReader; + exports.serializer = writer; + //# sourceMappingURL=data:application/json;base64,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UUFBUSxJQUFJLENBQUosRUFBTyxHQUFQLENBQVcsTUFBWCxDQUFSLENBQWI7QUFDQSxnQkFBTSxLQUFOLEdBQWMsSUFBSSxDQUFKLEVBQU8sR0FBUCxDQUFXLE9BQVgsSUFBc0Isb0JBQVEsV0FBUixDQUFvQixJQUFJLENBQUosRUFBTyxHQUFQLENBQVcsT0FBWCxDQUFwQixDQUF0QixHQUFpRSxTQUEvRTtBQUNBLGNBQUksTUFBTSxLQUFWLEVBQWlCO0FBQ2Ysa0JBQU0sS0FBTixDQUFZLGFBQVosR0FBNEIsb0JBQVEsV0FBUixDQUFvQixNQUFNLEtBQU4sQ0FBWSxhQUFoQyxDQUE1QjtBQUNEO0FBQ0QsaUJBQU8scUJBQVcsS0FBWCxFQUFrQixFQUFDLGtCQUFELEVBQVcsV0FBVyxTQUF0QixFQUFsQixDQUFQO0FBQ0Q7QUFDRixPQWZPO0FBZ0JSLGNBQVMsR0FBRCxJQUFTO0FBQ2YsZUFBTyxvQkFBTyxJQUFJLENBQUosQ0FBUCxDQUFQO0FBQ0Q7QUFsQk87QUFaa0IsR0FBdkIsQ0FBUDtBQWlDRDs7UUFHZSxnQixHQUFkLFU7UUFBMEMsVSxHQUFWLE0iLCJmaWxlIjoic2VyaWFsaXplci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0cmFuc2l0IGZyb20gXCJ0cmFuc2l0LWpzXCI7XG5pbXBvcnQgeyBMaXN0LCBNYXAgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHsgU3ltYm9sLCAgU3ltYm9sQ2xhc3MgfSBmcm9tIFwiLi9zeW1ib2xcIjtcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gXCJzaGlmdC1wYXJzZXIvZGlzdC90b2tlbml6ZXJcIjtcblxubGV0IHR5cGVNYXAgPSBbVG9rZW5UeXBlLlNUUklORywgVG9rZW5UeXBlLkVPUywgVG9rZW5UeXBlLkxQQVJFTiwgVG9rZW5UeXBlLlJQQVJFTixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5MQlJBQ0ssIFRva2VuVHlwZS5SQlJBQ0ssIFRva2VuVHlwZS5MQlJBQ0UsIFRva2VuVHlwZS5SQlJBQ0UsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuQ09MT04sIFRva2VuVHlwZS5TRU1JQ09MT04sIFRva2VuVHlwZS5QRVJJT0QsIFRva2VuVHlwZS5FTExJUFNJUyxcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5BUlJPVywgVG9rZW5UeXBlLkNPTkRJVElPTkFMLCBUb2tlblR5cGUuSU5DLCBUb2tlblR5cGUuREVDLFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkFTU0lHTiwgVG9rZW5UeXBlLkFTU0lHTl9CSVRfT1IsIFRva2VuVHlwZS5BU1NJR05fQklUX1hPUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5BU1NJR05fQklUX0FORCwgVG9rZW5UeXBlLkFTU0lHTl9TSEwsIFRva2VuVHlwZS5BU1NJR05fU0hSLFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkFTU0lHTl9TSFJfVU5TSUdORUQsIFRva2VuVHlwZS5BU1NJR05fQURELCBUb2tlblR5cGUuQVNTSUdOX1NVQixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5BU1NJR05fTVVMLCBUb2tlblR5cGUuQVNTSUdOX0RJViwgVG9rZW5UeXBlLkFTU0lHTl9NT0QsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuQ09NTUEsIFRva2VuVHlwZS5PUiwgVG9rZW5UeXBlLkFORCwgVG9rZW5UeXBlLkJJVF9PUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5CSVRfWE9SLCBUb2tlblR5cGUuQklUX0FORCwgVG9rZW5UeXBlLlNITCwgVG9rZW5UeXBlLlNIUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5TSFJfVU5TSUdORUQsIFRva2VuVHlwZS5BREQsIFRva2VuVHlwZS5TVUIsIFRva2VuVHlwZS5NVUwsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuRElWLCBUb2tlblR5cGUuTU9ELCBUb2tlblR5cGUuRVEsIFRva2VuVHlwZS5ORSxcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5FUV9TVFJJQ1QsIFRva2VuVHlwZS5ORV9TVFJJQ1QsIFRva2VuVHlwZS5MVCwgVG9rZW5UeXBlLkdULFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkxURSwgVG9rZW5UeXBlLkdURSwgVG9rZW5UeXBlLklOU1RBTkNFT0YsIFRva2VuVHlwZS5JTixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5OT1QsIFRva2VuVHlwZS5CSVRfTk9ULCBUb2tlblR5cGUuQVdBSVQsIFRva2VuVHlwZS5ERUxFVEUsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuVFlQRU9GLCBUb2tlblR5cGUuVk9JRCwgVG9rZW5UeXBlLkJSRUFLLCBUb2tlblR5cGUuQ0FTRSxcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5DQVRDSCwgVG9rZW5UeXBlLkNMQVNTLCBUb2tlblR5cGUuQ09OVElOVUUsIFRva2VuVHlwZS5ERUJVR0dFUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5ERUZBVUxULCBUb2tlblR5cGUuRE8sIFRva2VuVHlwZS5FTFNFLCBUb2tlblR5cGUuRVhQT1JULFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkVYVEVORFMsIFRva2VuVHlwZS5GSU5BTExZLCBUb2tlblR5cGUuRk9SLCBUb2tlblR5cGUuRlVOQ1RJT04sXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuSUYsIFRva2VuVHlwZS5JTVBPUlQsIFRva2VuVHlwZS5MRVQsIFRva2VuVHlwZS5ORVcsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuUkVUVVJOLCBUb2tlblR5cGUuU1VQRVIsIFRva2VuVHlwZS5TV0lUQ0gsIFRva2VuVHlwZS5USElTLFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLlRIUk9XLCBUb2tlblR5cGUuVFJZLCBUb2tlblR5cGUuVkFSLCBUb2tlblR5cGUuV0hJTEUsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuV0lUSCwgVG9rZW5UeXBlLk5VTEwsIFRva2VuVHlwZS5UUlVFLCBUb2tlblR5cGUuRkFMU0UsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuWUlFTEQsIFRva2VuVHlwZS5OVU1CRVIsIFRva2VuVHlwZS5TVFJJTkcsIFRva2VuVHlwZS5SRUdFWFAsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgVG9rZW5UeXBlLkNPTlNULCBUb2tlblR5cGUuVEVNUExBVEUsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuSUxMRUdBTF07XG5cbmxldCBMaXN0SGFuZGxlciA9IHRyYW5zaXQubWFrZVdyaXRlSGFuZGxlcih7XG4gIHRhZzogKCkgPT4gXCJhcnJheVwiLFxuICByZXA6ICh2KSA9PiB2XG59KTtcblxubGV0IE1hcEhhbmRsZXIgPSB0cmFuc2l0Lm1ha2VXcml0ZUhhbmRsZXIoe1xuICB0YWc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gXCJtYXBcIjsgfSxcbiAgcmVwOiBmdW5jdGlvbih2KSB7IHJldHVybiB2OyB9LFxuICBzdHJpbmdSZXA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbDsgfVxufSk7XG5cbmxldCBTeW50YXhIYW5kbGVyID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHtcbiAgdGFnOiAoKSA9PiBcInN0eFwiLFxuICByZXA6ICh2KSA9PiB7XG4gICAgaWYgKExpc3QuaXNMaXN0KHYudG9rZW4pKSB7XG4gICAgICByZXR1cm4gW3YudG9rZW4sIHYuc2NvcGVzZXRzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHQgPSB0cmFuc2l0Lm9iamVjdFRvTWFwKHYudG9rZW4pO1xuICAgICAgdC5zZXQoXCJ0eXBlXCIsIHR5cGVNYXAuaW5kZXhPZih2LnRva2VuLnR5cGUpKTtcbiAgICAgIHJldHVybiBbdCwgdi5zY29wZXNldHNdO1xuICAgIH1cbiAgfVxufSk7XG5sZXQgU3ltYm9sSGFuZGxlciA9IHRyYW5zaXQubWFrZVdyaXRlSGFuZGxlcih7XG4gIHRhZzogKCkgPT4gXCJzeW1iXCIsXG4gIHJlcDogKHYpID0+ICBbdi5uYW1lXVxufSk7XG5cbmxldCB3cml0ZXIgPSB0cmFuc2l0LndyaXRlcihcImpzb25cIiwge1xuICBoYW5kbGVyczogdHJhbnNpdC5tYXAoW1xuICAgIExpc3QsIExpc3RIYW5kbGVyLFxuICAgIE1hcCwgTWFwSGFuZGxlcixcbiAgICBTeW50YXgsIFN5bnRheEhhbmRsZXIsXG4gICAgU3ltYm9sQ2xhc3MsIFN5bWJvbEhhbmRsZXJcbiAgXSlcbn0pO1xuXG5mdW5jdGlvbiBtYWtlUmVhZGVyKGJpbmRpbmdzKSB7XG4gIHJldHVybiB0cmFuc2l0LnJlYWRlcihcImpzb25cIiwge1xuICAgIGFycmF5QnVpbGRlcjoge1xuICAgICAgaW5pdDogKCkgPT4gTGlzdCgpLmFzTXV0YWJsZSgpLFxuICAgICAgYWRkOiAocmV0LCB2YWwpID0+IHJldC5wdXNoKHZhbCksXG4gICAgICBmaW5hbGl6ZTogKHJldCkgPT4gcmV0LmFzSW1tdXRhYmxlKCksXG4gICAgICBmcm9tQXJyYXk6IChhcnIpID0+IExpc3QoYXJyKVxuICAgIH0sXG4gICAgbWFwQnVpbGRlcjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24oKSB7IHJldHVybiBNYXAoKS5hc011dGFibGUoKTsgfSxcbiAgICAgIGFkZDogZnVuY3Rpb24ocmV0LCBrZXksIHZhbCkgeyByZXR1cm4gcmV0LnNldChrZXksIHZhbCk7IH0sXG4gICAgICBmaW5hbGl6ZTogZnVuY3Rpb24ocmV0KSB7IHJldHVybiByZXQuYXNJbW11dGFibGUoKTsgfVxuICAgIH0sXG4gICAgaGFuZGxlcnM6IHtcbiAgICAgIFwic3R4XCI6IChyZXApID0+IHtcbiAgICAgICAgbGV0IHNjb3Blc2V0cyA9IHRyYW5zaXQubWFwVG9PYmplY3QocmVwWzFdKTtcbiAgICAgICAgaWYgKExpc3QuaXNMaXN0KHJlcFswXSkpIHtcbiAgICAgICAgICBsZXQgdG9rZW4gPSByZXBbMF07XG4gICAgICAgICAgcmV0dXJuIG5ldyBTeW50YXgodG9rZW4sIHtiaW5kaW5ncywgc2NvcGVzZXRzOiBzY29wZXNldHN9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgdG9rZW4gPSB0cmFuc2l0Lm1hcFRvT2JqZWN0KHJlcFswXSk7XG4gICAgICAgICAgdG9rZW4udHlwZSA9IHR5cGVNYXBbcmVwWzBdLmdldChcInR5cGVcIildO1xuICAgICAgICAgIHRva2VuLnNsaWNlID0gcmVwWzBdLmhhcyhcInNsaWNlXCIpID8gdHJhbnNpdC5tYXBUb09iamVjdChyZXBbMF0uZ2V0KFwic2xpY2VcIikpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0b2tlbi5zbGljZSkge1xuICAgICAgICAgICAgdG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbiA9IHRyYW5zaXQubWFwVG9PYmplY3QodG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuLCB7YmluZGluZ3MsIHNjb3Blc2V0czogc2NvcGVzZXRzfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInN5bWJcIjogKHJlcCkgPT4ge1xuICAgICAgICByZXR1cm4gU3ltYm9sKHJlcFswXSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHtcbiAgbWFrZVJlYWRlciBhcyBtYWtlRGVzZXJpYWxpemVyLCB3cml0ZXIgYXMgc2VyaWFsaXplclxufTtcbiJdfQ== /***/ }, -/* 58 */ +/* 50 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(Buffer) {// transit-js 0.8.847 @@ -35713,2484 +34035,5387 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack for (var b in this.defaults.handlers) { this.handlers[b] = this.defaults.handlers[b]; } - for (b in this.options.handlers) { - if (com.cognitect.transit.impl.decoder.isGroundHandler(b)) { - throw Error('Cannot override handler for ground type "' + b + '"'); + for (b in this.options.handlers) { + if (com.cognitect.transit.impl.decoder.isGroundHandler(b)) { + throw Error('Cannot override handler for ground type "' + b + '"'); + } + this.handlers[b] = this.options.handlers[b]; + } + this.preferStrings = null != this.options.preferStrings ? this.options.preferStrings : this.defaults.preferStrings; + this.preferBuffers = null != this.options.preferBuffers ? this.options.preferBuffers : this.defaults.preferBuffers; + this.defaultHandler = this.options.defaultHandler || this.defaults.defaultHandler; + this.mapBuilder = this.options.mapBuilder; + this.arrayBuilder = this.options.arrayBuilder; + }; + com.cognitect.transit.impl.decoder.Decoder.prototype.defaults = {handlers:{_:function(a, b) { + return com.cognitect.transit.types.nullValue(); + }, "?":function(a, b) { + return com.cognitect.transit.types.boolValue(a); + }, b:function(a, b) { + return com.cognitect.transit.types.binary(a, b); + }, i:function(a, b) { + return com.cognitect.transit.types.intValue(a); + }, n:function(a, b) { + return com.cognitect.transit.types.bigInteger(a); + }, d:function(a, b) { + return com.cognitect.transit.types.floatValue(a); + }, f:function(a, b) { + return com.cognitect.transit.types.bigDecimalValue(a); + }, c:function(a, b) { + return com.cognitect.transit.types.charValue(a); + }, ":":function(a, b) { + return com.cognitect.transit.types.keyword(a); + }, $:function(a, b) { + return com.cognitect.transit.types.symbol(a); + }, r:function(a, b) { + return com.cognitect.transit.types.uri(a); + }, z:function(a, b) { + return com.cognitect.transit.types.specialDouble(a); + }, "'":function(a, b) { + return a; + }, m:function(a, b) { + return com.cognitect.transit.types.date(a); + }, t:function(a, b) { + return com.cognitect.transit.types.verboseDate(a); + }, u:function(a, b) { + return com.cognitect.transit.types.uuid(a); + }, set:function(a, b) { + return com.cognitect.transit.types.set(a); + }, list:function(a, b) { + return com.cognitect.transit.types.list(a); + }, link:function(a, b) { + return com.cognitect.transit.types.link(a); + }, cmap:function(a, b) { + return com.cognitect.transit.types.map(a, !1); + }}, defaultHandler:function(a, b) { + return com.cognitect.transit.types.taggedValue(a, b); + }, preferStrings:!0, preferBuffers:!0}; + com.cognitect.transit.impl.decoder.Decoder.prototype.decode = function(a, b, c, d) { + if (null == a) { + return null; + } + switch(typeof a) { + case "string": + return this.decodeString(a, b, c, d); + case "object": + return com.cognitect.transit.util.isArray(a) ? "^ " === a[0] ? this.decodeArrayHash(a, b, c, d) : this.decodeArray(a, b, c, d) : this.decodeHash(a, b, c, d); + } + return a; + }; + com.cognitect.transit.impl.decoder.Decoder.prototype.decode = com.cognitect.transit.impl.decoder.Decoder.prototype.decode; + com.cognitect.transit.impl.decoder.Decoder.prototype.decodeString = function(a, b, c, d) { + return com.cognitect.transit.caching.isCacheable(a, c) ? (a = this.parseString(a, b, !1), b && b.write(a, c), a) : com.cognitect.transit.caching.isCacheCode(a) ? b.read(a, c) : this.parseString(a, b, c); + }; + com.cognitect.transit.impl.decoder.Decoder.prototype.decodeHash = function(a, b, c, d) { + c = com.cognitect.transit.util.objectKeys(a); + var e = c[0]; + d = 1 == c.length ? this.decode(e, b, !1, !1) : null; + if (com.cognitect.transit.impl.decoder.isTag(d)) { + return a = a[e], c = this.handlers[d.str], null != c ? c(this.decode(a, b, !1, !0), this) : com.cognitect.transit.types.taggedValue(d.str, this.decode(a, b, !1, !1)); + } + if (this.mapBuilder) { + if (c.length < 2 * com.cognitect.transit.types.SMALL_ARRAY_MAP_THRESHOLD && this.mapBuilder.fromArray) { + var f = []; + for (d = 0;d < c.length;d++) { + e = c[d], f.push(this.decode(e, b, !0, !1)), f.push(this.decode(a[e], b, !1, !1)); + } + return this.mapBuilder.fromArray(f, a); + } + f = this.mapBuilder.init(a); + for (d = 0;d < c.length;d++) { + e = c[d], f = this.mapBuilder.add(f, this.decode(e, b, !0, !1), this.decode(a[e], b, !1, !1), a); + } + return this.mapBuilder.finalize(f, a); + } + f = []; + for (d = 0;d < c.length;d++) { + e = c[d], f.push(this.decode(e, b, !0, !1)), f.push(this.decode(a[e], b, !1, !1)); + } + return com.cognitect.transit.types.map(f, !1); + }; + com.cognitect.transit.impl.decoder.Decoder.prototype.decodeArrayHash = function(a, b, c, d) { + if (this.mapBuilder) { + if (a.length < 2 * com.cognitect.transit.types.SMALL_ARRAY_MAP_THRESHOLD + 1 && this.mapBuilder.fromArray) { + d = []; + for (c = 1;c < a.length;c += 2) { + d.push(this.decode(a[c], b, !0, !1)), d.push(this.decode(a[c + 1], b, !1, !1)); + } + return this.mapBuilder.fromArray(d, a); + } + d = this.mapBuilder.init(a); + for (c = 1;c < a.length;c += 2) { + d = this.mapBuilder.add(d, this.decode(a[c], b, !0, !1), this.decode(a[c + 1], b, !1, !1), a); + } + return this.mapBuilder.finalize(d, a); + } + d = []; + for (c = 1;c < a.length;c += 2) { + d.push(this.decode(a[c], b, !0, !1)), d.push(this.decode(a[c + 1], b, !1, !1)); + } + return com.cognitect.transit.types.map(d, !1); + }; + com.cognitect.transit.impl.decoder.Decoder.prototype.decodeArray = function(a, b, c, d) { + if (d) { + var e = []; + for (d = 0;d < a.length;d++) { + e.push(this.decode(a[d], b, c, !1)); + } + return e; + } + e = b && b.idx; + if (2 === a.length && "string" === typeof a[0] && (d = this.decode(a[0], b, !1, !1), com.cognitect.transit.impl.decoder.isTag(d))) { + return a = a[1], e = this.handlers[d.str], null != e ? e = e(this.decode(a, b, c, !0), this) : com.cognitect.transit.types.taggedValue(d.str, this.decode(a, b, c, !1)); + } + b && e != b.idx && (b.idx = e); + if (this.arrayBuilder) { + if (32 >= a.length && this.arrayBuilder.fromArray) { + e = []; + for (d = 0;d < a.length;d++) { + e.push(this.decode(a[d], b, c, !1)); + } + return this.arrayBuilder.fromArray(e, a); + } + e = this.arrayBuilder.init(a); + for (d = 0;d < a.length;d++) { + e = this.arrayBuilder.add(e, this.decode(a[d], b, c, !1), a); + } + return this.arrayBuilder.finalize(e, a); + } + e = []; + for (d = 0;d < a.length;d++) { + e.push(this.decode(a[d], b, c, !1)); + } + return e; + }; + com.cognitect.transit.impl.decoder.Decoder.prototype.parseString = function(a, b, c) { + if (a.charAt(0) === com.cognitect.transit.delimiters.ESC) { + b = a.charAt(1); + if (b === com.cognitect.transit.delimiters.ESC || b === com.cognitect.transit.delimiters.SUB || b === com.cognitect.transit.delimiters.RES) { + return a.substring(1); + } + if (b === com.cognitect.transit.delimiters.TAG) { + return com.cognitect.transit.impl.decoder.tag(a.substring(2)); + } + c = this.handlers[b]; + return null == c ? this.defaultHandler(b, a.substring(2)) : c(a.substring(2), this); + } + return a; + }; + com.cognitect.transit.impl.decoder.decoder = function(a) { + return new com.cognitect.transit.impl.decoder.Decoder(a); + }; + com.cognitect.transit.impl.reader = {}; + com.cognitect.transit.impl.reader.JSONUnmarshaller = function(a) { + this.decoder = new com.cognitect.transit.impl.decoder.Decoder(a); + }; + com.cognitect.transit.impl.reader.JSONUnmarshaller.prototype.unmarshal = function(a, b) { + return this.decoder.decode(JSON.parse(a), b); + }; + com.cognitect.transit.impl.reader.Reader = function(a, b) { + this.unmarshaller = a; + this.options = b || {}; + this.cache = this.options.cache ? this.options.cache : new com.cognitect.transit.caching.ReadCache; + }; + com.cognitect.transit.impl.reader.Reader.prototype.read = function(a) { + a = this.unmarshaller.unmarshal(a, this.cache); + this.cache.clear(); + return a; + }; + com.cognitect.transit.impl.reader.Reader.prototype.read = com.cognitect.transit.impl.reader.Reader.prototype.read; + com.cognitect.transit.impl.writer = {}; + com.cognitect.transit.impl.writer.escape = function(a) { + if (0 < a.length) { + var b = a.charAt(0); + return b === com.cognitect.transit.delimiters.ESC || b === com.cognitect.transit.delimiters.SUB || b === com.cognitect.transit.delimiters.RES ? com.cognitect.transit.delimiters.ESC + a : a; + } + return a; + }; + com.cognitect.transit.impl.writer.JSONMarshaller = function(a) { + this.opts = a || {}; + this.preferStrings = null != this.opts.preferStrings ? this.opts.preferStrings : !0; + this.objectBuilder = this.opts.objectBuilder || null; + this.handlers = new com.cognitect.transit.handlers.Handlers; + if (a = this.opts.handlers) { + if (com.cognitect.transit.util.isArray(a) || !a.forEach) { + throw Error('transit writer "handlers" option must be a map'); + } + var b = this; + a.forEach(function(a, d) { + if (void 0 !== d) { + b.handlers.set(d, a); + } else { + throw Error("Cannot create handler for JavaScript undefined"); + } + }); + } + this.handlerForForeign = this.opts.handlerForForeign; + this.unpack = this.opts.unpack || function(a) { + return com.cognitect.transit.types.isArrayMap(a) && null === a.backingMap ? a._entries : !1; + }; + this.verbose = this.opts && this.opts.verbose || !1; + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.handler = function(a) { + var b = this.handlers.get(com.cognitect.transit.handlers.constructor(a)); + return null != b ? b : (a = a && a.transitTag) ? this.handlers.get(a) : null; + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.registerHandler = function(a, b) { + this.handlers.set(a, b); + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitNil = function(a, b) { + return a ? this.emitString(com.cognitect.transit.delimiters.ESC, "_", "", a, b) : null; + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitString = function(a, b, c, d, e) { + a = a + b + c; + return e ? e.write(a, d) : a; + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitBoolean = function(a, b, c) { + return b ? this.emitString(com.cognitect.transit.delimiters.ESC, "?", a.toString()[0], b, c) : a; + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitInteger = function(a, b, c) { + return Infinity === a ? this.emitString(com.cognitect.transit.delimiters.ESC, "z", "INF", b, c) : -Infinity === a ? this.emitString(com.cognitect.transit.delimiters.ESC, "z", "-INF", b, c) : isNaN(a) ? this.emitString(com.cognitect.transit.delimiters.ESC, "z", "NaN", b, c) : b || "string" === typeof a || a instanceof goog.math.Long ? this.emitString(com.cognitect.transit.delimiters.ESC, "i", a.toString(), b, c) : a; + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitDouble = function(a, b, c) { + return b ? this.emitString(a.ESC, "d", a, b, c) : a; + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitBinary = function(a, b, c) { + return this.emitString(com.cognitect.transit.delimiters.ESC, "b", a, b, c); + }; + com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitQuoted = function(a, b, c) { + if (a.verbose) { + a = {}; + var d = this.emitString(com.cognitect.transit.delimiters.ESC_TAG, "'", "", !0, c); + a[d] = com.cognitect.transit.impl.writer.marshal(this, b, !1, c); + return a; + } + return [this.emitString(com.cognitect.transit.delimiters.ESC_TAG, "'", "", !0, c), com.cognitect.transit.impl.writer.marshal(this, b, !1, c)]; + }; + com.cognitect.transit.impl.writer.emitObjects = function(a, b, c) { + var d = []; + if (com.cognitect.transit.util.isArray(b)) { + for (var e = 0;e < b.length;e++) { + d.push(com.cognitect.transit.impl.writer.marshal(a, b[e], !1, c)); + } + } else { + b.forEach(function(b, e) { + d.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, c)); + }); + } + return d; + }; + com.cognitect.transit.impl.writer.emitArray = function(a, b, c, d) { + return com.cognitect.transit.impl.writer.emitObjects(a, b, d); + }; + com.cognitect.transit.impl.writer.isStringableKey = function(a, b) { + if ("string" !== typeof b) { + var c = a.handler(b); + return c && 1 === c.tag(b).length; + } + return !0; + }; + com.cognitect.transit.impl.writer.stringableKeys = function(a, b) { + var c = a.unpack(b), d = !0; + if (c) { + for (var e = 0;e < c.length && (d = com.cognitect.transit.impl.writer.isStringableKey(a, c[e]), d);e += 2) { + } + return d; + } + if (b.keys && (c = b.keys(), e = null, c.next)) { + for (e = c.next();!e.done;) { + d = com.cognitect.transit.impl.writer.isStringableKey(a, e.value); + if (!d) { + break; + } + e = c.next(); + } + return d; + } + if (b.forEach) { + return b.forEach(function(b, c) { + d = d && com.cognitect.transit.impl.writer.isStringableKey(a, c); + }), d; + } + throw Error("Cannot walk keys of object type " + com.cognitect.transit.handlers.constructor(b).name); + }; + com.cognitect.transit.impl.writer.isForeignObject = function(a) { + if (a.constructor.transit$isObject) { + return !0; + } + var b = a.constructor.toString(), b = b.substr(9), b = b.substr(0, b.indexOf("(")); + isObject = "Object" == b; + "undefined" != typeof Object.defineProperty ? Object.defineProperty(a.constructor, "transit$isObject", {value:isObject, enumerable:!1}) : a.constructor.transit$isObject = isObject; + return isObject; + }; + com.cognitect.transit.impl.writer.emitMap = function(a, b, c, d) { + var e = null, f = null, g = null, e = null; + c = 0; + if (b.constructor === Object || null != b.forEach || a.handlerForForeign && com.cognitect.transit.impl.writer.isForeignObject(b)) { + if (a.verbose) { + if (null != b.forEach) { + if (com.cognitect.transit.impl.writer.stringableKeys(a, b)) { + var h = {}; + b.forEach(function(b, c) { + h[com.cognitect.transit.impl.writer.marshal(a, c, !0, !1)] = com.cognitect.transit.impl.writer.marshal(a, b, !1, d); + }); + } else { + e = a.unpack(b); + f = []; + g = a.emitString(com.cognitect.transit.delimiters.ESC_TAG, "cmap", "", !0, d); + if (e) { + for (;c < e.length;c += 2) { + f.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !1, !1)), f.push(com.cognitect.transit.impl.writer.marshal(a, e[c + 1], !1, d)); + } + } else { + b.forEach(function(b, c) { + f.push(com.cognitect.transit.impl.writer.marshal(a, c, !1, !1)); + f.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, d)); + }); + } + h = {}; + h[g] = f; + } + } else { + for (e = com.cognitect.transit.util.objectKeys(b), h = {};c < e.length;c++) { + h[com.cognitect.transit.impl.writer.marshal(a, e[c], !0, !1)] = com.cognitect.transit.impl.writer.marshal(a, b[e[c]], !1, d); + } + } + return h; + } + if (null != b.forEach) { + if (com.cognitect.transit.impl.writer.stringableKeys(a, b)) { + e = a.unpack(b); + h = ["^ "]; + if (e) { + for (;c < e.length;c += 2) { + h.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !0, d)), h.push(com.cognitect.transit.impl.writer.marshal(a, e[c + 1], !1, d)); + } + } else { + b.forEach(function(b, c) { + h.push(com.cognitect.transit.impl.writer.marshal(a, c, !0, d)); + h.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, d)); + }); + } + return h; + } + e = a.unpack(b); + f = []; + g = a.emitString(com.cognitect.transit.delimiters.ESC_TAG, "cmap", "", !0, d); + if (e) { + for (;c < e.length;c += 2) { + f.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !1, d)), f.push(com.cognitect.transit.impl.writer.marshal(a, e[c + 1], !1, d)); + } + } else { + b.forEach(function(b, c) { + f.push(com.cognitect.transit.impl.writer.marshal(a, c, !1, d)); + f.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, d)); + }); + } + return [g, f]; + } + h = ["^ "]; + for (e = com.cognitect.transit.util.objectKeys(b);c < e.length;c++) { + h.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !0, d)), h.push(com.cognitect.transit.impl.writer.marshal(a, b[e[c]], !1, d)); + } + return h; + } + if (null != a.objectBuilder) { + return a.objectBuilder(b, function(b) { + return com.cognitect.transit.impl.writer.marshal(a, b, !0, d); + }, function(b) { + return com.cognitect.transit.impl.writer.marshal(a, b, !1, d); + }); + } + c = com.cognitect.transit.handlers.constructor(b).name; + e = Error("Cannot write " + c); + e.data = {obj:b, type:c}; + throw e; + }; + com.cognitect.transit.impl.writer.emitTaggedMap = function(a, b, c, d, e) { + return a.verbose ? (d = {}, d[a.emitString(com.cognitect.transit.delimiters.ESC_TAG, b, "", !0, e)] = com.cognitect.transit.impl.writer.marshal(a, c, !1, e), d) : [a.emitString(com.cognitect.transit.delimiters.ESC_TAG, b, "", !0, e), com.cognitect.transit.impl.writer.marshal(a, c, !1, e)]; + }; + com.cognitect.transit.impl.writer.emitEncoded = function(a, b, c, d, e, f, g) { + if (1 === c.length) { + if ("string" === typeof d) { + return a.emitString(com.cognitect.transit.delimiters.ESC, c, d, f, g); + } + if (f || a.preferStrings) { + (d = a.verbose && b.getVerboseHandler()) ? (c = d.tag(e), d = d.stringRep(e, d)) : d = b.stringRep(e, b); + if (null !== d) { + return a.emitString(com.cognitect.transit.delimiters.ESC, c, d, f, g); + } + a = Error('Tag "' + c + '" cannot be encoded as string'); + a.data = {tag:c, rep:d, obj:e}; + throw a; + } + } + return com.cognitect.transit.impl.writer.emitTaggedMap(a, c, d, f, g); + }; + com.cognitect.transit.impl.writer.marshal = function(a, b, c, d) { + var e = a.handler(b) || (a.handlerForForeign ? a.handlerForForeign(b, a.handlers) : null), f = e ? e.tag(b) : null, g = e ? e.rep(b) : null; + if (null != e && null != f) { + switch(f) { + case "_": + return a.emitNil(c, d); + case "s": + return a.emitString("", "", com.cognitect.transit.impl.writer.escape(g), c, d); + case "?": + return a.emitBoolean(g, c, d); + case "i": + return a.emitInteger(g, c, d); + case "d": + return a.emitDouble(g, c, d); + case "b": + return a.emitBinary(g, c, d); + case "'": + return a.emitQuoted(a, g, d); + case "array": + return com.cognitect.transit.impl.writer.emitArray(a, g, c, d); + case "map": + return com.cognitect.transit.impl.writer.emitMap(a, g, c, d); + default: + return com.cognitect.transit.impl.writer.emitEncoded(a, e, f, g, b, c, d); + } + } else { + throw a = com.cognitect.transit.handlers.constructor(b).name, c = Error("Cannot write " + a), c.data = {obj:b, type:a}, c; + } + }; + com.cognitect.transit.impl.writer.maybeQuoted = function(a, b) { + var c = a.handler(b) || (a.handlerForForeign ? a.handlerForForeign(b, a.handlers) : null); + if (null != c) { + return 1 === c.tag(b).length ? com.cognitect.transit.types.quoted(b) : b; + } + var c = com.cognitect.transit.handlers.constructor(b).name, d = Error("Cannot write " + c); + d.data = {obj:b, type:c}; + throw d; + }; + com.cognitect.transit.impl.writer.marshalTop = function(a, b, c, d) { + return JSON.stringify(com.cognitect.transit.impl.writer.marshal(a, com.cognitect.transit.impl.writer.maybeQuoted(a, b), c, d)); + }; + com.cognitect.transit.impl.writer.Writer = function(a, b) { + this._marshaller = a; + this.options = b || {}; + this.cache = !1 === this.options.cache ? null : this.options.cache ? this.options.cache : new com.cognitect.transit.caching.WriteCache; + }; + com.cognitect.transit.impl.writer.Writer.prototype.marshaller = function() { + return this._marshaller; + }; + com.cognitect.transit.impl.writer.Writer.prototype.marshaller = com.cognitect.transit.impl.writer.Writer.prototype.marshaller; + com.cognitect.transit.impl.writer.Writer.prototype.write = function(a, b) { + var c = null, c = b || {}, d = c.asMapKey || !1, e = this._marshaller.verbose ? !1 : this.cache, c = !1 === c.marshalTop ? com.cognitect.transit.impl.writer.marshal(this._marshaller, a, d, e) : com.cognitect.transit.impl.writer.marshalTop(this._marshaller, a, d, e); + null != this.cache && this.cache.clear(); + return c; + }; + com.cognitect.transit.impl.writer.Writer.prototype.write = com.cognitect.transit.impl.writer.Writer.prototype.write; + com.cognitect.transit.impl.writer.Writer.prototype.register = function(a, b) { + this._marshaller.registerHandler(a, b); + }; + com.cognitect.transit.impl.writer.Writer.prototype.register = com.cognitect.transit.impl.writer.Writer.prototype.register; + var TRANSIT_DEV = !0, TRANSIT_NODE_TARGET = !0, TRANSIT_BROWSER_TARGET = !1, TRANSIT_BROWSER_AMD_TARGET = !1; + com.cognitect.transit.reader = function(a, b) { + if ("json" === a || "json-verbose" === a || null == a) { + var c = new com.cognitect.transit.impl.reader.JSONUnmarshaller(b); + return new com.cognitect.transit.impl.reader.Reader(c, b); + } + throw Error("Cannot create reader of type " + a); + }; + com.cognitect.transit.writer = function(a, b) { + if ("json" === a || "json-verbose" === a || null == a) { + "json-verbose" === a && (null == b && (b = {}), b.verbose = !0); + var c = new com.cognitect.transit.impl.writer.JSONMarshaller(b); + return new com.cognitect.transit.impl.writer.Writer(c, b); + } + c = Error('Type must be "json"'); + c.data = {type:a}; + throw c; + }; + com.cognitect.transit.makeWriteHandler = function(a) { + var b = function() { + }; + b.prototype.tag = a.tag; + b.prototype.rep = a.rep; + b.prototype.stringRep = a.stringRep; + b.prototype.getVerboseHandler = a.getVerboseHandler; + return new b; + }; + com.cognitect.transit.makeBuilder = function(a) { + var b = function() { + }; + b.prototype.init = a.init; + b.prototype.add = a.add; + b.prototype.finalize = a.finalize; + b.prototype.fromArray = a.fromArray; + return new b; + }; + com.cognitect.transit.date = com.cognitect.transit.types.date; + com.cognitect.transit.integer = com.cognitect.transit.types.intValue; + com.cognitect.transit.isInteger = com.cognitect.transit.types.isInteger; + com.cognitect.transit.uuid = com.cognitect.transit.types.uuid; + com.cognitect.transit.isUUID = com.cognitect.transit.types.isUUID; + com.cognitect.transit.bigInt = com.cognitect.transit.types.bigInteger; + com.cognitect.transit.isBigInt = com.cognitect.transit.types.isBigInteger; + com.cognitect.transit.bigDec = com.cognitect.transit.types.bigDecimalValue; + com.cognitect.transit.isBigDec = com.cognitect.transit.types.isBigDecimal; + com.cognitect.transit.keyword = com.cognitect.transit.types.keyword; + com.cognitect.transit.isKeyword = com.cognitect.transit.types.isKeyword; + com.cognitect.transit.symbol = com.cognitect.transit.types.symbol; + com.cognitect.transit.isSymbol = com.cognitect.transit.types.isSymbol; + com.cognitect.transit.binary = com.cognitect.transit.types.binary; + com.cognitect.transit.isBinary = com.cognitect.transit.types.isBinary; + com.cognitect.transit.uri = com.cognitect.transit.types.uri; + com.cognitect.transit.isURI = com.cognitect.transit.types.isURI; + com.cognitect.transit.map = com.cognitect.transit.types.map; + com.cognitect.transit.isMap = com.cognitect.transit.types.isMap; + com.cognitect.transit.set = com.cognitect.transit.types.set; + com.cognitect.transit.isSet = com.cognitect.transit.types.isSet; + com.cognitect.transit.list = com.cognitect.transit.types.list; + com.cognitect.transit.isList = com.cognitect.transit.types.isList; + com.cognitect.transit.quoted = com.cognitect.transit.types.quoted; + com.cognitect.transit.isQuoted = com.cognitect.transit.types.isQuoted; + com.cognitect.transit.tagged = com.cognitect.transit.types.taggedValue; + com.cognitect.transit.isTaggedValue = com.cognitect.transit.types.isTaggedValue; + com.cognitect.transit.link = com.cognitect.transit.types.link; + com.cognitect.transit.isLink = com.cognitect.transit.types.isLink; + com.cognitect.transit.hash = com.cognitect.transit.eq.hashCode; + com.cognitect.transit.hashMapLike = com.cognitect.transit.eq.hashMapLike; + com.cognitect.transit.hashArrayLike = com.cognitect.transit.eq.hashArrayLike; + com.cognitect.transit.equals = com.cognitect.transit.eq.equals; + com.cognitect.transit.extendToEQ = com.cognitect.transit.eq.extendToEQ; + com.cognitect.transit.mapToObject = function(a) { + var b = {}; + a.forEach(function(a, d) { + if ("string" !== typeof d) { + throw Error("Cannot convert map with non-string keys"); + } + b[d] = a; + }); + return b; + }; + com.cognitect.transit.objectToMap = function(a) { + var b = com.cognitect.transit.map(), c; + for (c in a) { + a.hasOwnProperty(c) && b.set(c, a[c]); + } + return b; + }; + com.cognitect.transit.decoder = com.cognitect.transit.impl.decoder.decoder; + com.cognitect.transit.readCache = com.cognitect.transit.caching.readCache; + com.cognitect.transit.writeCache = com.cognitect.transit.caching.writeCache; + com.cognitect.transit.UUIDfromString = com.cognitect.transit.types.UUIDfromString; + com.cognitect.transit.randomUUID = com.cognitect.transit.util.randomUUID; + com.cognitect.transit.stringableKeys = com.cognitect.transit.impl.writer.stringableKeys; + TRANSIT_BROWSER_TARGET && (goog.exportSymbol("transit.reader", com.cognitect.transit.reader), goog.exportSymbol("transit.writer", com.cognitect.transit.writer), goog.exportSymbol("transit.makeBuilder", com.cognitect.transit.makeBuilder), goog.exportSymbol("transit.makeWriteHandler", com.cognitect.transit.makeWriteHandler), goog.exportSymbol("transit.date", com.cognitect.transit.types.date), goog.exportSymbol("transit.integer", com.cognitect.transit.types.intValue), goog.exportSymbol("transit.isInteger", + com.cognitect.transit.types.isInteger), goog.exportSymbol("transit.uuid", com.cognitect.transit.types.uuid), goog.exportSymbol("transit.isUUID", com.cognitect.transit.types.isUUID), goog.exportSymbol("transit.bigInt", com.cognitect.transit.types.bigInteger), goog.exportSymbol("transit.isBigInt", com.cognitect.transit.types.isBigInteger), goog.exportSymbol("transit.bigDec", com.cognitect.transit.types.bigDecimalValue), goog.exportSymbol("transit.isBigDec", com.cognitect.transit.types.isBigDecimal), + goog.exportSymbol("transit.keyword", com.cognitect.transit.types.keyword), goog.exportSymbol("transit.isKeyword", com.cognitect.transit.types.isKeyword), goog.exportSymbol("transit.symbol", com.cognitect.transit.types.symbol), goog.exportSymbol("transit.isSymbol", com.cognitect.transit.types.isSymbol), goog.exportSymbol("transit.binary", com.cognitect.transit.types.binary), goog.exportSymbol("transit.isBinary", com.cognitect.transit.types.isBinary), goog.exportSymbol("transit.uri", com.cognitect.transit.types.uri), + goog.exportSymbol("transit.isURI", com.cognitect.transit.types.isURI), goog.exportSymbol("transit.map", com.cognitect.transit.types.map), goog.exportSymbol("transit.isMap", com.cognitect.transit.types.isMap), goog.exportSymbol("transit.set", com.cognitect.transit.types.set), goog.exportSymbol("transit.isSet", com.cognitect.transit.types.isSet), goog.exportSymbol("transit.list", com.cognitect.transit.types.list), goog.exportSymbol("transit.isList", com.cognitect.transit.types.isList), goog.exportSymbol("transit.quoted", + com.cognitect.transit.types.quoted), goog.exportSymbol("transit.isQuoted", com.cognitect.transit.types.isQuoted), goog.exportSymbol("transit.tagged", com.cognitect.transit.types.taggedValue), goog.exportSymbol("transit.isTaggedValue", com.cognitect.transit.types.isTaggedValue), goog.exportSymbol("transit.link", com.cognitect.transit.types.link), goog.exportSymbol("transit.isLink", com.cognitect.transit.types.isLink), goog.exportSymbol("transit.hash", com.cognitect.transit.eq.hashCode), goog.exportSymbol("transit.hashMapLike", + com.cognitect.transit.eq.hashMapLike), goog.exportSymbol("transit.hashArrayLike", com.cognitect.transit.eq.hashArrayLike), goog.exportSymbol("transit.equals", com.cognitect.transit.eq.equals), goog.exportSymbol("transit.extendToEQ", com.cognitect.transit.eq.extendToEQ), goog.exportSymbol("transit.mapToObject", com.cognitect.transit.mapToObject), goog.exportSymbol("transit.objectToMap", com.cognitect.transit.objectToMap), goog.exportSymbol("transit.decoder", com.cognitect.transit.impl.decoder.decoder), + goog.exportSymbol("transit.UUIDfromString", com.cognitect.transit.types.UUIDfromString), goog.exportSymbol("transit.randomUUID", com.cognitect.transit.util.randomUUID), goog.exportSymbol("transit.stringableKeys", com.cognitect.transit.impl.writer.stringableKeys), goog.exportSymbol("transit.readCache", com.cognitect.transit.caching.readCache), goog.exportSymbol("transit.writeCache", com.cognitect.transit.caching.writeCache)); + TRANSIT_NODE_TARGET && (module.exports = {reader:com.cognitect.transit.reader, writer:com.cognitect.transit.writer, makeBuilder:com.cognitect.transit.makeBuilder, makeWriteHandler:com.cognitect.transit.makeWriteHandler, date:com.cognitect.transit.types.date, integer:com.cognitect.transit.types.intValue, isInteger:com.cognitect.transit.types.isInteger, uuid:com.cognitect.transit.types.uuid, isUUID:com.cognitect.transit.types.isUUID, bigInt:com.cognitect.transit.types.bigInteger, isBigInt:com.cognitect.transit.types.isBigInteger, + bigDec:com.cognitect.transit.types.bigDecimalValue, isBigDec:com.cognitect.transit.types.isBigDecimal, keyword:com.cognitect.transit.types.keyword, isKeyword:com.cognitect.transit.types.isKeyword, symbol:com.cognitect.transit.types.symbol, isSymbol:com.cognitect.transit.types.isSymbol, binary:com.cognitect.transit.types.binary, isBinary:com.cognitect.transit.types.isBinary, uri:com.cognitect.transit.types.uri, isURI:com.cognitect.transit.types.isURI, map:com.cognitect.transit.types.map, isMap:com.cognitect.transit.types.isMap, + set:com.cognitect.transit.types.set, isSet:com.cognitect.transit.types.isSet, list:com.cognitect.transit.types.list, isList:com.cognitect.transit.types.isList, quoted:com.cognitect.transit.types.quoted, isQuoted:com.cognitect.transit.types.isQuoted, tagged:com.cognitect.transit.types.taggedValue, isTaggedValue:com.cognitect.transit.types.isTaggedValue, link:com.cognitect.transit.types.link, isLink:com.cognitect.transit.types.isLink, hash:com.cognitect.transit.eq.hashCode, hashArrayLike:com.cognitect.transit.eq.hashArrayLike, + hashMapLike:com.cognitect.transit.eq.hashMapLike, equals:com.cognitect.transit.eq.equals, extendToEQ:com.cognitect.transit.eq.extendToEQ, mapToObject:com.cognitect.transit.mapToObject, objectToMap:com.cognitect.transit.objectToMap, decoder:com.cognitect.transit.impl.decoder.decoder, UUIDfromString:com.cognitect.transit.types.UUIDfromString, randomUUID:com.cognitect.transit.util.randomUUID, stringableKeys:com.cognitect.transit.impl.writer.stringableKeys, readCache:com.cognitect.transit.caching.readCache, + writeCache:com.cognitect.transit.caching.writeCache}); + + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51).Buffer)) + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(Buffer, global) {/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + /* eslint-disable no-proto */ + + 'use strict' + + var base64 = __webpack_require__(52) + var ieee754 = __webpack_require__(53) + var isArray = __webpack_require__(54) + + exports.Buffer = Buffer + exports.SlowBuffer = SlowBuffer + exports.INSPECT_MAX_BYTES = 50 + Buffer.poolSize = 8192 // not used by this implementation + + var rootParent = {} + + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property + * on objects. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ + Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined + ? global.TYPED_ARRAY_SUPPORT + : typedArraySupport() + + function typedArraySupport () { + function Bar () {} + try { + var arr = new Uint8Array(1) + arr.foo = function () { return 42 } + arr.constructor = Bar + return arr.foo() === 42 && // typed array instances can be augmented + arr.constructor === Bar && // constructor can be set + typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` + arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + } catch (e) { + return false + } + } + + function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff + } + + /** + * Class: Buffer + * ============= + * + * The Buffer constructor returns instances of `Uint8Array` that are augmented + * with function properties for all the node `Buffer` API functions. We use + * `Uint8Array` so that square bracket notation works as expected -- it returns + * a single octet. + * + * By augmenting the instances, we can avoid modifying the `Uint8Array` + * prototype. + */ + function Buffer (arg) { + if (!(this instanceof Buffer)) { + // Avoid going through an ArgumentsAdaptorTrampoline in the common case. + if (arguments.length > 1) return new Buffer(arg, arguments[1]) + return new Buffer(arg) + } + + if (!Buffer.TYPED_ARRAY_SUPPORT) { + this.length = 0 + this.parent = undefined + } + + // Common case. + if (typeof arg === 'number') { + return fromNumber(this, arg) + } + + // Slightly less common case. + if (typeof arg === 'string') { + return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + } + + // Unusual. + return fromObject(this, arg) + } + + function fromNumber (that, length) { + that = allocate(that, length < 0 ? 0 : checked(length) | 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < length; i++) { + that[i] = 0 + } + } + return that + } + + function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + + // Assumption: byteLength() return value is always < kMaxLength. + var length = byteLength(string, encoding) | 0 + that = allocate(that, length) + + that.write(string, encoding) + return that + } + + function fromObject (that, object) { + if (Buffer.isBuffer(object)) return fromBuffer(that, object) + + if (isArray(object)) return fromArray(that, object) + + if (object == null) { + throw new TypeError('must start with number, buffer, array or string') + } + + if (typeof ArrayBuffer !== 'undefined') { + if (object.buffer instanceof ArrayBuffer) { + return fromTypedArray(that, object) + } + if (object instanceof ArrayBuffer) { + return fromArrayBuffer(that, object) + } + } + + if (object.length) return fromArrayLike(that, object) + + return fromJsonObject(that, object) + } + + function fromBuffer (that, buffer) { + var length = checked(buffer.length) | 0 + that = allocate(that, length) + buffer.copy(that, 0, 0, length) + return that + } + + function fromArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that + } + + // Duplicate of fromArray() to keep fromArray() monomorphic. + function fromTypedArray (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + // Truncating the elements is probably not what people expect from typed + // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior + // of the old Buffer constructor. + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that + } + + function fromArrayBuffer (that, array) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + array.byteLength + that = Buffer._augment(new Uint8Array(array)) + } else { + // Fallback: Return an object instance of the Buffer class + that = fromTypedArray(that, new Uint8Array(array)) + } + return that + } + + function fromArrayLike (that, array) { + var length = checked(array.length) | 0 + that = allocate(that, length) + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that + } + + // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. + // Returns a zero-length buffer for inputs that don't conform to the spec. + function fromJsonObject (that, object) { + var array + var length = 0 + + if (object.type === 'Buffer' && isArray(object.data)) { + array = object.data + length = checked(array.length) | 0 + } + that = allocate(that, length) + + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255 + } + return that + } + + if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype + Buffer.__proto__ = Uint8Array + } else { + // pre-set for values that may exist in the future + Buffer.prototype.length = undefined + Buffer.prototype.parent = undefined + } + + function allocate (that, length) { + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = Buffer._augment(new Uint8Array(length)) + that.__proto__ = Buffer.prototype + } else { + // Fallback: Return an object instance of the Buffer class + that.length = length + that._isBuffer = true + } + + var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 + if (fromPool) that.parent = rootParent + + return that + } + + function checked (length) { + // Note: cannot use `length < kMaxLength` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 + } + + function SlowBuffer (subject, encoding) { + if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + + var buf = new Buffer(subject, encoding) + delete buf.parent + return buf + } + + Buffer.isBuffer = function isBuffer (b) { + return !!(b != null && b._isBuffer) + } + + Buffer.compare = function compare (a, b) { + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + var i = 0 + var len = Math.min(x, y) + while (i < len) { + if (a[i] !== b[i]) break + + ++i + } + + if (i !== len) { + x = a[i] + y = b[i] + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + } + + Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'raw': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } + } + + Buffer.concat = function concat (list, length) { + if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + + if (list.length === 0) { + return new Buffer(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; i++) { + length += list[i].length + } + } + + var buf = new Buffer(length) + var pos = 0 + for (i = 0; i < list.length; i++) { + var item = list[i] + item.copy(buf, pos) + pos += item.length + } + return buf + } + + function byteLength (string, encoding) { + if (typeof string !== 'string') string = '' + string + + var len = string.length + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'binary': + // Deprecated + case 'raw': + case 'raws': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } + } + Buffer.byteLength = byteLength + + function slowToString (encoding, start, end) { + var loweredCase = false + + start = start | 0 + end = end === undefined || end === Infinity ? this.length : end | 0 + + if (!encoding) encoding = 'utf8' + if (start < 0) start = 0 + if (end > this.length) end = this.length + if (end <= start) return '' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'binary': + return binarySlice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } + } + + Buffer.prototype.toString = function toString () { + var length = this.length | 0 + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) + } + + Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 + } + + Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') + if (this.length > max) str += ' ... ' + } + return '' + } + + Buffer.prototype.compare = function compare (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return 0 + return Buffer.compare(this, b) + } + + Buffer.prototype.indexOf = function indexOf (val, byteOffset) { + if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff + else if (byteOffset < -0x80000000) byteOffset = -0x80000000 + byteOffset >>= 0 + + if (this.length === 0) return -1 + if (byteOffset >= this.length) return -1 + + // Negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + + if (typeof val === 'string') { + if (val.length === 0) return -1 // special case: looking for empty string always fails + return String.prototype.indexOf.call(this, val, byteOffset) + } + if (Buffer.isBuffer(val)) { + return arrayIndexOf(this, val, byteOffset) + } + if (typeof val === 'number') { + if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { + return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + } + return arrayIndexOf(this, [ val ], byteOffset) + } + + function arrayIndexOf (arr, val, byteOffset) { + var foundIndex = -1 + for (var i = 0; byteOffset + i < arr.length; i++) { + if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex + } else { + foundIndex = -1 + } + } + return -1 + } + + throw new TypeError('val must be string, number or Buffer') + } + + // `get` is deprecated + Buffer.prototype.get = function get (offset) { + console.log('.get() is deprecated. Access using array indexes instead.') + return this.readUInt8(offset) + } + + // `set` is deprecated + Buffer.prototype.set = function set (v, offset) { + console.log('.set() is deprecated. Access using array indexes instead.') + return this.writeUInt8(v, offset) + } + + function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + // must be an even number of digits + var strLen = string.length + if (strLen % 2 !== 0) throw new Error('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; i++) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (isNaN(parsed)) throw new Error('Invalid hex string') + buf[offset + i] = parsed + } + return i + } + + function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) + } + + function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) + } + + function binaryWrite (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) + } + + function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) + } + + function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) + } + + Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0 + if (isFinite(length)) { + length = length | 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + var swap = encoding + encoding = offset + offset = length | 0 + length = swap + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'binary': + return binaryWrite(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } + } + + Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } + } + + function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } + } + + function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) + } + + // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + var MAX_ARGUMENTS_LENGTH = 0x1000 + + function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res + } + + function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret + } + + function binarySlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; i++) { + ret += String.fromCharCode(buf[i]) + } + return ret + } + + function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; i++) { + out += toHex(buf[i]) + } + return out + } + + function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + } + return res + } + + Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = Buffer._augment(this.subarray(start, end)) + } else { + var sliceLen = end - start + newBuf = new Buffer(sliceLen, undefined) + for (var i = 0; i < sliceLen; i++) { + newBuf[i] = this[i + start] + } + } + + if (newBuf.length) newBuf.parent = this.parent || this + + return newBuf + } + + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') + } + + Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val + } + + Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val + } + + Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] + } + + Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) + } + + Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] + } + + Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) + } + + Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + } + + Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val + } + + Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val + } + + Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) + } + + Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val + } + + Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val + } + + Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + } + + Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) + } + + Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) + } + + Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) + } + + Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) + } + + Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) + } + + function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + } + + Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength + } + + Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + byteLength = byteLength | 0 + if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength + } + + Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + this[offset] = (value & 0xff) + return offset + 1 + } + + function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8 + } + } + + Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 + } + + Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 + } + + function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1 + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff + } + } + + Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 + } + + Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 + } + + Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength + } + + Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = value < 0 ? 1 : 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength + } + + Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 + } + + Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + } else { + objectWriteUInt16(this, value, offset, true) + } + return offset + 2 + } + + Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + } else { + objectWriteUInt16(this, value, offset, false) + } + return offset + 2 + } + + Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + } else { + objectWriteUInt32(this, value, offset, true) + } + return offset + 4 + } + + Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset | 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + } else { + objectWriteUInt32(this, value, offset, false) + } + return offset + 4 + } + + function checkIEEE754 (buf, value, offset, ext, max, min) { + if (value > max || value < min) throw new RangeError('value is out of bounds') + if (offset + ext > buf.length) throw new RangeError('index out of range') + if (offset < 0) throw new RangeError('index out of range') + } + + function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 + } + + Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) + } + + Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) + } + + function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 + } + + Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) + } + + Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) + } + + // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + var i + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; i--) { + target[i + targetStart] = this[i + start] + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; i++) { + target[i + targetStart] = this[i + start] + } + } else { + target._set(this.subarray(start, start + len), targetStart) + } + + return len + } + + // fill(value, start=0, end=buffer.length) + Buffer.prototype.fill = function fill (value, start, end) { + if (!value) value = 0 + if (!start) start = 0 + if (!end) end = this.length + + if (end < start) throw new RangeError('end < start') + + // Fill 0 bytes; we're done + if (end === start) return + if (this.length === 0) return + + if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') + if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + + var i + if (typeof value === 'number') { + for (i = start; i < end; i++) { + this[i] = value + } + } else { + var bytes = utf8ToBytes(value.toString()) + var len = bytes.length + for (i = start; i < end; i++) { + this[i] = bytes[i % len] + } + } + + return this + } + + /** + * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. + * Added in Node 0.12. Only available in browsers that support ArrayBuffer. + */ + Buffer.prototype.toArrayBuffer = function toArrayBuffer () { + if (typeof Uint8Array !== 'undefined') { + if (Buffer.TYPED_ARRAY_SUPPORT) { + return (new Buffer(this)).buffer + } else { + var buf = new Uint8Array(this.length) + for (var i = 0, len = buf.length; i < len; i += 1) { + buf[i] = this[i] + } + return buf.buffer + } + } else { + throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + } + } + + // HELPER FUNCTIONS + // ================ + + var BP = Buffer.prototype + + /** + * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods + */ + Buffer._augment = function _augment (arr) { + arr.constructor = Buffer + arr._isBuffer = true + + // save reference to original Uint8Array set method before overwriting + arr._set = arr.set + + // deprecated + arr.get = BP.get + arr.set = BP.set + + arr.write = BP.write + arr.toString = BP.toString + arr.toLocaleString = BP.toString + arr.toJSON = BP.toJSON + arr.equals = BP.equals + arr.compare = BP.compare + arr.indexOf = BP.indexOf + arr.copy = BP.copy + arr.slice = BP.slice + arr.readUIntLE = BP.readUIntLE + arr.readUIntBE = BP.readUIntBE + arr.readUInt8 = BP.readUInt8 + arr.readUInt16LE = BP.readUInt16LE + arr.readUInt16BE = BP.readUInt16BE + arr.readUInt32LE = BP.readUInt32LE + arr.readUInt32BE = BP.readUInt32BE + arr.readIntLE = BP.readIntLE + arr.readIntBE = BP.readIntBE + arr.readInt8 = BP.readInt8 + arr.readInt16LE = BP.readInt16LE + arr.readInt16BE = BP.readInt16BE + arr.readInt32LE = BP.readInt32LE + arr.readInt32BE = BP.readInt32BE + arr.readFloatLE = BP.readFloatLE + arr.readFloatBE = BP.readFloatBE + arr.readDoubleLE = BP.readDoubleLE + arr.readDoubleBE = BP.readDoubleBE + arr.writeUInt8 = BP.writeUInt8 + arr.writeUIntLE = BP.writeUIntLE + arr.writeUIntBE = BP.writeUIntBE + arr.writeUInt16LE = BP.writeUInt16LE + arr.writeUInt16BE = BP.writeUInt16BE + arr.writeUInt32LE = BP.writeUInt32LE + arr.writeUInt32BE = BP.writeUInt32BE + arr.writeIntLE = BP.writeIntLE + arr.writeIntBE = BP.writeIntBE + arr.writeInt8 = BP.writeInt8 + arr.writeInt16LE = BP.writeInt16LE + arr.writeInt16BE = BP.writeInt16BE + arr.writeInt32LE = BP.writeInt32LE + arr.writeInt32BE = BP.writeInt32BE + arr.writeFloatLE = BP.writeFloatLE + arr.writeFloatBE = BP.writeFloatBE + arr.writeDoubleLE = BP.writeDoubleLE + arr.writeDoubleBE = BP.writeDoubleBE + arr.fill = BP.fill + arr.inspect = BP.inspect + arr.toArrayBuffer = BP.toArrayBuffer + + return arr + } + + var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + + function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str + } + + function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') + } + + function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) + } + + function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; i++) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes + } + + function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; i++) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray + } + + function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; i++) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray + } + + function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) + } + + function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; i++) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i + } + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51).Buffer, (function() { return this; }()))) + +/***/ }, +/* 52 */ +/***/ function(module, exports, __webpack_require__) { + + var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + + ;(function (exports) { + 'use strict'; + + var Arr = (typeof Uint8Array !== 'undefined') + ? Uint8Array + : Array + + var PLUS = '+'.charCodeAt(0) + var SLASH = '/'.charCodeAt(0) + var NUMBER = '0'.charCodeAt(0) + var LOWER = 'a'.charCodeAt(0) + var UPPER = 'A'.charCodeAt(0) + var PLUS_URL_SAFE = '-'.charCodeAt(0) + var SLASH_URL_SAFE = '_'.charCodeAt(0) + + function decode (elt) { + var code = elt.charCodeAt(0) + if (code === PLUS || + code === PLUS_URL_SAFE) + return 62 // '+' + if (code === SLASH || + code === SLASH_URL_SAFE) + return 63 // '/' + if (code < NUMBER) + return -1 //no match + if (code < NUMBER + 10) + return code - NUMBER + 26 + 26 + if (code < UPPER + 26) + return code - UPPER + if (code < LOWER + 26) + return code - LOWER + 26 + } + + function b64ToByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + + if (b64.length % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + var len = b64.length + placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(b64.length * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? b64.length - 4 : b64.length + + var L = 0 + + function push (v) { + arr[L++] = v + } + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) + push((tmp & 0xFF0000) >> 16) + push((tmp & 0xFF00) >> 8) + push(tmp & 0xFF) + } + + if (placeHolders === 2) { + tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) + push(tmp & 0xFF) + } else if (placeHolders === 1) { + tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) + push((tmp >> 8) & 0xFF) + push(tmp & 0xFF) + } + + return arr + } + + function uint8ToBase64 (uint8) { + var i, + extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes + output = "", + temp, length + + function encode (num) { + return lookup.charAt(num) + } + + function tripletToBase64 (num) { + return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) + } + + // go through the array every three bytes, we'll deal with trailing stuff later + for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { + temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output += tripletToBase64(temp) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + switch (extraBytes) { + case 1: + temp = uint8[uint8.length - 1] + output += encode(temp >> 2) + output += encode((temp << 4) & 0x3F) + output += '==' + break + case 2: + temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) + output += encode(temp >> 10) + output += encode((temp >> 4) & 0x3F) + output += encode((temp << 2) & 0x3F) + output += '=' + break + } + + return output + } + + exports.toByteArray = b64ToByteArray + exports.fromByteArray = uint8ToBase64 + }( false ? (this.base64js = {}) : exports)) + + +/***/ }, +/* 53 */ +/***/ function(module, exports) { + + exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) + } + + exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 } - this.handlers[b] = this.options.handlers[b]; } - this.preferStrings = null != this.options.preferStrings ? this.options.preferStrings : this.defaults.preferStrings; - this.preferBuffers = null != this.options.preferBuffers ? this.options.preferBuffers : this.defaults.preferBuffers; - this.defaultHandler = this.options.defaultHandler || this.defaults.defaultHandler; - this.mapBuilder = this.options.mapBuilder; - this.arrayBuilder = this.options.arrayBuilder; + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 + } + + +/***/ }, +/* 54 */ +/***/ function(module, exports) { + + var toString = {}.toString; + + module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; }; - com.cognitect.transit.impl.decoder.Decoder.prototype.defaults = {handlers:{_:function(a, b) { - return com.cognitect.transit.types.nullValue(); - }, "?":function(a, b) { - return com.cognitect.transit.types.boolValue(a); - }, b:function(a, b) { - return com.cognitect.transit.types.binary(a, b); - }, i:function(a, b) { - return com.cognitect.transit.types.intValue(a); - }, n:function(a, b) { - return com.cognitect.transit.types.bigInteger(a); - }, d:function(a, b) { - return com.cognitect.transit.types.floatValue(a); - }, f:function(a, b) { - return com.cognitect.transit.types.bigDecimalValue(a); - }, c:function(a, b) { - return com.cognitect.transit.types.charValue(a); - }, ":":function(a, b) { - return com.cognitect.transit.types.keyword(a); - }, $:function(a, b) { - return com.cognitect.transit.types.symbol(a); - }, r:function(a, b) { - return com.cognitect.transit.types.uri(a); - }, z:function(a, b) { - return com.cognitect.transit.types.specialDouble(a); - }, "'":function(a, b) { - return a; - }, m:function(a, b) { - return com.cognitect.transit.types.date(a); - }, t:function(a, b) { - return com.cognitect.transit.types.verboseDate(a); - }, u:function(a, b) { - return com.cognitect.transit.types.uuid(a); - }, set:function(a, b) { - return com.cognitect.transit.types.set(a); - }, list:function(a, b) { - return com.cognitect.transit.types.list(a); - }, link:function(a, b) { - return com.cognitect.transit.types.link(a); - }, cmap:function(a, b) { - return com.cognitect.transit.types.map(a, !1); - }}, defaultHandler:function(a, b) { - return com.cognitect.transit.types.taggedValue(a, b); - }, preferStrings:!0, preferBuffers:!0}; - com.cognitect.transit.impl.decoder.Decoder.prototype.decode = function(a, b, c, d) { - if (null == a) { + + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.SyntaxOrTermWrapper = undefined; + exports.unwrap = unwrap; + + var _errors = __webpack_require__(23); + + var _immutable = __webpack_require__(3); + + var _enforester = __webpack_require__(56); + + var _syntax = __webpack_require__(46); + + var _ramda = __webpack_require__(10); + + var _ = _interopRequireWildcard(_ramda); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + const symWrap = Symbol('wrapper'); + const privateData = new WeakMap(); + + const getVal = t => { + if (t.match("delimiter")) { return null; } - switch(typeof a) { - case "string": - return this.decodeString(a, b, c, d); - case "object": - return com.cognitect.transit.util.isArray(a) ? "^ " === a[0] ? this.decodeArrayHash(a, b, c, d) : this.decodeArray(a, b, c, d) : this.decodeHash(a, b, c, d); + if (typeof t.val === 'function') { + return t.val(); } - return a; - }; - com.cognitect.transit.impl.decoder.Decoder.prototype.decode = com.cognitect.transit.impl.decoder.Decoder.prototype.decode; - com.cognitect.transit.impl.decoder.Decoder.prototype.decodeString = function(a, b, c, d) { - return com.cognitect.transit.caching.isCacheable(a, c) ? (a = this.parseString(a, b, !1), b && b.write(a, c), a) : com.cognitect.transit.caching.isCacheCode(a) ? b.read(a, c) : this.parseString(a, b, c); + return null; }; - com.cognitect.transit.impl.decoder.Decoder.prototype.decodeHash = function(a, b, c, d) { - c = com.cognitect.transit.util.objectKeys(a); - var e = c[0]; - d = 1 == c.length ? this.decode(e, b, !1, !1) : null; - if (com.cognitect.transit.impl.decoder.isTag(d)) { - return a = a[e], c = this.handlers[d.str], null != c ? c(this.decode(a, b, !1, !0), this) : com.cognitect.transit.types.taggedValue(d.str, this.decode(a, b, !1, !1)); + + class SyntaxOrTermWrapper { + constructor(s) { + let context = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + this[symWrap] = s; + this.context = context; } - if (this.mapBuilder) { - if (c.length < 2 * com.cognitect.transit.types.SMALL_ARRAY_MAP_THRESHOLD && this.mapBuilder.fromArray) { - var f = []; - for (d = 0;d < c.length;d++) { - e = c[d], f.push(this.decode(e, b, !0, !1)), f.push(this.decode(a[e], b, !1, !1)); - } - return this.mapBuilder.fromArray(f, a); - } - f = this.mapBuilder.init(a); - for (d = 0;d < c.length;d++) { - e = c[d], f = this.mapBuilder.add(f, this.decode(e, b, !0, !1), this.decode(a[e], b, !1, !1), a); + + from(type, value) { + let stx = this[symWrap]; + if (typeof stx.from === 'function') { + return stx.from(type, value); } - return this.mapBuilder.finalize(f, a); } - f = []; - for (d = 0;d < c.length;d++) { - e = c[d], f.push(this.decode(e, b, !0, !1)), f.push(this.decode(a[e], b, !1, !1)); + fromNull() { + return this.from("null", null); } - return com.cognitect.transit.types.map(f, !1); - }; - com.cognitect.transit.impl.decoder.Decoder.prototype.decodeArrayHash = function(a, b, c, d) { - if (this.mapBuilder) { - if (a.length < 2 * com.cognitect.transit.types.SMALL_ARRAY_MAP_THRESHOLD + 1 && this.mapBuilder.fromArray) { - d = []; - for (c = 1;c < a.length;c += 2) { - d.push(this.decode(a[c], b, !0, !1)), d.push(this.decode(a[c + 1], b, !1, !1)); - } - return this.mapBuilder.fromArray(d, a); - } - d = this.mapBuilder.init(a); - for (c = 1;c < a.length;c += 2) { - d = this.mapBuilder.add(d, this.decode(a[c], b, !0, !1), this.decode(a[c + 1], b, !1, !1), a); - } - return this.mapBuilder.finalize(d, a); + + fromNumber(value) { + return this.from('number', value); } - d = []; - for (c = 1;c < a.length;c += 2) { - d.push(this.decode(a[c], b, !0, !1)), d.push(this.decode(a[c + 1], b, !1, !1)); + + fromString(value) { + return this.from("string", value); } - return com.cognitect.transit.types.map(d, !1); - }; - com.cognitect.transit.impl.decoder.Decoder.prototype.decodeArray = function(a, b, c, d) { - if (d) { - var e = []; - for (d = 0;d < a.length;d++) { - e.push(this.decode(a[d], b, c, !1)); + + fromPunctuator(value) { + return this.from("punctuator", value); + } + + fromKeyword(value) { + return this.from("keyword", value); + } + + fromIdentifier(value) { + return this.from("identifier", value); + } + + fromRegularExpression(value) { + return this.from("regularExpression", value); + } + + fromBraces(inner) { + return this.from("braces", inner); + } + + fromBrackets(inner) { + return this.from("brackets", inner); + } + + fromParens(inner) { + return this.from("parens", inner); + } + + match(type, value) { + let stx = this[symWrap]; + if (typeof stx.match === 'function') { + return stx.match(type, value); } - return e; } - e = b && b.idx; - if (2 === a.length && "string" === typeof a[0] && (d = this.decode(a[0], b, !1, !1), com.cognitect.transit.impl.decoder.isTag(d))) { - return a = a[1], e = this.handlers[d.str], null != e ? e = e(this.decode(a, b, c, !0), this) : com.cognitect.transit.types.taggedValue(d.str, this.decode(a, b, c, !1)); + + isIdentifier(value) { + return this.match("identifier", value); } - b && e != b.idx && (b.idx = e); - if (this.arrayBuilder) { - if (32 >= a.length && this.arrayBuilder.fromArray) { - e = []; - for (d = 0;d < a.length;d++) { - e.push(this.decode(a[d], b, c, !1)); - } - return this.arrayBuilder.fromArray(e, a); + + isAssign(value) { + return this.match("assign", value); + } + + isBooleanLiteral(value) { + return this.match("boolean", value); + } + + isKeyword(value) { + return this.match("keyword", value); + } + + isNullLiteral(value) { + return this.match("null", value); + } + + isNumericLiteral(value) { + return this.match("number", value); + } + + isPunctuator(value) { + return this.match("punctuator", value); + } + + isStringLiteral(value) { + return this.match("string", value); + } + + isRegularExpression(value) { + return this.match("regularExpression", value); + } + + isTemplate(value) { + return this.match("template", value); + } + + isDelimiter(value) { + return this.match("delimiter", value); + } + + isParens(value) { + return this.match("parens", value); + } + + isBraces(value) { + return this.match("braces", value); + } + + isBrackets(value) { + return this.match("brackets", value); + } + + isSyntaxTemplate(value) { + return this.match("syntaxTemplate", value); + } + + isEOF(value) { + return this.match("eof", value); + } + + lineNumber() { + return this[symWrap].lineNumber(); + } + + val() { + return getVal(this[symWrap]); + } + + inner() { + let stx = this[symWrap]; + if (!stx.match("delimiter")) { + throw new Error('Can only get inner syntax on a delimiter'); } - e = this.arrayBuilder.init(a); - for (d = 0;d < a.length;d++) { - e = this.arrayBuilder.add(e, this.decode(a[d], b, c, !1), a); + + let enf = new _enforester.Enforester(stx.inner(), (0, _immutable.List)(), this.context); + return new MacroContext(enf, 'inner', this.context); + } + } + + exports.SyntaxOrTermWrapper = SyntaxOrTermWrapper; + function unwrap(x) { + if (x instanceof SyntaxOrTermWrapper) { + return x[symWrap]; + } + return x; + } + + function cloneEnforester(enf) { + const rest = enf.rest; + const prev = enf.prev; + const context = enf.context; + + return new _enforester.Enforester(rest, prev, context); + } + + function Marker() {} + + /* + ctx :: { + of: (Syntax) -> ctx + next: (String) -> Syntax or Term + } + */ + class MacroContext { + + constructor(enf, name, context, useScope, introducedScope) { + const startMarker = new Marker(); + const startEnf = cloneEnforester(enf); + const priv = { + name: name, + context: context, + enf: startEnf, + startMarker: startMarker, + markers: new Map([[startMarker, enf]]) + }; + + if (useScope && introducedScope) { + priv.noScopes = false; + priv.useScope = useScope; + priv.introducedScope = introducedScope; + } else { + priv.noScopes = true; } - return this.arrayBuilder.finalize(e, a); + privateData.set(this, priv); + this.reset(); // set current enforester + + this[Symbol.iterator] = () => this; } - e = []; - for (d = 0;d < a.length;d++) { - e.push(this.decode(a[d], b, c, !1)); + + name() { + var _privateData$get = privateData.get(this); + + const name = _privateData$get.name; + const context = _privateData$get.context; + + return new SyntaxOrTermWrapper(name, context); } - return e; - }; - com.cognitect.transit.impl.decoder.Decoder.prototype.parseString = function(a, b, c) { - if (a.charAt(0) === com.cognitect.transit.delimiters.ESC) { - b = a.charAt(1); - if (b === com.cognitect.transit.delimiters.ESC || b === com.cognitect.transit.delimiters.SUB || b === com.cognitect.transit.delimiters.RES) { - return a.substring(1); + + expand(type) { + var _privateData$get2 = privateData.get(this); + + const enf = _privateData$get2.enf; + const context = _privateData$get2.context; + + if (enf.rest.size === 0) { + return { + done: true, + value: null + }; } - if (b === com.cognitect.transit.delimiters.TAG) { - return com.cognitect.transit.impl.decoder.tag(a.substring(2)); + enf.expandMacro(); + let originalRest = enf.rest; + let value; + switch (type) { + case 'AssignmentExpression': + case 'expr': + value = enf.enforestExpressionLoop(); + break; + case 'Expression': + value = enf.enforestExpression(); + break; + case 'Statement': + case 'stmt': + value = enf.enforestStatement(); + break; + case 'BlockStatement': + case 'WhileStatement': + case 'IfStatement': + case 'ForStatement': + case 'SwitchStatement': + case 'BreakStatement': + case 'ContinueStatement': + case 'DebuggerStatement': + case 'WithStatement': + case 'TryStatement': + case 'ThrowStatement': + case 'ClassDeclaration': + case 'FunctionDeclaration': + case 'LabeledStatement': + case 'VariableDeclarationStatement': + case 'ReturnStatement': + case 'ExpressionStatement': + value = enf.enforestStatement(); + (0, _errors.expect)(_.whereEq({ type: type }, value), `Expecting a ${ type }`, value, originalRest); + break; + case 'YieldExpression': + value = enf.enforestYieldExpression(); + break; + case 'ClassExpression': + value = enf.enforestClass({ isExpr: true }); + break; + case 'ArrowExpression': + value = enf.enforestArrowExpression(); + break; + case 'NewExpression': + value = enf.enforestNewExpression(); + break; + case 'ThisExpression': + case 'FunctionExpression': + case 'IdentifierExpression': + case 'LiteralNumericExpression': + case 'LiteralInfinityExpression': + case 'LiteralStringExpression': + case 'TemplateExpression': + case 'LiteralBooleanExpression': + case 'LiteralNullExpression': + case 'LiteralRegExpExpression': + case 'ObjectExpression': + case 'ArrayExpression': + value = enf.enforestPrimaryExpression(); + break; + case 'UnaryExpression': + case 'UpdateExpression': + case 'BinaryExpression': + case 'StaticMemberExpression': + case 'ComputedMemberExpression': + case 'CompoundAssignmentExpression': + case 'ConditionalExpression': + value = enf.enforestExpressionLoop(); + (0, _errors.expect)(_.whereEq({ type: type }, value), `Expecting a ${ type }`, value, originalRest); + break; + default: + throw new Error('Unknown term type: ' + type); } - c = this.handlers[b]; - return null == c ? this.defaultHandler(b, a.substring(2)) : c(a.substring(2), this); - } - return a; - }; - com.cognitect.transit.impl.decoder.decoder = function(a) { - return new com.cognitect.transit.impl.decoder.Decoder(a); - }; - com.cognitect.transit.impl.reader = {}; - com.cognitect.transit.impl.reader.JSONUnmarshaller = function(a) { - this.decoder = new com.cognitect.transit.impl.decoder.Decoder(a); - }; - com.cognitect.transit.impl.reader.JSONUnmarshaller.prototype.unmarshal = function(a, b) { - return this.decoder.decode(JSON.parse(a), b); - }; - com.cognitect.transit.impl.reader.Reader = function(a, b) { - this.unmarshaller = a; - this.options = b || {}; - this.cache = this.options.cache ? this.options.cache : new com.cognitect.transit.caching.ReadCache; - }; - com.cognitect.transit.impl.reader.Reader.prototype.read = function(a) { - a = this.unmarshaller.unmarshal(a, this.cache); - this.cache.clear(); - return a; - }; - com.cognitect.transit.impl.reader.Reader.prototype.read = com.cognitect.transit.impl.reader.Reader.prototype.read; - com.cognitect.transit.impl.writer = {}; - com.cognitect.transit.impl.writer.escape = function(a) { - if (0 < a.length) { - var b = a.charAt(0); - return b === com.cognitect.transit.delimiters.ESC || b === com.cognitect.transit.delimiters.SUB || b === com.cognitect.transit.delimiters.RES ? com.cognitect.transit.delimiters.ESC + a : a; + return { + done: false, + value: new SyntaxOrTermWrapper(value, context) + }; } - return a; - }; - com.cognitect.transit.impl.writer.JSONMarshaller = function(a) { - this.opts = a || {}; - this.preferStrings = null != this.opts.preferStrings ? this.opts.preferStrings : !0; - this.objectBuilder = this.opts.objectBuilder || null; - this.handlers = new com.cognitect.transit.handlers.Handlers; - if (a = this.opts.handlers) { - if (com.cognitect.transit.util.isArray(a) || !a.forEach) { - throw Error('transit writer "handlers" option must be a map'); + + _rest(enf) { + const priv = privateData.get(this); + if (priv.markers.get(priv.startMarker) === enf) { + return priv.enf.rest; } - var b = this; - a.forEach(function(a, d) { - if (void 0 !== d) { - b.handlers.set(d, a); + throw Error("Unauthorized access!"); + } + + reset(marker) { + const priv = privateData.get(this); + let enf; + if (marker == null) { + // go to the beginning + enf = priv.markers.get(priv.startMarker); + } else if (marker && marker instanceof Marker) { + // marker could be from another context + if (priv.markers.has(marker)) { + enf = priv.markers.get(marker); } else { - throw Error("Cannot create handler for JavaScript undefined"); + throw new Error('marker must originate from this context'); } - }); + } else { + throw new Error('marker must be an instance of Marker'); + } + priv.enf = cloneEnforester(enf); } - this.handlerForForeign = this.opts.handlerForForeign; - this.unpack = this.opts.unpack || function(a) { - return com.cognitect.transit.types.isArrayMap(a) && null === a.backingMap ? a._entries : !1; - }; - this.verbose = this.opts && this.opts.verbose || !1; - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.handler = function(a) { - var b = this.handlers.get(com.cognitect.transit.handlers.constructor(a)); - return null != b ? b : (a = a && a.transitTag) ? this.handlers.get(a) : null; - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.registerHandler = function(a, b) { - this.handlers.set(a, b); - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitNil = function(a, b) { - return a ? this.emitString(com.cognitect.transit.delimiters.ESC, "_", "", a, b) : null; - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitString = function(a, b, c, d, e) { - a = a + b + c; - return e ? e.write(a, d) : a; - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitBoolean = function(a, b, c) { - return b ? this.emitString(com.cognitect.transit.delimiters.ESC, "?", a.toString()[0], b, c) : a; - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitInteger = function(a, b, c) { - return Infinity === a ? this.emitString(com.cognitect.transit.delimiters.ESC, "z", "INF", b, c) : -Infinity === a ? this.emitString(com.cognitect.transit.delimiters.ESC, "z", "-INF", b, c) : isNaN(a) ? this.emitString(com.cognitect.transit.delimiters.ESC, "z", "NaN", b, c) : b || "string" === typeof a || a instanceof goog.math.Long ? this.emitString(com.cognitect.transit.delimiters.ESC, "i", a.toString(), b, c) : a; - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitDouble = function(a, b, c) { - return b ? this.emitString(a.ESC, "d", a, b, c) : a; - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitBinary = function(a, b, c) { - return this.emitString(com.cognitect.transit.delimiters.ESC, "b", a, b, c); - }; - com.cognitect.transit.impl.writer.JSONMarshaller.prototype.emitQuoted = function(a, b, c) { - if (a.verbose) { - a = {}; - var d = this.emitString(com.cognitect.transit.delimiters.ESC_TAG, "'", "", !0, c); - a[d] = com.cognitect.transit.impl.writer.marshal(this, b, !1, c); - return a; + + mark() { + const priv = privateData.get(this); + let marker; + + // the idea here is that marking at the beginning shouldn't happen more than once. + // We can reuse startMarker. + if (priv.enf.rest === priv.markers.get(priv.startMarker).rest) { + marker = priv.startMarker; + } else if (priv.enf.rest.isEmpty()) { + // same reason as above + if (!priv.endMarker) priv.endMarker = new Marker(); + marker = priv.endMarker; + } else { + //TODO(optimization/dubious): check that there isn't already a marker for this index? + marker = new Marker(); + } + if (!priv.markers.has(marker)) { + priv.markers.set(marker, cloneEnforester(priv.enf)); + } + return marker; + } + + next() { + var _privateData$get3 = privateData.get(this); + + const enf = _privateData$get3.enf; + const noScopes = _privateData$get3.noScopes; + const useScope = _privateData$get3.useScope; + const introducedScope = _privateData$get3.introducedScope; + const context = _privateData$get3.context; + + if (enf.rest.size === 0) { + return { + done: true, + value: null + }; + } + let value = enf.advance(); + if (!noScopes) { + value = value.addScope(useScope, context.bindings, _syntax.ALL_PHASES).addScope(introducedScope, context.bindings, _syntax.ALL_PHASES, { flip: true }); + } + return { + done: false, + value: new SyntaxOrTermWrapper(value, context) + }; + } + } + exports.default = MacroContext; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYWNyby1jb250ZXh0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztRQWlLZ0IsTSxHQUFBLE07O0FBaktoQjs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7SUFBWSxDOzs7O0FBRVosTUFBTSxVQUFVLE9BQU8sU0FBUCxDQUFoQjtBQUNBLE1BQU0sY0FBYyxJQUFJLE9BQUosRUFBcEI7O0FBRUEsTUFBTSxTQUFTLEtBQUs7QUFDbEIsTUFBSSxFQUFFLEtBQUYsQ0FBUSxXQUFSLENBQUosRUFBMEI7QUFDeEIsV0FBTyxJQUFQO0FBQ0Q7QUFDRCxNQUFJLE9BQU8sRUFBRSxHQUFULEtBQWlCLFVBQXJCLEVBQWlDO0FBQy9CLFdBQU8sRUFBRSxHQUFGLEVBQVA7QUFDRDtBQUNELFNBQU8sSUFBUDtBQUNELENBUkQ7O0FBVU8sTUFBTSxtQkFBTixDQUEwQjtBQUMvQixjQUFZLENBQVosRUFBNkI7QUFBQSxRQUFkLE9BQWMseURBQUosRUFBSTs7QUFDM0IsU0FBSyxPQUFMLElBQWdCLENBQWhCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEOztBQUVELE9BQUssSUFBTCxFQUFXLEtBQVgsRUFBa0I7QUFDaEIsUUFBSSxNQUFNLEtBQUssT0FBTCxDQUFWO0FBQ0EsUUFBSSxPQUFPLElBQUksSUFBWCxLQUFvQixVQUF4QixFQUFvQztBQUNsQyxhQUFPLElBQUksSUFBSixDQUFTLElBQVQsRUFBZSxLQUFmLENBQVA7QUFDRDtBQUNGO0FBQ0QsYUFBVztBQUNULFdBQU8sS0FBSyxJQUFMLENBQVUsTUFBVixFQUFrQixJQUFsQixDQUFQO0FBQ0Q7O0FBRUQsYUFBVyxLQUFYLEVBQWtCO0FBQ2hCLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBVixFQUFvQixLQUFwQixDQUFQO0FBQ0Q7O0FBRUQsYUFBVyxLQUFYLEVBQWtCO0FBQ2hCLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBVixFQUFvQixLQUFwQixDQUFQO0FBQ0Q7O0FBRUQsaUJB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aEIsQ0FEekQ7O0FBQUEsVUFDRyxHQURILHFCQUNHLEdBREg7QUFBQSxVQUNRLFFBRFIscUJBQ1EsUUFEUjtBQUFBLFVBQ2tCLFFBRGxCLHFCQUNrQixRQURsQjtBQUFBLFVBQzRCLGVBRDVCLHFCQUM0QixlQUQ1QjtBQUFBLFVBQzZDLE9BRDdDLHFCQUM2QyxPQUQ3Qzs7QUFFTCxRQUFJLElBQUksSUFBSixDQUFTLElBQVQsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkIsYUFBTztBQUNMLGNBQU0sSUFERDtBQUVMLGVBQU87QUFGRixPQUFQO0FBSUQ7QUFDRCxRQUFJLFFBQVEsSUFBSSxPQUFKLEVBQVo7QUFDQSxRQUFJLENBQUMsUUFBTCxFQUFlO0FBQ2IsY0FBUSxNQUNMLFFBREssQ0FDSSxRQURKLEVBQ2MsUUFBUSxRQUR0QixzQkFFTCxRQUZLLENBRUksZUFGSixFQUVxQixRQUFRLFFBRjdCLHNCQUVtRCxFQUFFLE1BQU0sSUFBUixFQUZuRCxDQUFSO0FBR0Q7QUFDRCxXQUFPO0FBQ0wsWUFBTSxLQUREO0FBRUwsYUFBTyxJQUFJLG1CQUFKLENBQXdCLEtBQXhCLEVBQStCLE9BQS9CO0FBRkYsS0FBUDtBQUlEO0FBMUwrQjtrQkFBYixZIiwiZmlsZSI6Im1hY3JvLWNvbnRleHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBlY3QgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBMaXN0IH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7IEVuZm9yZXN0ZXIgfSBmcm9tICcuL2VuZm9yZXN0ZXInO1xuaW1wb3J0IHsgQUxMX1BIQVNFUyB9IGZyb20gJy4vc3ludGF4JztcbmltcG9ydCAqIGFzIF8gZnJvbSAncmFtZGEnO1xuXG5jb25zdCBzeW1XcmFwID0gU3ltYm9sKCd3cmFwcGVyJyk7XG5jb25zdCBwcml2YXRlRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IGdldFZhbCA9IHQgPT4ge1xuICBpZiAodC5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdC52YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdC52YWwoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW50YXhPclRlcm1XcmFwcGVyIHtcbiAgY29uc3RydWN0b3IocywgY29udGV4dCA9IHt9KSB7XG4gICAgdGhpc1tzeW1XcmFwXSA9IHM7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIGZyb20odHlwZSwgdmFsdWUpIHtcbiAgICBsZXQgc3R4ID0gdGhpc1tzeW1XcmFwXTtcbiAgICBpZiAodHlwZW9mIHN0eC5mcm9tID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc3R4LmZyb20odHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBmcm9tTnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwibnVsbFwiLCBudWxsKTtcbiAgfVxuXG4gIGZyb21OdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKCdudW1iZXInLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcInN0cmluZ1wiLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tUHVuY3R1YXRvcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJwdW5jdHVhdG9yXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21LZXl3b3JkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImtleXdvcmRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnJvbUlkZW50aWZpZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiaWRlbnRpZmllclwiLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tUmVndWxhckV4cHJlc3Npb24odmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicmVndWxhckV4cHJlc3Npb25cIiwgdmFsdWUpO1xuICB9XG5cbiAgZnJvbUJyYWNlcyhpbm5lcikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJicmFjZXNcIiwgaW5uZXIpO1xuICB9XG5cbiAgZnJvbUJyYWNrZXRzKGlubmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImJyYWNrZXRzXCIsIGlubmVyKTtcbiAgfVxuXG4gIGZyb21QYXJlbnMoaW5uZXIpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicGFyZW5zXCIsIGlubmVyKTtcbiAgfVxuXG4gIG1hdGNoKHR5cGUsIHZhbHVlKSB7XG4gICAgbGV0IHN0eCA9IHRoaXNbc3ltV3JhcF07XG4gICAgaWYgKHR5cGVvZiBzdHgubWF0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzdHgubWF0Y2godHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGlzSWRlbnRpZmllcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiaWRlbnRpZmllclwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0Fzc2lnbih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYXNzaWduXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzQm9vbGVhbkxpdGVyYWwodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJvb2xlYW5cIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNLZXl3b3JkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJrZXl3b3JkXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzTnVsbExpdGVyYWwodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcIm51bGxcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNOdW1lcmljTGl0ZXJhbCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwibnVtYmVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzUHVuY3R1YXRvcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicHVuY3R1YXRvclwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1N0cmluZ0xpdGVyYWwodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInN0cmluZ1wiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1JlZ3VsYXJFeHByZXNzaW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1RlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJ0ZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0RlbGltaXRlcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZGVsaW1pdGVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzUGFyZW5zKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwYXJlbnNcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNCcmFjZXModmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJyYWNlc1wiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0JyYWNrZXRzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJicmFja2V0c1wiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1N5bnRheFRlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzeW50YXhUZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0VPRih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZW9mXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGxpbmVOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXNbc3ltV3JhcF0ubGluZU51bWJlcigpO1xuICB9XG5cbiAgdmFsKCkge1xuICAgIHJldHVybiBnZXRWYWwodGhpc1tzeW1XcmFwXSk7XG4gIH1cblxuICBpbm5lcigpIHtcbiAgICBsZXQgc3R4ID0gdGhpc1tzeW1XcmFwXTtcbiAgICBpZiAoIXN0eC5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBnZXQgaW5uZXIgc3ludGF4IG9uIGEgZGVsaW1pdGVyJyk7XG4gICAgfVxuXG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHN0eC5pbm5lcigpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgcmV0dXJuIG5ldyBNYWNyb0NvbnRleHQoZW5mLCAnaW5uZXInLCB0aGlzLmNvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXAoeCkge1xuICBpZiAoeCBpbnN0YW5jZW9mIFN5bnRheE9yVGVybVdyYXBwZXIpIHtcbiAgICByZXR1cm4geFtzeW1XcmFwXTtcbiAgfVxuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbmZvcmVzdGVyKGVuZikge1xuICBjb25zdCB7IHJlc3QsIHByZXYsIGNvbnRleHQgfSA9IGVuZjtcbiAgcmV0dXJuIG5ldyBFbmZvcmVzdGVyKHJlc3QsIHByZXYsIGNvbnRleHQpO1xufVxuXG5mdW5jdGlvbiBNYXJrZXIgKCkge31cblxuLypcbmN0eCA6OiB7XG4gIG9mOiAoU3ludGF4KSAtPiBjdHhcbiAgbmV4dDogKFN0cmluZykgLT4gU3ludGF4IG9yIFRlcm1cbn1cbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWNyb0NvbnRleHQge1xuXG4gIGNvbnN0cnVjdG9yKGVuZiwgbmFtZSwgY29udGV4dCwgdXNlU2NvcGUsIGludHJvZHVjZWRTY29wZSkge1xuICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gbmV3IE1hcmtlcigpO1xuICAgIGNvbnN0IHN0YXJ0RW5mID0gY2xvbmVFbmZvcmVzdGVyKGVuZik7XG4gICAgY29uc3QgcHJpdiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBjb250ZXh0LFxuICAgICAgZW5mOiBzdGFydEVuZixcbiAgICAgIHN0YXJ0TWFya2VyLFxuICAgICAgbWFya2VyczogbmV3IE1hcChbW3N0YXJ0TWFya2VyLCBlbmZdXSksXG4gICAgfTtcblxuICAgIGlmICh1c2VTY29wZSAmJiBpbnRyb2R1Y2VkU2NvcGUpIHtcbiAgICAgIHByaXYubm9TY29wZXMgPSBmYWxzZTtcbiAgICAgIHByaXYudXNlU2NvcGUgPSB1c2VTY29wZTtcbiAgICAgIHByaXYuaW50cm9kdWNlZFNjb3BlID0gaW50cm9kdWNlZFNjb3BlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcml2Lm5vU2NvcGVzID0gdHJ1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZURhdGEuc2V0KHRoaXMsIHByaXYpO1xuICAgIHRoaXMucmVzZXQoKTsgLy8gc2V0IGN1cnJlbnQgZW5mb3Jlc3RlclxuXG4gICAgdGhpc1tTeW1ib2wuaXRlcmF0b3JdID0gKCkgPT4gdGhpcztcbiAgfVxuXG4gIG5hbWUoKSB7XG4gICAgY29uc3QgeyBuYW1lLCBjb250ZXh0IH0gPSBwcml2YXRlRGF0YS5nZXQodGhpcyk7XG4gICAgcmV0dXJuIG5ldyBTeW50YXhPclRlcm1XcmFwcGVyKG5hbWUsIGNvbnRleHQpO1xuICB9XG5cbiAgZXhwYW5kKHR5cGUpIHtcbiAgICBjb25zdCB7IGVuZiwgY29udGV4dCB9ID0gcHJpdmF0ZURhdGEuZ2V0KHRoaXMpO1xuICAgIGlmIChlbmYucmVzdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgZW5mLmV4cGFuZE1hY3JvKCk7XG4gICAgbGV0IG9yaWdpbmFsUmVzdCA9IGVuZi5yZXN0O1xuICAgIGxldCB2YWx1ZTtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgY2FzZSAnQXNzaWdubWVudEV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnZXhwcic6XG4gICAgICAgIHZhbHVlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFeHByZXNzaW9uJzpcbiAgICAgICAgdmFsdWUgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ3N0bXQnOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Jsb2NrU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ1doaWxlU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ0lmU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICBjYXNlICdTd2l0Y2hTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQnJlYWtTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQ29udGludWVTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnRGVidWdnZXJTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnV2l0aFN0YXRlbWVudCc6XG4gICAgICBjYXNlICdUcnlTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnVGhyb3dTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQ2xhc3NEZWNsYXJhdGlvbic6XG4gICAgICBjYXNlICdGdW5jdGlvbkRlY2xhcmF0aW9uJzpcbiAgICAgIGNhc2UgJ0xhYmVsZWRTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCc6XG4gICAgICBjYXNlICdSZXR1cm5TdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnRXhwcmVzc2lvblN0YXRlbWVudCc6XG4gICAgICAgIHZhbHVlID0gZW5mLmVuZm9yZXN0U3RhdGVtZW50KCk7XG4gICAgICAgIGV4cGVjdChfLndoZXJlRXEoe3R5cGV9LCB2YWx1ZSksIGBFeHBlY3RpbmcgYSAke3R5cGV9YCwgdmFsdWUsIG9yaWdpbmFsUmVzdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWWllbGRFeHByZXNzaW9uJzpcbiAgICAgICAgdmFsdWUgPSBlbmYuZW5mb3Jlc3RZaWVsZEV4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdDbGFzc0V4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IHRydWV9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0V4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdEFycm93RXhwcmVzc2lvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05ld0V4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdE5ld0V4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUaGlzRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdGdW5jdGlvbkV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnSWRlbnRpZmllckV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0xpdGVyYWxJbmZpbml0eUV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnVGVtcGxhdGVFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0xpdGVyYWxCb29sZWFuRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdMaXRlcmFsTnVsbEV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnT2JqZWN0RXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdBcnJheUV4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVW5hcnlFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ1VwZGF0ZUV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnQmluYXJ5RXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdTdGF0aWNNZW1iZXJFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0NvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic6XG4gICAgICAgIHZhbHVlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgZXhwZWN0KF8ud2hlcmVFcSh7dHlwZX0sIHZhbHVlKSwgYEV4cGVjdGluZyBhICR7dHlwZX1gLCB2YWx1ZSwgb3JpZ2luYWxSZXN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdGVybSB0eXBlOiAnICsgdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBuZXcgU3ludGF4T3JUZXJtV3JhcHBlcih2YWx1ZSwgY29udGV4dClcbiAgICB9O1xuICB9XG5cbiAgX3Jlc3QoZW5mKSB7XG4gICAgY29uc3QgcHJpdiA9IHByaXZhdGVEYXRhLmdldCh0aGlzKTtcbiAgICBpZiAocHJpdi5tYXJrZXJzLmdldChwcml2LnN0YXJ0TWFya2VyKSA9PT0gZW5mKSB7XG4gICAgICByZXR1cm4gcHJpdi5lbmYucmVzdDtcbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoXCJVbmF1dGhvcml6ZWQgYWNjZXNzIVwiKTtcbiAgfVxuXG4gIHJlc2V0KG1hcmtlcikge1xuICAgIGNvbnN0IHByaXYgPSBwcml2YXRlRGF0YS5nZXQodGhpcyk7XG4gICAgbGV0IGVuZjtcbiAgICBpZiAobWFya2VyID09IG51bGwpIHtcbiAgICAgIC8vIGdvIHRvIHRoZSBiZWdpbm5pbmdcbiAgICAgIGVuZiA9IHByaXYubWFya2Vycy5nZXQocHJpdi5zdGFydE1hcmtlcik7XG4gICAgfSBlbHNlIGlmIChtYXJrZXIgJiYgbWFya2VyIGluc3RhbmNlb2YgTWFya2VyKSB7XG4gICAgICAvLyBtYXJrZXIgY291bGQgYmUgZnJvbSBhbm90aGVyIGNvbnRleHRcbiAgICAgIGlmIChwcml2Lm1hcmtlcnMuaGFzKG1hcmtlcikpIHtcbiAgICAgICAgZW5mID0gcHJpdi5tYXJrZXJzLmdldChtYXJrZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXJrZXIgbXVzdCBvcmlnaW5hdGUgZnJvbSB0aGlzIGNvbnRleHQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXJrZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBNYXJrZXInKTtcbiAgICB9XG4gICAgcHJpdi5lbmYgPSBjbG9uZUVuZm9yZXN0ZXIoZW5mKTtcbiAgfVxuXG4gIG1hcmsoKSB7XG4gICAgY29uc3QgcHJpdiA9IHByaXZhdGVEYXRhLmdldCh0aGlzKTtcbiAgICBsZXQgbWFya2VyO1xuXG4gICAgLy8gdGhlIGlkZWEgaGVyZSBpcyB0aGF0IG1hcmtpbmcgYXQgdGhlIGJlZ2lubmluZyBzaG91bGRuJ3QgaGFwcGVuIG1vcmUgdGhhbiBvbmNlLlxuICAgIC8vIFdlIGNhbiByZXVzZSBzdGFydE1hcmtlci5cbiAgICBpZiAocHJpdi5lbmYucmVzdCA9PT0gcHJpdi5tYXJrZXJzLmdldChwcml2LnN0YXJ0TWFya2VyKS5yZXN0KSB7XG4gICAgICBtYXJrZXIgPSBwcml2LnN0YXJ0TWFya2VyO1xuICAgIH0gZWxzZSBpZiAocHJpdi5lbmYucmVzdC5pc0VtcHR5KCkpIHtcbiAgICAgIC8vIHNhbWUgcmVhc29uIGFzIGFib3ZlXG4gICAgICBpZiAoIXByaXYuZW5kTWFya2VyKSBwcml2LmVuZE1hcmtlciA9IG5ldyBNYXJrZXIoKTtcbiAgICAgIG1hcmtlciA9IHByaXYuZW5kTWFya2VyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1RPRE8ob3B0aW1pemF0aW9uL2R1YmlvdXMpOiBjaGVjayB0aGF0IHRoZXJlIGlzbid0IGFscmVhZHkgYSBtYXJrZXIgZm9yIHRoaXMgaW5kZXg/XG4gICAgICBtYXJrZXIgPSBuZXcgTWFya2VyKCk7XG4gICAgfVxuICAgIGlmICghcHJpdi5tYXJrZXJzLmhhcyhtYXJrZXIpKSB7XG4gICAgICBwcml2Lm1hcmtlcnMuc2V0KG1hcmtlciwgY2xvbmVFbmZvcmVzdGVyKHByaXYuZW5mKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXJrZXI7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGNvbnN0IHsgZW5mLCBub1Njb3BlcywgdXNlU2NvcGUsIGludHJvZHVjZWRTY29wZSwgY29udGV4dCB9ID0gcHJpdmF0ZURhdGEuZ2V0KHRoaXMpO1xuICAgIGlmIChlbmYucmVzdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gZW5mLmFkdmFuY2UoKTtcbiAgICBpZiAoIW5vU2NvcGVzKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgIC5hZGRTY29wZSh1c2VTY29wZSwgY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUylcbiAgICAgICAgLmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUywgeyBmbGlwOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbmV3IFN5bnRheE9yVGVybVdyYXBwZXIodmFsdWUsIGNvbnRleHQpXG4gICAgfTtcbiAgfVxufVxuIl19 + +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.Enforester = undefined; + + var _terms = __webpack_require__(9); + + var _terms2 = _interopRequireDefault(_terms); + + var _ramdaFantasy = __webpack_require__(24); + + var _transforms = __webpack_require__(38); + + var _immutable = __webpack_require__(3); + + var _errors = __webpack_require__(23); + + var _operators = __webpack_require__(57); + + var _syntax = __webpack_require__(46); + + var _syntax2 = _interopRequireDefault(_syntax); + + var _scope = __webpack_require__(58); + + var _loadSyntax = __webpack_require__(48); + + var _macroContext = __webpack_require__(55); + + var _macroContext2 = _interopRequireDefault(_macroContext); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + const Just = _ramdaFantasy.Maybe.Just; + const Nothing = _ramdaFantasy.Maybe.Nothing; + + const EXPR_LOOP_OPERATOR = {}; + const EXPR_LOOP_NO_CHANGE = {}; + const EXPR_LOOP_EXPANSION = {}; + + class Enforester { + constructor(stxl, prev, context) { + this.done = false; + (0, _errors.assert)(_immutable.List.isList(stxl), "expecting a list of terms to enforest"); + (0, _errors.assert)(_immutable.List.isList(prev), "expecting a list of terms to enforest"); + (0, _errors.assert)(context, "expecting a context to enforest"); + this.term = null; + + this.rest = stxl; + this.prev = prev; + + this.context = context; } - return [this.emitString(com.cognitect.transit.delimiters.ESC_TAG, "'", "", !0, c), com.cognitect.transit.impl.writer.marshal(this, b, !1, c)]; - }; - com.cognitect.transit.impl.writer.emitObjects = function(a, b, c) { - var d = []; - if (com.cognitect.transit.util.isArray(b)) { - for (var e = 0;e < b.length;e++) { - d.push(com.cognitect.transit.impl.writer.marshal(a, b[e], !1, c)); - } - } else { - b.forEach(function(b, e) { - d.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, c)); - }); + + peek() { + let n = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + + return this.rest.get(n); } - return d; - }; - com.cognitect.transit.impl.writer.emitArray = function(a, b, c, d) { - return com.cognitect.transit.impl.writer.emitObjects(a, b, d); - }; - com.cognitect.transit.impl.writer.isStringableKey = function(a, b) { - if ("string" !== typeof b) { - var c = a.handler(b); - return c && 1 === c.tag(b).length; + + advance() { + let ret = this.rest.first(); + this.rest = this.rest.rest(); + return ret; } - return !0; - }; - com.cognitect.transit.impl.writer.stringableKeys = function(a, b) { - var c = a.unpack(b), d = !0; - if (c) { - for (var e = 0;e < c.length && (d = com.cognitect.transit.impl.writer.isStringableKey(a, c[e]), d);e += 2) { + + /* + enforest works over: + prev - a list of the previously enforest Terms + term - the current term being enforested (initially null) + rest - remaining Terms to enforest + */ + enforest() { + let type = arguments.length <= 0 || arguments[0] === undefined ? "Module" : arguments[0]; + + // initialize the term + this.term = null; + + if (this.rest.size === 0) { + this.done = true; + return this.term; } - return d; - } - if (b.keys && (c = b.keys(), e = null, c.next)) { - for (e = c.next();!e.done;) { - d = com.cognitect.transit.impl.writer.isStringableKey(a, e.value); - if (!d) { - break; - } - e = c.next(); + + if (this.isEOF(this.peek())) { + this.term = new _terms2.default("EOF", {}); + this.advance(); + return this.term; } - return d; + + let result; + if (type === "expression") { + result = this.enforestExpressionLoop(); + } else { + result = this.enforestModule(); + } + + if (this.rest.size === 0) { + this.done = true; + } + return result; } - if (b.forEach) { - return b.forEach(function(b, c) { - d = d && com.cognitect.transit.impl.writer.isStringableKey(a, c); - }), d; + + enforestModule() { + return this.enforestBody(); } - throw Error("Cannot walk keys of object type " + com.cognitect.transit.handlers.constructor(b).name); - }; - com.cognitect.transit.impl.writer.isForeignObject = function(a) { - if (a.constructor.transit$isObject) { - return !0; + + enforestBody() { + return this.enforestModuleItem(); } - var b = a.constructor.toString(), b = b.substr(9), b = b.substr(0, b.indexOf("(")); - isObject = "Object" == b; - "undefined" != typeof Object.defineProperty ? Object.defineProperty(a.constructor, "transit$isObject", {value:isObject, enumerable:!1}) : a.constructor.transit$isObject = isObject; - return isObject; - }; - com.cognitect.transit.impl.writer.emitMap = function(a, b, c, d) { - var e = null, f = null, g = null, e = null; - c = 0; - if (b.constructor === Object || null != b.forEach || a.handlerForForeign && com.cognitect.transit.impl.writer.isForeignObject(b)) { - if (a.verbose) { - if (null != b.forEach) { - if (com.cognitect.transit.impl.writer.stringableKeys(a, b)) { - var h = {}; - b.forEach(function(b, c) { - h[com.cognitect.transit.impl.writer.marshal(a, c, !0, !1)] = com.cognitect.transit.impl.writer.marshal(a, b, !1, d); - }); - } else { - e = a.unpack(b); - f = []; - g = a.emitString(com.cognitect.transit.delimiters.ESC_TAG, "cmap", "", !0, d); - if (e) { - for (;c < e.length;c += 2) { - f.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !1, !1)), f.push(com.cognitect.transit.impl.writer.marshal(a, e[c + 1], !1, d)); - } - } else { - b.forEach(function(b, c) { - f.push(com.cognitect.transit.impl.writer.marshal(a, c, !1, !1)); - f.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, d)); - }); - } - h = {}; - h[g] = f; - } - } else { - for (e = com.cognitect.transit.util.objectKeys(b), h = {};c < e.length;c++) { - h[com.cognitect.transit.impl.writer.marshal(a, e[c], !0, !1)] = com.cognitect.transit.impl.writer.marshal(a, b[e[c]], !1, d); - } - } - return h; + + enforestModuleItem() { + let lookahead = this.peek(); + if (this.isKeyword(lookahead, 'import')) { + this.advance(); + return this.enforestImportDeclaration(); + } else if (this.isKeyword(lookahead, 'export')) { + this.advance(); + return this.enforestExportDeclaration(); + } else if (this.isIdentifier(lookahead, '#')) { + return this.enforestLanguagePragma(); } - if (null != b.forEach) { - if (com.cognitect.transit.impl.writer.stringableKeys(a, b)) { - e = a.unpack(b); - h = ["^ "]; - if (e) { - for (;c < e.length;c += 2) { - h.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !0, d)), h.push(com.cognitect.transit.impl.writer.marshal(a, e[c + 1], !1, d)); - } - } else { - b.forEach(function(b, c) { - h.push(com.cognitect.transit.impl.writer.marshal(a, c, !0, d)); - h.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, d)); - }); - } - return h; + return this.enforestStatement(); + } + + enforestLanguagePragma() { + this.matchIdentifier('#'); + this.matchIdentifier('lang'); + let path = this.matchStringLiteral(); + this.consumeSemicolon(); + return new _terms2.default('Pragma', { + kind: 'lang', + items: _immutable.List.of(path) + }); + } + + enforestExportDeclaration() { + let lookahead = this.peek(); + if (this.isPunctuator(lookahead, '*')) { + this.advance(); + let moduleSpecifier = this.enforestFromClause(); + return new _terms2.default('ExportAllFrom', { moduleSpecifier: moduleSpecifier }); + } else if (this.isBraces(lookahead)) { + let namedExports = this.enforestExportClause(); + let moduleSpecifier = null; + if (this.isIdentifier(this.peek(), 'from')) { + moduleSpecifier = this.enforestFromClause(); } - e = a.unpack(b); - f = []; - g = a.emitString(com.cognitect.transit.delimiters.ESC_TAG, "cmap", "", !0, d); - if (e) { - for (;c < e.length;c += 2) { - f.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !1, d)), f.push(com.cognitect.transit.impl.writer.marshal(a, e[c + 1], !1, d)); - } - } else { - b.forEach(function(b, c) { - f.push(com.cognitect.transit.impl.writer.marshal(a, c, !1, d)); - f.push(com.cognitect.transit.impl.writer.marshal(a, b, !1, d)); + return new _terms2.default('ExportFrom', { namedExports: namedExports, moduleSpecifier: moduleSpecifier }); + } else if (this.isKeyword(lookahead, 'class')) { + return new _terms2.default('Export', { + declaration: this.enforestClass({ isExpr: false }) + }); + } else if (this.isFnDeclTransform(lookahead)) { + return new _terms2.default('Export', { + declaration: this.enforestFunction({ isExpr: false, inDefault: false }) + }); + } else if (this.isKeyword(lookahead, 'default')) { + this.advance(); + if (this.isFnDeclTransform(this.peek())) { + return new _terms2.default('ExportDefault', { + body: this.enforestFunction({ isExpr: false, inDefault: true }) }); + } else if (this.isKeyword(this.peek(), 'class')) { + return new _terms2.default('ExportDefault', { + body: this.enforestClass({ isExpr: false, inDefault: true }) + }); + } else { + let body = this.enforestExpressionLoop(); + this.consumeSemicolon(); + return new _terms2.default('ExportDefault', { body: body }); } - return [g, f]; + } else if (this.isVarDeclTransform(lookahead) || this.isLetDeclTransform(lookahead) || this.isConstDeclTransform(lookahead) || this.isSyntaxrecDeclTransform(lookahead) || this.isSyntaxDeclTransform(lookahead)) { + return new _terms2.default('Export', { + declaration: this.enforestVariableDeclaration() + }); } - h = ["^ "]; - for (e = com.cognitect.transit.util.objectKeys(b);c < e.length;c++) { - h.push(com.cognitect.transit.impl.writer.marshal(a, e[c], !0, d)), h.push(com.cognitect.transit.impl.writer.marshal(a, b[e[c]], !1, d)); + throw this.createError(lookahead, 'unexpected syntax'); + } + + enforestExportClause() { + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + let result = []; + while (enf.rest.size !== 0) { + result.push(enf.enforestExportSpecifier()); + enf.consumeComma(); } - return h; + return (0, _immutable.List)(result); } - if (null != a.objectBuilder) { - return a.objectBuilder(b, function(b) { - return com.cognitect.transit.impl.writer.marshal(a, b, !0, d); - }, function(b) { - return com.cognitect.transit.impl.writer.marshal(a, b, !1, d); + + enforestExportSpecifier() { + let name = this.enforestIdentifier(); + if (this.isIdentifier(this.peek(), 'as')) { + this.advance(); + let exportedName = this.enforestIdentifier(); + return new _terms2.default('ExportSpecifier', { name: name, exportedName: exportedName }); + } + return new _terms2.default('ExportSpecifier', { + name: null, + exportedName: name }); } - c = com.cognitect.transit.handlers.constructor(b).name; - e = Error("Cannot write " + c); - e.data = {obj:b, type:c}; - throw e; - }; - com.cognitect.transit.impl.writer.emitTaggedMap = function(a, b, c, d, e) { - return a.verbose ? (d = {}, d[a.emitString(com.cognitect.transit.delimiters.ESC_TAG, b, "", !0, e)] = com.cognitect.transit.impl.writer.marshal(a, c, !1, e), d) : [a.emitString(com.cognitect.transit.delimiters.ESC_TAG, b, "", !0, e), com.cognitect.transit.impl.writer.marshal(a, c, !1, e)]; - }; - com.cognitect.transit.impl.writer.emitEncoded = function(a, b, c, d, e, f, g) { - if (1 === c.length) { - if ("string" === typeof d) { - return a.emitString(com.cognitect.transit.delimiters.ESC, c, d, f, g); + + enforestImportDeclaration() { + let lookahead = this.peek(); + let defaultBinding = null; + let namedImports = (0, _immutable.List)(); + let forSyntax = false; + + if (this.isStringLiteral(lookahead)) { + let moduleSpecifier = this.advance(); + this.consumeSemicolon(); + return new _terms2.default('Import', { + defaultBinding: defaultBinding, + namedImports: namedImports, + moduleSpecifier: moduleSpecifier, + forSyntax: forSyntax + }); } - if (f || a.preferStrings) { - (d = a.verbose && b.getVerboseHandler()) ? (c = d.tag(e), d = d.stringRep(e, d)) : d = b.stringRep(e, b); - if (null !== d) { - return a.emitString(com.cognitect.transit.delimiters.ESC, c, d, f, g); + + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead)) { + defaultBinding = this.enforestBindingIdentifier(); + if (!this.isPunctuator(this.peek(), ',')) { + let moduleSpecifier = this.enforestFromClause(); + if (this.isKeyword(this.peek(), 'for') && this.isIdentifier(this.peek(1), 'syntax')) { + this.advance(); + this.advance(); + forSyntax = true; + } + + return new _terms2.default('Import', { + defaultBinding: defaultBinding, moduleSpecifier: moduleSpecifier, + namedImports: (0, _immutable.List)(), + forSyntax: forSyntax + }); } - a = Error('Tag "' + c + '" cannot be encoded as string'); - a.data = {tag:c, rep:d, obj:e}; - throw a; } - } - return com.cognitect.transit.impl.writer.emitTaggedMap(a, c, d, f, g); - }; - com.cognitect.transit.impl.writer.marshal = function(a, b, c, d) { - var e = a.handler(b) || (a.handlerForForeign ? a.handlerForForeign(b, a.handlers) : null), f = e ? e.tag(b) : null, g = e ? e.rep(b) : null; - if (null != e && null != f) { - switch(f) { - case "_": - return a.emitNil(c, d); - case "s": - return a.emitString("", "", com.cognitect.transit.impl.writer.escape(g), c, d); - case "?": - return a.emitBoolean(g, c, d); - case "i": - return a.emitInteger(g, c, d); - case "d": - return a.emitDouble(g, c, d); - case "b": - return a.emitBinary(g, c, d); - case "'": - return a.emitQuoted(a, g, d); - case "array": - return com.cognitect.transit.impl.writer.emitArray(a, g, c, d); - case "map": - return com.cognitect.transit.impl.writer.emitMap(a, g, c, d); - default: - return com.cognitect.transit.impl.writer.emitEncoded(a, e, f, g, b, c, d); + this.consumeComma(); + lookahead = this.peek(); + if (this.isBraces(lookahead)) { + let imports = this.enforestNamedImports(); + let fromClause = this.enforestFromClause(); + if (this.isKeyword(this.peek(), 'for') && this.isIdentifier(this.peek(1), 'syntax')) { + this.advance(); + this.advance(); + forSyntax = true; + } + + return new _terms2.default("Import", { + defaultBinding: defaultBinding, + forSyntax: forSyntax, + namedImports: imports, + moduleSpecifier: fromClause + + }); + } else if (this.isPunctuator(lookahead, '*')) { + let namespaceBinding = this.enforestNamespaceBinding(); + let moduleSpecifier = this.enforestFromClause(); + if (this.isKeyword(this.peek(), 'for') && this.isIdentifier(this.peek(1), 'syntax')) { + this.advance(); + this.advance(); + forSyntax = true; + } + return new _terms2.default('ImportNamespace', { + defaultBinding: defaultBinding, forSyntax: forSyntax, namespaceBinding: namespaceBinding, moduleSpecifier: moduleSpecifier + }); } - } else { - throw a = com.cognitect.transit.handlers.constructor(b).name, c = Error("Cannot write " + a), c.data = {obj:b, type:a}, c; - } - }; - com.cognitect.transit.impl.writer.maybeQuoted = function(a, b) { - var c = a.handler(b) || (a.handlerForForeign ? a.handlerForForeign(b, a.handlers) : null); - if (null != c) { - return 1 === c.tag(b).length ? com.cognitect.transit.types.quoted(b) : b; + throw this.createError(lookahead, 'unexpected syntax'); } - var c = com.cognitect.transit.handlers.constructor(b).name, d = Error("Cannot write " + c); - d.data = {obj:b, type:c}; - throw d; - }; - com.cognitect.transit.impl.writer.marshalTop = function(a, b, c, d) { - return JSON.stringify(com.cognitect.transit.impl.writer.marshal(a, com.cognitect.transit.impl.writer.maybeQuoted(a, b), c, d)); - }; - com.cognitect.transit.impl.writer.Writer = function(a, b) { - this._marshaller = a; - this.options = b || {}; - this.cache = !1 === this.options.cache ? null : this.options.cache ? this.options.cache : new com.cognitect.transit.caching.WriteCache; - }; - com.cognitect.transit.impl.writer.Writer.prototype.marshaller = function() { - return this._marshaller; - }; - com.cognitect.transit.impl.writer.Writer.prototype.marshaller = com.cognitect.transit.impl.writer.Writer.prototype.marshaller; - com.cognitect.transit.impl.writer.Writer.prototype.write = function(a, b) { - var c = null, c = b || {}, d = c.asMapKey || !1, e = this._marshaller.verbose ? !1 : this.cache, c = !1 === c.marshalTop ? com.cognitect.transit.impl.writer.marshal(this._marshaller, a, d, e) : com.cognitect.transit.impl.writer.marshalTop(this._marshaller, a, d, e); - null != this.cache && this.cache.clear(); - return c; - }; - com.cognitect.transit.impl.writer.Writer.prototype.write = com.cognitect.transit.impl.writer.Writer.prototype.write; - com.cognitect.transit.impl.writer.Writer.prototype.register = function(a, b) { - this._marshaller.registerHandler(a, b); - }; - com.cognitect.transit.impl.writer.Writer.prototype.register = com.cognitect.transit.impl.writer.Writer.prototype.register; - var TRANSIT_DEV = !0, TRANSIT_NODE_TARGET = !0, TRANSIT_BROWSER_TARGET = !1, TRANSIT_BROWSER_AMD_TARGET = !1; - com.cognitect.transit.reader = function(a, b) { - if ("json" === a || "json-verbose" === a || null == a) { - var c = new com.cognitect.transit.impl.reader.JSONUnmarshaller(b); - return new com.cognitect.transit.impl.reader.Reader(c, b); + + enforestNamespaceBinding() { + this.matchPunctuator('*'); + this.matchIdentifier('as'); + return this.enforestBindingIdentifier(); } - throw Error("Cannot create reader of type " + a); - }; - com.cognitect.transit.writer = function(a, b) { - if ("json" === a || "json-verbose" === a || null == a) { - "json-verbose" === a && (null == b && (b = {}), b.verbose = !0); - var c = new com.cognitect.transit.impl.writer.JSONMarshaller(b); - return new com.cognitect.transit.impl.writer.Writer(c, b); + + enforestNamedImports() { + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + let result = []; + while (enf.rest.size !== 0) { + result.push(enf.enforestImportSpecifiers()); + enf.consumeComma(); + } + return (0, _immutable.List)(result); } - c = Error('Type must be "json"'); - c.data = {type:a}; - throw c; - }; - com.cognitect.transit.makeWriteHandler = function(a) { - var b = function() { - }; - b.prototype.tag = a.tag; - b.prototype.rep = a.rep; - b.prototype.stringRep = a.stringRep; - b.prototype.getVerboseHandler = a.getVerboseHandler; - return new b; - }; - com.cognitect.transit.makeBuilder = function(a) { - var b = function() { - }; - b.prototype.init = a.init; - b.prototype.add = a.add; - b.prototype.finalize = a.finalize; - b.prototype.fromArray = a.fromArray; - return new b; - }; - com.cognitect.transit.date = com.cognitect.transit.types.date; - com.cognitect.transit.integer = com.cognitect.transit.types.intValue; - com.cognitect.transit.isInteger = com.cognitect.transit.types.isInteger; - com.cognitect.transit.uuid = com.cognitect.transit.types.uuid; - com.cognitect.transit.isUUID = com.cognitect.transit.types.isUUID; - com.cognitect.transit.bigInt = com.cognitect.transit.types.bigInteger; - com.cognitect.transit.isBigInt = com.cognitect.transit.types.isBigInteger; - com.cognitect.transit.bigDec = com.cognitect.transit.types.bigDecimalValue; - com.cognitect.transit.isBigDec = com.cognitect.transit.types.isBigDecimal; - com.cognitect.transit.keyword = com.cognitect.transit.types.keyword; - com.cognitect.transit.isKeyword = com.cognitect.transit.types.isKeyword; - com.cognitect.transit.symbol = com.cognitect.transit.types.symbol; - com.cognitect.transit.isSymbol = com.cognitect.transit.types.isSymbol; - com.cognitect.transit.binary = com.cognitect.transit.types.binary; - com.cognitect.transit.isBinary = com.cognitect.transit.types.isBinary; - com.cognitect.transit.uri = com.cognitect.transit.types.uri; - com.cognitect.transit.isURI = com.cognitect.transit.types.isURI; - com.cognitect.transit.map = com.cognitect.transit.types.map; - com.cognitect.transit.isMap = com.cognitect.transit.types.isMap; - com.cognitect.transit.set = com.cognitect.transit.types.set; - com.cognitect.transit.isSet = com.cognitect.transit.types.isSet; - com.cognitect.transit.list = com.cognitect.transit.types.list; - com.cognitect.transit.isList = com.cognitect.transit.types.isList; - com.cognitect.transit.quoted = com.cognitect.transit.types.quoted; - com.cognitect.transit.isQuoted = com.cognitect.transit.types.isQuoted; - com.cognitect.transit.tagged = com.cognitect.transit.types.taggedValue; - com.cognitect.transit.isTaggedValue = com.cognitect.transit.types.isTaggedValue; - com.cognitect.transit.link = com.cognitect.transit.types.link; - com.cognitect.transit.isLink = com.cognitect.transit.types.isLink; - com.cognitect.transit.hash = com.cognitect.transit.eq.hashCode; - com.cognitect.transit.hashMapLike = com.cognitect.transit.eq.hashMapLike; - com.cognitect.transit.hashArrayLike = com.cognitect.transit.eq.hashArrayLike; - com.cognitect.transit.equals = com.cognitect.transit.eq.equals; - com.cognitect.transit.extendToEQ = com.cognitect.transit.eq.extendToEQ; - com.cognitect.transit.mapToObject = function(a) { - var b = {}; - a.forEach(function(a, d) { - if ("string" !== typeof d) { - throw Error("Cannot convert map with non-string keys"); + + enforestImportSpecifiers() { + let lookahead = this.peek(); + let name; + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead)) { + name = this.advance(); + if (!this.isIdentifier(this.peek(), 'as')) { + return new _terms2.default('ImportSpecifier', { + name: null, + binding: new _terms2.default('BindingIdentifier', { + name: name + }) + }); + } else { + this.matchIdentifier('as'); + } + } else { + throw this.createError(lookahead, 'unexpected token in import specifier'); } - b[d] = a; - }); - return b; - }; - com.cognitect.transit.objectToMap = function(a) { - var b = com.cognitect.transit.map(), c; - for (c in a) { - a.hasOwnProperty(c) && b.set(c, a[c]); + return new _terms2.default('ImportSpecifier', { + name: name, binding: this.enforestBindingIdentifier() + }); } - return b; - }; - com.cognitect.transit.decoder = com.cognitect.transit.impl.decoder.decoder; - com.cognitect.transit.readCache = com.cognitect.transit.caching.readCache; - com.cognitect.transit.writeCache = com.cognitect.transit.caching.writeCache; - com.cognitect.transit.UUIDfromString = com.cognitect.transit.types.UUIDfromString; - com.cognitect.transit.randomUUID = com.cognitect.transit.util.randomUUID; - com.cognitect.transit.stringableKeys = com.cognitect.transit.impl.writer.stringableKeys; - TRANSIT_BROWSER_TARGET && (goog.exportSymbol("transit.reader", com.cognitect.transit.reader), goog.exportSymbol("transit.writer", com.cognitect.transit.writer), goog.exportSymbol("transit.makeBuilder", com.cognitect.transit.makeBuilder), goog.exportSymbol("transit.makeWriteHandler", com.cognitect.transit.makeWriteHandler), goog.exportSymbol("transit.date", com.cognitect.transit.types.date), goog.exportSymbol("transit.integer", com.cognitect.transit.types.intValue), goog.exportSymbol("transit.isInteger", - com.cognitect.transit.types.isInteger), goog.exportSymbol("transit.uuid", com.cognitect.transit.types.uuid), goog.exportSymbol("transit.isUUID", com.cognitect.transit.types.isUUID), goog.exportSymbol("transit.bigInt", com.cognitect.transit.types.bigInteger), goog.exportSymbol("transit.isBigInt", com.cognitect.transit.types.isBigInteger), goog.exportSymbol("transit.bigDec", com.cognitect.transit.types.bigDecimalValue), goog.exportSymbol("transit.isBigDec", com.cognitect.transit.types.isBigDecimal), - goog.exportSymbol("transit.keyword", com.cognitect.transit.types.keyword), goog.exportSymbol("transit.isKeyword", com.cognitect.transit.types.isKeyword), goog.exportSymbol("transit.symbol", com.cognitect.transit.types.symbol), goog.exportSymbol("transit.isSymbol", com.cognitect.transit.types.isSymbol), goog.exportSymbol("transit.binary", com.cognitect.transit.types.binary), goog.exportSymbol("transit.isBinary", com.cognitect.transit.types.isBinary), goog.exportSymbol("transit.uri", com.cognitect.transit.types.uri), - goog.exportSymbol("transit.isURI", com.cognitect.transit.types.isURI), goog.exportSymbol("transit.map", com.cognitect.transit.types.map), goog.exportSymbol("transit.isMap", com.cognitect.transit.types.isMap), goog.exportSymbol("transit.set", com.cognitect.transit.types.set), goog.exportSymbol("transit.isSet", com.cognitect.transit.types.isSet), goog.exportSymbol("transit.list", com.cognitect.transit.types.list), goog.exportSymbol("transit.isList", com.cognitect.transit.types.isList), goog.exportSymbol("transit.quoted", - com.cognitect.transit.types.quoted), goog.exportSymbol("transit.isQuoted", com.cognitect.transit.types.isQuoted), goog.exportSymbol("transit.tagged", com.cognitect.transit.types.taggedValue), goog.exportSymbol("transit.isTaggedValue", com.cognitect.transit.types.isTaggedValue), goog.exportSymbol("transit.link", com.cognitect.transit.types.link), goog.exportSymbol("transit.isLink", com.cognitect.transit.types.isLink), goog.exportSymbol("transit.hash", com.cognitect.transit.eq.hashCode), goog.exportSymbol("transit.hashMapLike", - com.cognitect.transit.eq.hashMapLike), goog.exportSymbol("transit.hashArrayLike", com.cognitect.transit.eq.hashArrayLike), goog.exportSymbol("transit.equals", com.cognitect.transit.eq.equals), goog.exportSymbol("transit.extendToEQ", com.cognitect.transit.eq.extendToEQ), goog.exportSymbol("transit.mapToObject", com.cognitect.transit.mapToObject), goog.exportSymbol("transit.objectToMap", com.cognitect.transit.objectToMap), goog.exportSymbol("transit.decoder", com.cognitect.transit.impl.decoder.decoder), - goog.exportSymbol("transit.UUIDfromString", com.cognitect.transit.types.UUIDfromString), goog.exportSymbol("transit.randomUUID", com.cognitect.transit.util.randomUUID), goog.exportSymbol("transit.stringableKeys", com.cognitect.transit.impl.writer.stringableKeys), goog.exportSymbol("transit.readCache", com.cognitect.transit.caching.readCache), goog.exportSymbol("transit.writeCache", com.cognitect.transit.caching.writeCache)); - TRANSIT_NODE_TARGET && (module.exports = {reader:com.cognitect.transit.reader, writer:com.cognitect.transit.writer, makeBuilder:com.cognitect.transit.makeBuilder, makeWriteHandler:com.cognitect.transit.makeWriteHandler, date:com.cognitect.transit.types.date, integer:com.cognitect.transit.types.intValue, isInteger:com.cognitect.transit.types.isInteger, uuid:com.cognitect.transit.types.uuid, isUUID:com.cognitect.transit.types.isUUID, bigInt:com.cognitect.transit.types.bigInteger, isBigInt:com.cognitect.transit.types.isBigInteger, - bigDec:com.cognitect.transit.types.bigDecimalValue, isBigDec:com.cognitect.transit.types.isBigDecimal, keyword:com.cognitect.transit.types.keyword, isKeyword:com.cognitect.transit.types.isKeyword, symbol:com.cognitect.transit.types.symbol, isSymbol:com.cognitect.transit.types.isSymbol, binary:com.cognitect.transit.types.binary, isBinary:com.cognitect.transit.types.isBinary, uri:com.cognitect.transit.types.uri, isURI:com.cognitect.transit.types.isURI, map:com.cognitect.transit.types.map, isMap:com.cognitect.transit.types.isMap, - set:com.cognitect.transit.types.set, isSet:com.cognitect.transit.types.isSet, list:com.cognitect.transit.types.list, isList:com.cognitect.transit.types.isList, quoted:com.cognitect.transit.types.quoted, isQuoted:com.cognitect.transit.types.isQuoted, tagged:com.cognitect.transit.types.taggedValue, isTaggedValue:com.cognitect.transit.types.isTaggedValue, link:com.cognitect.transit.types.link, isLink:com.cognitect.transit.types.isLink, hash:com.cognitect.transit.eq.hashCode, hashArrayLike:com.cognitect.transit.eq.hashArrayLike, - hashMapLike:com.cognitect.transit.eq.hashMapLike, equals:com.cognitect.transit.eq.equals, extendToEQ:com.cognitect.transit.eq.extendToEQ, mapToObject:com.cognitect.transit.mapToObject, objectToMap:com.cognitect.transit.objectToMap, decoder:com.cognitect.transit.impl.decoder.decoder, UUIDfromString:com.cognitect.transit.types.UUIDfromString, randomUUID:com.cognitect.transit.util.randomUUID, stringableKeys:com.cognitect.transit.impl.writer.stringableKeys, readCache:com.cognitect.transit.caching.readCache, - writeCache:com.cognitect.transit.caching.writeCache}); + enforestFromClause() { + this.matchIdentifier('from'); + let lookahead = this.matchStringLiteral(); + this.consumeSemicolon(); + return lookahead; + } - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(59).Buffer)) + enforestStatementListItem() { + let lookahead = this.peek(); -/***/ }, -/* 59 */ -/***/ function(module, exports, __webpack_require__) { + if (this.isFnDeclTransform(lookahead)) { + return this.enforestFunctionDeclaration({ isExpr: false }); + } else if (this.isKeyword(lookahead, 'class')) { + return this.enforestClass({ isExpr: false }); + } else { + return this.enforestStatement(); + } + } - /* WEBPACK VAR INJECTION */(function(Buffer, global) {/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ - /* eslint-disable no-proto */ + enforestStatement() { + let lookahead = this.peek(); - 'use strict' + if (this.term === null && this.isCompiletimeTransform(lookahead)) { + this.expandMacro(); + lookahead = this.peek(); + } - var base64 = __webpack_require__(60) - var ieee754 = __webpack_require__(61) - var isArray = __webpack_require__(62) + if (this.term === null && this.isTerm(lookahead)) { + // TODO: check that this is actually an statement + return this.advance(); + } - exports.Buffer = Buffer - exports.SlowBuffer = SlowBuffer - exports.INSPECT_MAX_BYTES = 50 - Buffer.poolSize = 8192 // not used by this implementation + if (this.term === null && this.isBraces(lookahead)) { + return this.enforestBlockStatement(); + } - var rootParent = {} + if (this.term === null && this.isWhileTransform(lookahead)) { + return this.enforestWhileStatement(); + } - /** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property - * on objects. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. + if (this.term === null && this.isIfTransform(lookahead)) { + return this.enforestIfStatement(); + } + if (this.term === null && this.isForTransform(lookahead)) { + return this.enforestForStatement(); + } + if (this.term === null && this.isSwitchTransform(lookahead)) { + return this.enforestSwitchStatement(); + } + if (this.term === null && this.isBreakTransform(lookahead)) { + return this.enforestBreakStatement(); + } + if (this.term === null && this.isContinueTransform(lookahead)) { + return this.enforestContinueStatement(); + } + if (this.term === null && this.isDoTransform(lookahead)) { + return this.enforestDoStatement(); + } + if (this.term === null && this.isDebuggerTransform(lookahead)) { + return this.enforestDebuggerStatement(); + } + if (this.term === null && this.isWithTransform(lookahead)) { + return this.enforestWithStatement(); + } + if (this.term === null && this.isTryTransform(lookahead)) { + return this.enforestTryStatement(); + } + if (this.term === null && this.isThrowTransform(lookahead)) { + return this.enforestThrowStatement(); + } + + // TODO: put somewhere else + if (this.term === null && this.isKeyword(lookahead, "class")) { + return this.enforestClass({ isExpr: false }); + } + + if (this.term === null && this.isFnDeclTransform(lookahead)) { + return this.enforestFunctionDeclaration(); + } - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ - Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined - ? global.TYPED_ARRAY_SUPPORT - : typedArraySupport() + if (this.term === null && this.isIdentifier(lookahead) && this.isPunctuator(this.peek(1), ':')) { + return this.enforestLabeledStatement(); + } - function typedArraySupport () { - function Bar () {} - try { - var arr = new Uint8Array(1) - arr.foo = function () { return 42 } - arr.constructor = Bar - return arr.foo() === 42 && // typed array instances can be augmented - arr.constructor === Bar && // constructor can be set - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } - } + if (this.term === null && (this.isVarDeclTransform(lookahead) || this.isLetDeclTransform(lookahead) || this.isConstDeclTransform(lookahead) || this.isSyntaxrecDeclTransform(lookahead) || this.isSyntaxDeclTransform(lookahead))) { + let stmt = new _terms2.default('VariableDeclarationStatement', { + declaration: this.enforestVariableDeclaration() + }); + this.consumeSemicolon(); + return stmt; + } - function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff - } + if (this.term === null && this.isReturnStmtTransform(lookahead)) { + return this.enforestReturnStatement(); + } - /** - * Class: Buffer - * ============= - * - * The Buffer constructor returns instances of `Uint8Array` that are augmented - * with function properties for all the node `Buffer` API functions. We use - * `Uint8Array` so that square bracket notation works as expected -- it returns - * a single octet. - * - * By augmenting the instances, we can avoid modifying the `Uint8Array` - * prototype. - */ - function Buffer (arg) { - if (!(this instanceof Buffer)) { - // Avoid going through an ArgumentsAdaptorTrampoline in the common case. - if (arguments.length > 1) return new Buffer(arg, arguments[1]) - return new Buffer(arg) + if (this.term === null && this.isPunctuator(lookahead, ";")) { + this.advance(); + return new _terms2.default("EmptyStatement", {}); + } + + return this.enforestExpressionStatement(); } - if (!Buffer.TYPED_ARRAY_SUPPORT) { - this.length = 0 - this.parent = undefined + enforestLabeledStatement() { + let label = this.matchIdentifier(); + this.matchPunctuator(':'); + let stmt = this.enforestStatement(); + + return new _terms2.default('LabeledStatement', { + label: label, + body: stmt + }); } - // Common case. - if (typeof arg === 'number') { - return fromNumber(this, arg) + enforestBreakStatement() { + this.matchKeyword('break'); + let lookahead = this.peek(); + let label = null; + if (this.rest.size === 0 || this.isPunctuator(lookahead, ';')) { + this.consumeSemicolon(); + return new _terms2.default('BreakStatement', { label: label }); + } + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'yield') || this.isKeyword(lookahead, 'let')) { + label = this.enforestIdentifier(); + } + this.consumeSemicolon(); + + return new _terms2.default('BreakStatement', { label: label }); } - // Slightly less common case. - if (typeof arg === 'string') { - return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') + enforestTryStatement() { + this.matchKeyword('try'); + let body = this.enforestBlock(); + if (this.isKeyword(this.peek(), 'catch')) { + let catchClause = this.enforestCatchClause(); + if (this.isKeyword(this.peek(), 'finally')) { + this.advance(); + let finalizer = this.enforestBlock(); + return new _terms2.default('TryFinallyStatement', { + body: body, catchClause: catchClause, finalizer: finalizer + }); + } + return new _terms2.default('TryCatchStatement', { body: body, catchClause: catchClause }); + } + if (this.isKeyword(this.peek(), 'finally')) { + this.advance(); + let finalizer = this.enforestBlock(); + return new _terms2.default('TryFinallyStatement', { body: body, catchClause: null, finalizer: finalizer }); + } + throw this.createError(this.peek(), 'try with no catch or finally'); } - // Unusual. - return fromObject(this, arg) - } + enforestCatchClause() { + this.matchKeyword('catch'); + let bindingParens = this.matchParens(); + let enf = new Enforester(bindingParens, (0, _immutable.List)(), this.context); + let binding = enf.enforestBindingTarget(); + let body = this.enforestBlock(); + return new _terms2.default('CatchClause', { binding: binding, body: body }); + } - function fromNumber (that, length) { - that = allocate(that, length < 0 ? 0 : checked(length) | 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < length; i++) { - that[i] = 0 - } + enforestThrowStatement() { + this.matchKeyword('throw'); + let expression = this.enforestExpression(); + this.consumeSemicolon(); + return new _terms2.default('ThrowStatement', { expression: expression }); } - return that - } - function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' + enforestWithStatement() { + this.matchKeyword('with'); + let objParens = this.matchParens(); + let enf = new Enforester(objParens, (0, _immutable.List)(), this.context); + let object = enf.enforestExpression(); + let body = this.enforestStatement(); + return new _terms2.default('WithStatement', { object: object, body: body }); + } - // Assumption: byteLength() return value is always < kMaxLength. - var length = byteLength(string, encoding) | 0 - that = allocate(that, length) + enforestDebuggerStatement() { + this.matchKeyword('debugger'); - that.write(string, encoding) - return that - } + return new _terms2.default('DebuggerStatement', {}); + } - function fromObject (that, object) { - if (Buffer.isBuffer(object)) return fromBuffer(that, object) + enforestDoStatement() { + this.matchKeyword('do'); + let body = this.enforestStatement(); + this.matchKeyword('while'); + let testBody = this.matchParens(); + let enf = new Enforester(testBody, (0, _immutable.List)(), this.context); + let test = enf.enforestExpression(); + this.consumeSemicolon(); + return new _terms2.default('DoWhileStatement', { body: body, test: test }); + } - if (isArray(object)) return fromArray(that, object) + enforestContinueStatement() { + let kwd = this.matchKeyword('continue'); + let lookahead = this.peek(); + let label = null; + if (this.rest.size === 0 || this.isPunctuator(lookahead, ';')) { + this.consumeSemicolon(); + return new _terms2.default('ContinueStatement', { label: label }); + } + if (this.lineNumberEq(kwd, lookahead) && (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'yield') || this.isKeyword(lookahead, 'let'))) { + label = this.enforestIdentifier(); + } + this.consumeSemicolon(); - if (object == null) { - throw new TypeError('must start with number, buffer, array or string') + return new _terms2.default('ContinueStatement', { label: label }); } - if (typeof ArrayBuffer !== 'undefined') { - if (object.buffer instanceof ArrayBuffer) { - return fromTypedArray(that, object) + enforestSwitchStatement() { + this.matchKeyword('switch'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let discriminant = enf.enforestExpression(); + let body = this.matchCurlies(); + + if (body.size === 0) { + return new _terms2.default('SwitchStatement', { + discriminant: discriminant, + cases: (0, _immutable.List)() + }); } - if (object instanceof ArrayBuffer) { - return fromArrayBuffer(that, object) + enf = new Enforester(body, (0, _immutable.List)(), this.context); + let cases = enf.enforestSwitchCases(); + let lookahead = enf.peek(); + if (enf.isKeyword(lookahead, 'default')) { + let defaultCase = enf.enforestSwitchDefault(); + let postDefaultCases = enf.enforestSwitchCases(); + return new _terms2.default('SwitchStatementWithDefault', { + discriminant: discriminant, + preDefaultCases: cases, + defaultCase: defaultCase, + postDefaultCases: postDefaultCases + }); } + return new _terms2.default('SwitchStatement', { discriminant: discriminant, cases: cases }); } - if (object.length) return fromArrayLike(that, object) + enforestSwitchCases() { + let cases = []; + while (!(this.rest.size === 0 || this.isKeyword(this.peek(), 'default'))) { + cases.push(this.enforestSwitchCase()); + } + return (0, _immutable.List)(cases); + } - return fromJsonObject(that, object) - } + enforestSwitchCase() { + this.matchKeyword('case'); + return new _terms2.default('SwitchCase', { + test: this.enforestExpression(), + consequent: this.enforestSwitchCaseBody() + }); + } - function fromBuffer (that, buffer) { - var length = checked(buffer.length) | 0 - that = allocate(that, length) - buffer.copy(that, 0, 0, length) - return that - } + enforestSwitchCaseBody() { + this.matchPunctuator(':'); + return this.enforestStatementListInSwitchCaseBody(); + } - function fromArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 + enforestStatementListInSwitchCaseBody() { + let result = []; + while (!(this.rest.size === 0 || this.isKeyword(this.peek(), 'default') || this.isKeyword(this.peek(), 'case'))) { + result.push(this.enforestStatementListItem()); + } + return (0, _immutable.List)(result); } - return that - } - // Duplicate of fromArray() to keep fromArray() monomorphic. - function fromTypedArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - // Truncating the elements is probably not what people expect from typed - // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior - // of the old Buffer constructor. - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 + enforestSwitchDefault() { + this.matchKeyword('default'); + return new _terms2.default('SwitchDefault', { + consequent: this.enforestSwitchCaseBody() + }); } - return that - } - function fromArrayBuffer (that, array) { - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - array.byteLength - that = Buffer._augment(new Uint8Array(array)) - } else { - // Fallback: Return an object instance of the Buffer class - that = fromTypedArray(that, new Uint8Array(array)) + enforestForStatement() { + this.matchKeyword('for'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let lookahead, test, init, right, type, left, update; + + // case where init is null + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); + if (!enf.isPunctuator(enf.peek(), ';')) { + test = enf.enforestExpression(); + } + enf.matchPunctuator(';'); + if (enf.rest.size !== 0) { + right = enf.enforestExpression(); + } + return new _terms2.default('ForStatement', { + init: null, + test: test, + update: right, + body: this.enforestStatement() + }); + // case where init is not null + } else { + // testing + lookahead = enf.peek(); + if (enf.isVarDeclTransform(lookahead) || enf.isLetDeclTransform(lookahead) || enf.isConstDeclTransform(lookahead)) { + init = enf.enforestVariableDeclaration(); + lookahead = enf.peek(); + if (this.isKeyword(lookahead, 'in') || this.isIdentifier(lookahead, 'of')) { + if (this.isKeyword(lookahead, 'in')) { + enf.advance(); + right = enf.enforestExpression(); + type = 'ForInStatement'; + } else if (this.isIdentifier(lookahead, 'of')) { + enf.advance(); + right = enf.enforestExpression(); + type = 'ForOfStatement'; + } + return new _terms2.default(type, { + left: init, right: right, body: this.enforestStatement() + }); + } + enf.matchPunctuator(';'); + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); + test = null; + } else { + test = enf.enforestExpression(); + enf.matchPunctuator(';'); + } + update = enf.enforestExpression(); + } else { + if (this.isKeyword(enf.peek(1), 'in') || this.isIdentifier(enf.peek(1), 'of')) { + left = enf.enforestBindingIdentifier(); + let kind = enf.advance(); + if (this.isKeyword(kind, 'in')) { + type = 'ForInStatement'; + } else { + type = 'ForOfStatement'; + } + right = enf.enforestExpression(); + return new _terms2.default(type, { + left: left, right: right, body: this.enforestStatement() + }); + } + init = enf.enforestExpression(); + enf.matchPunctuator(';'); + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); + test = null; + } else { + test = enf.enforestExpression(); + enf.matchPunctuator(';'); + } + update = enf.enforestExpression(); + } + return new _terms2.default('ForStatement', { init: init, test: test, update: update, body: this.enforestStatement() }); + } } - return that - } - function fromArrayLike (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 + enforestIfStatement() { + this.matchKeyword('if'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let lookahead = enf.peek(); + let test = enf.enforestExpression(); + if (test === null) { + throw enf.createError(lookahead, 'expecting an expression'); + } + let consequent = this.enforestStatement(); + let alternate = null; + if (this.isKeyword(this.peek(), 'else')) { + this.advance(); + alternate = this.enforestStatement(); + } + return new _terms2.default('IfStatement', { test: test, consequent: consequent, alternate: alternate }); } - return that - } - // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. - // Returns a zero-length buffer for inputs that don't conform to the spec. - function fromJsonObject (that, object) { - var array - var length = 0 + enforestWhileStatement() { + this.matchKeyword('while'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let lookahead = enf.peek(); + let test = enf.enforestExpression(); + if (test === null) { + throw enf.createError(lookahead, 'expecting an expression'); + } + let body = this.enforestStatement(); - if (object.type === 'Buffer' && isArray(object.data)) { - array = object.data - length = checked(array.length) | 0 + return new _terms2.default('WhileStatement', { test: test, body: body }); } - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 + enforestBlockStatement() { + return new _terms2.default('BlockStatement', { + block: this.enforestBlock() + }); } - return that - } - - if (Buffer.TYPED_ARRAY_SUPPORT) { - Buffer.prototype.__proto__ = Uint8Array.prototype - Buffer.__proto__ = Uint8Array - } else { - // pre-set for values that may exist in the future - Buffer.prototype.length = undefined - Buffer.prototype.parent = undefined - } - function allocate (that, length) { - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = Buffer._augment(new Uint8Array(length)) - that.__proto__ = Buffer.prototype - } else { - // Fallback: Return an object instance of the Buffer class - that.length = length - that._isBuffer = true + enforestBlock() { + return new _terms2.default('Block', { + statements: this.matchCurlies() + }); } - var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 - if (fromPool) that.parent = rootParent + enforestClass(_ref) { + let isExpr = _ref.isExpr; + let inDefault = _ref.inDefault; - return that - } + let kw = this.advance(); + let name = null, + supr = null; + let type = isExpr ? 'ClassExpression' : 'ClassDeclaration'; - function checked (length) { - // Note: cannot use `length < kMaxLength` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 - } + if (this.isIdentifier(this.peek())) { + name = this.enforestBindingIdentifier(); + } else if (!isExpr) { + if (inDefault) { + name = new _terms2.default('BindingIdentifier', { + name: _syntax2.default.fromIdentifier('_default', kw) + }); + } else { + throw this.createError(this.peek(), 'unexpected syntax'); + } + } - function SlowBuffer (subject, encoding) { - if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) + if (this.isKeyword(this.peek(), 'extends')) { + this.advance(); + supr = this.enforestExpressionLoop(); + } - var buf = new Buffer(subject, encoding) - delete buf.parent - return buf - } + let elements = []; + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + while (enf.rest.size !== 0) { + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); + continue; + } - Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) - } + let isStatic = false; - Buffer.compare = function compare (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } + var _enf$enforestMethodDe = enf.enforestMethodDefinition(); - if (a === b) return 0 + let methodOrKey = _enf$enforestMethodDe.methodOrKey; + let kind = _enf$enforestMethodDe.kind; - var x = a.length - var y = b.length + if (kind === 'identifier' && methodOrKey.value.val() === 'static') { + isStatic = true; - var i = 0 - var len = Math.min(x, y) - while (i < len) { - if (a[i] !== b[i]) break + var _enf$enforestMethodDe2 = enf.enforestMethodDefinition(); - ++i - } + methodOrKey = _enf$enforestMethodDe2.methodOrKey; + kind = _enf$enforestMethodDe2.kind; + } + if (kind === 'method') { + elements.push(new _terms2.default('ClassElement', { isStatic: isStatic, method: methodOrKey })); + } else { + throw this.createError(enf.peek(), "Only methods are allowed in classes"); + } + } - if (i !== len) { - x = a[i] - y = b[i] + return new _terms2.default(type, { + name: name, super: supr, + elements: (0, _immutable.List)(elements) + }); } - if (x < y) return -1 - if (y < x) return 1 - return 0 - } - - Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'binary': - case 'base64': - case 'raw': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } - } + enforestBindingTarget() { + var _ref2 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - Buffer.concat = function concat (list, length) { - if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') + let allowPunctuator = _ref2.allowPunctuator; - if (list.length === 0) { - return new Buffer(0) + let lookahead = this.peek(); + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead) || allowPunctuator && this.isPunctuator(lookahead)) { + return this.enforestBindingIdentifier({ allowPunctuator: allowPunctuator }); + } else if (this.isBrackets(lookahead)) { + return this.enforestArrayBinding(); + } else if (this.isBraces(lookahead)) { + return this.enforestObjectBinding(); + } + (0, _errors.assert)(false, 'not implemented yet'); } - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; i++) { - length += list[i].length + enforestObjectBinding() { + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + let properties = []; + while (enf.rest.size !== 0) { + properties.push(enf.enforestBindingProperty()); + enf.consumeComma(); } - } - var buf = new Buffer(length) - var pos = 0 - for (i = 0; i < list.length; i++) { - var item = list[i] - item.copy(buf, pos) - pos += item.length + return new _terms2.default('ObjectBinding', { + properties: (0, _immutable.List)(properties) + }); } - return buf - } - function byteLength (string, encoding) { - if (typeof string !== 'string') string = '' + string + enforestBindingProperty() { + let lookahead = this.peek(); - var len = string.length - if (len === 0) return 0 + var _enforestPropertyName = this.enforestPropertyName(); - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'binary': - // Deprecated - case 'raw': - case 'raws': - return len - case 'utf8': - case 'utf-8': - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase() - loweredCase = true + let name = _enforestPropertyName.name; + let binding = _enforestPropertyName.binding; + + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'let') || this.isKeyword(lookahead, 'yield')) { + if (!this.isPunctuator(this.peek(), ':')) { + let defaultValue = null; + if (this.isAssign(this.peek())) { + this.advance(); + let expr = this.enforestExpressionLoop(); + defaultValue = expr; + } + return new _terms2.default('BindingPropertyIdentifier', { + binding: binding, init: defaultValue + }); + } } + this.matchPunctuator(':'); + binding = this.enforestBindingElement(); + return new _terms2.default('BindingPropertyProperty', { + name: name, binding: binding + }); } - } - Buffer.byteLength = byteLength - function slowToString (encoding, start, end) { - var loweredCase = false + enforestArrayBinding() { + let bracket = this.matchSquares(); + let enf = new Enforester(bracket, (0, _immutable.List)(), this.context); + let elements = [], + restElement = null; + while (enf.rest.size !== 0) { + let el; + if (enf.isPunctuator(enf.peek(), ',')) { + enf.consumeComma(); + el = null; + } else { + if (enf.isPunctuator(enf.peek(), '...')) { + enf.advance(); + restElement = enf.enforestBindingTarget(); + break; + } else { + el = enf.enforestBindingElement(); + } + enf.consumeComma(); + } + elements.push(el); + } + return new _terms2.default('ArrayBinding', { + elements: (0, _immutable.List)(elements), + restElement: restElement + }); + } - start = start | 0 - end = end === undefined || end === Infinity ? this.length : end | 0 + enforestBindingElement() { + let binding = this.enforestBindingTarget(); - if (!encoding) encoding = 'utf8' - if (start < 0) start = 0 - if (end > this.length) end = this.length - if (end <= start) return '' + if (this.isAssign(this.peek())) { + this.advance(); + let init = this.enforestExpressionLoop(); + binding = new _terms2.default('BindingWithDefault', { binding: binding, init: init }); + } + return binding; + } - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) + enforestBindingIdentifier() { + var _ref3 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) + let allowPunctuator = _ref3.allowPunctuator; - case 'ascii': - return asciiSlice(this, start, end) + let name; + if (allowPunctuator && this.isPunctuator(this.peek())) { + name = this.enforestPunctuator(); + } else { + name = this.enforestIdentifier(); + } + return new _terms2.default("BindingIdentifier", { name: name }); + } - case 'binary': - return binarySlice(this, start, end) + enforestPunctuator() { + let lookahead = this.peek(); + if (this.isPunctuator(lookahead)) { + return this.advance(); + } + throw this.createError(lookahead, "expecting a punctuator"); + } - case 'base64': - return base64Slice(this, start, end) + enforestIdentifier() { + let lookahead = this.peek(); + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead)) { + return this.advance(); + } + throw this.createError(lookahead, "expecting an identifier"); + } - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) + enforestReturnStatement() { + let kw = this.advance(); + let lookahead = this.peek(); - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true + // short circuit for the empty expression case + if (this.rest.size === 0 || lookahead && !this.lineNumberEq(kw, lookahead)) { + return new _terms2.default("ReturnStatement", { + expression: null + }); + } + + let term = null; + if (!this.isPunctuator(lookahead, ';')) { + term = this.enforestExpression(); + (0, _errors.expect)(term != null, "Expecting an expression to follow return keyword", lookahead, this.rest); } + + this.consumeSemicolon(); + return new _terms2.default("ReturnStatement", { + expression: term + }); } - } - Buffer.prototype.toString = function toString () { - var length = this.length | 0 - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) - } + enforestVariableDeclaration() { + let kind; + let lookahead = this.advance(); + let kindSyn = lookahead; + let phase = this.context.phase; - Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 - } + if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.VariableDeclTransform) { + kind = "var"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.LetDeclTransform) { + kind = "let"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.ConstDeclTransform) { + kind = "const"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.SyntaxDeclTransform) { + kind = "syntax"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.SyntaxrecDeclTransform) { + kind = "syntaxrec"; + } - Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } - return '' - } + let decls = (0, _immutable.List)(); - Buffer.prototype.compare = function compare (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return 0 - return Buffer.compare(this, b) - } + while (true) { + let term = this.enforestVariableDeclarator({ isSyntax: kind === "syntax" || kind === 'syntaxrec' }); + let lookahead = this.peek(); + decls = decls.concat(term); - Buffer.prototype.indexOf = function indexOf (val, byteOffset) { - if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff - else if (byteOffset < -0x80000000) byteOffset = -0x80000000 - byteOffset >>= 0 + if (this.isPunctuator(lookahead, ",")) { + this.advance(); + } else { + break; + } + } + + return new _terms2.default('VariableDeclaration', { + kind: kind, + declarators: decls + }); + } - if (this.length === 0) return -1 - if (byteOffset >= this.length) return -1 + enforestVariableDeclarator(_ref4) { + let isSyntax = _ref4.isSyntax; - // Negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) + let id = this.enforestBindingTarget({ allowPunctuator: isSyntax }); + let lookahead = this.peek(); - if (typeof val === 'string') { - if (val.length === 0) return -1 // special case: looking for empty string always fails - return String.prototype.indexOf.call(this, val, byteOffset) - } - if (Buffer.isBuffer(val)) { - return arrayIndexOf(this, val, byteOffset) + let init; + if (this.isPunctuator(lookahead, '=')) { + this.advance(); + let enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); + init = enf.enforest("expression"); + this.rest = enf.rest; + } else { + init = null; + } + return new _terms2.default("VariableDeclarator", { + binding: id, + init: init + }); } - if (typeof val === 'number') { - if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { - return Uint8Array.prototype.indexOf.call(this, val, byteOffset) + + enforestExpressionStatement() { + let start = this.rest.get(0); + let expr = this.enforestExpression(); + if (expr === null) { + throw this.createError(start, "not a valid expression"); } - return arrayIndexOf(this, [ val ], byteOffset) + this.consumeSemicolon(); + + return new _terms2.default("ExpressionStatement", { + expression: expr + }); } - function arrayIndexOf (arr, val, byteOffset) { - var foundIndex = -1 - for (var i = 0; byteOffset + i < arr.length; i++) { - if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex - } else { - foundIndex = -1 + enforestExpression() { + let left = this.enforestExpressionLoop(); + let lookahead = this.peek(); + if (this.isPunctuator(lookahead, ',')) { + while (this.rest.size !== 0) { + if (!this.isPunctuator(this.peek(), ',')) { + break; + } + let operator = this.advance(); + let right = this.enforestExpressionLoop(); + left = new _terms2.default('BinaryExpression', { left: left, operator: operator, right: right }); } } - return -1 + this.term = null; + return left; } - throw new TypeError('val must be string, number or Buffer') - } + enforestExpressionLoop() { + this.term = null; + this.opCtx = { + prec: 0, + combine: x => x, + stack: (0, _immutable.List)() + }; - // `get` is deprecated - Buffer.prototype.get = function get (offset) { - console.log('.get() is deprecated. Access using array indexes instead.') - return this.readUInt8(offset) - } + do { + let term = this.enforestAssignmentExpression(); + // no change means we've done as much enforesting as possible + // if nothing changed, maybe we just need to pop the expr stack + if (term === EXPR_LOOP_NO_CHANGE && this.opCtx.stack.size > 0) { + this.term = this.opCtx.combine(this.term); - // `set` is deprecated - Buffer.prototype.set = function set (v, offset) { - console.log('.set() is deprecated. Access using array indexes instead.') - return this.writeUInt8(v, offset) - } + var _opCtx$stack$last = this.opCtx.stack.last(); - function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } + let prec = _opCtx$stack$last.prec; + let combine = _opCtx$stack$last.combine; + + this.opCtx.prec = prec; + this.opCtx.combine = combine; + this.opCtx.stack = this.opCtx.stack.pop(); + } else if (term === EXPR_LOOP_NO_CHANGE) { + break; + } else if (term === EXPR_LOOP_OPERATOR || term === EXPR_LOOP_EXPANSION) { + // operator means an opCtx was pushed on the stack + this.term = null; + } else { + this.term = term; + } + } while (true); // get a fixpoint + return this.term; } - // must be an even number of digits - var strLen = string.length - if (strLen % 2 !== 0) throw new Error('Invalid hex string') + enforestAssignmentExpression() { + let lookahead = this.peek(); - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; i++) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) throw new Error('Invalid hex string') - buf[offset + i] = parsed - } - return i - } + if (this.term === null && this.isCompiletimeTransform(lookahead)) { + this.expandMacro(); + lookahead = this.peek(); + } - function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) - } + if (this.term === null && this.isTerm(lookahead)) { + // TODO: check that this is actually an expression + return this.advance(); + } - function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) - } + if (this.term === null && this.isKeyword(lookahead, 'yield')) { + return this.enforestYieldExpression(); + } - function binaryWrite (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) - } + if (this.term === null && this.isKeyword(lookahead, 'class')) { + return this.enforestClass({ isExpr: true }); + } + if (this.term === null && (this.isIdentifier(lookahead) || this.isParens(lookahead)) && this.isPunctuator(this.peek(1), '=>') && this.lineNumberEq(lookahead, this.peek(1))) { + return this.enforestArrowExpression(); + } - function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) - } + if (this.term === null && this.isSyntaxTemplate(lookahead)) { + return this.enforestSyntaxTemplate(); + } + // syntaxQuote ` ... ` + if (this.term === null && this.isSyntaxQuoteTransform(lookahead)) { + return this.enforestSyntaxQuote(); + } - function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) - } + // ($x:expr) + if (this.term === null && this.isParens(lookahead)) { + return new _terms2.default("ParenthesizedExpression", { + inner: this.advance().inner() + }); + } - Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0 - if (isFinite(length)) { - length = length | 0 - if (encoding === undefined) encoding = 'utf8' - } else { - encoding = length - length = undefined + if (this.term === null && (this.isKeyword(lookahead, "this") || this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'let') || this.isKeyword(lookahead, 'yield') || this.isNumericLiteral(lookahead) || this.isStringLiteral(lookahead) || this.isTemplate(lookahead) || this.isBooleanLiteral(lookahead) || this.isNullLiteral(lookahead) || this.isRegularExpression(lookahead) || this.isFnDeclTransform(lookahead) || this.isBraces(lookahead) || this.isBrackets(lookahead))) { + return this.enforestPrimaryExpression(); } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - var swap = encoding - encoding = offset - offset = length | 0 - length = swap - } - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining + // prefix unary + if (this.term === null && this.isOperator(lookahead)) { + return this.enforestUnaryExpression(); + } - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('attempt to write outside buffer bounds') - } + if (this.term === null && this.isVarBindingTransform(lookahead)) { + let id = this.getFromCompiletimeEnvironment(lookahead).id; + if (id !== lookahead) { + this.advance(); + this.rest = _immutable.List.of(id).concat(this.rest); + return EXPR_LOOP_EXPANSION; + } + } - if (!encoding) encoding = 'utf8' + if (this.term === null && (this.isNewTransform(lookahead) || this.isKeyword(lookahead, 'super')) || + // and then check the cases where the term part of p is something... + this.term && ( + // $x:expr . $prop:ident + this.isPunctuator(lookahead, '.') && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1))) || + // $x:expr [ $b:expr ] + this.isBrackets(lookahead) || + // $x:expr (...) + this.isParens(lookahead))) { + return this.enforestLeftHandSideExpression({ allowCall: true }); + } - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) + // $x:id `...` + if (this.term && this.isTemplate(lookahead)) { + return this.enforestTemplateLiteral(); + } - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) + // postfix unary + if (this.term && this.isUpdateOperator(lookahead)) { + return this.enforestUpdateExpression(); + } - case 'ascii': - return asciiWrite(this, string, offset, length) + // $l:expr $op:binaryOperator $r:expr + if (this.term && this.isOperator(lookahead)) { + return this.enforestBinaryExpression(); + } - case 'binary': - return binaryWrite(this, string, offset, length) + // $x:expr = $init:expr + if (this.term && this.isAssign(lookahead)) { + let binding = this.transformDestructuring(this.term); + let op = this.advance(); - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) + let enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); + let init = enf.enforest("expression"); + this.rest = enf.rest; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) + if (op.val() === '=') { + return new _terms2.default('AssignmentExpression', { + binding: binding, + expression: init + }); + } else { + return new _terms2.default('CompoundAssignmentExpression', { + binding: binding, + operator: op.val(), + expression: init + }); + } + } - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true + if (this.term && this.isPunctuator(lookahead, '?')) { + return this.enforestConditionalExpression(); } - } - } - Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) + return EXPR_LOOP_NO_CHANGE; } - } - function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) + enforestPrimaryExpression() { + let lookahead = this.peek(); + // $x:ThisExpression + if (this.term === null && this.isKeyword(lookahead, "this")) { + return this.enforestThisExpression(); + } + // $x:ident + if (this.term === null && (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'let') || this.isKeyword(lookahead, 'yield'))) { + return this.enforestIdentifierExpression(); + } + if (this.term === null && this.isNumericLiteral(lookahead)) { + return this.enforestNumericLiteral(); + } + if (this.term === null && this.isStringLiteral(lookahead)) { + return this.enforestStringLiteral(); + } + if (this.term === null && this.isTemplate(lookahead)) { + return this.enforestTemplateLiteral(); + } + if (this.term === null && this.isBooleanLiteral(lookahead)) { + return this.enforestBooleanLiteral(); + } + if (this.term === null && this.isNullLiteral(lookahead)) { + return this.enforestNullLiteral(); + } + if (this.term === null && this.isRegularExpression(lookahead)) { + return this.enforestRegularExpressionLiteral(); + } + // $x:FunctionExpression + if (this.term === null && this.isFnDeclTransform(lookahead)) { + return this.enforestFunctionExpression(); + } + // { $p:prop (,) ... } + if (this.term === null && this.isBraces(lookahead)) { + return this.enforestObjectExpression(); + } + // [$x:expr (,) ...] + if (this.term === null && this.isBrackets(lookahead)) { + return this.enforestArrayExpression(); + } + (0, _errors.assert)(false, 'Not a primary expression'); } - } - function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end) - var res = [] + enforestLeftHandSideExpression(_ref5) { + let allowCall = _ref5.allowCall; - var i = start - while (i < end) { - var firstByte = buf[i] - var codePoint = null - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 + let lookahead = this.peek(); - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint + if (this.isKeyword(lookahead, 'super')) { + this.advance(); + this.term = new _terms2.default('Super', {}); + } else if (this.isNewTransform(lookahead)) { + this.term = this.enforestNewExpression(); + } - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte - } - break - case 2: - secondByte = buf[i + 1] - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint - } - } - break - case 3: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint - } - } - break - case 4: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - fourthByte = buf[i + 3] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint - } + while (true) { + lookahead = this.peek(); + if (this.isParens(lookahead)) { + if (!allowCall) { + // we're dealing with a new expression + if (this.term && ((0, _terms.isIdentifierExpression)(this.term) || (0, _terms.isStaticMemberExpression)(this.term) || (0, _terms.isComputedMemberExpression)(this.term))) { + return this.term; } + this.term = this.enforestExpressionLoop(); + } else { + this.term = this.enforestCallExpression(); + } + } else if (this.isBrackets(lookahead)) { + this.term = this.term ? this.enforestComputedMemberExpression() : this.enforestPrimaryExpression(); + } else if (this.isPunctuator(lookahead, '.') && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1)))) { + this.term = this.enforestStaticMemberExpression(); + } else if (this.isTemplate(lookahead)) { + this.term = this.enforestTemplateLiteral(); + } else if (this.isBraces(lookahead)) { + this.term = this.enforestPrimaryExpression(); + } else if (this.isIdentifier(lookahead)) { + this.term = new _terms2.default('IdentifierExpression', { name: this.enforestIdentifier() }); + } else { + break; } } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD - bytesPerSequence = 1 - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000 - res.push(codePoint >>> 10 & 0x3FF | 0xD800) - codePoint = 0xDC00 | codePoint & 0x3FF - } - - res.push(codePoint) - i += bytesPerSequence + return this.term; } - return decodeCodePointsArray(res) - } - - // Based on http://stackoverflow.com/a/22747272/680742, the browser with - // the lowest limit is Chrome, with 0x10000 args. - // We go 1 magnitude less, for safety - var MAX_ARGUMENTS_LENGTH = 0x1000 + enforestBooleanLiteral() { + return new _terms2.default("LiteralBooleanExpression", { + value: this.advance() + }); + } - function decodeCodePointsArray (codePoints) { - var len = codePoints.length - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + enforestTemplateLiteral() { + return new _terms2.default('TemplateExpression', { + tag: this.term, + elements: this.enforestTemplateElements() + }); } - // Decode in chunks to avoid "call stack size exceeded". - var res = '' - var i = 0 - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ) + enforestStringLiteral() { + return new _terms2.default("LiteralStringExpression", { + value: this.advance() + }); } - return res - } - function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) + enforestNumericLiteral() { + let num = this.advance(); + if (num.val() === 1 / 0) { + return new _terms2.default('LiteralInfinityExpression', {}); + } + return new _terms2.default("LiteralNumericExpression", { + value: num + }); + } - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i] & 0x7F) + enforestIdentifierExpression() { + return new _terms2.default("IdentifierExpression", { + name: this.advance() + }); } - return ret - } - function binarySlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) + enforestRegularExpressionLiteral() { + let reStx = this.advance(); - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i]) + let lastSlash = reStx.token.value.lastIndexOf("/"); + let pattern = reStx.token.value.slice(1, lastSlash); + let flags = reStx.token.value.slice(lastSlash + 1); + return new _terms2.default("LiteralRegExpExpression", { + pattern: pattern, flags: flags + }); } - return ret - } - - function hexSlice (buf, start, end) { - var len = buf.length - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len + enforestNullLiteral() { + this.advance(); + return new _terms2.default("LiteralNullExpression", {}); + } - var out = '' - for (var i = start; i < end; i++) { - out += toHex(buf[i]) + enforestThisExpression() { + return new _terms2.default("ThisExpression", { + stx: this.advance() + }); } - return out - } - function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + enforestArgumentList() { + let result = []; + while (this.rest.size > 0) { + let arg; + if (this.isPunctuator(this.peek(), '...')) { + this.advance(); + arg = new _terms2.default('SpreadElement', { + expression: this.enforestExpressionLoop() + }); + } else { + arg = this.enforestExpressionLoop(); + } + if (this.rest.size > 0) { + this.matchPunctuator(','); + } + result.push(arg); + } + return (0, _immutable.List)(result); } - return res - } - Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end + enforestNewExpression() { + this.matchKeyword('new'); + if (this.isPunctuator(this.peek(), '.') && this.isIdentifier(this.peek(1), 'target')) { + this.advance(); + this.advance(); + return new _terms2.default('NewTargetExpression', {}); + } - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len + let callee = this.enforestLeftHandSideExpression({ allowCall: false }); + let args; + if (this.isParens(this.peek())) { + args = this.matchParens(); + } else { + args = (0, _immutable.List)(); + } + return new _terms2.default('NewExpression', { + callee: callee, + arguments: args + }); } - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len + enforestComputedMemberExpression() { + let enf = new Enforester(this.matchSquares(), (0, _immutable.List)(), this.context); + return new _terms2.default('ComputedMemberExpression', { + object: this.term, + expression: enf.enforestExpression() + }); } - if (end < start) end = start + transformDestructuring(term) { + switch (term.type) { + case 'IdentifierExpression': + return new _terms2.default('BindingIdentifier', { name: term.name }); - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = Buffer._augment(this.subarray(start, end)) - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined) - for (var i = 0; i < sliceLen; i++) { - newBuf[i] = this[i + start] + case 'ParenthesizedExpression': + if (term.inner.size === 1 && this.isIdentifier(term.inner.get(0))) { + return new _terms2.default('BindingIdentifier', { name: term.inner.get(0) }); + } + return term; + case 'DataProperty': + return new _terms2.default('BindingPropertyProperty', { + name: term.name, + binding: this.transformDestructuringWithDefault(term.expression) + }); + case 'ShorthandProperty': + return new _terms2.default('BindingPropertyIdentifier', { + binding: new _terms2.default('BindingIdentifier', { name: term.name }), + init: null + }); + case 'ObjectExpression': + return new _terms2.default('ObjectBinding', { + properties: term.properties.map(t => this.transformDestructuring(t)) + }); + case 'ArrayExpression': + { + let last = term.elements.last(); + if (last != null && last.type === 'SpreadElement') { + return new _terms2.default('ArrayBinding', { + elements: term.elements.slice(0, -1).map(t => t && this.transformDestructuringWithDefault(t)), + restElement: this.transformDestructuringWithDefault(last.expression) + }); + } else { + return new _terms2.default('ArrayBinding', { + elements: term.elements.map(t => t && this.transformDestructuringWithDefault(t)), + restElement: null + }); + } + } + case 'StaticPropertyName': + return new _terms2.default('BindingIdentifier', { + name: term.value + }); + case 'ComputedMemberExpression': + case 'StaticMemberExpression': + case 'ArrayBinding': + case 'BindingIdentifier': + case 'BindingPropertyIdentifier': + case 'BindingPropertyProperty': + case 'BindingWithDefault': + case 'ObjectBinding': + return term; } + (0, _errors.assert)(false, 'not implemented yet for ' + term.type); } - if (newBuf.length) newBuf.parent = this.parent || this + transformDestructuringWithDefault(term) { + switch (term.type) { + case "AssignmentExpression": + return new _terms2.default('BindingWithDefault', { + binding: this.transformDestructuring(term.binding), + init: term.expression + }); + } + return this.transformDestructuring(term); + } - return newBuf - } + enforestCallExpression() { + let paren = this.advance(); + return new _terms2.default("CallExpression", { + callee: this.term, + arguments: paren.inner() + }); + } - /* - * Need to make sure that buffer isn't trying to write out of bounds. - */ - function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') - } + enforestArrowExpression() { + let enf; + if (this.isIdentifier(this.peek())) { + enf = new Enforester(_immutable.List.of(this.advance()), (0, _immutable.List)(), this.context); + } else { + let p = this.matchParens(); + enf = new Enforester(p, (0, _immutable.List)(), this.context); + } + let params = enf.enforestFormalParameters(); + this.matchPunctuator('=>'); - Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) + let body; + if (this.isBraces(this.peek())) { + body = this.matchCurlies(); + } else { + enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); + body = enf.enforestExpressionLoop(); + this.rest = enf.rest; + } + return new _terms2.default('ArrowExpression', { params: params, body: body }); + } - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul + enforestYieldExpression() { + let kwd = this.matchKeyword('yield'); + let lookahead = this.peek(); + + if (this.rest.size === 0 || lookahead && !this.lineNumberEq(kwd, lookahead)) { + return new _terms2.default('YieldExpression', { + expression: null + }); + } else { + let isGenerator = false; + if (this.isPunctuator(this.peek(), '*')) { + isGenerator = true; + this.advance(); + } + let expr = this.enforestExpression(); + let type = isGenerator ? 'YieldGeneratorExpression' : 'YieldExpression'; + return new _terms2.default(type, { + expression: expr + }); + } } - return val - } + enforestSyntaxTemplate() { + return new _terms2.default('SyntaxTemplate', { + template: this.advance() + }); + } - Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) + enforestSyntaxQuote() { + let name = this.advance(); + return new _terms2.default('SyntaxQuote', { + name: name, + template: new _terms2.default('TemplateExpression', { + tag: new _terms2.default('IdentifierExpression', { + name: name + }), + elements: this.enforestTemplateElements() + }) + }); } - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul + enforestStaticMemberExpression() { + let object = this.term; + this.advance(); + let property = this.advance(); + + return new _terms2.default("StaticMemberExpression", { + object: object, + property: property + }); } - return val - } + enforestArrayExpression() { + let arr = this.advance(); - Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] - } + let elements = []; - Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) - } + let enf = new Enforester(arr.inner(), (0, _immutable.List)(), this.context); - Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] - } + while (enf.rest.size > 0) { + let lookahead = enf.peek(); + if (enf.isPunctuator(lookahead, ",")) { + enf.advance(); + elements.push(null); + } else if (enf.isPunctuator(lookahead, '...')) { + enf.advance(); + let expression = enf.enforestExpressionLoop(); + if (expression == null) { + throw enf.createError(lookahead, 'expecting expression'); + } + elements.push(new _terms2.default('SpreadElement', { expression: expression })); + } else { + let term = enf.enforestExpressionLoop(); + if (term == null) { + throw enf.createError(lookahead, "expected expression"); + } + elements.push(term); + enf.consumeComma(); + } + } - Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) + return new _terms2.default("ArrayExpression", { + elements: (0, _immutable.List)(elements) + }); + } - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) - } + enforestObjectExpression() { + let obj = this.advance(); - Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) + let properties = (0, _immutable.List)(); - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) - } + let enf = new Enforester(obj.inner(), (0, _immutable.List)(), this.context); - Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) + let lastProp = null; + while (enf.rest.size > 0) { + let prop = enf.enforestPropertyDefinition(); + enf.consumeComma(); + properties = properties.concat(prop); - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul + if (lastProp === prop) { + throw enf.createError(prop, "invalid syntax in object"); + } + lastProp = prop; + } + + return new _terms2.default("ObjectExpression", { + properties: properties + }); } - mul *= 0x80 - if (val >= mul) val -= Math.pow(2, 8 * byteLength) + enforestPropertyDefinition() { + var _enforestMethodDefini = this.enforestMethodDefinition(); - return val - } + let methodOrKey = _enforestMethodDefini.methodOrKey; + let kind = _enforestMethodDefini.kind; - Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 + switch (kind) { + case 'method': + return methodOrKey; + case 'identifier': + if (this.isAssign(this.peek())) { + this.advance(); + let init = this.enforestExpressionLoop(); + return new _terms2.default('BindingPropertyIdentifier', { + init: init, binding: this.transformDestructuring(methodOrKey) + }); + } else if (!this.isPunctuator(this.peek(), ':')) { + return new _terms2.default('ShorthandProperty', { + name: methodOrKey.value + }); + } + } - if (val >= mul) val -= Math.pow(2, 8 * byteLength) + this.matchPunctuator(':'); + let expr = this.enforestExpressionLoop(); - return val - } + return new _terms2.default("DataProperty", { + name: methodOrKey, + expression: expr + }); + } - Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) - } + enforestMethodDefinition() { + let lookahead = this.peek(); + let isGenerator = false; + if (this.isPunctuator(lookahead, '*')) { + isGenerator = true; + this.advance(); + } - Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val - } + if (this.isIdentifier(lookahead, 'get') && this.isPropertyName(this.peek(1))) { + this.advance(); - Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val - } + var _enforestPropertyName2 = this.enforestPropertyName(); - Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) + let name = _enforestPropertyName2.name; - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) - } + this.matchParens(); + let body = this.matchCurlies(); + return { + methodOrKey: new _terms2.default('Getter', { name: name, body: body }), + kind: 'method' + }; + } else if (this.isIdentifier(lookahead, 'set') && this.isPropertyName(this.peek(1))) { + this.advance(); - Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) + var _enforestPropertyName3 = this.enforestPropertyName(); - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) - } + let name = _enforestPropertyName3.name; - Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) - } + let enf = new Enforester(this.matchParens(), (0, _immutable.List)(), this.context); + let param = enf.enforestBindingElement(); + let body = this.matchCurlies(); + return { + methodOrKey: new _terms2.default('Setter', { name: name, param: param, body: body }), + kind: 'method' + }; + } - Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) - } + var _enforestPropertyName4 = this.enforestPropertyName(); - Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) - } + let name = _enforestPropertyName4.name; - Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) - } + if (this.isParens(this.peek())) { + let params = this.matchParens(); + let enf = new Enforester(params, (0, _immutable.List)(), this.context); + let formalParams = enf.enforestFormalParameters(); - function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - } + let body = this.matchCurlies(); + return { + methodOrKey: new _terms2.default('Method', { + isGenerator: isGenerator, + name: name, params: formalParams, body: body + }), + kind: 'method' + }; + } + return { + methodOrKey: name, + kind: this.isIdentifier(lookahead) || this.isKeyword(lookahead) ? 'identifier' : 'property' + }; + } - Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + enforestPropertyName() { + let lookahead = this.peek(); - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF + if (this.isStringLiteral(lookahead) || this.isNumericLiteral(lookahead)) { + return { + name: new _terms2.default('StaticPropertyName', { + value: this.advance() + }), + binding: null + }; + } else if (this.isBrackets(lookahead)) { + let enf = new Enforester(this.matchSquares(), (0, _immutable.List)(), this.context); + let expr = enf.enforestExpressionLoop(); + return { + name: new _terms2.default('ComputedPropertyName', { + expression: expr + }), + binding: null + }; + } + let name = this.advance(); + return { + name: new _terms2.default('StaticPropertyName', { value: name }), + binding: new _terms2.default('BindingIdentifier', { name: name }) + }; } - return offset + byteLength - } - - Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) + enforestFunction(_ref6) { + let isExpr = _ref6.isExpr; + let inDefault = _ref6.inDefault; - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } + let name = null, + params, + body; + let isGenerator = false; + // eat the function keyword + let fnKeyword = this.advance(); + let lookahead = this.peek(); + let type = isExpr ? 'FunctionExpression' : 'FunctionDeclaration'; + + if (this.isPunctuator(lookahead, "*")) { + isGenerator = true; + this.advance(); + lookahead = this.peek(); + } - return offset + byteLength - } + if (!this.isParens(lookahead)) { + name = this.enforestBindingIdentifier(); + } else if (inDefault) { + name = new _terms2.default('BindingIdentifier', { + name: _syntax2.default.fromIdentifier('*default*', fnKeyword) + }); + } - Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = (value & 0xff) - return offset + 1 - } + params = this.matchParens(); - function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } - } + body = this.matchCurlies(); - Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 - } + let enf = new Enforester(params, (0, _immutable.List)(), this.context); + let formalParams = enf.enforestFormalParameters(); - Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) + return new _terms2.default(type, { + name: name, + isGenerator: isGenerator, + params: formalParams, + body: body + }); } - return offset + 2 - } - function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } - } + enforestFunctionExpression() { + let name = null, + params, + body; + let isGenerator = false; + // eat the function keyword + this.advance(); + let lookahead = this.peek(); - Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 - } + if (this.isPunctuator(lookahead, "*")) { + isGenerator = true; + this.advance(); + lookahead = this.peek(); + } - Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 - } + if (!this.isParens(lookahead)) { + name = this.enforestBindingIdentifier(); + } - Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) + params = this.matchParens(); + body = this.matchCurlies(); - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } + let enf = new Enforester(params, (0, _immutable.List)(), this.context); + let formalParams = enf.enforestFormalParameters(); - var i = 0 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + return new _terms2.default("FunctionExpression", { + name: name, + isGenerator: isGenerator, + params: formalParams, + body: body + }); } - return offset + byteLength - } - - Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) + enforestFunctionDeclaration() { + let name, params, body; + let isGenerator = false; + // eat the function keyword + this.advance(); + let lookahead = this.peek(); - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } + if (this.isPunctuator(lookahead, "*")) { + isGenerator = true; + this.advance(); + } - var i = byteLength - 1 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } + name = this.enforestBindingIdentifier(); - return offset + byteLength - } + params = this.matchParens(); + body = this.matchCurlies(); - Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - if (value < 0) value = 0xff + value + 1 - this[offset] = (value & 0xff) - return offset + 1 - } + let enf = new Enforester(params, (0, _immutable.List)(), this.context); + let formalParams = enf.enforestFormalParameters(); - Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) + return new _terms2.default("FunctionDeclaration", { + name: name, + isGenerator: isGenerator, + params: formalParams, + body: body + }); } - return offset + 2 - } - Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) + enforestFormalParameters() { + let items = []; + let rest = null; + while (this.rest.size !== 0) { + let lookahead = this.peek(); + if (this.isPunctuator(lookahead, '...')) { + this.matchPunctuator('...'); + rest = this.enforestBindingIdentifier(); + break; + } + items.push(this.enforestParam()); + this.consumeComma(); + } + return new _terms2.default("FormalParameters", { + items: (0, _immutable.List)(items), rest: rest + }); } - return offset + 2 - } - Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else { - objectWriteUInt32(this, value, offset, true) + enforestParam() { + return this.enforestBindingElement(); } - return offset + 4 - } - Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 - } + enforestUpdateExpression() { + let operator = this.matchUnaryOperator(); - function checkIEEE754 (buf, value, offset, ext, max, min) { - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - if (offset < 0) throw new RangeError('index out of range') - } + return new _terms2.default('UpdateExpression', { + isPrefix: false, + operator: operator.val(), + operand: this.transformDestructuring(this.term) + }); + } - function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + enforestUnaryExpression() { + let operator = this.matchUnaryOperator(); + this.opCtx.stack = this.opCtx.stack.push({ + prec: this.opCtx.prec, + combine: this.opCtx.combine + }); + // TODO: all builtins are 14, custom operators will change this + this.opCtx.prec = 14; + this.opCtx.combine = rightTerm => { + if (operator.val() === '++' || operator.val() === '--') { + return new _terms2.default('UpdateExpression', { + operator: operator.val(), + operand: this.transformDestructuring(rightTerm), + isPrefix: true + }); + } else { + return new _terms2.default('UnaryExpression', { + operator: operator.val(), + operand: rightTerm + }); + } + }; + return EXPR_LOOP_OPERATOR; } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 - } - Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) - } + enforestConditionalExpression() { + // first, pop the operator stack + let test = this.opCtx.combine(this.term); + if (this.opCtx.stack.size > 0) { + var _opCtx$stack$last2 = this.opCtx.stack.last(); - Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) - } + let prec = _opCtx$stack$last2.prec; + let combine = _opCtx$stack$last2.combine; - function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + this.opCtx.stack = this.opCtx.stack.pop(); + this.opCtx.prec = prec; + this.opCtx.combine = combine; + } + + this.matchPunctuator('?'); + let enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); + let consequent = enf.enforestExpressionLoop(); + enf.matchPunctuator(':'); + enf = new Enforester(enf.rest, (0, _immutable.List)(), this.context); + let alternate = enf.enforestExpressionLoop(); + this.rest = enf.rest; + return new _terms2.default('ConditionalExpression', { + test: test, consequent: consequent, alternate: alternate + }); } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 - } - Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) - } + enforestBinaryExpression() { - Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) - } + let leftTerm = this.term; + let opStx = this.peek(); + let op = opStx.val(); + let opPrec = (0, _operators.getOperatorPrec)(op); + let opAssoc = (0, _operators.getOperatorAssoc)(op); - // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) - Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start + if ((0, _operators.operatorLt)(this.opCtx.prec, opPrec, opAssoc)) { + this.opCtx.stack = this.opCtx.stack.push({ + prec: this.opCtx.prec, + combine: this.opCtx.combine + }); + this.opCtx.prec = opPrec; + this.opCtx.combine = rightTerm => { + return new _terms2.default("BinaryExpression", { + left: leftTerm, + operator: opStx, + right: rightTerm + }); + }; + this.advance(); + return EXPR_LOOP_OPERATOR; + } else { + let term = this.opCtx.combine(leftTerm); + // this.rest does not change - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 + var _opCtx$stack$last3 = this.opCtx.stack.last(); - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') + let prec = _opCtx$stack$last3.prec; + let combine = _opCtx$stack$last3.combine; + + this.opCtx.stack = this.opCtx.stack.pop(); + this.opCtx.prec = prec; + this.opCtx.combine = combine; + return term; + } } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start + enforestTemplateElements() { + let lookahead = this.matchTemplate(); + let elements = lookahead.token.items.map(it => { + if (this.isDelimiter(it)) { + let enf = new Enforester(it.inner(), (0, _immutable.List)(), this.context); + return enf.enforest("expression"); + } + return new _terms2.default('TemplateElement', { + rawValue: it.slice.text + }); + }); + return elements; } - var len = end - start - var i + expandMacro() { + let lookahead = this.peek(); + while (this.isCompiletimeTransform(lookahead)) { + let name = this.advance(); + + let syntaxTransform = this.getFromCompiletimeEnvironment(name); + if (syntaxTransform == null || typeof syntaxTransform.value !== "function") { + throw this.createError(name, "the macro name was not bound to a value that could be invoked"); + } + let useSiteScope = (0, _scope.freshScope)("u"); + let introducedScope = (0, _scope.freshScope)("i"); + // TODO: needs to be a list of scopes I think + this.context.useScope = useSiteScope; + + let ctx = new _macroContext2.default(this, name, this.context, useSiteScope, introducedScope); + + let result = (0, _loadSyntax.sanitizeReplacementValues)(syntaxTransform.value.call(null, ctx)); + if (!_immutable.List.isList(result)) { + throw this.createError(name, "macro must return a list but got: " + result); + } + result = result.map(stx => { + if (!(stx && typeof stx.addScope === 'function')) { + throw this.createError(name, 'macro must return syntax objects or terms but got: ' + stx); + } + return stx.addScope(introducedScope, this.context.bindings, _syntax.ALL_PHASES, { flip: true }); + }); - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; i--) { - target[i + targetStart] = this[i + start] - } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; i++) { - target[i + targetStart] = this[i + start] + this.rest = result.concat(ctx._rest(this)); + lookahead = this.peek(); } - } else { - target._set(this.subarray(start, start + len), targetStart) } - return len - } + consumeSemicolon() { + let lookahead = this.peek(); - // fill(value, start=0, end=buffer.length) - Buffer.prototype.fill = function fill (value, start, end) { - if (!value) value = 0 - if (!start) start = 0 - if (!end) end = this.length + if (lookahead && this.isPunctuator(lookahead, ";")) { + this.advance(); + } + } - if (end < start) throw new RangeError('end < start') + consumeComma() { + let lookahead = this.peek(); - // Fill 0 bytes; we're done - if (end === start) return - if (this.length === 0) return + if (lookahead && this.isPunctuator(lookahead, ',')) { + this.advance(); + } + } - if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') - if (end < 0 || end > this.length) throw new RangeError('end out of bounds') + safeCheck(obj, type) { + let val = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - var i - if (typeof value === 'number') { - for (i = start; i < end; i++) { - this[i] = value - } - } else { - var bytes = utf8ToBytes(value.toString()) - var len = bytes.length - for (i = start; i < end; i++) { - this[i] = bytes[i % len] - } + return obj && (typeof obj.match === 'function' ? obj.match(type, val) : false); } - return this - } + isTerm(term) { + return term && term instanceof _terms2.default; + } - /** - * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. - * Added in Node 0.12. Only available in browsers that support ArrayBuffer. - */ - Buffer.prototype.toArrayBuffer = function toArrayBuffer () { - if (typeof Uint8Array !== 'undefined') { - if (Buffer.TYPED_ARRAY_SUPPORT) { - return (new Buffer(this)).buffer - } else { - var buf = new Uint8Array(this.length) - for (var i = 0, len = buf.length; i < len; i += 1) { - buf[i] = this[i] - } - return buf.buffer - } - } else { - throw new TypeError('Buffer.toArrayBuffer not supported in this browser') + isEOF(obj) { + return this.safeCheck(obj, 'eof'); } - } - // HELPER FUNCTIONS - // ================ + isIdentifier(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - var BP = Buffer.prototype + return this.safeCheck(obj, 'identifier', val); + } - /** - * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods - */ - Buffer._augment = function _augment (arr) { - arr.constructor = Buffer - arr._isBuffer = true + isPropertyName(obj) { + return this.isIdentifier(obj) || this.isKeyword(obj) || this.isNumericLiteral(obj) || this.isStringLiteral(obj) || this.isBrackets(obj); + } - // save reference to original Uint8Array set method before overwriting - arr._set = arr.set + isNumericLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - // deprecated - arr.get = BP.get - arr.set = BP.set + return this.safeCheck(obj, 'number', val); + } - arr.write = BP.write - arr.toString = BP.toString - arr.toLocaleString = BP.toString - arr.toJSON = BP.toJSON - arr.equals = BP.equals - arr.compare = BP.compare - arr.indexOf = BP.indexOf - arr.copy = BP.copy - arr.slice = BP.slice - arr.readUIntLE = BP.readUIntLE - arr.readUIntBE = BP.readUIntBE - arr.readUInt8 = BP.readUInt8 - arr.readUInt16LE = BP.readUInt16LE - arr.readUInt16BE = BP.readUInt16BE - arr.readUInt32LE = BP.readUInt32LE - arr.readUInt32BE = BP.readUInt32BE - arr.readIntLE = BP.readIntLE - arr.readIntBE = BP.readIntBE - arr.readInt8 = BP.readInt8 - arr.readInt16LE = BP.readInt16LE - arr.readInt16BE = BP.readInt16BE - arr.readInt32LE = BP.readInt32LE - arr.readInt32BE = BP.readInt32BE - arr.readFloatLE = BP.readFloatLE - arr.readFloatBE = BP.readFloatBE - arr.readDoubleLE = BP.readDoubleLE - arr.readDoubleBE = BP.readDoubleBE - arr.writeUInt8 = BP.writeUInt8 - arr.writeUIntLE = BP.writeUIntLE - arr.writeUIntBE = BP.writeUIntBE - arr.writeUInt16LE = BP.writeUInt16LE - arr.writeUInt16BE = BP.writeUInt16BE - arr.writeUInt32LE = BP.writeUInt32LE - arr.writeUInt32BE = BP.writeUInt32BE - arr.writeIntLE = BP.writeIntLE - arr.writeIntBE = BP.writeIntBE - arr.writeInt8 = BP.writeInt8 - arr.writeInt16LE = BP.writeInt16LE - arr.writeInt16BE = BP.writeInt16BE - arr.writeInt32LE = BP.writeInt32LE - arr.writeInt32BE = BP.writeInt32BE - arr.writeFloatLE = BP.writeFloatLE - arr.writeFloatBE = BP.writeFloatBE - arr.writeDoubleLE = BP.writeDoubleLE - arr.writeDoubleBE = BP.writeDoubleBE - arr.fill = BP.fill - arr.inspect = BP.inspect - arr.toArrayBuffer = BP.toArrayBuffer + isStringLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return arr - } + return this.safeCheck(obj, 'string', val); + } - var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g + isTemplate(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' + return this.safeCheck(obj, 'template', val); } - return str - } - function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') - } + isSyntaxTemplate(obj) { + return this.safeCheck(obj, 'syntaxTemplate'); + } - function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) - } + isBooleanLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] + return this.safeCheck(obj, 'boolean', val); + } - for (var i = 0; i < length; i++) { - codePoint = string.charCodeAt(i) + isNullLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } + return this.safeCheck(obj, 'null', val); + } - // valid lead - leadSurrogate = codePoint + isRegularExpression(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - continue - } + return this.safeCheck(obj, 'regularExpression', val); + } - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } + isDelimiter(obj) { + return this.safeCheck(obj, 'delimiter'); + } - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - } + isParens(obj) { + return this.safeCheck(obj, 'parens'); + } - leadSurrogate = null + isBraces(obj) { + return this.safeCheck(obj, 'braces'); + } - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } + isBrackets(obj) { + return this.safeCheck(obj, 'brackets'); } - return bytes - } + isAssign(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; i++) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) + return this.safeCheck(obj, 'assign', val); } - return byteArray - } - function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; i++) { - if ((units -= 2) < 0) break + isKeyword(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) + return this.safeCheck(obj, 'keyword', val); } - return byteArray - } + isPunctuator(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) - } + return this.safeCheck(obj, 'punctuator', val); + } - function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; i++) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] + isOperator(obj) { + return (this.safeCheck(obj, 'punctuator') || this.safeCheck(obj, 'identifier') || this.safeCheck(obj, 'keyword')) && (0, _operators.isOperator)(obj); } - return i - } - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(59).Buffer, (function() { return this; }()))) + isUpdateOperator(obj) { + return this.safeCheck(obj, 'punctuator', '++') || this.safeCheck(obj, 'punctuator', '--'); + } -/***/ }, -/* 60 */ -/***/ function(module, exports, __webpack_require__) { + safeResolve(obj, phase) { + return obj && typeof obj.resolve === 'function' ? Just(obj.resolve(phase)) : Nothing(); + } - var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + isTransform(obj, trans) { + return this.safeResolve(obj, this.context.phase).map(name => this.context.env.get(name) === trans || this.context.store.get(name) === trans).getOrElse(false); + } - ;(function (exports) { - 'use strict'; + isTransformInstance(obj, trans) { + return this.safeResolve(obj, this.context.phase).map(name => this.context.env.get(name) instanceof trans || this.context.store.get(name) instanceof trans).getOrElse(false); + } - var Arr = (typeof Uint8Array !== 'undefined') - ? Uint8Array - : Array + isFnDeclTransform(obj) { + return this.isTransform(obj, _transforms.FunctionDeclTransform); + } - var PLUS = '+'.charCodeAt(0) - var SLASH = '/'.charCodeAt(0) - var NUMBER = '0'.charCodeAt(0) - var LOWER = 'a'.charCodeAt(0) - var UPPER = 'A'.charCodeAt(0) - var PLUS_URL_SAFE = '-'.charCodeAt(0) - var SLASH_URL_SAFE = '_'.charCodeAt(0) + isVarDeclTransform(obj) { + return this.isTransform(obj, _transforms.VariableDeclTransform); + } - function decode (elt) { - var code = elt.charCodeAt(0) - if (code === PLUS || - code === PLUS_URL_SAFE) - return 62 // '+' - if (code === SLASH || - code === SLASH_URL_SAFE) - return 63 // '/' - if (code < NUMBER) - return -1 //no match - if (code < NUMBER + 10) - return code - NUMBER + 26 + 26 - if (code < UPPER + 26) - return code - UPPER - if (code < LOWER + 26) - return code - LOWER + 26 - } + isLetDeclTransform(obj) { + return this.isTransform(obj, _transforms.LetDeclTransform); + } - function b64ToByteArray (b64) { - var i, j, l, tmp, placeHolders, arr + isConstDeclTransform(obj) { + return this.isTransform(obj, _transforms.ConstDeclTransform); + } - if (b64.length % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } + isSyntaxDeclTransform(obj) { + return this.isTransform(obj, _transforms.SyntaxDeclTransform); + } - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - var len = b64.length - placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 + isSyntaxrecDeclTransform(obj) { + return this.isTransform(obj, _transforms.SyntaxrecDeclTransform); + } - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(b64.length * 3 / 4 - placeHolders) + isSyntaxQuoteTransform(obj) { + return this.isTransform(obj, _transforms.SyntaxQuoteTransform); + } - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? b64.length - 4 : b64.length + isReturnStmtTransform(obj) { + return this.isTransform(obj, _transforms.ReturnStatementTransform); + } - var L = 0 + isWhileTransform(obj) { + return this.isTransform(obj, _transforms.WhileTransform); + } - function push (v) { - arr[L++] = v - } + isForTransform(obj) { + return this.isTransform(obj, _transforms.ForTransform); + } - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) - push((tmp & 0xFF0000) >> 16) - push((tmp & 0xFF00) >> 8) - push(tmp & 0xFF) - } + isSwitchTransform(obj) { + return this.isTransform(obj, _transforms.SwitchTransform); + } - if (placeHolders === 2) { - tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) - push(tmp & 0xFF) - } else if (placeHolders === 1) { - tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) - push((tmp >> 8) & 0xFF) - push(tmp & 0xFF) - } + isBreakTransform(obj) { + return this.isTransform(obj, _transforms.BreakTransform); + } - return arr - } + isContinueTransform(obj) { + return this.isTransform(obj, _transforms.ContinueTransform); + } - function uint8ToBase64 (uint8) { - var i, - extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes - output = "", - temp, length + isDoTransform(obj) { + return this.isTransform(obj, _transforms.DoTransform); + } - function encode (num) { - return lookup.charAt(num) - } + isDebuggerTransform(obj) { + return this.isTransform(obj, _transforms.DebuggerTransform); + } - function tripletToBase64 (num) { - return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) - } + isWithTransform(obj) { + return this.isTransform(obj, _transforms.WithTransform); + } - // go through the array every three bytes, we'll deal with trailing stuff later - for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { - temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output += tripletToBase64(temp) - } + isTryTransform(obj) { + return this.isTransform(obj, _transforms.TryTransform); + } - // pad the end with zeros, but make sure to not forget the extra bytes - switch (extraBytes) { - case 1: - temp = uint8[uint8.length - 1] - output += encode(temp >> 2) - output += encode((temp << 4) & 0x3F) - output += '==' - break - case 2: - temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) - output += encode(temp >> 10) - output += encode((temp >> 4) & 0x3F) - output += encode((temp << 2) & 0x3F) - output += '=' - break - } + isThrowTransform(obj) { + return this.isTransform(obj, _transforms.ThrowTransform); + } - return output - } + isIfTransform(obj) { + return this.isTransform(obj, _transforms.IfTransform); + } - exports.toByteArray = b64ToByteArray - exports.fromByteArray = uint8ToBase64 - }( false ? (this.base64js = {}) : exports)) + isNewTransform(obj) { + return this.isTransform(obj, _transforms.NewTransform); + } + isCompiletimeTransform(obj) { + return this.isTransformInstance(obj, _transforms.CompiletimeTransform); + } -/***/ }, -/* 61 */ -/***/ function(module, exports) { + isVarBindingTransform(obj) { + return this.isTransformInstance(obj, _transforms.VarBindingTransform); + } - exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] + getFromCompiletimeEnvironment(term) { + if (this.context.env.has(term.resolve(this.context.phase))) { + return this.context.env.get(term.resolve(this.context.phase)); + } + return this.context.store.get(term.resolve(this.context.phase)); + } - i += d + lineNumberEq(a, b) { + if (!(a && b)) { + return false; + } + return a.lineNumber() === b.lineNumber(); + } - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + matchIdentifier(val) { + let lookahead = this.advance(); + if (this.isIdentifier(lookahead, val)) { + return lookahead; + } + throw this.createError(lookahead, "expecting an identifier"); + } - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + matchKeyword(val) { + let lookahead = this.advance(); + if (this.isKeyword(lookahead, val)) { + return lookahead; + } + throw this.createError(lookahead, 'expecting ' + val); + } - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias + matchLiteral() { + let lookahead = this.advance(); + if (this.isNumericLiteral(lookahead) || this.isStringLiteral(lookahead) || this.isBooleanLiteral(lookahead) || this.isNullLiteral(lookahead) || this.isTemplate(lookahead) || this.isRegularExpression(lookahead)) { + return lookahead; + } + throw this.createError(lookahead, "expecting a literal"); } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) - } - exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + matchStringLiteral() { + let lookahead = this.advance(); + if (this.isStringLiteral(lookahead)) { + return lookahead; + } + throw this.createError(lookahead, 'expecting a string literal'); + } - value = Math.abs(value) + matchTemplate() { + let lookahead = this.advance(); + if (this.isTemplate(lookahead)) { + return lookahead; + } + throw this.createError(lookahead, 'expecting a template literal'); + } - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 + matchParens() { + let lookahead = this.advance(); + if (this.isParens(lookahead)) { + return lookahead.inner(); } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) + throw this.createError(lookahead, "expecting parens"); + } + + matchCurlies() { + let lookahead = this.advance(); + if (this.isBraces(lookahead)) { + return lookahead.inner(); } - if (value * c >= 2) { - e++ - c /= 2 + throw this.createError(lookahead, "expecting curly braces"); + } + matchSquares() { + let lookahead = this.advance(); + if (this.isBrackets(lookahead)) { + return lookahead.inner(); } + throw this.createError(lookahead, "expecting sqaure braces"); + } - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias + matchUnaryOperator() { + let lookahead = this.advance(); + if ((0, _operators.isUnaryOperator)(lookahead)) { + return lookahead; + } + throw this.createError(lookahead, "expecting a unary operator"); + } + + matchPunctuator(val) { + let lookahead = this.advance(); + if (this.isPunctuator(lookahead)) { + if (typeof val !== 'undefined') { + if (lookahead.val() === val) { + return lookahead; + } else { + throw this.createError(lookahead, "expecting a " + val + " punctuator"); + } + } + return lookahead; + } + throw this.createError(lookahead, "expecting a punctuator"); + } + + createError(stx, message) { + let ctx = ""; + let offending = stx; + if (this.rest.size > 0) { + ctx = this.rest.slice(0, 20).map(term => { + if (this.isDelimiter(term)) { + return term.inner(); + } + return _immutable.List.of(term); + }).flatten().map(s => { + if (s === offending) { + return "__" + s.val() + "__"; + } + return s.val(); + }).join(" "); } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 + ctx = offending.toString(); } + return new Error(message + "\n" + ctx); + } + } + exports.Enforester = Enforester; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmZvcmVzdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUNBOztBQUlBOztBQXdCQTs7QUFDQTs7QUFDQTs7QUFPQTs7OztBQUVBOztBQUNBOztBQUVBOzs7Ozs7QUF6Q0EsTUFBTSxPQUFPLG9CQUFNLElBQW5CO0FBQ0EsTUFBTSxVQUFVLG9CQUFNLE9BQXRCOztBQTBDQSxNQUFNLHFCQUFxQixFQUEzQjtBQUNBLE1BQU0sc0JBQXNCLEVBQTVCO0FBQ0EsTUFBTSxzQkFBc0IsRUFBNUI7O0FBRU8sTUFBTSxVQUFOLENBQWlCO0FBQ3RCLGNBQVksSUFBWixFQUFrQixJQUFsQixFQUF3QixPQUF4QixFQUFpQztBQUMvQixTQUFLLElBQUwsR0FBWSxLQUFaO0FBQ0Esd0JBQU8sZ0JBQUssTUFBTCxDQUFZLElBQVosQ0FBUCxFQUEwQix1Q0FBMUI7QUFDQSx3QkFBTyxnQkFBSyxNQUFMLENBQVksSUFBWixDQUFQLEVBQTBCLHVDQUExQjtBQUNBLHdCQUFPLE9BQVAsRUFBZ0IsaUNBQWhCO0FBQ0EsU0FBSyxJQUFMLEdBQVksSUFBWjs7QUFFQSxTQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsU0FBSyxJQUFMLEdBQVksSUFBWjs7QUFFQSxTQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0Q7O0FBRUQsU0FBWTtBQUFBLFFBQVAsQ0FBTyx5REFBSCxDQUFHOztBQUNWLFdBQU8sS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLENBQWQsQ0FBUDtBQUNEOztBQUVELFlBQVU7QUFDUixRQUFJLE1BQU0sS0FBSyxJQUFMLENBQVUsS0FBVixFQUFWO0FBQ0EsU0FBSyxJQUFMLEdBQVksS0FBSyxJQUFMLENBQVUsSUFBVixFQUFaO0FBQ0EsV0FBTyxHQUFQO0FBQ0Q7O0FBRUQ7Ozs7OztBQU1BLGFBQTBCO0FBQUEsUUFBakIsSUFBaUIseURBQVYsUUFBVTs7QUFDeEI7QUFDQSxTQUFLLElBQUwsR0FBWSxJQUFaOztBQUVBLFFB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SUFBTCxDQUFVLElBQVYsR0FBaUIsQ0FBckIsRUFBd0I7QUFDdEIsWUFBTSxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQWdCLENBQWhCLEVBQW1CLEVBQW5CLEVBQXVCLEdBQXZCLENBQTJCLFFBQVE7QUFDdkMsWUFBSSxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBSixFQUE0QjtBQUMxQixpQkFBTyxLQUFLLEtBQUwsRUFBUDtBQUNEO0FBQ0QsZUFBTyxnQkFBSyxFQUFMLENBQVEsSUFBUixDQUFQO0FBQ0QsT0FMSyxFQUtILE9BTEcsR0FLTyxHQUxQLENBS1csS0FBSztBQUNwQixZQUFJLE1BQU0sU0FBVixFQUFxQjtBQUNuQixpQkFBTyxPQUFPLEVBQUUsR0FBRixFQUFQLEdBQWlCLElBQXhCO0FBQ0Q7QUFDRCxlQUFPLEVBQUUsR0FBRixFQUFQO0FBQ0QsT0FWSyxFQVVILElBVkcsQ0FVRSxHQVZGLENBQU47QUFXRCxLQVpELE1BWU87QUFDTCxZQUFNLFVBQVUsUUFBVixFQUFOO0FBQ0Q7QUFDRCxXQUFPLElBQUksS0FBSixDQUFVLFVBQVUsSUFBVixHQUFpQixHQUEzQixDQUFQO0FBRUQ7QUFqckVxQjtRQUFYLFUsR0FBQSxVIiwiZmlsZSI6ImVuZm9yZXN0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVybSwgeyBpc0lkZW50aWZpZXJFeHByZXNzaW9uLCBpc1N0YXRpY01lbWJlckV4cHJlc3Npb24sIGlzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uIH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IE1heWJlIH0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmNvbnN0IEp1c3QgPSBNYXliZS5KdXN0O1xuY29uc3QgTm90aGluZyA9IE1heWJlLk5vdGhpbmc7XG5cbmltcG9ydCB7XG4gIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybSxcbiAgVmFyaWFibGVEZWNsVHJhbnNmb3JtLFxuICBOZXdUcmFuc2Zvcm0sXG4gIExldERlY2xUcmFuc2Zvcm0sXG4gIENvbnN0RGVjbFRyYW5zZm9ybSxcbiAgU3ludGF4RGVjbFRyYW5zZm9ybSxcbiAgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSxcbiAgU3ludGF4UXVvdGVUcmFuc2Zvcm0sXG4gIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSxcbiAgV2hpbGVUcmFuc2Zvcm0sXG4gIElmVHJhbnNmb3JtLFxuICBGb3JUcmFuc2Zvcm0sXG4gIFN3aXRjaFRyYW5zZm9ybSxcbiAgQnJlYWtUcmFuc2Zvcm0sXG4gIENvbnRpbnVlVHJhbnNmb3JtLFxuICBEb1RyYW5zZm9ybSxcbiAgRGVidWdnZXJUcmFuc2Zvcm0sXG4gIFdpdGhUcmFuc2Zvcm0sXG4gIFRyeVRyYW5zZm9ybSxcbiAgVGhyb3dUcmFuc2Zvcm0sXG4gIENvbXBpbGV0aW1lVHJhbnNmb3JtLFxuICBWYXJCaW5kaW5nVHJhbnNmb3JtXG59IGZyb20gXCIuL3RyYW5zZm9ybXNcIjtcbmltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgeyBleHBlY3QsIGFzc2VydCB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtcbiAgaXNPcGVyYXRvcixcbiAgaXNVbmFyeU9wZXJhdG9yLFxuICBnZXRPcGVyYXRvckFzc29jLFxuICBnZXRPcGVyYXRvclByZWMsXG4gIG9wZXJhdG9yTHRcbn0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgU3ludGF4LCB7IEFMTF9QSEFTRVMgfSBmcm9tIFwiLi9zeW50YXhcIjtcblxuaW1wb3J0IHsgZnJlc2hTY29wZSB9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgeyBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzIH0gZnJvbSAnLi9sb2FkLXN5bnRheCc7XG5cbmltcG9ydCBNYWNyb0NvbnRleHQgZnJvbSBcIi4vbWFjcm8tY29udGV4dFwiO1xuXG5jb25zdCBFWFBSX0xPT1BfT1BFUkFUT1IgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9OT19DSEFOR0UgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9FWFBBTlNJT04gPSB7fTtcblxuZXhwb3J0IGNsYXNzIEVuZm9yZXN0ZXIge1xuICBjb25zdHJ1Y3RvcihzdHhsLCBwcmV2LCBjb250ZXh0KSB7XG4gICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHN0eGwpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHByZXYpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KGNvbnRleHQsIFwiZXhwZWN0aW5nIGEgY29udGV4dCB0byBlbmZvcmVzdFwiKTtcbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuXG4gICAgdGhpcy5yZXN0ID0gc3R4bDtcbiAgICB0aGlzLnByZXYgPSBwcmV2O1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHBlZWsobiA9IDApIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0LmdldChuKTtcbiAgfVxuXG4gIGFkdmFuY2UoKSB7XG4gICAgbGV0IHJldCA9IHRoaXMucmVzdC5maXJzdCgpO1xuICAgIHRoaXMucmVzdCA9IHRoaXMucmVzdC5yZXN0KCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qXG4gICBlbmZvcmVzdCB3b3JrcyBvdmVyOlxuICAgcHJldiAtIGEgbGlzdCBvZiB0aGUgcHJldmlvdXNseSBlbmZvcmVzdCBUZXJtc1xuICAgdGVybSAtIHRoZSBjdXJyZW50IHRlcm0gYmVpbmcgZW5mb3Jlc3RlZCAoaW5pdGlhbGx5IG51bGwpXG4gICByZXN0IC0gcmVtYWluaW5nIFRlcm1zIHRvIGVuZm9yZXN0XG4gICAqL1xuICBlbmZvcmVzdCh0eXBlID0gXCJNb2R1bGVcIikge1xuICAgIC8vIGluaXRpYWxpemUgdGhlIHRlcm1cbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuXG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMudGVybTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0VPRih0aGlzLnBlZWsoKSkpIHtcbiAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKFwiRU9GXCIsIHt9KTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRoaXMudGVybTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlID09PSBcImV4cHJlc3Npb25cIikge1xuICAgICAgcmVzdWx0ID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZW5mb3Jlc3RNb2R1bGUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBlbmZvcmVzdE1vZHVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJvZHkoKTtcbiAgfVxuXG4gIGVuZm9yZXN0Qm9keSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdE1vZHVsZUl0ZW0oKTtcbiAgfVxuXG4gIGVuZm9yZXN0TW9kdWxlSXRlbSgpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2ltcG9ydCcpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SW1wb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2V4cG9ydCcpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RXhwb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCwgJyMnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMYW5ndWFnZVByYWdtYSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICB9XG5cbiAgZW5mb3Jlc3RMYW5ndWFnZVByYWdtYSgpIHtcbiAgICB0aGlzLm1hdGNoSWRlbnRpZmllcignIycpO1xuICAgIHRoaXMubWF0Y2hJZGVudGlmaWVyKCdsYW5nJyk7XG4gICAgbGV0IHBhdGggPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybSgnUHJhZ21hJywge1xuICAgICAga2luZDogJ2xhbmcnLFxuICAgICAgaXRlbXM6IExpc3Qub2YocGF0aClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0RXhwb3J0RGVjbGFyYXRpb24oKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcqJykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydEFsbEZyb20nLCB7IG1vZHVsZVNwZWNpZmllciB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgbGV0IG5hbWVkRXhwb3J0cyA9IHRoaXMuZW5mb3Jlc3RFeHBvcnRDbGF1c2UoKTtcbiAgICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCAnZnJvbScpKSB7XG4gICAgICAgIG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydEZyb20nLCB7IG5hbWVkRXhwb3J0cywgbW9kdWxlU3BlY2lmaWVyIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnY2xhc3MnKSkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnQnLCB7XG4gICAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0Q2xhc3MoeyBpc0V4cHI6IGZhbHNlIH0pXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnQnLCB7XG4gICAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwcjogZmFsc2UsIGluRGVmYXVsdDogZmFsc2V9KVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdkZWZhdWx0JykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0odGhpcy5wZWVrKCkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0RGVmYXVsdCcsIHtcbiAgICAgICAgICBib2R5OiB0aGlzLmVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwcjogZmFsc2UsIGluRGVmYXVsdDogdHJ1ZX0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2NsYXNzJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnREZWZhdWx0Jywge1xuICAgICAgICAgIGJvZHk6IHRoaXMuZW5mb3Jlc3RDbGFzcyh7aXNFeHByOiBmYWxzZSwgaW5EZWZhdWx0OiB0cnVlfSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgYm9keSA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnREZWZhdWx0JywgeyBib2R5IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1ZhckRlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICB0aGlzLmlzTGV0RGVjbFRyYW5zZm9ybShsb29rYWhlYWQpIHx8XG4gICAgICAgIHRoaXMuaXNDb25zdERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICB0aGlzLmlzU3ludGF4cmVjRGVjbFRyYW5zZm9ybShsb29rYWhlYWQpIHx8XG4gICAgICAgIHRoaXMuaXNTeW50YXhEZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0Jywge1xuICAgICAgICBkZWNsYXJhdGlvbjogdGhpcy5lbmZvcmVzdFZhcmlhYmxlRGVjbGFyYXRpb24oKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCAndW5leHBlY3RlZCBzeW50YXgnKTtcbiAgfVxuXG4gIGVuZm9yZXN0RXhwb3J0Q2xhdXNlKCkge1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcih0aGlzLm1hdGNoQ3VybGllcygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHdoaWxlIChlbmYucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICByZXN1bHQucHVzaChlbmYuZW5mb3Jlc3RFeHBvcnRTcGVjaWZpZXIoKSk7XG4gICAgICBlbmYuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdEV4cG9ydFNwZWNpZmllcigpIHtcbiAgICBsZXQgbmFtZSA9IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCk7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCAnYXMnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgZXhwb3J0ZWROYW1lID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0U3BlY2lmaWVyJywgeyBuYW1lLCBleHBvcnRlZE5hbWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0U3BlY2lmaWVyJywge1xuICAgICAgbmFtZTogbnVsbCxcbiAgICAgIGV4cG9ydGVkTmFtZTogbmFtZVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RJbXBvcnREZWNsYXJhdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGRlZmF1bHRCaW5kaW5nID0gbnVsbDtcbiAgICBsZXQgbmFtZWRJbXBvcnRzID0gTGlzdCgpO1xuICAgIGxldCBmb3JTeW50YXggPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWQpKSB7XG4gICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0Jywge1xuICAgICAgICBkZWZhdWx0QmluZGluZyxcbiAgICAgICAgbmFtZWRJbXBvcnRzLFxuICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIGZvclN5bnRheFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkKSkge1xuICAgICAgZGVmYXVsdEJpbmRpbmcgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICcsJykpIHtcbiAgICAgICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2ZvcicpICYmIHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygxKSwgJ3N5bnRheCcpKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgZm9yU3ludGF4ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0Jywge1xuICAgICAgICAgIGRlZmF1bHRCaW5kaW5nLCBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgbmFtZWRJbXBvcnRzOiBMaXN0KCksXG4gICAgICAgICAgZm9yU3ludGF4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnN1bWVDb21tYSgpO1xuICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkpIHtcbiAgICAgIGxldCBpbXBvcnRzID0gdGhpcy5lbmZvcmVzdE5hbWVkSW1wb3J0cygpO1xuICAgICAgbGV0IGZyb21DbGF1c2UgPSB0aGlzLmVuZm9yZXN0RnJvbUNsYXVzZSgpO1xuICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCAnZm9yJykgJiYgdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKDEpLCAnc3ludGF4JykpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBmb3JTeW50YXggPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnRcIiwge1xuICAgICAgICBkZWZhdWx0QmluZGluZyxcbiAgICAgICAgZm9yU3ludGF4LFxuICAgICAgICBuYW1lZEltcG9ydHM6IGltcG9ydHMsXG4gICAgICAgIG1vZHVsZVNwZWNpZmllcjogZnJvbUNsYXVzZVxuXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJyonKSkge1xuICAgICAgbGV0IG5hbWVzcGFjZUJpbmRpbmcgPSB0aGlzLmVuZm9yZXN0TmFtZXNwYWNlQmluZGluZygpO1xuICAgICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdmb3InKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksICdzeW50YXgnKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGZvclN5bnRheCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ0ltcG9ydE5hbWVzcGFjZScsIHtcbiAgICAgICAgZGVmYXVsdEJpbmRpbmcsIGZvclN5bnRheCwgbmFtZXNwYWNlQmluZGluZywgbW9kdWxlU3BlY2lmaWVyXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsICd1bmV4cGVjdGVkIHN5bnRheCcpO1xuICB9XG5cbiAgZW5mb3Jlc3ROYW1lc3BhY2VCaW5kaW5nKCkge1xuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKCcqJyk7XG4gICAgdGhpcy5tYXRjaElkZW50aWZpZXIoJ2FzJyk7XG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICB9XG5cbiAgZW5mb3Jlc3ROYW1lZEltcG9ydHMoKSB7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKGVuZi5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKGVuZi5lbmZvcmVzdEltcG9ydFNwZWNpZmllcnMoKSk7XG4gICAgICBlbmYuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdEltcG9ydFNwZWNpZmllcnMoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBuYW1lO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCkpIHtcbiAgICAgIG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGlmICghdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCksICdhcycpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0U3BlY2lmaWVyJywge1xuICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgYmluZGluZzogbmV3IFRlcm0oJ0JpbmRpbmdJZGVudGlmaWVyJywge1xuICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXRjaElkZW50aWZpZXIoJ2FzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCAndW5leHBlY3RlZCB0b2tlbiBpbiBpbXBvcnQgc3BlY2lmaWVyJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0U3BlY2lmaWVyJywge1xuICAgICAgbmFtZSwgYmluZGluZzogdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0RnJvbUNsYXVzZSgpIHtcbiAgICB0aGlzLm1hdGNoSWRlbnRpZmllcignZnJvbScpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBsb29rYWhlYWQ7XG4gIH1cblxuICBlbmZvcmVzdFN0YXRlbWVudExpc3RJdGVtKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RnVuY3Rpb25EZWNsYXJhdGlvbih7IGlzRXhwcjogZmFsc2UgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENsYXNzKHsgaXNFeHByOiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBlbmZvcmVzdFN0YXRlbWVudCgpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNDb21waWxldGltZVRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICB0aGlzLmV4cGFuZE1hY3JvKCk7XG4gICAgICBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUZXJtKGxvb2thaGVhZCkpIHtcbiAgICAgIC8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhbiBzdGF0ZW1lbnRcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCbG9ja1N0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1doaWxlVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0V2hpbGVTdGF0ZW1lbnQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNJZlRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdElmU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0ZvclRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEZvclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNTd2l0Y2hUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTd2l0Y2hTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJlYWtUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCcmVha1N0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNDb250aW51ZVRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0RvVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RG9TdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRGVidWdnZXJUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3REZWJ1Z2dlclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNXaXRoVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0V2l0aFN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUcnlUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUcnlTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVGhyb3dUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUaHJvd1N0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHB1dCBzb21ld2hlcmUgZWxzZVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCBcImNsYXNzXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkKSAmJlxuICAgICAgICB0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoMSksICc6JykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TGFiZWxlZFN0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiZcbiAgICAgICAgKHRoaXMuaXNWYXJEZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkgfHxcbiAgICAgICAgIHRoaXMuaXNMZXREZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkgfHxcbiAgICAgICAgIHRoaXMuaXNDb25zdERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgdGhpcy5pc1N5bnRheHJlY0RlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgdGhpcy5pc1N5bnRheERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSkpIHtcbiAgICAgIGxldCBzdG10ID0gbmV3IFRlcm0oJ1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQnLCB7XG4gICAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzUmV0dXJuU3RtdFRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFJldHVyblN0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCBcIjtcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRW1wdHlTdGF0ZW1lbnRcIiwge30pO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uU3RhdGVtZW50KCk7XG4gIH1cblxuICBlbmZvcmVzdExhYmVsZWRTdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGxhYmVsID0gdGhpcy5tYXRjaElkZW50aWZpZXIoKTtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignOicpO1xuICAgIGxldCBzdG10ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdMYWJlbGVkU3RhdGVtZW50Jywge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgYm9keTogc3RtdFxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RCcmVha1N0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnYnJlYWsnKTtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGxhYmVsID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCAnOycpKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnQnJlYWtTdGF0ZW1lbnQnLCB7IGxhYmVsIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkKSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICd5aWVsZCcpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2xldCcpKSB7XG4gICAgICBsYWJlbCA9IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCcmVha1N0YXRlbWVudCcsIHsgbGFiZWwgfSk7XG4gIH1cblxuICBlbmZvcmVzdFRyeVN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgndHJ5Jyk7XG4gICAgbGV0IGJvZHkgPSB0aGlzLmVuZm9yZXN0QmxvY2soKTtcbiAgICBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdjYXRjaCcpKSB7XG4gICAgICBsZXQgY2F0Y2hDbGF1c2UgPSB0aGlzLmVuZm9yZXN0Q2F0Y2hDbGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2ZpbmFsbHknKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgbGV0IGZpbmFsaXplciA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ1RyeUZpbmFsbHlTdGF0ZW1lbnQnLCB7XG4gICAgICAgICAgYm9keSwgY2F0Y2hDbGF1c2UsIGZpbmFsaXplclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSgnVHJ5Q2F0Y2hTdGF0ZW1lbnQnLCB7IGJvZHksIGNhdGNoQ2xhdXNlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdmaW5hbGx5JykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IGZpbmFsaXplciA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdUcnlGaW5hbGx5U3RhdGVtZW50JywgeyBib2R5LCBjYXRjaENsYXVzZTogbnVsbCwgZmluYWxpemVyIH0pO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKHRoaXMucGVlaygpLCAndHJ5IHdpdGggbm8gY2F0Y2ggb3IgZmluYWxseScpO1xuICB9XG5cbiAgZW5mb3Jlc3RDYXRjaENsYXVzZSgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnY2F0Y2gnKTtcbiAgICBsZXQgYmluZGluZ1BhcmVucyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoYmluZGluZ1BhcmVucywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBiaW5kaW5nID0gZW5mLmVuZm9yZXN0QmluZGluZ1RhcmdldCgpO1xuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdEJsb2NrKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDYXRjaENsYXVzZScsIHsgYmluZGluZywgYm9keSB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VGhyb3dTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ3Rocm93Jyk7XG4gICAgbGV0IGV4cHJlc3Npb24gPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybSgnVGhyb3dTdGF0ZW1lbnQnLCB7IGV4cHJlc3Npb24gfSk7XG4gIH1cblxuICBlbmZvcmVzdFdpdGhTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ3dpdGgnKTtcbiAgICBsZXQgb2JqUGFyZW5zID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihvYmpQYXJlbnMsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgb2JqZWN0ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIHJldHVybiBuZXcgVGVybSgnV2l0aFN0YXRlbWVudCcsIHsgb2JqZWN0LCBib2R5IH0pO1xuICB9XG5cbiAgZW5mb3Jlc3REZWJ1Z2dlclN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnZGVidWdnZXInKTtcblxuICAgIHJldHVybiBuZXcgVGVybSgnRGVidWdnZXJTdGF0ZW1lbnQnLCB7fSk7XG4gIH1cblxuICBlbmZvcmVzdERvU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKCdkbycpO1xuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKCd3aGlsZScpO1xuICAgIGxldCB0ZXN0Qm9keSA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGVzdEJvZHksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0RvV2hpbGVTdGF0ZW1lbnQnLCB7IGJvZHksIHRlc3QgfSk7XG4gIH1cblxuICBlbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCkge1xuICAgIGxldCBrd2QgPSB0aGlzLm1hdGNoS2V5d29yZCgnY29udGludWUnKTtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGxhYmVsID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCAnOycpKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnQ29udGludWVTdGF0ZW1lbnQnLCB7IGxhYmVsIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5saW5lTnVtYmVyRXEoa3dkLCBsb29rYWhlYWQpICYmXG4gICAgICAgICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8XG4gICAgICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICd5aWVsZCcpIHx8XG4gICAgICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdsZXQnKSkpIHtcbiAgICAgIGxhYmVsID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oJ0NvbnRpbnVlU3RhdGVtZW50JywgeyBsYWJlbCB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0U3dpdGNoU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKCdzd2l0Y2gnKTtcbiAgICBsZXQgY29uZCA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoY29uZCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBkaXNjcmltaW5hbnQgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuXG4gICAgaWYgKGJvZHkuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnQnLCB7XG4gICAgICAgIGRpc2NyaW1pbmFudDogZGlzY3JpbWluYW50LFxuICAgICAgICBjYXNlczogTGlzdCgpXG4gICAgICB9KTtcbiAgICB9XG4gICAgZW5mID0gbmV3IEVuZm9yZXN0ZXIoYm9keSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBjYXNlcyA9IGVuZi5lbmZvcmVzdFN3aXRjaENhc2VzKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IGVuZi5wZWVrKCk7XG4gICAgaWYgKGVuZi5pc0tleXdvcmQobG9va2FoZWFkLCAnZGVmYXVsdCcpKSB7XG4gICAgICBsZXQgZGVmYXVsdENhc2UgPSBlbmYuZW5mb3Jlc3RTd2l0Y2hEZWZhdWx0KCk7XG4gICAgICBsZXQgcG9zdERlZmF1bHRDYXNlcyA9IGVuZi5lbmZvcmVzdFN3aXRjaENhc2VzKCk7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ1N3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0Jywge1xuICAgICAgICBkaXNjcmltaW5hbnQsXG4gICAgICAgIHByZURlZmF1bHRDYXNlczogY2FzZXMsXG4gICAgICAgIGRlZmF1bHRDYXNlLFxuICAgICAgICBwb3N0RGVmYXVsdENhc2VzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnQnLCB7ICBkaXNjcmltaW5hbnQsIGNhc2VzIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RTd2l0Y2hDYXNlcygpIHtcbiAgICBsZXQgY2FzZXMgPSBbXTtcbiAgICB3aGlsZSAoISh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCB0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2RlZmF1bHQnKSkpIHtcbiAgICAgIGNhc2VzLnB1c2godGhpcy5lbmZvcmVzdFN3aXRjaENhc2UoKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KGNhc2VzKTtcbiAgfVxuXG4gIGVuZm9yZXN0U3dpdGNoQ2FzZSgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnY2FzZScpO1xuICAgIHJldHVybiBuZXcgVGVybSgnU3dpdGNoQ2FzZScsIHtcbiAgICAgIHRlc3Q6IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCksXG4gICAgICBjb25zZXF1ZW50OiB0aGlzLmVuZm9yZXN0U3dpdGNoQ2FzZUJvZHkoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpIHtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignOicpO1xuICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50TGlzdEluU3dpdGNoQ2FzZUJvZHkoKTtcbiAgfVxuXG4gIGVuZm9yZXN0U3RhdGVtZW50TGlzdEluU3dpdGNoQ2FzZUJvZHkoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHdoaWxlKCEodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdkZWZhdWx0JykgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdjYXNlJykpKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmVuZm9yZXN0U3RhdGVtZW50TGlzdEl0ZW0oKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdFN3aXRjaERlZmF1bHQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ2RlZmF1bHQnKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1N3aXRjaERlZmF1bHQnLCB7XG4gICAgICBjb25zZXF1ZW50OiB0aGlzLmVuZm9yZXN0U3dpdGNoQ2FzZUJvZHkoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGb3JTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ2ZvcicpO1xuICAgIGxldCBjb25kID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcihjb25kLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGxvb2thaGVhZCwgdGVzdCwgaW5pdCwgcmlnaHQsIHR5cGUsIGxlZnQsIHVwZGF0ZTtcblxuICAgIC8vIGNhc2Ugd2hlcmUgaW5pdCBpcyBudWxsXG4gICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJzsnKSkge1xuICAgICAgZW5mLmFkdmFuY2UoKTtcbiAgICAgIGlmICghZW5mLmlzUHVuY3R1YXRvcihlbmYucGVlaygpLCAnOycpKSB7XG4gICAgICAgIHRlc3QgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICB9XG4gICAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc7Jyk7XG4gICAgICBpZiAoZW5mLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgICByaWdodCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSgnRm9yU3RhdGVtZW50Jywge1xuICAgICAgICBpbml0OiBudWxsLFxuICAgICAgICB0ZXN0OiB0ZXN0LFxuICAgICAgICB1cGRhdGU6IHJpZ2h0LFxuICAgICAgICBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KClcbiAgICAgIH0pO1xuICAgIC8vIGNhc2Ugd2hlcmUgaW5pdCBpcyBub3QgbnVsbFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0ZXN0aW5nXG4gICAgICBsb29rYWhlYWQgPSBlbmYucGVlaygpO1xuICAgICAgaWYgKGVuZi5pc1ZhckRlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgIGVuZi5pc0xldERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgIGVuZi5pc0NvbnN0RGVjbFRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICAgIGluaXQgPSBlbmYuZW5mb3Jlc3RWYXJpYWJsZURlY2xhcmF0aW9uKCk7XG4gICAgICAgIGxvb2thaGVhZCA9IGVuZi5wZWVrKCk7XG4gICAgICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdpbicpIHx8IHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCwgJ29mJykpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnaW4nKSkge1xuICAgICAgICAgICAgZW5mLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHJpZ2h0ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgdHlwZSA9ICdGb3JJblN0YXRlbWVudCc7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQsICdvZicpKSB7XG4gICAgICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmlnaHQgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICB0eXBlID0gJ0Zvck9mU3RhdGVtZW50JztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKHR5cGUsIHtcbiAgICAgICAgICAgIGxlZnQ6IGluaXQsIHJpZ2h0LCBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc7Jyk7XG4gICAgICAgIGlmIChlbmYuaXNQdW5jdHVhdG9yKGVuZi5wZWVrKCksICc7JykpIHtcbiAgICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICAgIHRlc3QgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlc3QgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgICAgZW5mLm1hdGNoUHVuY3R1YXRvcignOycpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmlzS2V5d29yZChlbmYucGVlaygxKSwgJ2luJykgfHwgdGhpcy5pc0lkZW50aWZpZXIoZW5mLnBlZWsoMSksICdvZicpKSB7XG4gICAgICAgICAgbGVmdCA9IGVuZi5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgICAgICAgbGV0IGtpbmQgPSBlbmYuYWR2YW5jZSgpO1xuICAgICAgICAgIGlmICh0aGlzLmlzS2V5d29yZChraW5kLCAnaW4nKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdGb3JJblN0YXRlbWVudCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSAnRm9yT2ZTdGF0ZW1lbnQnO1xuICAgICAgICAgIH1cbiAgICAgICAgICByaWdodCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgICAgICAgbGVmdDogbGVmdCwgcmlnaHQsIGJvZHk6IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGluaXQgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgIGVuZi5tYXRjaFB1bmN0dWF0b3IoJzsnKTtcbiAgICAgICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJzsnKSkge1xuICAgICAgICAgIGVuZi5hZHZhbmNlKCk7XG4gICAgICAgICAgdGVzdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc7Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdGb3JTdGF0ZW1lbnQnLCB7IGluaXQsIHRlc3QsIHVwZGF0ZSwgYm9keTogdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpIH0pO1xuICAgIH1cbiAgfVxuXG4gIGVuZm9yZXN0SWZTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ2lmJyk7XG4gICAgbGV0IGNvbmQgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKGNvbmQsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkID0gZW5mLnBlZWsoKTtcbiAgICBsZXQgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAodGVzdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyBhbiBleHByZXNzaW9uJyk7XG4gICAgfVxuICAgIGxldCBjb25zZXF1ZW50ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIGxldCBhbHRlcm5hdGUgPSBudWxsO1xuICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2Vsc2UnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBhbHRlcm5hdGUgPSB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSgnSWZTdGF0ZW1lbnQnLCB7IHRlc3QsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZSB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0V2hpbGVTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ3doaWxlJyk7XG4gICAgbGV0IGNvbmQgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKGNvbmQsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkID0gZW5mLnBlZWsoKTtcbiAgICBsZXQgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAodGVzdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyBhbiBleHByZXNzaW9uJyk7XG4gICAgfVxuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdXaGlsZVN0YXRlbWVudCcsIHsgdGVzdCwgYm9keSB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0QmxvY2tTdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCbG9ja1N0YXRlbWVudCcsIHtcbiAgICAgIGJsb2NrOiB0aGlzLmVuZm9yZXN0QmxvY2soKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RCbG9jaygpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0Jsb2NrJywge1xuICAgICAgc3RhdGVtZW50czogdGhpcy5tYXRjaEN1cmxpZXMoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RDbGFzcyh7IGlzRXhwciwgaW5EZWZhdWx0IH0pIHtcbiAgICBsZXQga3cgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQgbmFtZSA9IG51bGwsIHN1cHIgPSBudWxsO1xuICAgIGxldCB0eXBlID0gaXNFeHByID8gJ0NsYXNzRXhwcmVzc2lvbicgOiAnQ2xhc3NEZWNsYXJhdGlvbic7XG5cbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfSBlbHNlIGlmICghaXNFeHByKSB7XG4gICAgICBpZiAoaW5EZWZhdWx0KSB7XG4gICAgICAgIG5hbWUgPSBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7XG4gICAgICAgICAgbmFtZTogU3ludGF4LmZyb21JZGVudGlmaWVyKCdfZGVmYXVsdCcsIGt3KVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IodGhpcy5wZWVrKCksICd1bmV4cGVjdGVkIHN5bnRheCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2V4dGVuZHMnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBzdXByID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnRzID0gW107XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB3aGlsZSAoZW5mLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJzsnKSkge1xuICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU3RhdGljID0gZmFsc2U7XG4gICAgICBsZXQge21ldGhvZE9yS2V5LCBraW5kfSA9IGVuZi5lbmZvcmVzdE1ldGhvZERlZmluaXRpb24oKTtcbiAgICAgIGlmIChraW5kID09PSAnaWRlbnRpZmllcicgJiYgbWV0aG9kT3JLZXkudmFsdWUudmFsKCkgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIGlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgKHttZXRob2RPcktleSwga2luZH0gPSBlbmYuZW5mb3Jlc3RNZXRob2REZWZpbml0aW9uKCkpO1xuICAgICAgfVxuICAgICAgaWYgKGtpbmQgPT09ICdtZXRob2QnKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2gobmV3IFRlcm0oJ0NsYXNzRWxlbWVudCcsIHtpc1N0YXRpYywgbWV0aG9kOiBtZXRob2RPcktleX0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IoZW5mLnBlZWsoKSwgXCJPbmx5IG1ldGhvZHMgYXJlIGFsbG93ZWQgaW4gY2xhc3Nlc1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgbmFtZSwgc3VwZXI6IHN1cHIsXG4gICAgICBlbGVtZW50czogTGlzdChlbGVtZW50cylcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0QmluZGluZ1RhcmdldCh7IGFsbG93UHVuY3R1YXRvciB9ID0ge30pIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkKSB8fCAoYWxsb3dQdW5jdHVhdG9yICYmIHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKHsgYWxsb3dQdW5jdHVhdG9yIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QXJyYXlCaW5kaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0T2JqZWN0QmluZGluZygpO1xuICAgIH1cbiAgICBhc3NlcnQoZmFsc2UsICdub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gIH1cblxuICBlbmZvcmVzdE9iamVjdEJpbmRpbmcoKSB7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgcHJvcGVydGllcyA9IFtdO1xuICAgIHdoaWxlIChlbmYucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICBwcm9wZXJ0aWVzLnB1c2goZW5mLmVuZm9yZXN0QmluZGluZ1Byb3BlcnR5KCkpO1xuICAgICAgZW5mLmNvbnN1bWVDb21tYSgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGVybSgnT2JqZWN0QmluZGluZycsIHtcbiAgICAgIHByb3BlcnRpZXM6IExpc3QocHJvcGVydGllcylcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0QmluZGluZ1Byb3BlcnR5KCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQge25hbWUsIGJpbmRpbmd9ID0gdGhpcy5lbmZvcmVzdFByb3BlcnR5TmFtZSgpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2xldCcpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ3lpZWxkJykpIHtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICc6JykpIHtcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzQXNzaWduKHRoaXMucGVlaygpKSkge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIGxldCBleHByID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlID0gZXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXInLCB7XG4gICAgICAgICAgYmluZGluZywgaW5pdDogZGVmYXVsdFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignOicpO1xuICAgIGJpbmRpbmcgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0VsZW1lbnQoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5Jywge1xuICAgICAgbmFtZSwgYmluZGluZ1xuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcnJheUJpbmRpbmcoKSB7XG4gICAgbGV0IGJyYWNrZXQgPSB0aGlzLm1hdGNoU3F1YXJlcygpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihicmFja2V0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGVsZW1lbnRzID0gW10sIHJlc3RFbGVtZW50ID0gbnVsbDtcbiAgICB3aGlsZSAoZW5mLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgbGV0IGVsO1xuICAgICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJywnKSkge1xuICAgICAgICBlbmYuY29uc3VtZUNvbW1hKCk7XG4gICAgICAgIGVsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlbmYuaXNQdW5jdHVhdG9yKGVuZi5wZWVrKCksICcuLi4nKSkge1xuICAgICAgICAgIGVuZi5hZHZhbmNlKCk7XG4gICAgICAgICAgcmVzdEVsZW1lbnQgPSBlbmYuZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwgPSBlbmYuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGVuZi5jb25zdW1lQ29tbWEoKTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRzLnB1c2goZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oJ0FycmF5QmluZGluZycsIHtcbiAgICAgIGVsZW1lbnRzOiBMaXN0KGVsZW1lbnRzKSxcbiAgICAgIHJlc3RFbGVtZW50XG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdEJpbmRpbmdFbGVtZW50KCkge1xuICAgIGxldCBiaW5kaW5nID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoKTtcblxuICAgIGlmICh0aGlzLmlzQXNzaWduKHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgaW5pdCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgYmluZGluZyA9IG5ldyBUZXJtKCdCaW5kaW5nV2l0aERlZmF1bHQnLCB7IGJpbmRpbmcsIGluaXQgfSk7XG4gICAgfVxuICAgIHJldHVybiBiaW5kaW5nO1xuICB9XG5cbiAgZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcih7IGFsbG93UHVuY3R1YXRvciB9ID0ge30pIHtcbiAgICBsZXQgbmFtZTtcbiAgICBpZiAoYWxsb3dQdW5jdHVhdG9yICYmIHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpKSkge1xuICAgICAgbmFtZSA9IHRoaXMuZW5mb3Jlc3RQdW5jdHVhdG9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSB0aGlzLmVuZm9yZXN0SWRlbnRpZmllcigpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7IG5hbWUgfSk7XG4gIH1cblxuICBlbmZvcmVzdFB1bmN0dWF0b3IoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhIHB1bmN0dWF0b3JcIik7XG4gIH1cblxuICBlbmZvcmVzdElkZW50aWZpZXIoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwiZXhwZWN0aW5nIGFuIGlkZW50aWZpZXJcIik7XG4gIH1cblxuXG4gIGVuZm9yZXN0UmV0dXJuU3RhdGVtZW50KCkge1xuICAgIGxldCBrdyA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIC8vIHNob3J0IGNpcmN1aXQgZm9yIHRoZSBlbXB0eSBleHByZXNzaW9uIGNhc2VcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHxcbiAgICAgICAgKGxvb2thaGVhZCAmJiAhdGhpcy5saW5lTnVtYmVyRXEoa3csIGxvb2thaGVhZCkpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJSZXR1cm5TdGF0ZW1lbnRcIiwge1xuICAgICAgICBleHByZXNzaW9uOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgdGVybSA9IG51bGw7XG4gICAgaWYgKCF0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICc7JykpIHtcbiAgICAgIHRlcm0gPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgZXhwZWN0KHRlcm0gIT0gbnVsbCwgXCJFeHBlY3RpbmcgYW4gZXhwcmVzc2lvbiB0byBmb2xsb3cgcmV0dXJuIGtleXdvcmRcIiwgbG9va2FoZWFkLCB0aGlzLnJlc3QpO1xuICAgIH1cblxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7XG4gICAgICBleHByZXNzaW9uOiB0ZXJtXG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7XG4gICAgbGV0IGtpbmQ7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBraW5kU3luID0gbG9va2FoZWFkO1xuICAgIGxldCBwaGFzZSA9IHRoaXMuY29udGV4dC5waGFzZTtcblxuICAgIGlmIChraW5kU3luICYmXG4gICAgICAgIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW4ucmVzb2x2ZShwaGFzZSkpID09PSBWYXJpYWJsZURlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmQgPSBcInZhclwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5biAmJlxuICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bi5yZXNvbHZlKHBoYXNlKSkgPT09IExldERlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmQgPSBcImxldFwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5biAmJlxuICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bi5yZXNvbHZlKHBoYXNlKSkgPT09IENvbnN0RGVjbFRyYW5zZm9ybSkge1xuICAgICAga2luZCA9IFwiY29uc3RcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW4gJiZcbiAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW4ucmVzb2x2ZShwaGFzZSkpID09PSBTeW50YXhEZWNsVHJhbnNmb3JtKSB7XG4gICAgICBraW5kID0gXCJzeW50YXhcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW4gJiZcbiAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW4ucmVzb2x2ZShwaGFzZSkpID09PSBTeW50YXhyZWNEZWNsVHJhbnNmb3JtKSB7XG4gICAgICBraW5kID0gXCJzeW50YXhyZWNcIjtcbiAgICB9XG5cbiAgICBsZXQgZGVjbHMgPSBMaXN0KCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdG9yKHsgaXNTeW50YXg6IGtpbmQgPT09IFwic3ludGF4XCIgfHwga2luZCA9PT0gJ3N5bnRheHJlYycgfSk7XG4gICAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgICBkZWNscyA9IGRlY2xzLmNvbmNhdCh0ZXJtKTtcblxuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIsXCIpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdWYXJpYWJsZURlY2xhcmF0aW9uJywge1xuICAgICAga2luZDoga2luZCxcbiAgICAgIGRlY2xhcmF0b3JzOiBkZWNsc1xuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RWYXJpYWJsZURlY2xhcmF0b3IoeyBpc1N5bnRheCB9KSB7XG4gICAgbGV0IGlkID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoeyBhbGxvd1B1bmN0dWF0b3I6IGlzU3ludGF4IH0pO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGxldCBpbml0O1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICc9JykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgaW5pdCA9IGVuZi5lbmZvcmVzdChcImV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRvclwiLCB7XG4gICAgICBiaW5kaW5nOiBpZCxcbiAgICAgIGluaXQ6IGluaXRcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0RXhwcmVzc2lvblN0YXRlbWVudCgpIHtcbiAgICBsZXQgc3RhcnQgPSB0aGlzLnJlc3QuZ2V0KDApO1xuICAgIGxldCBleHByID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAoZXhwciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihzdGFydCwgXCJub3QgYSB2YWxpZCBleHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblxuICAgIHJldHVybiBuZXcgVGVybShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge1xuICAgICAgZXhwcmVzc2lvbjogZXhwclxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RFeHByZXNzaW9uKCkge1xuICAgIGxldCBsZWZ0ID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcsJykpIHtcbiAgICAgIHdoaWxlICh0aGlzLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCAnLCcpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdG9yID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGxldCByaWdodCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICBsZWZ0ID0gbmV3IFRlcm0oJ0JpbmFyeUV4cHJlc3Npb24nLCB7bGVmdCwgb3BlcmF0b3IsIHJpZ2h0fSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgcmV0dXJuIGxlZnQ7XG4gIH1cblxuICBlbmZvcmVzdEV4cHJlc3Npb25Mb29wKCkge1xuICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgdGhpcy5vcEN0eCA9IHtcbiAgICAgIHByZWM6IDAsXG4gICAgICBjb21iaW5lOiAoeCkgPT4geCxcbiAgICAgIHN0YWNrOiBMaXN0KClcbiAgICB9O1xuXG4gICAgZG8ge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0QXNzaWdubWVudEV4cHJlc3Npb24oKTtcbiAgICAgIC8vIG5vIGNoYW5nZSBtZWFucyB3ZSd2ZSBkb25lIGFzIG11Y2ggZW5mb3Jlc3RpbmcgYXMgcG9zc2libGVcbiAgICAgIC8vIGlmIG5vdGhpbmcgY2hhbmdlZCwgbWF5YmUgd2UganVzdCBuZWVkIHRvIHBvcCB0aGUgZXhwciBzdGFja1xuICAgICAgaWYgKHRlcm0gPT09IEVYUFJfTE9PUF9OT19DSEFOR0UgJiYgdGhpcy5vcEN0eC5zdGFjay5zaXplID4gMCkge1xuICAgICAgICB0aGlzLnRlcm0gPSB0aGlzLm9wQ3R4LmNvbWJpbmUodGhpcy50ZXJtKTtcbiAgICAgICAgbGV0IHtwcmVjLCBjb21iaW5lfSA9IHRoaXMub3BDdHguc3RhY2subGFzdCgpO1xuICAgICAgICB0aGlzLm9wQ3R4LnByZWMgPSBwcmVjO1xuICAgICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAodGVybSA9PT0gRVhQUl9MT09QX05PX0NIQU5HRSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAodGVybSA9PT0gRVhQUl9MT09QX09QRVJBVE9SIHx8IHRlcm0gPT09IEVYUFJfTE9PUF9FWFBBTlNJT04pIHtcbiAgICAgICAgLy8gb3BlcmF0b3IgbWVhbnMgYW4gb3BDdHggd2FzIHB1c2hlZCBvbiB0aGUgc3RhY2tcbiAgICAgICAgdGhpcy50ZXJtID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGVybSA9IHRlcm07XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7ICAvLyBnZXQgYSBmaXhwb2ludFxuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBlbmZvcmVzdEFzc2lnbm1lbnRFeHByZXNzaW9uKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0NvbXBpbGV0aW1lVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kTWFjcm8oKTtcbiAgICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1Rlcm0obG9va2FoZWFkKSkge1xuICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb25cbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ3lpZWxkJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0WWllbGRFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IHRydWV9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJlxuICAgICAgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSAmJlxuICAgICAgIHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygxKSwgJz0+JykgJiZcbiAgICAgICB0aGlzLmxpbmVOdW1iZXJFcShsb29rYWhlYWQsIHRoaXMucGVlaygxKSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QXJyb3dFeHByZXNzaW9uKCk7XG4gICAgfVxuXG5cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1N5bnRheFRlbXBsYXRlKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4VGVtcGxhdGUoKTtcbiAgICB9XG4gICAgLy8gc3ludGF4UXVvdGUgYCAuLi4gYFxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1N5bnRheFF1b3RlVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4UXVvdGUoKTtcbiAgICB9XG5cbiAgICAvLyAoJHg6ZXhwcilcbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNQYXJlbnMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIiwge1xuICAgICAgICBpbm5lcjogdGhpcy5hZHZhbmNlKCkuaW5uZXIoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiAoXG4gICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsIFwidGhpc1wiKSB8fFxuICAgICAgdGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkKSB8fFxuICAgICAgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnbGV0JykgfHxcbiAgICAgIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ3lpZWxkJykgfHxcbiAgICAgIHRoaXMuaXNOdW1lcmljTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzVGVtcGxhdGUobG9va2FoZWFkKSB8fFxuICAgICAgdGhpcy5pc0Jvb2xlYW5MaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgIHRoaXMuaXNOdWxsTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzUmVndWxhckV4cHJlc3Npb24obG9va2FoZWFkKSB8fFxuICAgICAgdGhpcy5pc0ZuRGVjbFRyYW5zZm9ybShsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkgfHxcbiAgICAgIHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWQpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RQcmltYXJ5RXhwcmVzc2lvbigpO1xuICAgIH1cblxuICAgIC8vIHByZWZpeCB1bmFyeVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc09wZXJhdG9yKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0VW5hcnlFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVmFyQmluZGluZ1RyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICBsZXQgaWQgPSB0aGlzLmdldEZyb21Db21waWxldGltZUVudmlyb25tZW50KGxvb2thaGVhZCkuaWQ7XG4gICAgICBpZiAoaWQgIT09IGxvb2thaGVhZCkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5yZXN0ID0gTGlzdC5vZihpZCkuY29uY2F0KHRoaXMucmVzdCk7XG4gICAgICAgIHJldHVybiBFWFBSX0xPT1BfRVhQQU5TSU9OO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgodGhpcy50ZXJtID09PSBudWxsICYmIChcbiAgICAgIHRoaXMuaXNOZXdUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdzdXBlcicpKSkgfHxcbiAgICAgICAgLy8gYW5kIHRoZW4gY2hlY2sgdGhlIGNhc2VzIHdoZXJlIHRoZSB0ZXJtIHBhcnQgb2YgcCBpcyBzb21ldGhpbmcuLi5cbiAgICAgICAgKHRoaXMudGVybSAmJiAoXG4gICAgICAgICAgLy8gJHg6ZXhwciAuICRwcm9wOmlkZW50XG4gICAgICAgICAgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJy4nKSAmJiAoXG4gICAgICAgICAgICB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSkpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygxKSkpKSB8fFxuICAgICAgICAgICAgLy8gJHg6ZXhwciBbICRiOmV4cHIgXVxuICAgICAgICAgICAgdGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkgfHxcbiAgICAgICAgICAgIC8vICR4OmV4cHIgKC4uLilcbiAgICAgICAgICAgIHRoaXMuaXNQYXJlbnMobG9va2FoZWFkKVxuICAgICAgICApKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKHsgYWxsb3dDYWxsOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vICR4OmlkIGAuLi5gXG4gICAgaWYodGhpcy50ZXJtICYmIHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgIH1cblxuICAgIC8vIHBvc3RmaXggdW5hcnlcbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNVcGRhdGVPcGVyYXRvcihsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFVwZGF0ZUV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICAvLyAkbDpleHByICRvcDpiaW5hcnlPcGVyYXRvciAkcjpleHByXG4gICAgaWYgKHRoaXMudGVybSAmJiB0aGlzLmlzT3BlcmF0b3IobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCaW5hcnlFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgLy8gJHg6ZXhwciA9ICRpbml0OmV4cHJcbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNBc3NpZ24obG9va2FoZWFkKSkge1xuICAgICAgbGV0IGJpbmRpbmcgPSB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodGhpcy50ZXJtKTtcbiAgICAgIGxldCBvcCA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGhpcy5yZXN0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgaW5pdCA9IGVuZi5lbmZvcmVzdChcImV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcblxuICAgICAgaWYgKG9wLnZhbCgpID09PSAnPScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdBc3NpZ25tZW50RXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBiaW5kaW5nLFxuICAgICAgICAgIGV4cHJlc3Npb246IGluaXRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0NvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb24nLCB7XG4gICAgICAgICAgYmluZGluZyxcbiAgICAgICAgICBvcGVyYXRvcjogb3AudmFsKCksXG4gICAgICAgICAgZXhwcmVzc2lvbjogaW5pdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJz8nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RDb25kaXRpb25hbEV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRVhQUl9MT09QX05PX0NIQU5HRTtcbiAgfVxuXG4gIGVuZm9yZXN0UHJpbWFyeUV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIC8vICR4OlRoaXNFeHByZXNzaW9uXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsIFwidGhpc1wiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUaGlzRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICAvLyAkeDppZGVudFxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnbGV0JykgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAneWllbGQnKSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SWRlbnRpZmllckV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3ROdW1lcmljTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3RyaW5nTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCb29sZWFuTGl0ZXJhbChsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJvb2xlYW5MaXRlcmFsKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc051bGxMaXRlcmFsKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TnVsbExpdGVyYWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzUmVndWxhckV4cHJlc3Npb24obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwoKTtcbiAgICB9XG4gICAgLy8gJHg6RnVuY3Rpb25FeHByZXNzaW9uXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RnVuY3Rpb25FeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIC8vIHsgJHA6cHJvcCAoLCkgLi4uIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RPYmplY3RFeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIC8vIFskeDpleHByICgsKSAuLi5dXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJhY2tldHMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RBcnJheUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCAnTm90IGEgcHJpbWFyeSBleHByZXNzaW9uJyk7XG4gIH1cblxuICBlbmZvcmVzdExlZnRIYW5kU2lkZUV4cHJlc3Npb24oeyBhbGxvd0NhbGwgfSkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdzdXBlcicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKCdTdXBlcicsIHt9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNOZXdUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdE5ld0V4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAodGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSB7XG4gICAgICAgIGlmICghYWxsb3dDYWxsKSB7XG4gICAgICAgICAgLy8gd2UncmUgZGVhbGluZyB3aXRoIGEgbmV3IGV4cHJlc3Npb25cbiAgICAgICAgICBpZiAodGhpcy50ZXJtICYmXG4gICAgICAgICAgICAgIChpc0lkZW50aWZpZXJFeHByZXNzaW9uKHRoaXMudGVybSkgfHxcbiAgICAgICAgICAgICAgIGlzU3RhdGljTWVtYmVyRXhwcmVzc2lvbih0aGlzLnRlcm0pIHx8XG4gICAgICAgICAgICAgICBpc0NvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbih0aGlzLnRlcm0pKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVybTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdENhbGxFeHByZXNzaW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy50ZXJtID8gdGhpcy5lbmZvcmVzdENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbigpIDogdGhpcy5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJy4nKSAmJiAoXG4gICAgICAgIHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygxKSkgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKDEpKSkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFN0YXRpY01lbWJlckV4cHJlc3Npb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gbmV3IFRlcm0oJ0lkZW50aWZpZXJFeHByZXNzaW9uJywgeyBuYW1lOiB0aGlzLmVuZm9yZXN0SWRlbnRpZmllcigpIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBlbmZvcmVzdEJvb2xlYW5MaXRlcmFsKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxCb29sZWFuRXhwcmVzc2lvblwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5hZHZhbmNlKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VGVtcGxhdGVMaXRlcmFsKCkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVGVtcGxhdGVFeHByZXNzaW9uJywge1xuICAgICAgdGFnOiB0aGlzLnRlcm0sXG4gICAgICBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RTdHJpbmdMaXRlcmFsKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmFkdmFuY2UoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3ROdW1lcmljTGl0ZXJhbCgpIHtcbiAgICBsZXQgbnVtID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKG51bS52YWwoKSA9PT0gMSAvIDApIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbicsIHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiBudW1cbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0SWRlbnRpZmllckV4cHJlc3Npb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge1xuICAgICAgbmFtZTogdGhpcy5hZHZhbmNlKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0UmVndWxhckV4cHJlc3Npb25MaXRlcmFsKCkge1xuICAgIGxldCByZVN0eCA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgbGV0IGxhc3RTbGFzaCA9IHJlU3R4LnRva2VuLnZhbHVlLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICBsZXQgcGF0dGVybiA9IHJlU3R4LnRva2VuLnZhbHVlLnNsaWNlKDEsIGxhc3RTbGFzaCk7XG4gICAgbGV0IGZsYWdzID0gcmVTdHgudG9rZW4udmFsdWUuc2xpY2UobGFzdFNsYXNoICsgMSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb25cIiwge1xuICAgICAgcGF0dGVybiwgZmxhZ3NcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0TnVsbExpdGVyYWwoKSB7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbE51bGxFeHByZXNzaW9uXCIsIHt9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VGhpc0V4cHJlc3Npb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVGhpc0V4cHJlc3Npb25cIiwge1xuICAgICAgc3R4OiB0aGlzLmFkdmFuY2UoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcmd1bWVudExpc3QoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHdoaWxlICh0aGlzLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgIGxldCBhcmc7XG4gICAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICcuLi4nKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgYXJnID0gbmV3IFRlcm0oJ1NwcmVhZEVsZW1lbnQnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKClcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgICAgdGhpcy5tYXRjaFB1bmN0dWF0b3IoJywnKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGFyZyk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdE5ld0V4cHJlc3Npb24oKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ25ldycpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoKSwgJy4nKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksICd0YXJnZXQnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnTmV3VGFyZ2V0RXhwcmVzc2lvbicsIHt9KTtcbiAgICB9XG5cbiAgICBsZXQgY2FsbGVlID0gdGhpcy5lbmZvcmVzdExlZnRIYW5kU2lkZUV4cHJlc3Npb24oeyBhbGxvd0NhbGw6IGZhbHNlIH0pO1xuICAgIGxldCBhcmdzO1xuICAgIGlmICh0aGlzLmlzUGFyZW5zKHRoaXMucGVlaygpKSkge1xuICAgICAgYXJncyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IExpc3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdOZXdFeHByZXNzaW9uJywge1xuICAgICAgY2FsbGVlLFxuICAgICAgYXJndW1lbnRzOiBhcmdzXG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGhpcy5tYXRjaFNxdWFyZXMoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiBuZXcgVGVybSgnQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uJywge1xuICAgICAgb2JqZWN0OiB0aGlzLnRlcm0sXG4gICAgICBleHByZXNzaW9uOiBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKClcbiAgICB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybURlc3RydWN0dXJpbmcodGVybSkge1xuICAgIHN3aXRjaCAodGVybS50eXBlKSB7XG4gICAgICBjYXNlICdJZGVudGlmaWVyRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7bmFtZTogdGVybS5uYW1lfSk7XG5cbiAgICAgIGNhc2UgJ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uJzpcbiAgICAgICAgaWYgKHRlcm0uaW5uZXIuc2l6ZSA9PT0gMSAmJiB0aGlzLmlzSWRlbnRpZmllcih0ZXJtLmlubmVyLmdldCgwKSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdJZGVudGlmaWVyJywgeyBuYW1lOiB0ZXJtLmlubmVyLmdldCgwKX0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXJtO1xuICAgICAgY2FzZSAnRGF0YVByb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eScsIHtcbiAgICAgICAgICBuYW1lOiB0ZXJtLm5hbWUsXG4gICAgICAgICAgYmluZGluZzogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nV2l0aERlZmF1bHQodGVybS5leHByZXNzaW9uKVxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ1Nob3J0aGFuZFByb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyJywge1xuICAgICAgICAgIGJpbmRpbmc6IG5ldyBUZXJtKCdCaW5kaW5nSWRlbnRpZmllcicsIHsgbmFtZTogdGVybS5uYW1lIH0pLFxuICAgICAgICAgIGluaXQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdPYmplY3RFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdPYmplY3RCaW5kaW5nJywge1xuICAgICAgICAgIHByb3BlcnRpZXM6IHRlcm0ucHJvcGVydGllcy5tYXAodCA9PiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodCkpXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAnQXJyYXlFeHByZXNzaW9uJzoge1xuICAgICAgICBsZXQgbGFzdCA9IHRlcm0uZWxlbWVudHMubGFzdCgpO1xuICAgICAgICBpZiAobGFzdCAhPSBudWxsICYmIGxhc3QudHlwZSA9PT0gJ1NwcmVhZEVsZW1lbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdBcnJheUJpbmRpbmcnLCB7XG4gICAgICAgICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5zbGljZSgwLCAtMSkubWFwKHQgPT4gdCAmJiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdCh0KSksXG4gICAgICAgICAgICByZXN0RWxlbWVudDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nV2l0aERlZmF1bHQobGFzdC5leHByZXNzaW9uKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSgnQXJyYXlCaW5kaW5nJywge1xuICAgICAgICAgICAgZWxlbWVudHM6IHRlcm0uZWxlbWVudHMubWFwKHQgPT4gdCAmJiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdCh0KSksXG4gICAgICAgICAgICByZXN0RWxlbWVudDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdTdGF0aWNQcm9wZXJ0eU5hbWUnOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdJZGVudGlmaWVyJywge1xuICAgICAgICAgIG5hbWU6IHRlcm0udmFsdWVcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdDb21wdXRlZE1lbWJlckV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnU3RhdGljTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdBcnJheUJpbmRpbmcnOlxuICAgICAgY2FzZSAnQmluZGluZ0lkZW50aWZpZXInOlxuICAgICAgY2FzZSAnQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcic6XG4gICAgICBjYXNlICdCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eSc6XG4gICAgICBjYXNlICdCaW5kaW5nV2l0aERlZmF1bHQnOlxuICAgICAgY2FzZSAnT2JqZWN0QmluZGluZyc6XG4gICAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgICBhc3NlcnQoZmFsc2UsICdub3QgaW1wbGVtZW50ZWQgeWV0IGZvciAnICsgdGVybS50eXBlKTtcbiAgfVxuXG4gIHRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdCh0ZXJtKSB7XG4gICAgc3dpdGNoICh0ZXJtLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdXaXRoRGVmYXVsdCcsIHtcbiAgICAgICAgICBiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodGVybS5iaW5kaW5nKSxcbiAgICAgICAgICBpbml0OiB0ZXJtLmV4cHJlc3Npb24sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRlcm0pO1xuICB9XG5cbiAgZW5mb3Jlc3RDYWxsRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgcGFyZW4gPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYWxsRXhwcmVzc2lvblwiLCB7XG4gICAgICBjYWxsZWU6IHRoaXMudGVybSxcbiAgICAgIGFyZ3VtZW50czogcGFyZW4uaW5uZXIoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKSB7XG4gICAgbGV0IGVuZjtcbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCkpKSB7XG4gICAgICBlbmYgPSBuZXcgRW5mb3Jlc3RlcihMaXN0Lm9mKHRoaXMuYWR2YW5jZSgpKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcCA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICAgIGVuZiA9IG5ldyBFbmZvcmVzdGVyKHAsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG4gICAgbGV0IHBhcmFtcyA9IGVuZi5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignPT4nKTtcblxuICAgIGxldCBib2R5O1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKHRoaXMucGVlaygpKSkge1xuICAgICAgYm9keSA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgYm9keSA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdBcnJvd0V4cHJlc3Npb24nLCB7IHBhcmFtcywgYm9keSB9KTtcbiAgfVxuXG5cbiAgZW5mb3Jlc3RZaWVsZEV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGt3ZCA9IHRoaXMubWF0Y2hLZXl3b3JkKCd5aWVsZCcpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCAobG9va2FoZWFkICYmICF0aGlzLmxpbmVOdW1iZXJFcShrd2QsIGxvb2thaGVhZCkpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ1lpZWxkRXhwcmVzc2lvbicsIHtcbiAgICAgICAgZXhwcmVzc2lvbjogbnVsbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpc0dlbmVyYXRvciA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCAnKicpKSB7XG4gICAgICAgICAgaXNHZW5lcmF0b3IgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfVxuICAgICAgbGV0IGV4cHIgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgbGV0IHR5cGUgPSBpc0dlbmVyYXRvciA/ICdZaWVsZEdlbmVyYXRvckV4cHJlc3Npb24nIDogJ1lpZWxkRXhwcmVzc2lvbic7XG4gICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgICBleHByZXNzaW9uOiBleHByXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBlbmZvcmVzdFN5bnRheFRlbXBsYXRlKCkge1xuICAgIHJldHVybiBuZXcgVGVybSgnU3ludGF4VGVtcGxhdGUnLCB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy5hZHZhbmNlKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0U3ludGF4UXVvdGUoKSB7XG4gICAgbGV0IG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1N5bnRheFF1b3RlJywge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHRlbXBsYXRlOiBuZXcgVGVybSgnVGVtcGxhdGVFeHByZXNzaW9uJywge1xuICAgICAgICB0YWc6IG5ldyBUZXJtKCdJZGVudGlmaWVyRXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH0pLFxuICAgICAgICBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0U3RhdGljTWVtYmVyRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgb2JqZWN0ID0gdGhpcy50ZXJtO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBwcm9wZXJ0eSA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBvYmplY3Q6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcnJheUV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGFyciA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgbGV0IGVsZW1lbnRzID0gW107XG5cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoYXJyLmlubmVyKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcblxuICAgIHdoaWxlIChlbmYucmVzdC5zaXplID4gMCkge1xuICAgICAgbGV0IGxvb2thaGVhZCA9IGVuZi5wZWVrKCk7XG4gICAgICBpZiAoZW5mLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsIFwiLFwiKSkge1xuICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICBlbGVtZW50cy5wdXNoKG51bGwpO1xuICAgICAgfSBlbHNlIGlmIChlbmYuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJy4uLicpKSB7XG4gICAgICAgIGVuZi5hZHZhbmNlKCk7XG4gICAgICAgIGxldCBleHByZXNzaW9uID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IGVuZi5jcmVhdGVFcnJvcihsb29rYWhlYWQsICdleHBlY3RpbmcgZXhwcmVzc2lvbicpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2gobmV3IFRlcm0oJ1NwcmVhZEVsZW1lbnQnLCB7IGV4cHJlc3Npb24gfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHRlcm0gPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICBpZiAodGVybSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgXCJleHBlY3RlZCBleHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2godGVybSk7XG4gICAgICAgIGVuZi5jb25zdW1lQ29tbWEoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUV4cHJlc3Npb25cIiwge1xuICAgICAgZWxlbWVudHM6IExpc3QoZWxlbWVudHMpXG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdE9iamVjdEV4cHJlc3Npb24oKSB7XG4gICAgbGV0IG9iaiA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgbGV0IHByb3BlcnRpZXMgPSBMaXN0KCk7XG5cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIob2JqLmlubmVyKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcblxuICAgIGxldCBsYXN0UHJvcCA9IG51bGw7XG4gICAgd2hpbGUgKGVuZi5yZXN0LnNpemUgPiAwKSB7XG4gICAgICBsZXQgcHJvcCA9IGVuZi5lbmZvcmVzdFByb3BlcnR5RGVmaW5pdGlvbigpO1xuICAgICAgZW5mLmNvbnN1bWVDb21tYSgpO1xuICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMuY29uY2F0KHByb3ApO1xuXG4gICAgICBpZiAobGFzdFByb3AgPT09IHByb3ApIHtcbiAgICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKHByb3AsIFwiaW52YWxpZCBzeW50YXggaW4gb2JqZWN0XCIpO1xuICAgICAgfVxuICAgICAgbGFzdFByb3AgPSBwcm9wO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEV4cHJlc3Npb25cIiwge1xuICAgICAgcHJvcGVydGllczogcHJvcGVydGllc1xuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RQcm9wZXJ0eURlZmluaXRpb24oKSB7XG5cbiAgICBsZXQge21ldGhvZE9yS2V5LCBraW5kfSA9IHRoaXMuZW5mb3Jlc3RNZXRob2REZWZpbml0aW9uKCk7XG5cbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgJ21ldGhvZCc6XG4gICAgICAgIHJldHVybiBtZXRob2RPcktleTtcbiAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgICBpZiAodGhpcy5pc0Fzc2lnbih0aGlzLnBlZWsoKSkpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICBsZXQgaW5pdCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcicsIHtcbiAgICAgICAgICAgIGluaXQsIGJpbmRpbmc6IHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyhtZXRob2RPcktleSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICc6JykpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ1Nob3J0aGFuZFByb3BlcnR5Jywge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kT3JLZXkudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKCc6Jyk7XG4gICAgbGV0IGV4cHIgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcblxuICAgIHJldHVybiBuZXcgVGVybShcIkRhdGFQcm9wZXJ0eVwiLCB7XG4gICAgICBuYW1lOiBtZXRob2RPcktleSxcbiAgICAgIGV4cHJlc3Npb246IGV4cHJcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJyonKSkge1xuICAgICAgaXNHZW5lcmF0b3IgPSB0cnVlO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCwgJ2dldCcpICYmIHRoaXMuaXNQcm9wZXJ0eU5hbWUodGhpcy5wZWVrKDEpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQge25hbWV9ID0gdGhpcy5lbmZvcmVzdFByb3BlcnR5TmFtZSgpO1xuICAgICAgdGhpcy5tYXRjaFBhcmVucygpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kT3JLZXk6IG5ldyBUZXJtKCdHZXR0ZXInLCB7IG5hbWUsIGJvZHkgfSksXG4gICAgICAgIGtpbmQ6ICdtZXRob2QnXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkLCAnc2V0JykgJiYgdGhpcy5pc1Byb3BlcnR5TmFtZSh0aGlzLnBlZWsoMSkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCB7bmFtZX0gPSB0aGlzLmVuZm9yZXN0UHJvcGVydHlOYW1lKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGhpcy5tYXRjaFBhcmVucygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgcGFyYW0gPSBlbmYuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kT3JLZXk6IG5ldyBUZXJtKCdTZXR0ZXInLCB7IG5hbWUsIHBhcmFtLCBib2R5IH0pLFxuICAgICAgICBraW5kOiAnbWV0aG9kJ1xuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHtuYW1lfSA9IHRoaXMuZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAodGhpcy5pc1BhcmVucyh0aGlzLnBlZWsoKSkpIHtcbiAgICAgIGxldCBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIocGFyYW1zLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgZm9ybWFsUGFyYW1zID0gZW5mLmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuXG4gICAgICBsZXQgYm9keSA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2RPcktleTogbmV3IFRlcm0oJ01ldGhvZCcsIHtcbiAgICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgICBuYW1lLCBwYXJhbXM6IGZvcm1hbFBhcmFtcywgYm9keVxuICAgICAgICB9KSxcbiAgICAgICAga2luZDogJ21ldGhvZCdcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtZXRob2RPcktleTogbmFtZSxcbiAgICAgIGtpbmQ6IHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkKSA/ICdpZGVudGlmaWVyJyA6ICdwcm9wZXJ0eSdcbiAgICB9O1xuICB9XG5cbiAgZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZCkgfHwgdGhpcy5pc051bWVyaWNMaXRlcmFsKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG5ldyBUZXJtKCdTdGF0aWNQcm9wZXJ0eU5hbWUnLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuYWR2YW5jZSgpXG4gICAgICAgIH0pLFxuICAgICAgICBiaW5kaW5nOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkpIHtcbiAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcih0aGlzLm1hdGNoU3F1YXJlcygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgZXhwciA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBuZXcgVGVybSgnQ29tcHV0ZWRQcm9wZXJ0eU5hbWUnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogZXhwclxuICAgICAgICB9KSxcbiAgICAgICAgYmluZGluZzogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmV3IFRlcm0oJ1N0YXRpY1Byb3BlcnR5TmFtZScsIHsgdmFsdWU6IG5hbWUgfSksXG4gICAgICBiaW5kaW5nOiBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7IG5hbWUgfSlcbiAgICB9O1xuICB9XG5cbiAgZW5mb3Jlc3RGdW5jdGlvbih7aXNFeHByLCBpbkRlZmF1bHR9KSB7XG4gICAgbGV0IG5hbWUgPSBudWxsLCBwYXJhbXMsIGJvZHk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgLy8gZWF0IHRoZSBmdW5jdGlvbiBrZXl3b3JkXG4gICAgbGV0IGZuS2V5d29yZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgdHlwZSA9IGlzRXhwciA/ICdGdW5jdGlvbkV4cHJlc3Npb24nIDogJ0Z1bmN0aW9uRGVjbGFyYXRpb24nO1xuXG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSB7XG4gICAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfSBlbHNlIGlmIChpbkRlZmF1bHQpIHtcbiAgICAgIG5hbWUgPSBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7XG4gICAgICAgIG5hbWU6IFN5bnRheC5mcm9tSWRlbnRpZmllcignKmRlZmF1bHQqJywgZm5LZXl3b3JkKVxuICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG5cblxuICAgIGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuXG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHBhcmFtcywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXMgPSBlbmYuZW5mb3Jlc3RGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogZm9ybWFsUGFyYW1zLFxuICAgICAgYm9keTogYm9keVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGdW5jdGlvbkV4cHJlc3Npb24oKSB7XG4gICAgbGV0IG5hbWUgPSBudWxsLCBwYXJhbXMsIGJvZHk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgLy8gZWF0IHRoZSBmdW5jdGlvbiBrZXl3b3JkXG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSB7XG4gICAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfVxuXG4gICAgcGFyYW1zID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuXG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHBhcmFtcywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXMgPSBlbmYuZW5mb3Jlc3RGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGdW5jdGlvbkV4cHJlc3Npb25cIiwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogZm9ybWFsUGFyYW1zLFxuICAgICAgYm9keTogYm9keVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGdW5jdGlvbkRlY2xhcmF0aW9uKCkge1xuICAgIGxldCBuYW1lLCBwYXJhbXMsIGJvZHk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgLy8gZWF0IHRoZSBmdW5jdGlvbiBrZXl3b3JkXG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG5cbiAgICBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgYm9keSA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG5cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIocGFyYW1zLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGZvcm1hbFBhcmFtcyA9IGVuZi5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcblxuICAgIHJldHVybiBuZXcgVGVybShcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogZm9ybWFsUGFyYW1zLFxuICAgICAgYm9keTogYm9keVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGb3JtYWxQYXJhbWV0ZXJzKCkge1xuICAgIGxldCBpdGVtcyA9IFtdO1xuICAgIGxldCByZXN0ID0gbnVsbDtcbiAgICB3aGlsZSAodGhpcy5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcuLi4nKSkge1xuICAgICAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignLi4uJyk7XG4gICAgICAgIHJlc3QgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpdGVtcy5wdXNoKHRoaXMuZW5mb3Jlc3RQYXJhbSgpKTtcbiAgICAgIHRoaXMuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge1xuICAgICAgaXRlbXM6IExpc3QoaXRlbXMpLCByZXN0XG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdFBhcmFtKCkge1xuICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmluZGluZ0VsZW1lbnQoKTtcbiAgfVxuXG4gIGVuZm9yZXN0VXBkYXRlRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgb3BlcmF0b3IgPSB0aGlzLm1hdGNoVW5hcnlPcGVyYXRvcigpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdVcGRhdGVFeHByZXNzaW9uJywge1xuICAgICAgaXNQcmVmaXg6IGZhbHNlLFxuICAgICAgb3BlcmF0b3I6IG9wZXJhdG9yLnZhbCgpLFxuICAgICAgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRoaXMudGVybSlcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VW5hcnlFeHByZXNzaW9uKCkge1xuICAgIGxldCBvcGVyYXRvciA9IHRoaXMubWF0Y2hVbmFyeU9wZXJhdG9yKCk7XG4gICAgdGhpcy5vcEN0eC5zdGFjayA9IHRoaXMub3BDdHguc3RhY2sucHVzaCh7XG4gICAgICBwcmVjOiB0aGlzLm9wQ3R4LnByZWMsXG4gICAgICBjb21iaW5lOiB0aGlzLm9wQ3R4LmNvbWJpbmVcbiAgICB9KTtcbiAgICAvLyBUT0RPOiBhbGwgYnVpbHRpbnMgYXJlIDE0LCBjdXN0b20gb3BlcmF0b3JzIHdpbGwgY2hhbmdlIHRoaXNcbiAgICB0aGlzLm9wQ3R4LnByZWMgPSAxNDtcbiAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSByaWdodFRlcm0gPT4ge1xuICAgICAgaWYgKG9wZXJhdG9yLnZhbCgpID09PSAnKysnIHx8IG9wZXJhdG9yLnZhbCgpID09PSAnLS0nKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnVXBkYXRlRXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IudmFsKCksXG4gICAgICAgICAgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHJpZ2h0VGVybSksXG4gICAgICAgICAgaXNQcmVmaXg6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ1VuYXJ5RXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IudmFsKCksXG4gICAgICAgICAgb3BlcmFuZDogcmlnaHRUZXJtXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEVYUFJfTE9PUF9PUEVSQVRPUjtcbiAgfVxuXG4gIGVuZm9yZXN0Q29uZGl0aW9uYWxFeHByZXNzaW9uKCkge1xuICAgIC8vIGZpcnN0LCBwb3AgdGhlIG9wZXJhdG9yIHN0YWNrXG4gICAgbGV0IHRlc3QgPSB0aGlzLm9wQ3R4LmNvbWJpbmUodGhpcy50ZXJtKTtcbiAgICBpZiAodGhpcy5vcEN0eC5zdGFjay5zaXplID4gMCkge1xuICAgICAgbGV0IHsgcHJlYywgY29tYmluZSB9ID0gdGhpcy5vcEN0eC5zdGFjay5sYXN0KCk7XG4gICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IHByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgIH1cblxuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKCc/Jyk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBjb25zZXF1ZW50ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc6Jyk7XG4gICAgZW5mID0gbmV3IEVuZm9yZXN0ZXIoZW5mLnJlc3QsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYWx0ZXJuYXRlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbicsIHtcbiAgICAgIHRlc3QsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RCaW5hcnlFeHByZXNzaW9uKCkge1xuXG4gICAgbGV0IGxlZnRUZXJtID0gdGhpcy50ZXJtO1xuICAgIGxldCBvcFN0eCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBvcCA9IG9wU3R4LnZhbCgpO1xuICAgIGxldCBvcFByZWMgPSBnZXRPcGVyYXRvclByZWMob3ApO1xuICAgIGxldCBvcEFzc29jID0gZ2V0T3BlcmF0b3JBc3NvYyhvcCk7XG5cbiAgICBpZiAob3BlcmF0b3JMdCh0aGlzLm9wQ3R4LnByZWMsIG9wUHJlYywgb3BBc3NvYykpIHtcbiAgICAgIHRoaXMub3BDdHguc3RhY2sgPSB0aGlzLm9wQ3R4LnN0YWNrLnB1c2goe1xuICAgICAgICBwcmVjOiB0aGlzLm9wQ3R4LnByZWMsXG4gICAgICAgIGNvbWJpbmU6IHRoaXMub3BDdHguY29tYmluZVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9wQ3R4LnByZWMgPSBvcFByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSAocmlnaHRUZXJtKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGxlZnQ6IGxlZnRUZXJtLFxuICAgICAgICAgIG9wZXJhdG9yOiBvcFN0eCxcbiAgICAgICAgICByaWdodDogcmlnaHRUZXJtXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIEVYUFJfTE9PUF9PUEVSQVRPUjtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLm9wQ3R4LmNvbWJpbmUobGVmdFRlcm0pO1xuICAgICAgLy8gdGhpcy5yZXN0IGRvZXMgbm90IGNoYW5nZVxuICAgICAgbGV0IHsgcHJlYywgY29tYmluZSB9ID0gdGhpcy5vcEN0eC5zdGFjay5sYXN0KCk7XG4gICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IHByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICB9XG5cbiAgZW5mb3Jlc3RUZW1wbGF0ZUVsZW1lbnRzKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLm1hdGNoVGVtcGxhdGUoKTtcbiAgICBsZXQgZWxlbWVudHMgPSBsb29rYWhlYWQudG9rZW4uaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKGl0KSkge1xuICAgICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoaXQuaW5uZXIoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICByZXR1cm4gZW5mLmVuZm9yZXN0KFwiZXhwcmVzc2lvblwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSgnVGVtcGxhdGVFbGVtZW50Jywge1xuICAgICAgICByYXdWYWx1ZTogaXQuc2xpY2UudGV4dFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9XG5cbiAgZXhwYW5kTWFjcm8oKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIHdoaWxlICh0aGlzLmlzQ29tcGlsZXRpbWVUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgbGV0IG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcblxuICAgICAgbGV0IHN5bnRheFRyYW5zZm9ybSA9IHRoaXMuZ2V0RnJvbUNvbXBpbGV0aW1lRW52aXJvbm1lbnQobmFtZSk7XG4gICAgICBpZiAoc3ludGF4VHJhbnNmb3JtID09IG51bGwgfHwgdHlwZW9mIHN5bnRheFRyYW5zZm9ybS52YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSxcbiAgICAgICAgICBcInRoZSBtYWNybyBuYW1lIHdhcyBub3QgYm91bmQgdG8gYSB2YWx1ZSB0aGF0IGNvdWxkIGJlIGludm9rZWRcIik7XG4gICAgICB9XG4gICAgICBsZXQgdXNlU2l0ZVNjb3BlID0gZnJlc2hTY29wZShcInVcIik7XG4gICAgICBsZXQgaW50cm9kdWNlZFNjb3BlID0gZnJlc2hTY29wZShcImlcIik7XG4gICAgICAvLyBUT0RPOiBuZWVkcyB0byBiZSBhIGxpc3Qgb2Ygc2NvcGVzIEkgdGhpbmtcbiAgICAgIHRoaXMuY29udGV4dC51c2VTY29wZSA9IHVzZVNpdGVTY29wZTtcblxuICAgICAgbGV0IGN0eCA9IG5ldyBNYWNyb0NvbnRleHQodGhpcywgbmFtZSwgdGhpcy5jb250ZXh0LCB1c2VTaXRlU2NvcGUsIGludHJvZHVjZWRTY29wZSk7XG5cbiAgICAgIGxldCByZXN1bHQgPSBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKHN5bnRheFRyYW5zZm9ybS52YWx1ZS5jYWxsKG51bGwsIGN0eCkpO1xuICAgICAgaWYgKCFMaXN0LmlzTGlzdChyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSwgXCJtYWNybyBtdXN0IHJldHVybiBhIGxpc3QgYnV0IGdvdDogXCIgKyByZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChzdHggPT4ge1xuICAgICAgICBpZiAoIShzdHggJiYgdHlwZW9mIHN0eC5hZGRTY29wZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKG5hbWUsICdtYWNybyBtdXN0IHJldHVybiBzeW50YXggb2JqZWN0cyBvciB0ZXJtcyBidXQgZ290OiAnICsgc3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3R4LmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTLCB7IGZsaXA6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZXN0ID0gcmVzdWx0LmNvbmNhdChjdHguX3Jlc3QodGhpcykpO1xuICAgICAgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3VtZVNlbWljb2xvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG5cbiAgICBpZiAobG9va2FoZWFkICYmIHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCI7XCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdW1lQ29tbWEoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKGxvb2thaGVhZCAmJiB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcsJykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNhZmVDaGVjayhvYmosIHR5cGUsIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gb2JqICYmICh0eXBlb2Ygb2JqLm1hdGNoID09PSAnZnVuY3Rpb24nID8gb2JqLm1hdGNoKHR5cGUsIHZhbCkgOiBmYWxzZSk7XG4gIH1cblxuICBpc1Rlcm0odGVybSkge1xuICAgIHJldHVybiB0ZXJtICYmICh0ZXJtIGluc3RhbmNlb2YgVGVybSk7XG4gIH1cblxuICBpc0VPRihvYmopIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnZW9mJyk7XG4gIH1cblxuICBpc0lkZW50aWZpZXIob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2lkZW50aWZpZXInLCB2YWwpO1xuICB9XG5cbiAgaXNQcm9wZXJ0eU5hbWUob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJZGVudGlmaWVyKG9iaikgfHwgdGhpcy5pc0tleXdvcmQob2JqKSB8fFxuICAgICAgICAgICB0aGlzLmlzTnVtZXJpY0xpdGVyYWwob2JqKSB8fCB0aGlzLmlzU3RyaW5nTGl0ZXJhbChvYmopIHx8IHRoaXMuaXNCcmFja2V0cyhvYmopO1xuICB9XG5cbiAgaXNOdW1lcmljTGl0ZXJhbChvYmosIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnbnVtYmVyJywgdmFsKTtcbiAgfVxuXG4gIGlzU3RyaW5nTGl0ZXJhbChvYmosIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnc3RyaW5nJywgdmFsKTtcbiAgfVxuXG4gIGlzVGVtcGxhdGUob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ3RlbXBsYXRlJywgdmFsKTtcbiAgfVxuXG4gIGlzU3ludGF4VGVtcGxhdGUob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ3N5bnRheFRlbXBsYXRlJyk7XG4gIH1cblxuICBpc0Jvb2xlYW5MaXRlcmFsKG9iaiwgdmFsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdib29sZWFuJywgdmFsKTtcbiAgfVxuXG4gIGlzTnVsbExpdGVyYWwob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ251bGwnLCB2YWwpO1xuICB9XG5cbiAgaXNSZWd1bGFyRXhwcmVzc2lvbihvYmosIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAncmVndWxhckV4cHJlc3Npb24nLCB2YWwpO1xuICB9XG5cbiAgaXNEZWxpbWl0ZXIob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2RlbGltaXRlcicpO1xuICB9XG5cbiAgaXNQYXJlbnMob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ3BhcmVucycpO1xuICB9XG5cbiAgaXNCcmFjZXMob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2JyYWNlcycpO1xuICB9XG5cbiAgaXNCcmFja2V0cyhvYmopIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnYnJhY2tldHMnKTtcbiAgfVxuXG4gIGlzQXNzaWduKG9iaiwgdmFsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdhc3NpZ24nLCB2YWwpO1xuICB9XG5cblxuICBpc0tleXdvcmQob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2tleXdvcmQnLCB2YWwpO1xuICB9XG5cbiAgaXNQdW5jdHVhdG9yKG9iaiwgdmFsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdwdW5jdHVhdG9yJywgdmFsKTtcbiAgfVxuXG4gIGlzT3BlcmF0b3Iob2JqKSB7XG4gICAgcmV0dXJuICh0aGlzLnNhZmVDaGVjayhvYmosICdwdW5jdHVhdG9yJykgfHxcbiAgICAgICAgICAgIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2lkZW50aWZpZXInKSB8fFxuICAgICAgICAgICAgdGhpcy5zYWZlQ2hlY2sob2JqLCAna2V5d29yZCcpKSAmJiBpc09wZXJhdG9yKG9iaik7XG4gIH1cblxuICBpc1VwZGF0ZU9wZXJhdG9yKG9iaikge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdwdW5jdHVhdG9yJywgJysrJykgfHxcbiAgICAgICAgICAgdGhpcy5zYWZlQ2hlY2sob2JqLCAncHVuY3R1YXRvcicsICctLScpO1xuICB9XG5cbiAgc2FmZVJlc29sdmUob2JqLCBwaGFzZSkge1xuICAgIHJldHVybiAob2JqICYmIHR5cGVvZiBvYmoucmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJykgPyBKdXN0KG9iai5yZXNvbHZlKHBoYXNlKSkgOiBOb3RoaW5nKCk7XG4gIH1cblxuICBpc1RyYW5zZm9ybShvYmosIHRyYW5zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZVJlc29sdmUob2JqLCB0aGlzLmNvbnRleHQucGhhc2UpXG4gICAgICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5jb250ZXh0LmVudi5nZXQobmFtZSkgPT09IHRyYW5zIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0b3JlLmdldChuYW1lKSA9PT0gdHJhbnMpXG4gICAgICAgICAgICAgICAuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuXG4gIGlzVHJhbnNmb3JtSW5zdGFuY2Uob2JqLCB0cmFucykge1xuICAgIHJldHVybiB0aGlzLnNhZmVSZXNvbHZlKG9iaiwgdGhpcy5jb250ZXh0LnBoYXNlKVxuICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuY29udGV4dC5lbnYuZ2V0KG5hbWUpIGluc3RhbmNlb2YgdHJhbnMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3RvcmUuZ2V0KG5hbWUpIGluc3RhbmNlb2YgdHJhbnMpXG4gICAgICAgICAgICAgICAuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuXG4gIGlzRm5EZWNsVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgRnVuY3Rpb25EZWNsVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzVmFyRGVjbFRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc0xldERlY2xUcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqLCBMZXREZWNsVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzQ29uc3REZWNsVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgQ29uc3REZWNsVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzU3ludGF4RGVjbFRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFN5bnRheERlY2xUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNTeW50YXhyZWNEZWNsVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1N5bnRheFF1b3RlVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgU3ludGF4UXVvdGVUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNSZXR1cm5TdG10VHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgUmV0dXJuU3RhdGVtZW50VHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzV2hpbGVUcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqLCBXaGlsZVRyYW5zZm9ybSk7XG4gIH1cblxuICBpc0ZvclRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIEZvclRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1N3aXRjaFRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFN3aXRjaFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc0JyZWFrVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgQnJlYWtUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNDb250aW51ZVRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIENvbnRpbnVlVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzRG9UcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqLCBEb1RyYW5zZm9ybSk7XG4gIH1cblxuICBpc0RlYnVnZ2VyVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgRGVidWdnZXJUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNXaXRoVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgV2l0aFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1RyeVRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFRyeVRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1Rocm93VHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgVGhyb3dUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNJZlRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIElmVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzTmV3VHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgTmV3VHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzQ29tcGlsZXRpbWVUcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm1JbnN0YW5jZShvYmosIENvbXBpbGV0aW1lVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzVmFyQmluZGluZ1RyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybUluc3RhbmNlKG9iaiwgVmFyQmluZGluZ1RyYW5zZm9ybSk7XG4gIH1cblxuICBnZXRGcm9tQ29tcGlsZXRpbWVFbnZpcm9ubWVudCh0ZXJtKSB7XG4gICAgaWYgKHRoaXMuY29udGV4dC5lbnYuaGFzKHRlcm0ucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5lbnYuZ2V0KHRlcm0ucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5zdG9yZS5nZXQodGVybS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkpO1xuICB9XG5cbiAgbGluZU51bWJlckVxKGEsIGIpIHtcbiAgICBpZiAoIShhICYmIGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhLmxpbmVOdW1iZXIoKSA9PT0gYi5saW5lTnVtYmVyKCk7XG4gIH1cblxuICBtYXRjaElkZW50aWZpZXIodmFsKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQsIHZhbCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhbiBpZGVudGlmaWVyXCIpO1xuICB9XG5cbiAgbWF0Y2hLZXl3b3JkKHZhbCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCB2YWwpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyAnICsgdmFsKTtcbiAgfVxuXG4gIG1hdGNoTGl0ZXJhbCgpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNOdW1lcmljTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICAgIHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc0Jvb2xlYW5MaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc051bGxMaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc1JlZ3VsYXJFeHByZXNzaW9uKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhIGxpdGVyYWxcIik7XG4gIH1cblxuICBtYXRjaFN0cmluZ0xpdGVyYWwoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyBhIHN0cmluZyBsaXRlcmFsJyk7XG4gIH1cblxuICBtYXRjaFRlbXBsYXRlKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCAnZXhwZWN0aW5nIGEgdGVtcGxhdGUgbGl0ZXJhbCcpO1xuICB9XG5cbiAgbWF0Y2hQYXJlbnMoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzUGFyZW5zKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQuaW5uZXIoKTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwiZXhwZWN0aW5nIHBhcmVuc1wiKTtcbiAgfVxuXG4gIG1hdGNoQ3VybGllcygpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIGxvb2thaGVhZC5pbm5lcigpO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgXCJleHBlY3RpbmcgY3VybHkgYnJhY2VzXCIpO1xuICB9XG4gIG1hdGNoU3F1YXJlcygpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkLmlubmVyKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBzcWF1cmUgYnJhY2VzXCIpO1xuICB9XG5cbiAgbWF0Y2hVbmFyeU9wZXJhdG9yKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAoaXNVbmFyeU9wZXJhdG9yKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhIHVuYXJ5IG9wZXJhdG9yXCIpO1xuICB9XG5cbiAgbWF0Y2hQdW5jdHVhdG9yKHZhbCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChsb29rYWhlYWQudmFsKCkgPT09IHZhbCkge1xuICAgICAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsXG4gICAgICAgICAgICBcImV4cGVjdGluZyBhIFwiICsgdmFsICsgXCIgcHVuY3R1YXRvclwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxvb2thaGVhZDtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwiZXhwZWN0aW5nIGEgcHVuY3R1YXRvclwiKTtcbiAgfVxuXG4gIGNyZWF0ZUVycm9yKHN0eCwgbWVzc2FnZSkge1xuICAgIGxldCBjdHggPSBcIlwiO1xuICAgIGxldCBvZmZlbmRpbmcgPSBzdHg7XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID4gMCkge1xuICAgICAgY3R4ID0gdGhpcy5yZXN0LnNsaWNlKDAsIDIwKS5tYXAodGVybSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKHRlcm0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRlcm0uaW5uZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTGlzdC5vZih0ZXJtKTtcbiAgICAgIH0pLmZsYXR0ZW4oKS5tYXAocyA9PiB7XG4gICAgICAgIGlmIChzID09PSBvZmZlbmRpbmcpIHtcbiAgICAgICAgICByZXR1cm4gXCJfX1wiICsgcy52YWwoKSArIFwiX19cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcy52YWwoKTtcbiAgICAgIH0pLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHggPSBvZmZlbmRpbmcudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcihtZXNzYWdlICsgXCJcXG5cIiArIGN0eCk7XG5cbiAgfVxufVxuIl19 + +/***/ }, +/* 57 */ +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.operatorLt = operatorLt; + exports.getOperatorPrec = getOperatorPrec; + exports.getOperatorAssoc = getOperatorAssoc; + exports.isUnaryOperator = isUnaryOperator; + exports.isOperator = isOperator; + const unaryOperators = { + '+': true, + '-': true, + '!': true, + '~': true, + '++': true, + '--': true, + 'typeof': true, + 'void': true, + 'delete': true + }; + const binaryOperatorPrecedence = { + "*": 13, + "/": 13, + "%": 13, + "+": 12, + "-": 12, + ">>": 11, + "<<": 11, + ">>>": 11, + "<": 10, + "<=": 10, + ">": 10, + ">=": 10, + "in": 10, + "instanceof": 10, + "==": 9, + "!=": 9, + "===": 9, + "!==": 9, + "&": 8, + "^": 7, + "|": 6, + "&&": 5, + "||": 4 + }; + + var operatorAssoc = { + "*": "left", + "/": "left", + "%": "left", + "+": "left", + "-": "left", + ">>": "left", + "<<": "left", + ">>>": "left", + "<": "left", + "<=": "left", + ">": "left", + ">=": "left", + "in": "left", + "instanceof": "left", + "==": "left", + "!=": "left", + "===": "left", + "!==": "left", + "&": "left", + "^": "left", + "|": "left", + "&&": "left", + "||": "left" + }; + + function operatorLt(left, right, assoc) { + if (assoc === "left") { + return left < right; + } else { + return left <= right; + } + } + + function getOperatorPrec(op) { + return binaryOperatorPrecedence[op]; + } + function getOperatorAssoc(op) { + return operatorAssoc[op]; + } + + function isUnaryOperator(op) { + return (op.match("punctuator") || op.match("identifier") || op.match("keyword")) && unaryOperators.hasOwnProperty(op.val()); + } + + function isOperator(op) { + if (op.match("punctuator") || op.match("identifier") || op.match("keyword")) { + return binaryOperatorPrecedence.hasOwnProperty(op) || unaryOperators.hasOwnProperty(op.val()); } + return false; + } + //# sourceMappingURL=data:application/json;base64,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eEMsS0FBK0MsZUFBZSxjQUFmLENBQThCLEdBQUcsR0FBSCxFQUE5QixDQUF0RDtBQUNEO0FBQ0QsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoib3BlcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdW5hcnlPcGVyYXRvcnMgPSB7XG4gICcrJzogdHJ1ZSxcbiAgJy0nOiB0cnVlLFxuICAnISc6IHRydWUsXG4gICd+JzogdHJ1ZSxcbiAgJysrJzogdHJ1ZSxcbiAgJy0tJzogdHJ1ZSxcbiAgJ3R5cGVvZic6IHRydWUsXG4gICd2b2lkJzogdHJ1ZSxcbiAgJ2RlbGV0ZSc6IHRydWUsXG59O1xuY29uc3QgYmluYXJ5T3BlcmF0b3JQcmVjZWRlbmNlID0ge1xuICBcIipcIjogMTMsXG4gIFwiL1wiOiAxMyxcbiAgXCIlXCI6IDEzLFxuICBcIitcIjogMTIsXG4gIFwiLVwiOiAxMixcbiAgXCI+PlwiOiAxMSxcbiAgXCI8PFwiOiAxMSxcbiAgXCI+Pj5cIjogMTEsXG4gIFwiPFwiOiAxMCxcbiAgXCI8PVwiOiAxMCxcbiAgXCI+XCI6IDEwLFxuICBcIj49XCI6IDEwLFxuICBcImluXCI6IDEwLFxuICBcImluc3RhbmNlb2ZcIjogMTAsXG4gIFwiPT1cIjogOSxcbiAgXCIhPVwiOiA5LFxuICBcIj09PVwiOiA5LFxuICBcIiE9PVwiOiA5LFxuICBcIiZcIjogOCxcbiAgXCJeXCI6IDcsXG4gIFwifFwiOiA2LFxuICBcIiYmXCI6IDUsXG4gIFwifHxcIjogNCxcbn07XG5cbnZhciBvcGVyYXRvckFzc29jID0ge1xuICBcIipcIjogXCJsZWZ0XCIsXG4gIFwiL1wiOiBcImxlZnRcIixcbiAgXCIlXCI6IFwibGVmdFwiLFxuICBcIitcIjogXCJsZWZ0XCIsXG4gIFwiLVwiOiBcImxlZnRcIixcbiAgXCI+PlwiOiBcImxlZnRcIixcbiAgXCI8PFwiOiBcImxlZnRcIixcbiAgXCI+Pj5cIjogXCJsZWZ0XCIsXG4gIFwiPFwiOiBcImxlZnRcIixcbiAgXCI8PVwiOiBcImxlZnRcIixcbiAgXCI+XCI6IFwibGVmdFwiLFxuICBcIj49XCI6IFwibGVmdFwiLFxuICBcImluXCI6IFwibGVmdFwiLFxuICBcImluc3RhbmNlb2ZcIjogXCJsZWZ0XCIsXG4gIFwiPT1cIjogXCJsZWZ0XCIsXG4gIFwiIT1cIjogXCJsZWZ0XCIsXG4gIFwiPT09XCI6IFwibGVmdFwiLFxuICBcIiE9PVwiOiBcImxlZnRcIixcbiAgXCImXCI6IFwibGVmdFwiLFxuICBcIl5cIjogXCJsZWZ0XCIsXG4gIFwifFwiOiBcImxlZnRcIixcbiAgXCImJlwiOiBcImxlZnRcIixcbiAgXCJ8fFwiOiBcImxlZnRcIixcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRvckx0KGxlZnQsIHJpZ2h0LCBhc3NvYykge1xuICBpZiAoYXNzb2MgPT09IFwibGVmdFwiKSB7XG4gICAgcmV0dXJuIGxlZnQgPCByaWdodDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGVmdCA8PSByaWdodDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0b3JQcmVjKG9wKSB7XG4gIHJldHVybiBiaW5hcnlPcGVyYXRvclByZWNlZGVuY2Vbb3BdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wZXJhdG9yQXNzb2Mob3ApIHtcbiAgcmV0dXJuIG9wZXJhdG9yQXNzb2Nbb3BdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmFyeU9wZXJhdG9yKG9wKSB7XG4gIHJldHVybiAob3AubWF0Y2goXCJwdW5jdHVhdG9yXCIpIHx8IG9wLm1hdGNoKFwiaWRlbnRpZmllclwiKSB8fCBvcC5tYXRjaChcImtleXdvcmRcIikpICYmXG4gICAgICAgIHVuYXJ5T3BlcmF0b3JzLmhhc093blByb3BlcnR5KG9wLnZhbCgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlcmF0b3Iob3ApIHtcbiAgaWYgKG9wLm1hdGNoKFwicHVuY3R1YXRvclwiKSB8fCBvcC5tYXRjaChcImlkZW50aWZpZXJcIikgfHwgb3AubWF0Y2goXCJrZXl3b3JkXCIpKSB7XG4gICAgcmV0dXJuIGJpbmFyeU9wZXJhdG9yUHJlY2VkZW5jZS5oYXNPd25Qcm9wZXJ0eShvcCkgfHwgdW5hcnlPcGVyYXRvcnMuaGFzT3duUHJvcGVydHkob3AudmFsKCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ== - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + "use strict"; - buffer[offset + i - d] |= s * 128 - } + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.freshScope = freshScope; + exports.Scope = Scope; + var _symbol = __webpack_require__(47); -/***/ }, -/* 62 */ -/***/ function(module, exports) { + let scopeIndex = 0; - var toString = {}.toString; + function freshScope() { + let name = arguments.length <= 0 || arguments[0] === undefined ? "scope" : arguments[0]; - module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; - }; + scopeIndex++; + return (0, _symbol.Symbol)(name + "_" + scopeIndex); + } + function Scope(name) { + return (0, _symbol.Symbol)(name); + } + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY29wZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQUlnQixVLEdBQUEsVTtRQUtBLEssR0FBQSxLOztBQVRoQjs7QUFFQSxJQUFJLGFBQWEsQ0FBakI7O0FBRU8sU0FBUyxVQUFULEdBQW9DO0FBQUEsTUFBaEIsSUFBZ0IseURBQVQsT0FBUzs7QUFDekM7QUFDQSxTQUFPLG9CQUFPLE9BQU8sR0FBUCxHQUFhLFVBQXBCLENBQVA7QUFDRDs7QUFFTSxTQUFTLEtBQVQsQ0FBZSxJQUFmLEVBQXFCO0FBQzFCLFNBQU8sb0JBQU8sSUFBUCxDQUFQO0FBQ0QiLCJmaWxlIjoic2NvcGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW1ib2wgfSBmcm9tIFwiLi9zeW1ib2xcIjtcblxubGV0IHNjb3BlSW5kZXggPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZnJlc2hTY29wZShuYW1lID0gXCJzY29wZVwiKSB7XG4gIHNjb3BlSW5kZXgrKztcbiAgcmV0dXJuIFN5bWJvbChuYW1lICsgXCJfXCIgKyBzY29wZUluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNjb3BlKG5hbWUpIHtcbiAgcmV0dXJuIFN5bWJvbChuYW1lKTtcbn1cbiJdfQ== /***/ }, -/* 63 */ +/* 59 */ /***/ function(module, exports, __webpack_require__) { - "use strict"; + 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); - exports.replaceTemplate = exports.processTemplate = undefined; + exports.processTemplate = processTemplate; + exports.replaceTemplate = replaceTemplate; - var _immutable = __webpack_require__(11); + var _immutable = __webpack_require__(3); - var _ramdaFantasy = __webpack_require__(15); - - var _ramda = __webpack_require__(27); + var _ramda = __webpack_require__(10); var _ramda2 = _interopRequireDefault(_ramda); - var _syntax = __webpack_require__(12); + var _syntax = __webpack_require__(46); var _syntax2 = _interopRequireDefault(_syntax); - var _errors = __webpack_require__(13); + var _errors = __webpack_require__(23); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - const isDolar_964 = s_975 => s_975 && typeof s_975.match === "function" && s_975.match("identifier") && s_975.val() === "$"; - const isDelimiter_965 = s_976 => s_976 && typeof s_976.match === "function" && s_976.match("delimiter"); - const isBraces_966 = s_977 => s_977 && typeof s_977.match === "function" && s_977.match("braces"); - const isParens_967 = s_978 => s_978 && typeof s_978.match === "function" && s_978.match("parens"); - const isBrackets_968 = s_979 => s_979 && typeof s_979.match === "function" && s_979.match("brackets"); - const insertIntoDelimiter_969 = _ramda2.default.cond([[isBraces_966, (s_980, r_981) => _syntax2.default.from("braces", r_981, s_980)], [isParens_967, (s_982, r_983) => _syntax2.default.from("parens", r_983, s_982)], [isBrackets_968, (s_984, r_985) => _syntax2.default.from("brackets", r_985, s_984)]]); - const process_970 = (acc_986, s_987) => { - if (isBraces_966(s_987) && isDolar_964(acc_986.template.last())) { - return { template: acc_986.template.push(_syntax2.default.from("braces", _immutable.List.of(_syntax2.default.from("number", acc_986.interp.size)), s_987)), interp: acc_986.interp.push(s_987.inner()) }; - } else if (isDelimiter_965(s_987)) { - let innerResult = processTemplate_973(s_987.inner(), acc_986.interp); - return { template: acc_986.template.push(insertIntoDelimiter_969(s_987, innerResult.template)), interp: innerResult.interp }; + /* + Given a syntax list like: + + [foo, bar, $, { 42, +, 24 }, baz] + + convert it to: + + [foo, bar, $, { 0 }, baz] + + and return another list with the interpolated values at the corresponding + positions. + + Requires either lookahead/lookbehind of one (to see the $). + */ + + const isDolar = s => s && typeof s.match === 'function' && s.match("identifier") && s.val() === '$'; + const isDelimiter = s => s && typeof s.match === 'function' && s.match("delimiter"); + const isBraces = s => s && typeof s.match === 'function' && s.match("braces"); + const isParens = s => s && typeof s.match === 'function' && s.match("parens"); + const isBrackets = s => s && typeof s.match === 'function' && s.match("brackets"); + + const insertIntoDelimiter = _ramda2.default.cond([[isBraces, (s, r) => _syntax2.default.from("braces", r, s)], [isParens, (s, r) => _syntax2.default.from("parens", r, s)], [isBrackets, (s, r) => _syntax2.default.from("brackets", r, s)]]); + + const process = (acc, s) => { + if (isBraces(s) && isDolar(acc.template.last())) { + return { + template: acc.template.push(_syntax2.default.from("braces", _immutable.List.of(_syntax2.default.from("number", acc.interp.size)), s)), + interp: acc.interp.push(s.inner()) + }; + } else if (isDelimiter(s)) { + let innerResult = processTemplate(s.inner(), acc.interp); + return { + template: acc.template.push(insertIntoDelimiter(s, innerResult.template)), + interp: innerResult.interp + }; } else { - return { template: acc_986.template.push(s_987), interp: acc_986.interp }; + return { + template: acc.template.push(s), + interp: acc.interp + }; } }; - function cloneLineNumber_971(to_988, from_989) { - if (from_989 && to_988) { - if (typeof to_988.setLineNumber === "function") { - return to_988.setLineNumber(from_989.lineNumber()); - } else if (_immutable.List.isList(to_988)) { - return to_988.map(x_990 => cloneLineNumber_971(x_990, from_989)); + + function cloneLineNumber(to, from) { + if (from && to) { + if (typeof to.setLineNumber === 'function') { + return to.setLineNumber(from.lineNumber()); + } else if (_immutable.List.isList(to)) { + return to.map(x => cloneLineNumber(x, from)); } } - return to_988; + return to; } - const replace_972 = (acc_991, s_992) => { - let last_993 = acc_991.template.get(-1); - let beforeLast_994 = acc_991.template.get(-2); - if (isBraces_966(s_992) && isDolar_964(last_993)) { - let index = s_992.inner().first().val(); - (0, _errors.assert)(acc_991.rep.size > index, "unknown replacement value"); - let replacement = cloneLineNumber_971(acc_991.rep.get(index), beforeLast_994); - return { template: acc_991.template.pop().concat(replacement), rep: acc_991.rep }; - } else if (isDelimiter_965(s_992)) { - let innerResult = replaceTemplate_974(s_992.inner(), acc_991.rep); - return { template: acc_991.template.push(insertIntoDelimiter_969(s_992, innerResult)), rep: acc_991.rep }; + + const replace = (acc, s) => { + let last = acc.template.get(-1); + let beforeLast = acc.template.get(-2); + if (isBraces(s) && isDolar(last)) { + let index = s.inner().first().val(); + (0, _errors.assert)(acc.rep.size > index, "unknown replacement value"); + let replacement = cloneLineNumber(acc.rep.get(index), beforeLast); + return { + template: acc.template.pop().concat(replacement), + rep: acc.rep + }; + } else if (isDelimiter(s)) { + let innerResult = replaceTemplate(s.inner(), acc.rep); + return { + template: acc.template.push(insertIntoDelimiter(s, innerResult)), + rep: acc.rep + }; } else { - return { template: acc_991.template.push(s_992), rep: acc_991.rep }; + return { + template: acc.template.push(s), + rep: acc.rep + }; } }; - function processTemplate_973(temp_995) { - let interp_996 = arguments.length <= 1 || arguments[1] === undefined ? (0, _immutable.List)() : arguments[1]; - return temp_995.reduce(process_970, { template: (0, _immutable.List)(), interp: interp_996 }); + function processTemplate(temp) { + let interp = arguments.length <= 1 || arguments[1] === undefined ? (0, _immutable.List)() : arguments[1]; + + return temp.reduce(process, { template: (0, _immutable.List)(), interp: interp }); } - function replaceTemplate_974(temp_997, rep_998) { - return temp_997.reduce(replace_972, { template: (0, _immutable.List)(), rep: rep_998 }).template; + + function replaceTemplate(temp, rep) { + return temp.reduce(replace, { template: (0, _immutable.List)(), rep: rep }).template; } - exports.processTemplate = processTemplate_973; - exports.replaceTemplate = replaceTemplate_974; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3RlbXBsYXRlLXByb2Nlc3Nvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0EsTUFBTSxjQUFjLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxZQUFaLENBQTlDLElBQTJFLE1BQU0sR0FBTixPQUFnQixHQUF4SDtBQUNBLE1BQU0sa0JBQWtCLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxXQUFaLENBQS9FO0FBQ0EsTUFBTSxlQUFlLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxRQUFaLENBQTVFO0FBQ0EsTUFBTSxlQUFlLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxRQUFaLENBQTVFO0FBQ0EsTUFBTSxpQkFBaUIsU0FBUyxTQUFTLE9BQU8sTUFBTSxLQUFiLEtBQXVCLFVBQWhDLElBQThDLE1BQU0sS0FBTixDQUFZLFVBQVosQ0FBOUU7QUFDQSxNQUFNLDBCQUEwQixnQkFBRSxJQUFGLENBQU8sQ0FBQyxDQUFDLFlBQUQsRUFBZSxDQUFDLEtBQUQsRUFBUSxLQUFSLEtBQWtCLGlCQUFPLElBQVAsQ0FBWSxRQUFaLEVBQXNCLEtBQXRCLEVBQTZCLEtBQTdCLENBQWpDLENBQUQsRUFBd0UsQ0FBQyxZQUFELEVBQWUsQ0FBQyxLQUFELEVBQVEsS0FBUixLQUFrQixpQkFBTyxJQUFQLENBQVksUUFBWixFQUFzQixLQUF0QixFQUE2QixLQUE3QixDQUFqQyxDQUF4RSxFQUErSSxDQUFDLGNBQUQsRUFBaUIsQ0FBQyxLQUFELEVBQVEsS0FBUixLQUFrQixpQkFBTyxJQUFQLENBQVksVUFBWixFQUF3QixLQUF4QixFQUEr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QWpCLENBQXNCLEtBQXRCLENBQVgsRUFBeUMsS0FBSyxRQUFRLEdBQXRELEVBQVA7QUFDRDtBQUNGLENBZEQ7QUFlQSxTQUFTLG1CQUFULENBQTZCLFFBQTdCLEVBQTREO0FBQUEsTUFBckIsVUFBcUIseURBQVIsc0JBQVE7O0FBQzFELFNBQU8sU0FBUyxNQUFULENBQWdCLFdBQWhCLEVBQTZCLEVBQUMsVUFBVSxzQkFBWCxFQUFtQixRQUFRLFVBQTNCLEVBQTdCLENBQVA7QUFDRDtBQUNELFNBQVMsbUJBQVQsQ0FBNkIsUUFBN0IsRUFBdUMsT0FBdkMsRUFBZ0Q7QUFDOUMsU0FBTyxTQUFTLE1BQVQsQ0FBZ0IsV0FBaEIsRUFBNkIsRUFBQyxVQUFVLHNCQUFYLEVBQW1CLEtBQUssT0FBeEIsRUFBN0IsRUFBK0QsUUFBdEU7QUFDRDtRQUM4QixlLEdBQXZCLG1CO1FBQ3VCLGUsR0FBdkIsbUIiLCJmaWxlIjoidGVtcGxhdGUtcHJvY2Vzc29yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQge01heWJlfSBmcm9tIFwicmFtZGEtZmFudGFzeVwiO1xuaW1wb3J0IF8gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuY29uc3QgaXNEb2xhcl85NjQgPSBzXzk3NSA9PiBzXzk3NSAmJiB0eXBlb2Ygc185NzUubWF0Y2ggPT09IFwiZnVuY3Rpb25cIiAmJiBzXzk3NS5tYXRjaChcImlkZW50aWZpZXJcIikgJiYgc185NzUudmFsKCkgPT09IFwiJFwiO1xuY29uc3QgaXNEZWxpbWl0ZXJfOTY1ID0gc185NzYgPT4gc185NzYgJiYgdHlwZW9mIHNfOTc2Lm1hdGNoID09PSBcImZ1bmN0aW9uXCIgJiYgc185NzYubWF0Y2goXCJkZWxpbWl0ZXJcIik7XG5jb25zdCBpc0JyYWNlc185NjYgPSBzXzk3NyA9PiBzXzk3NyAmJiB0eXBlb2Ygc185NzcubWF0Y2ggPT09IFwiZnVuY3Rpb25cIiAmJiBzXzk3Ny5tYXRjaChcImJyYWNlc1wiKTtcbmNvbnN0IGlzUGFyZW5zXzk2NyA9IHNfOTc4ID0+IHNfOTc4ICYmIHR5cGVvZiBzXzk3OC5tYXRjaCA9PT0gXCJmdW5jdGlvblwiICYmIHNfOTc4Lm1hdGNoKFwicGFyZW5zXCIpO1xuY29uc3QgaXNCcmFja2V0c185NjggPSBzXzk3OSA9PiBzXzk3OSAmJiB0eXBlb2Ygc185NzkubWF0Y2ggPT09IFwiZnVuY3Rpb25cIiAmJiBzXzk3OS5tYXRjaChcImJyYWNrZXRzXCIpO1xuY29uc3QgaW5zZXJ0SW50b0RlbGltaXRlcl85NjkgPSBfLmNvbmQoW1tpc0JyYWNlc185NjYsIChzXzk4MCwgcl85ODEpID0+IFN5bnRheC5mcm9tKFwiYnJhY2VzXCIsIHJfOTgxLCBzXzk4MCldLCBbaXNQYXJlbnNfOTY3LCAoc185ODIsIHJfOTgzKSA9PiBTeW50YXguZnJvbShcInBhcmVuc1wiLCByXzk4Mywgc185ODIpXSwgW2lzQnJhY2tldHNfOTY4LCAoc185ODQsIHJfOTg1KSA9PiBTeW50YXguZnJvbShcImJyYWNrZXRzXCIsIHJfOTg1LCBzXzk4NCldXSk7XG5jb25zdCBwcm9jZXNzXzk3MCA9IChhY2NfOTg2LCBzXzk4NykgPT4ge1xuICBpZiAoaXNCcmFjZXNfOTY2KHNfOTg3KSAmJiBpc0RvbGFyXzk2NChhY2NfOTg2LnRlbXBsYXRlLmxhc3QoKSkpIHtcbiAgICByZXR1cm4ge3RlbXBsYXRlOiBhY2NfOTg2LnRlbXBsYXRlLnB1c2goU3ludGF4LmZyb20oXCJicmFjZXNcIiwgTGlzdC5vZihTeW50YXguZnJvbShcIm51bWJlclwiLCBhY2NfOTg2LmludGVycC5zaXplKSksIHNfOTg3KSksIGludGVycDogYWNjXzk4Ni5pbnRlcnAucHVzaChzXzk4Ny5pbm5lcigpKX07XG4gIH0gZWxzZSBpZiAoaXNEZWxpbWl0ZXJfOTY1KHNfOTg3KSkge1xuICAgIGxldCBpbm5lclJlc3VsdCA9IHByb2Nlc3NUZW1wbGF0ZV85NzMoc185ODcuaW5uZXIoKSwgYWNjXzk4Ni5pbnRlcnApO1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185ODYudGVtcGxhdGUucHVzaChpbnNlcnRJbnRvRGVsaW1pdGVyXzk2OShzXzk4NywgaW5uZXJSZXN1bHQudGVtcGxhdGUpKSwgaW50ZXJwOiBpbm5lclJlc3VsdC5pbnRlcnB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185ODYudGVtcGxhdGUucHVzaChzXzk4NyksIGludGVycDogYWNjXzk4Ni5pbnRlcnB9O1xuICB9XG59O1xuZnVuY3Rpb24gY2xvbmVMaW5lTnVtYmVyXzk3MSh0b185ODgsIGZyb21fOTg5KSB7XG4gIGlmIChmcm9tXzk4OSAmJiB0b185ODgpIHtcbiAgICBpZiAodHlwZW9mIHRvXzk4OC5zZXRMaW5lTnVtYmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0b185ODguc2V0TGluZU51bWJlcihmcm9tXzk4OS5saW5lTnVtYmVyKCkpO1xuICAgIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodG9fOTg4KSkge1xuICAgICAgcmV0dXJuIHRvXzk4OC5tYXAoeF85OTAgPT4gY2xvbmVMaW5lTnVtYmVyXzk3MSh4Xzk5MCwgZnJvbV85ODkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvXzk4ODtcbn1cbmNvbnN0IHJlcGxhY2VfOTcyID0gKGFjY185OTEsIHNfOTkyKSA9PiB7XG4gIGxldCBsYXN0Xzk5MyA9IGFjY185OTEudGVtcGxhdGUuZ2V0KC0xKTtcbiAgbGV0IGJlZm9yZUxhc3RfOTk0ID0gYWNjXzk5MS50ZW1wbGF0ZS5nZXQoLTIpO1xuICBpZiAoaXNCcmFjZXNfOTY2KHNfOTkyKSAmJiBpc0RvbGFyXzk2NChsYXN0Xzk5MykpIHtcbiAgICBsZXQgaW5kZXggPSBzXzk5Mi5pbm5lcigpLmZpcnN0KCkudmFsKCk7XG4gICAgYXNzZXJ0KGFjY185OTEucmVwLnNpemUgPiBpbmRleCwgXCJ1bmtub3duIHJlcGxhY2VtZW50IHZhbHVlXCIpO1xuICAgIGxldCByZXBsYWNlbWVudCA9IGNsb25lTGluZU51bWJlcl85NzEoYWNjXzk5MS5yZXAuZ2V0KGluZGV4KSwgYmVmb3JlTGFzdF85OTQpO1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185OTEudGVtcGxhdGUucG9wKCkuY29uY2F0KHJlcGxhY2VtZW50KSwgcmVwOiBhY2NfOTkxLnJlcH07XG4gIH0gZWxzZSBpZiAoaXNEZWxpbWl0ZXJfOTY1KHNfOTkyKSkge1xuICAgIGxldCBpbm5lclJlc3VsdCA9IHJlcGxhY2VUZW1wbGF0ZV85NzQoc185OTIuaW5uZXIoKSwgYWNjXzk5MS5yZXApO1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185OTEudGVtcGxhdGUucHVzaChpbnNlcnRJbnRvRGVsaW1pdGVyXzk2OShzXzk5MiwgaW5uZXJSZXN1bHQpKSwgcmVwOiBhY2NfOTkxLnJlcH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHt0ZW1wbGF0ZTogYWNjXzk5MS50ZW1wbGF0ZS5wdXNoKHNfOTkyKSwgcmVwOiBhY2NfOTkxLnJlcH07XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzVGVtcGxhdGVfOTczKHRlbXBfOTk1LCBpbnRlcnBfOTk2ID0gTGlzdCgpKSB7XG4gIHJldHVybiB0ZW1wXzk5NS5yZWR1Y2UocHJvY2Vzc185NzAsIHt0ZW1wbGF0ZTogTGlzdCgpLCBpbnRlcnA6IGludGVycF85OTZ9KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUZW1wbGF0ZV85NzQodGVtcF85OTcsIHJlcF85OTgpIHtcbiAgcmV0dXJuIHRlbXBfOTk3LnJlZHVjZShyZXBsYWNlXzk3Miwge3RlbXBsYXRlOiBMaXN0KCksIHJlcDogcmVwXzk5OH0pLnRlbXBsYXRlO1xufVxuZXhwb3J0IHtwcm9jZXNzVGVtcGxhdGVfOTczIGFzIHByb2Nlc3NUZW1wbGF0ZX07XG5leHBvcnQge3JlcGxhY2VUZW1wbGF0ZV85NzQgYXMgcmVwbGFjZVRlbXBsYXRlfSJdfQ== + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS1wcm9jZXNzb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7UUF3RmdCLGUsR0FBQSxlO1FBSUEsZSxHQUFBLGU7O0FBNUZoQjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsTUFBTSxVQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxZQUFSLENBQXRDLElBQStELEVBQUUsR0FBRixPQUFZLEdBQXBHO0FBQ0EsTUFBTSxjQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxXQUFSLENBQS9EO0FBQ0EsTUFBTSxXQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQS9EO0FBQ0EsTUFBTSxXQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQS9EO0FBQ0EsTUFBTSxhQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxVQUFSLENBQS9EOztBQUVBLE1BQU0sc0JBQXNCLGdCQUFFLElBQUYsQ0FBTyxDQUNqQyxDQUFDLFFBQUQsRUFBVyxDQUFDLENBQUQsRUFBSSxDQUFKLEtBQVUsaUJBQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsQ0FBckIsQ0FEaUMsRUFFakMsQ0FBQyxRQUFELEVBQVcsQ0FBQyxDQUFELEVBQUksQ0FBSixLQUFVLGlCQUFPLElBQVAsQ0FBWSxRQUFaLEVBQXNCLENBQXRCLEVBQXlCLENBQXpCLENBQXJCLENBRmlDLEVBR2pDLENBQUMsVUFBRCxFQUFhLENBQUMsQ0FBRCxFQUFJLENBQUosS0FB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YSxJQUFiLENBQWtCLENBQWxCLENBREw7QUFFTCxXQUFLLElBQUk7QUFGSixLQUFQO0FBSUQ7QUFDRixDQXZCRDs7QUF5Qk8sU0FBUyxlQUFULENBQXlCLElBQXpCLEVBQWdEO0FBQUEsTUFBakIsTUFBaUIseURBQVIsc0JBQVE7O0FBQ3JELFNBQU8sS0FBSyxNQUFMLENBQVksT0FBWixFQUFxQixFQUFFLFVBQVUsc0JBQVosRUFBb0IsY0FBcEIsRUFBckIsQ0FBUDtBQUNEOztBQUVNLFNBQVMsZUFBVCxDQUF5QixJQUF6QixFQUErQixHQUEvQixFQUFvQztBQUN6QyxTQUFPLEtBQUssTUFBTCxDQUFZLE9BQVosRUFBcUIsRUFBRSxVQUFVLHNCQUFaLEVBQW9CLFFBQXBCLEVBQXJCLEVBQWdELFFBQXZEO0FBQ0QiLCJmaWxlIjoidGVtcGxhdGUtcHJvY2Vzc29yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlzdCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgXyBmcm9tICdyYW1kYSc7XG5pbXBvcnQgU3ludGF4IGZyb20gJy4vc3ludGF4JztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vZXJyb3JzJztcblxuLypcbkdpdmVuIGEgc3ludGF4IGxpc3QgbGlrZTpcblxuICBbZm9vLCBiYXIsICQsIHsgNDIsICssIDI0IH0sIGJhel1cblxuY29udmVydCBpdCB0bzpcblxuICBbZm9vLCBiYXIsICQsIHsgMCB9LCBiYXpdXG5cbmFuZCByZXR1cm4gYW5vdGhlciBsaXN0IHdpdGggdGhlIGludGVycG9sYXRlZCB2YWx1ZXMgYXQgdGhlIGNvcnJlc3BvbmRpbmdcbnBvc2l0aW9ucy5cblxuUmVxdWlyZXMgZWl0aGVyIGxvb2thaGVhZC9sb29rYmVoaW5kIG9mIG9uZSAodG8gc2VlIHRoZSAkKS5cbiovXG5cbmNvbnN0IGlzRG9sYXIgICAgID0gcyA9PiBzICYmIHR5cGVvZiBzLm1hdGNoID09PSAnZnVuY3Rpb24nICYmIHMubWF0Y2goXCJpZGVudGlmaWVyXCIpICYmIHMudmFsKCkgPT09ICckJztcbmNvbnN0IGlzRGVsaW1pdGVyID0gcyA9PiBzICYmIHR5cGVvZiBzLm1hdGNoID09PSAnZnVuY3Rpb24nICYmIHMubWF0Y2goXCJkZWxpbWl0ZXJcIik7XG5jb25zdCBpc0JyYWNlcyAgICA9IHMgPT4gcyAmJiB0eXBlb2Ygcy5tYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiBzLm1hdGNoKFwiYnJhY2VzXCIpO1xuY29uc3QgaXNQYXJlbnMgICAgPSBzID0+IHMgJiYgdHlwZW9mIHMubWF0Y2ggPT09ICdmdW5jdGlvbicgJiYgcy5tYXRjaChcInBhcmVuc1wiKTtcbmNvbnN0IGlzQnJhY2tldHMgID0gcyA9PiBzICYmIHR5cGVvZiBzLm1hdGNoID09PSAnZnVuY3Rpb24nICYmIHMubWF0Y2goXCJicmFja2V0c1wiKTtcblxuY29uc3QgaW5zZXJ0SW50b0RlbGltaXRlciA9IF8uY29uZChbXG4gIFtpc0JyYWNlcywgKHMsIHIpID0+IFN5bnRheC5mcm9tKFwiYnJhY2VzXCIsIHIsIHMpXSxcbiAgW2lzUGFyZW5zLCAocywgcikgPT4gU3ludGF4LmZyb20oXCJwYXJlbnNcIiwgciwgcyldLFxuICBbaXNCcmFja2V0cywgKHMsIHIpID0+IFN5bnRheC5mcm9tKFwiYnJhY2tldHNcIiwgciwgcyldXG5dKTtcblxuY29uc3QgcHJvY2VzcyA9IChhY2MsIHMpID0+IHtcbiAgaWYgKGlzQnJhY2VzKHMpICYmIGlzRG9sYXIoYWNjLnRlbXBsYXRlLmxhc3QoKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6IGFjYy50ZW1wbGF0ZS5wdXNoKFN5bnRheC5mcm9tKFwiYnJhY2VzXCIsIExpc3Qub2YoU3ludGF4LmZyb20oXCJudW1iZXJcIiwgYWNjLmludGVycC5zaXplKSksIHMpKSxcbiAgICAgIGludGVycDogYWNjLmludGVycC5wdXNoKHMuaW5uZXIoKSlcbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzRGVsaW1pdGVyKHMpKSB7XG4gICAgbGV0IGlubmVyUmVzdWx0ID0gcHJvY2Vzc1RlbXBsYXRlKHMuaW5uZXIoKSwgYWNjLmludGVycCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbXBsYXRlOiBhY2MudGVtcGxhdGUucHVzaChpbnNlcnRJbnRvRGVsaW1pdGVyKHMsIGlubmVyUmVzdWx0LnRlbXBsYXRlKSksXG4gICAgICBpbnRlcnA6IGlubmVyUmVzdWx0LmludGVycFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbXBsYXRlOiBhY2MudGVtcGxhdGUucHVzaChzKSxcbiAgICAgIGludGVycDogYWNjLmludGVycFxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsb25lTGluZU51bWJlcih0bywgZnJvbSkge1xuICBpZiAoZnJvbSAmJiB0byApIHtcbiAgICBpZiAodHlwZW9mIHRvLnNldExpbmVOdW1iZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0by5zZXRMaW5lTnVtYmVyKGZyb20ubGluZU51bWJlcigpKTtcbiAgICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHRvKSkge1xuICAgICAgcmV0dXJuIHRvLm1hcCh4ID0+IGNsb25lTGluZU51bWJlcih4LCBmcm9tKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cblxuY29uc3QgcmVwbGFjZSA9IChhY2MsIHMpID0+IHtcbiAgbGV0IGxhc3QgPSBhY2MudGVtcGxhdGUuZ2V0KC0xKTtcbiAgbGV0IGJlZm9yZUxhc3QgPSBhY2MudGVtcGxhdGUuZ2V0KC0yKTtcbiAgaWYgKGlzQnJhY2VzKHMpICYmIGlzRG9sYXIobGFzdCkpIHtcbiAgICBsZXQgaW5kZXggPSBzLmlubmVyKCkuZmlyc3QoKS52YWwoKTtcbiAgICBhc3NlcnQoYWNjLnJlcC5zaXplID4gaW5kZXgsIFwidW5rbm93biByZXBsYWNlbWVudCB2YWx1ZVwiKTtcbiAgICBsZXQgcmVwbGFjZW1lbnQgPSBjbG9uZUxpbmVOdW1iZXIoYWNjLnJlcC5nZXQoaW5kZXgpLCBiZWZvcmVMYXN0KTtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6IGFjYy50ZW1wbGF0ZS5wb3AoKS5jb25jYXQocmVwbGFjZW1lbnQpLFxuICAgICAgcmVwOiBhY2MucmVwXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc0RlbGltaXRlcihzKSkge1xuICAgIGxldCBpbm5lclJlc3VsdCA9IHJlcGxhY2VUZW1wbGF0ZShzLmlubmVyKCksIGFjYy5yZXApO1xuICAgIHJldHVybiB7XG4gICAgICB0ZW1wbGF0ZTogYWNjLnRlbXBsYXRlLnB1c2goaW5zZXJ0SW50b0RlbGltaXRlcihzLCBpbm5lclJlc3VsdCkpLFxuICAgICAgcmVwOiBhY2MucmVwXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6IGFjYy50ZW1wbGF0ZS5wdXNoKHMpLFxuICAgICAgcmVwOiBhY2MucmVwXG4gICAgfTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUZW1wbGF0ZSh0ZW1wLCBpbnRlcnAgPSBMaXN0KCkpIHtcbiAgcmV0dXJuIHRlbXAucmVkdWNlKHByb2Nlc3MsIHsgdGVtcGxhdGU6IExpc3QoKSwgaW50ZXJwIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVRlbXBsYXRlKHRlbXAsIHJlcCkge1xuICByZXR1cm4gdGVtcC5yZWR1Y2UocmVwbGFjZSwgeyB0ZW1wbGF0ZTogTGlzdCgpLCByZXAgfSkudGVtcGxhdGU7XG59XG4iXX0= /***/ }, -/* 64 */ -/***/ function(module, exports) { +/* 60 */ +/***/ function(module, exports, __webpack_require__) { - "use strict"; + 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); - class ASTDispatcher { - constructor(prefix_16, errorIfMissing_17) { - this.errorIfMissing = errorIfMissing_17; - this.prefix = prefix_16; - } - dispatch(term_18) { - let field_19 = this.prefix + term_18.type; - if (typeof this[field_19] === "function") { - return this[field_19](term_18); - } else if (!this.errorIfMissing) { - return term_18; - } - throw new Error(`Missing implementation for: ${ field_19 }`); + + var _termExpander = __webpack_require__(61); + + var _termExpander2 = _interopRequireDefault(_termExpander); + + var _tokenExpander = __webpack_require__(64); + + var _tokenExpander2 = _interopRequireDefault(_tokenExpander); + + var _ramda = __webpack_require__(10); + + var _ = _interopRequireWildcard(_ramda); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + class Compiler { + constructor(phase, env, store, context) { + this.phase = phase; + this.env = env; + this.store = store; + this.context = context; + } + + compile(stxl) { + let tokenExpander = new _tokenExpander2.default(_.merge(this.context, { + phase: this.phase, + env: this.env, + store: this.store + })); + let termExpander = new _termExpander2.default(_.merge(this.context, { + phase: this.phase, + env: this.env, + store: this.store + })); + + return _.pipe(_.bind(tokenExpander.expand, tokenExpander), _.map(t => termExpander.expand(t)))(stxl); } } - exports.default = ASTDispatcher; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2FzdC1kaXNwYXRjaGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQWUsTUFBTSxhQUFOLENBQW9CO0FBQ2pDLGNBQVksU0FBWixFQUF1QixpQkFBdkIsRUFBMEM7QUFDeEMsU0FBSyxjQUFMLEdBQXNCLGlCQUF0QjtBQUNBLFNBQUssTUFBTCxHQUFjLFNBQWQ7QUFDRDtBQUNELFdBQVMsT0FBVCxFQUFrQjtBQUNoQixRQUFJLFdBQVcsS0FBSyxNQUFMLEdBQWMsUUFBUSxJQUFyQztBQUNBLFFBQUksT0FBTyxLQUFLLFFBQUwsQ0FBUCxLQUEwQixVQUE5QixFQUEwQztBQUN4QyxhQUFPLEtBQUssUUFBTCxFQUFlLE9BQWYsQ0FBUDtBQUNELEtBRkQsTUFFTyxJQUFJLENBQUMsS0FBSyxjQUFWLEVBQTBCO0FBQy9CLGFBQU8sT0FBUDtBQUNEO0FBQ0QsVUFBTSxJQUFJLEtBQUosQ0FBVyxnQ0FBOEIsUUFBUyxHQUFsRCxDQUFOO0FBQ0Q7QUFiZ0M7a0JBQWQsYSIsImZpbGUiOiJhc3QtZGlzcGF0Y2hlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFTVERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3RvcihwcmVmaXhfMTYsIGVycm9ySWZNaXNzaW5nXzE3KSB7XG4gICAgdGhpcy5lcnJvcklmTWlzc2luZyA9IGVycm9ySWZNaXNzaW5nXzE3O1xuICAgIHRoaXMucHJlZml4ID0gcHJlZml4XzE2O1xuICB9XG4gIGRpc3BhdGNoKHRlcm1fMTgpIHtcbiAgICBsZXQgZmllbGRfMTkgPSB0aGlzLnByZWZpeCArIHRlcm1fMTgudHlwZTtcbiAgICBpZiAodHlwZW9mIHRoaXNbZmllbGRfMTldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0aGlzW2ZpZWxkXzE5XSh0ZXJtXzE4KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmVycm9ySWZNaXNzaW5nKSB7XG4gICAgICByZXR1cm4gdGVybV8xODtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGltcGxlbWVudGF0aW9uIGZvcjogJHtmaWVsZF8xOX1gKTtcbiAgfVxufVxuIl19 + exports.default = Compiler; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21waWxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7O0lBQVksQzs7Ozs7O0FBR0csTUFBTSxRQUFOLENBQWU7QUFDNUIsY0FBWSxLQUFaLEVBQW1CLEdBQW5CLEVBQXdCLEtBQXhCLEVBQStCLE9BQS9CLEVBQXdDO0FBQ3RDLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0EsU0FBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLFNBQUssT0FBTCxHQUFlLE9BQWY7QUFDRDs7QUFFRCxVQUFRLElBQVIsRUFBYztBQUNaLFFBQUksZ0JBQWdCLDRCQUFrQixFQUFFLEtBQUYsQ0FBUSxLQUFLLE9BQWIsRUFBc0I7QUFDMUQsYUFBTyxLQUFLLEtBRDhDO0FBRTFELFdBQUssS0FBSyxHQUZnRDtBQUcxRCxhQUFPLEtBQUs7QUFIOEMsS0FBdEIsQ0FBbEIsQ0FBcEI7QUFLQSxRQUFJLGVBQWUsMkJBQWlCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQjtBQUN4RCxhQUFPLEtBQUssS0FENEM7QUFFeEQsV0FBSyxLQUFLLEdBRjhDO0FBR3hELGFBQU8sS0FBSztBQUg0QyxLQUF0QixDQUFqQixDQUFuQjs7QUFNQSxXQUFPLEVBQUUsSUFBRixDQUNMLEVBQUUsSUFBRixDQUFPLGNBQWMsTUFBckIsRUFBNkIsYUFBN0IsQ0FESyxFQUVMLEVBQUUsR0FBRixDQUFNLEtBQUssYUFBYSxNQUFiLENBQW9CLENBQXBCLENBQVgsQ0FGSyxFQUdMLElBSEssQ0FBUDtBQUlEO0FBeEIyQjtrQkFBVCxRIiwiZmlsZSI6ImNvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlcm1FeHBhbmRlciBmcm9tIFwiLi90ZXJtLWV4cGFuZGVyLmpzXCI7XG5pbXBvcnQgVG9rZW5FeHBhbmRlciBmcm9tICcuL3Rva2VuLWV4cGFuZGVyJztcbmltcG9ydCAqIGFzIF8gZnJvbSAncmFtZGEnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBpbGVyIHtcbiAgY29uc3RydWN0b3IocGhhc2UsIGVudiwgc3RvcmUsIGNvbnRleHQpIHtcbiAgICB0aGlzLnBoYXNlID0gcGhhc2U7XG4gICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICBjb21waWxlKHN0eGwpIHtcbiAgICBsZXQgdG9rZW5FeHBhbmRlciA9IG5ldyBUb2tlbkV4cGFuZGVyKF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7XG4gICAgICBwaGFzZTogdGhpcy5waGFzZSxcbiAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICBzdG9yZTogdGhpcy5zdG9yZVxuICAgIH0pKTtcbiAgICBsZXQgdGVybUV4cGFuZGVyID0gbmV3IFRlcm1FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge1xuICAgICAgcGhhc2U6IHRoaXMucGhhc2UsXG4gICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgc3RvcmU6IHRoaXMuc3RvcmVcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gXy5waXBlKFxuICAgICAgXy5iaW5kKHRva2VuRXhwYW5kZXIuZXhwYW5kLCB0b2tlbkV4cGFuZGVyKSxcbiAgICAgIF8ubWFwKHQgPT4gdGVybUV4cGFuZGVyLmV4cGFuZCh0KSlcbiAgICApKHN0eGwpO1xuICB9XG59XG4iXX0= /***/ }, -/* 65 */ +/* 61 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -38198,350 +39423,666 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack Object.defineProperty(exports, "__esModule", { value: true }); - exports.unwrap = exports.SyntaxOrTermWrapper = undefined; - var _mapSyntaxReducer = __webpack_require__(66); + var _immutable = __webpack_require__(3); - var _mapSyntaxReducer2 = _interopRequireDefault(_mapSyntaxReducer); + var _terms = __webpack_require__(9); - var _shiftReducer = __webpack_require__(33); + var _terms2 = _interopRequireDefault(_terms); - var _shiftReducer2 = _interopRequireDefault(_shiftReducer); + var _scope = __webpack_require__(58); - var _errors = __webpack_require__(13); + var _applyScopeInParamsReducer = __webpack_require__(62); + + var _applyScopeInParamsReducer2 = _interopRequireDefault(_applyScopeInParamsReducer); - var _immutable = __webpack_require__(11); + var _compiler = __webpack_require__(60); - var _enforester = __webpack_require__(51); + var _compiler2 = _interopRequireDefault(_compiler); - var _syntax = __webpack_require__(12); + var _syntax = __webpack_require__(46); var _syntax2 = _interopRequireDefault(_syntax); - var _ramdaFantasy = __webpack_require__(15); + var _serializer = __webpack_require__(49); - var _ramda = __webpack_require__(27); + var _enforester = __webpack_require__(56); - var _ = _interopRequireWildcard(_ramda); + var _templateProcessor = __webpack_require__(59); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + var _astDispatcher = __webpack_require__(63); + + var _astDispatcher2 = _interopRequireDefault(_astDispatcher); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - const Just_396 = _ramdaFantasy.Maybe.Just; - const Nothing_397 = _ramdaFantasy.Maybe.Nothing; - const symWrap_398 = Symbol("wrapper"); - const privateData_399 = new WeakMap(); - const getVal_400 = t_405 => { - if (t_405.match("delimiter")) { - return null; + class TermExpander extends _astDispatcher2.default { + constructor(context) { + super('expand', true); + this.context = context; } - if (typeof t_405.val === "function") { - return t_405.val(); + + expand(term) { + return this.dispatch(term); } - return null; - }; - class SyntaxOrTermWrapper_401 { - constructor(s_406) { - let context_407 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - this[symWrap_398] = s_406; - this.context = context_407; + expandPragma(term) { + return term; } - from(type_408, value_409) { - let stx_410 = this[symWrap_398]; - if (typeof stx_410.from === "function") { - return stx_410.from(type_408, value_409); - } + + expandTemplateExpression(term) { + return new _terms2.default('TemplateExpression', { + tag: term.tag == null ? null : this.expand(term.tag), + elements: term.elements.toArray() + }); } - fromNull() { - return this.from("null", null); + + expandBreakStatement(term) { + return new _terms2.default('BreakStatement', { + label: term.label ? term.label.val() : null + }); } - fromNumber(value_411) { - return this.from("number", value_411); + + expandDoWhileStatement(term) { + return new _terms2.default('DoWhileStatement', { + body: this.expand(term.body), + test: this.expand(term.test) + }); } - fromString(value_412) { - return this.from("string", value_412); + + expandWithStatement(term) { + return new _terms2.default('WithStatement', { + body: this.expand(term.body), + object: this.expand(term.object) + }); } - fromPunctuator(value_413) { - return this.from("punctuator", value_413); + + expandDebuggerStatement(term) { + return term; } - fromKeyword(value_414) { - return this.from("keyword"); + + expandContinueStatement(term) { + return new _terms2.default('ContinueStatement', { + label: term.label ? term.label.val() : null + }); } - fromIdentifier(value_415) { - return this.from("identifier", value_415); + + expandSwitchStatementWithDefault(term) { + return new _terms2.default('SwitchStatementWithDefault', { + discriminant: this.expand(term.discriminant), + preDefaultCases: term.preDefaultCases.map(c => this.expand(c)).toArray(), + defaultCase: this.expand(term.defaultCase), + postDefaultCases: term.postDefaultCases.map(c => this.expand(c)).toArray() + }); } - fromRegularExpression(value_416) { - return this.from("regularExpression", value_416); + + expandComputedMemberExpression(term) { + return new _terms2.default('ComputedMemberExpression', { + object: this.expand(term.object), + expression: this.expand(term.expression) + }); } - fromBraces(inner_417) { - return this.from("braces", inner_417); + + expandSwitchStatement(term) { + return new _terms2.default('SwitchStatement', { + discriminant: this.expand(term.discriminant), + cases: term.cases.map(c => this.expand(c)).toArray() + }); } - fromBrackets(inner_418) { - return this.from("brackets", inner_418); + + expandFormalParameters(term) { + let rest = term.rest == null ? null : this.expand(term.rest); + return new _terms2.default('FormalParameters', { + items: term.items.map(i => this.expand(i)), + rest: rest + }); } - fromParens(inner_419) { - return this.from("parens", inner_419); + + expandArrowExpression(term) { + return this.doFunctionExpansion(term, 'ArrowExpression'); } - match(type_420, value_421) { - let stx_422 = this[symWrap_398]; - if (typeof stx_422.match === "function") { - return stx_422.match(type_420, value_421); - } + + expandSwitchDefault(term) { + return new _terms2.default('SwitchDefault', { + consequent: term.consequent.map(c => this.expand(c)).toArray() + }); } - isIdentifier(value_423) { - return this.match("identifier", value_423); + + expandSwitchCase(term) { + return new _terms2.default('SwitchCase', { + test: this.expand(term.test), + consequent: term.consequent.map(c => this.expand(c)).toArray() + }); } - isAssign(value_424) { - return this.match("assign", value_424); + + expandForInStatement(term) { + return new _terms2.default('ForInStatement', { + left: this.expand(term.left), + right: this.expand(term.right), + body: this.expand(term.body) + }); } - isBooleanLiteral(value_425) { - return this.match("boolean", value_425); + + expandTryCatchStatement(term) { + return new _terms2.default('TryCatchStatement', { + body: this.expand(term.body), + catchClause: this.expand(term.catchClause) + }); } - isKeyword(value_426) { - return this.match("keyword", value_426); + + expandTryFinallyStatement(term) { + let catchClause = term.catchClause == null ? null : this.expand(term.catchClause); + return new _terms2.default('TryFinallyStatement', { + body: this.expand(term.body), + catchClause: catchClause, + finalizer: this.expand(term.finalizer) + }); } - isNullLiteral(value_427) { - return this.match("null", value_427); + + expandCatchClause(term) { + return new _terms2.default('CatchClause', { + binding: this.expand(term.binding), + body: this.expand(term.body) + }); } - isNumericLiteral(value_428) { - return this.match("number", value_428); + + expandThrowStatement(term) { + return new _terms2.default('ThrowStatement', { + expression: this.expand(term.expression) + }); } - isPunctuator(value_429) { - return this.match("punctuator", value_429); + + expandForOfStatement(term) { + return new _terms2.default('ForOfStatement', { + left: this.expand(term.left), + right: this.expand(term.right), + body: this.expand(term.body) + }); } - isStringLiteral(value_430) { - return this.match("string", value_430); + + expandBindingIdentifier(term) { + return term; } - isRegularExpression(value_431) { - return this.match("regularExpression", value_431); + + expandBindingPropertyIdentifier(term) { + return term; } - isTemplate(value_432) { - return this.match("template", value_432); + expandBindingPropertyProperty(term) { + return new _terms2.default('BindingPropertyProperty', { + name: this.expand(term.name), + binding: this.expand(term.binding) + }); } - isDelimiter(value_433) { - return this.match("delimiter", value_433); + + expandComputedPropertyName(term) { + return new _terms2.default('ComputedPropertyName', { + expression: this.expand(term.expression) + }); } - isParens(value_434) { - return this.match("parens", value_434); + + expandObjectBinding(term) { + return new _terms2.default('ObjectBinding', { + properties: term.properties.map(t => this.expand(t)).toArray() + }); } - isBraces(value_435) { - return this.match("braces", value_435); + + expandArrayBinding(term) { + let restElement = term.restElement == null ? null : this.expand(term.restElement); + return new _terms2.default('ArrayBinding', { + elements: term.elements.map(t => t == null ? null : this.expand(t)).toArray(), + restElement: restElement + }); } - isBrackets(value_436) { - return this.match("brackets", value_436); + + expandBindingWithDefault(term) { + return new _terms2.default('BindingWithDefault', { + binding: this.expand(term.binding), + init: this.expand(term.init) + }); } - isSyntaxTemplate(value_437) { - return this.match("syntaxTemplate", value_437); + + expandShorthandProperty(term) { + // because hygiene, shorthand properties must turn into DataProperties + return new _terms2.default('DataProperty', { + name: new _terms2.default('StaticPropertyName', { + value: term.name + }), + expression: new _terms2.default('IdentifierExpression', { + name: term.name + }) + }); } - isEOF(value_438) { - return this.match("eof", value_438); + + expandForStatement(term) { + let init = term.init == null ? null : this.expand(term.init); + let test = term.test == null ? null : this.expand(term.test); + let update = term.update == null ? null : this.expand(term.update); + let body = this.expand(term.body); + return new _terms2.default('ForStatement', { init: init, test: test, update: update, body: body }); } - lineNumber() { - return this[symWrap_398].lineNumber(); + + expandYieldExpression(term) { + let expr = term.expression == null ? null : this.expand(term.expression); + return new _terms2.default('YieldExpression', { + expression: expr + }); } - val() { - return getVal_400(this[symWrap_398]); + + expandYieldGeneratorExpression(term) { + let expr = term.expression == null ? null : this.expand(term.expression); + return new _terms2.default('YieldGeneratorExpression', { + expression: expr + }); } - inner() { - let stx_439 = this[symWrap_398]; - if (!stx_439.match("delimiter")) { - throw new Error("Can only get inner syntax on a delimiter"); - } - let enf_440 = new _enforester.Enforester(stx_439.inner(), (0, _immutable.List)(), this.context); - return new MacroContext(enf_440, "inner", this.context); + + expandWhileStatement(term) { + return new _terms2.default('WhileStatement', { + test: this.expand(term.test), + body: this.expand(term.body) + }); } - } - function unwrap_402(x_441) { - if (x_441 instanceof SyntaxOrTermWrapper_401) { - return x_441[symWrap_398]; + + expandIfStatement(term) { + let consequent = term.consequent == null ? null : this.expand(term.consequent); + let alternate = term.alternate == null ? null : this.expand(term.alternate); + return new _terms2.default('IfStatement', { + test: this.expand(term.test), + consequent: consequent, + alternate: alternate + }); } - return x_441; - } - function cloneEnforester_403(enf_442) { - const rest = enf_442.rest; - const prev = enf_442.prev; - const context = enf_442.context; - return new _enforester.Enforester(rest, prev, context); - } - function Marker_404() {} - class MacroContext { - constructor(enf_443, name_444, context_445, useScope_446, introducedScope_447) { - const startMarker_448 = new Marker_404(); - const startEnf_449 = cloneEnforester_403(enf_443); - const priv_450 = { name: name_444, context: context_445, startMarker: startMarker_448, markers: new Map([[startMarker_448, enf_443]]) }; - if (useScope_446 && introducedScope_447) { - priv_450.noScopes = false; - priv_450.useScope = useScope_446; - priv_450.introducedScope = introducedScope_447; - } else { - priv_450.noScopes = true; + expandBlockStatement(term) { + return new _terms2.default('BlockStatement', { + block: this.expand(term.block) + }); + } + + expandBlock(term) { + let scope = (0, _scope.freshScope)('block'); + this.context.currentScope.push(scope); + let compiler = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); + + let markedBody, bodyTerm; + markedBody = term.statements.map(b => b.addScope(scope, this.context.bindings, _syntax.ALL_PHASES)); + bodyTerm = new _terms2.default('Block', { + statements: compiler.compile(markedBody) + }); + this.context.currentScope.pop(); + return bodyTerm; + } + + expandVariableDeclarationStatement(term) { + return new _terms2.default('VariableDeclarationStatement', { + declaration: this.expand(term.declaration) + }); + } + expandReturnStatement(term) { + if (term.expression == null) { + return term; } - privateData_399.set(this, priv_450); - this.reset(); - this[Symbol.iterator] = () => this; + return new _terms2.default("ReturnStatement", { + expression: this.expand(term.expression) + }); + } + + expandClassDeclaration(term) { + return new _terms2.default('ClassDeclaration', { + name: term.name == null ? null : this.expand(term.name), + super: term.super == null ? null : this.expand(term.super), + elements: term.elements.map(el => this.expand(el)).toArray() + }); + } + + expandClassExpression(term) { + return new _terms2.default('ClassExpression', { + name: term.name == null ? null : this.expand(term.name), + super: term.super == null ? null : this.expand(term.super), + elements: term.elements.map(el => this.expand(el)).toArray() + }); } - name() { - var _privateData_399$get = privateData_399.get(this); - const name = _privateData_399$get.name; - const context = _privateData_399$get.context; + expandClassElement(term) { + return new _terms2.default('ClassElement', { + isStatic: term.isStatic, + method: this.expand(term.method) + }); + } - return new SyntaxOrTermWrapper_401(name, context); + expandThisExpression(term) { + return term; } - expand(type_451) { - var _privateData_399$get2 = privateData_399.get(this); - const enf = _privateData_399$get2.enf; - const context = _privateData_399$get2.context; + expandSyntaxTemplate(term) { + let r = (0, _templateProcessor.processTemplate)(term.template.inner()); + let str = _syntax2.default.from("string", _serializer.serializer.write(r.template)); + let callee = new _terms2.default('IdentifierExpression', { name: _syntax2.default.from("identifier", 'syntaxTemplate') }); - if (enf.rest.size === 0) { - return { done: true, value: null }; - } - enf.expandMacro(); - let originalRest_452 = enf.rest; - let value_453; - switch (type_451) { - case "AssignmentExpression": - case "expr": - value_453 = enf.enforestExpressionLoop(); - break; - case "Expression": - value_453 = enf.enforestExpression(); - break; - case "Statement": - case "stmt": - value_453 = enf.enforestStatement(); - break; - case "BlockStatement": - case "WhileStatement": - case "IfStatement": - case "ForStatement": - case "SwitchStatement": - case "BreakStatement": - case "ContinueStatement": - case "DebuggerStatement": - case "WithStatement": - case "TryStatement": - case "ThrowStatement": - case "ClassDeclaration": - case "FunctionDeclaration": - case "LabeledStatement": - case "VariableDeclarationStatement": - case "ReturnStatement": - case "ExpressionStatement": - value_453 = enf.enforestStatement(); - (0, _errors.expect)(_.whereEq({ type: type_451 }, value_453), `Expecting a ${ type_451 }`, value_453, originalRest_452); - break; - case "YieldExpression": - value_453 = enf.enforestYieldExpression(); - break; - case "ClassExpression": - value_453 = enf.enforestClass({ isExpr: true }); - break; - case "ArrowExpression": - value_453 = enf.enforestArrowExpression(); - break; - case "NewExpression": - value_453 = enf.enforestNewExpression(); - break; - case "ThisExpression": - case "FunctionExpression": - case "IdentifierExpression": - case "LiteralNumericExpression": - case "LiteralInfinityExpression": - case "LiteralStringExpression": - case "TemplateExpression": - case "LiteralBooleanExpression": - case "LiteralNullExpression": - case "LiteralRegExpExpression": - case "ObjectExpression": - case "ArrayExpression": - value_453 = enf.enforestPrimaryExpression(); - break; - case "UnaryExpression": - case "UpdateExpression": - case "BinaryExpression": - case "StaticMemberExpression": - case "ComputedMemberExpression": - case "AssignmentExpression": - case "CompoundAssignmentExpression": - case "ConditionalExpression": - value_453 = enf.enforestExpressionLoop(); - (0, _errors.expect)(_.whereEq({ type: type_451 }, value_453), `Expecting a ${ type_451 }`, value_453, originalRest_452); - break; - default: - throw new Error("Unknown term type: " + type_451); - } - return { done: false, value: new SyntaxOrTermWrapper_401(value_453, context) }; + let expandedInterps = r.interp.map(i => { + let enf = new _enforester.Enforester(i, (0, _immutable.List)(), this.context); + return this.expand(enf.enforest('expression')); + }); + + let args = _immutable.List.of(new _terms2.default('LiteralStringExpression', { value: str })).concat(expandedInterps); + + return new _terms2.default('CallExpression', { + callee: callee, arguments: args + }); + } + + expandSyntaxQuote(term) { + let str = new _terms2.default("LiteralStringExpression", { + value: _syntax2.default.from("string", _serializer.serializer.write(term.name)) + }); + + return new _terms2.default("TemplateExpression", { + tag: term.template.tag, + elements: term.template.elements.push(str).push(new _terms2.default('TemplateElement', { + rawValue: '' + })).toArray() + }); + } + + expandStaticMemberExpression(term) { + return new _terms2.default("StaticMemberExpression", { + object: this.expand(term.object), + property: term.property + }); + } + + expandArrayExpression(term) { + return new _terms2.default("ArrayExpression", { + elements: term.elements.map(t => t == null ? t : this.expand(t)) + }); + } + + expandImport(term) { + return term; + } + + expandImportNamespace(term) { + return term; + } + + expandExport(term) { + return new _terms2.default('Export', { + declaration: this.expand(term.declaration) + }); + } + + expandExportDefault(term) { + return new _terms2.default('ExportDefault', { + body: this.expand(term.body) + }); + } + + expandExportFrom(term) { + return term; } - _rest(enf_454) { - const priv_455 = privateData_399.get(this); - if (priv_455.markers.get(priv_455.startMarker) === enf_454) { - return priv_455.enf.rest; + + expandExportAllFrom(term) { + return term; + } + + expandExportSpecifier(term) { + return term; + } + + expandStaticPropertyName(term) { + return term; + } + + expandDataProperty(term) { + return new _terms2.default("DataProperty", { + name: this.expand(term.name), + expression: this.expand(term.expression) + }); + } + + expandObjectExpression(term) { + return new _terms2.default("ObjectExpression", { + properties: term.properties.map(t => this.expand(t)) + }); + } + + expandVariableDeclarator(term) { + let init = term.init == null ? null : this.expand(term.init); + return new _terms2.default("VariableDeclarator", { + binding: this.expand(term.binding), + init: init + }); + } + + expandVariableDeclaration(term) { + if (term.kind === 'syntax' || term.kind === 'syntaxrec') { + return term; } - throw Error("Unauthorized access!"); + return new _terms2.default("VariableDeclaration", { + kind: term.kind, + declarators: term.declarators.map(d => this.expand(d)) + }); } - reset(marker_456) { - const priv_457 = privateData_399.get(this); - let enf_458; - if (marker_456 == null) { - enf_458 = priv_457.markers.get(priv_457.startMarker); - } else if (marker_456 && marker_456 instanceof Marker_404) { - if (priv_457.markers.has(marker_456)) { - enf_458 = priv_457.markers.get(marker_456); - } else { - throw new Error("marker must originate from this context"); - } - } else { - throw new Error("marker must be an instance of Marker"); + + expandParenthesizedExpression(term) { + if (term.inner.size === 0) { + throw new Error("unexpected end of input"); } - priv_457.enf = cloneEnforester_403(enf_458); + let enf = new _enforester.Enforester(term.inner, (0, _immutable.List)(), this.context); + let lookahead = enf.peek(); + let t = enf.enforestExpression(); + if (t == null || enf.rest.size > 0) { + throw enf.createError(lookahead, "unexpected syntax"); + } + return this.expand(t); } - mark() { - const priv_459 = privateData_399.get(this); - let marker_460; - if (priv_459.enf.rest === priv_459.markers.get(priv_459.startMarker).rest) { - marker_460 = priv_459.startMarker; - } else if (priv_459.enf.rest.isEmpty()) { - if (!priv_459.endMarker) priv_459.endMarker = new Marker_404(); - marker_460 = priv_459.endMarker; + + expandUnaryExpression(term) { + return new _terms2.default('UnaryExpression', { + operator: term.operator, + operand: this.expand(term.operand) + }); + } + + expandUpdateExpression(term) { + return new _terms2.default('UpdateExpression', { + isPrefix: term.isPrefix, + operator: term.operator, + operand: this.expand(term.operand) + }); + } + + expandBinaryExpression(term) { + let left = this.expand(term.left); + let right = this.expand(term.right); + return new _terms2.default("BinaryExpression", { + left: left, + operator: term.operator, + right: right + }); + } + + expandConditionalExpression(term) { + return new _terms2.default('ConditionalExpression', { + test: this.expand(term.test), + consequent: this.expand(term.consequent), + alternate: this.expand(term.alternate) + }); + } + + expandNewTargetExpression(term) { + return term; + } + + expandNewExpression(term) { + let callee = this.expand(term.callee); + let enf = new _enforester.Enforester(term.arguments, (0, _immutable.List)(), this.context); + let args = enf.enforestArgumentList().map(arg => this.expand(arg)); + return new _terms2.default('NewExpression', { + callee: callee, + arguments: args.toArray() + }); + } + + expandSuper(term) { + return term; + } + + expandCallExpression(term) { + let callee = this.expand(term.callee); + let enf = new _enforester.Enforester(term.arguments, (0, _immutable.List)(), this.context); + let args = enf.enforestArgumentList().map(arg => this.expand(arg)); + return new _terms2.default("CallExpression", { + callee: callee, + arguments: args + }); + } + + expandSpreadElement(term) { + return new _terms2.default('SpreadElement', { + expression: this.expand(term.expression) + }); + } + + expandExpressionStatement(term) { + let child = this.expand(term.expression); + return new _terms2.default("ExpressionStatement", { + expression: child + }); + } + + expandLabeledStatement(term) { + return new _terms2.default('LabeledStatement', { + label: term.label.val(), + body: this.expand(term.body) + }); + } + + doFunctionExpansion(term, type) { + let scope = (0, _scope.freshScope)("fun"); + let red = new _applyScopeInParamsReducer2.default(scope, this.context); + let params; + if (type !== 'Getter' && type !== 'Setter') { + params = red.transform(term.params); + params = this.expand(params); + } + this.context.currentScope.push(scope); + let compiler = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); + + let markedBody, bodyTerm; + if (term.body instanceof _terms2.default) { + // Arrow functions have a single term as their body + bodyTerm = this.expand(term.body.addScope(scope, this.context.bindings, _syntax.ALL_PHASES)); } else { - marker_460 = new Marker_404(); + markedBody = term.body.map(b => b.addScope(scope, this.context.bindings, _syntax.ALL_PHASES)); + bodyTerm = new _terms2.default("FunctionBody", { + directives: (0, _immutable.List)(), + statements: compiler.compile(markedBody) + }); } - if (!priv_459.markers.has(marker_460)) { - priv_459.markers.set(marker_460, cloneEnforester_403(priv_459.enf)); + this.context.currentScope.pop(); + + if (type === 'Getter') { + return new _terms2.default(type, { + name: this.expand(term.name), + body: bodyTerm + }); + } else if (type === 'Setter') { + return new _terms2.default(type, { + name: this.expand(term.name), + param: term.param, + body: bodyTerm + }); + } else if (type === 'ArrowExpression') { + return new _terms2.default(type, { + params: params, + body: bodyTerm + }); } - return marker_460; + return new _terms2.default(type, { + name: term.name, + isGenerator: term.isGenerator, + params: params, + body: bodyTerm + }); } - next() { - var _privateData_399$get3 = privateData_399.get(this); - const enf = _privateData_399$get3.enf; - const noScopes = _privateData_399$get3.noScopes; - const useScope = _privateData_399$get3.useScope; - const introducedScope = _privateData_399$get3.introducedScope; - const context = _privateData_399$get3.context; + expandMethod(term) { + return this.doFunctionExpansion(term, 'Method'); + } - if (enf.rest.size === 0) { - return { done: true, value: null }; - } - let value_461 = enf.advance(); - if (!noScopes) { - value_461 = value_461.addScope(useScope, context.bindings, _syntax.ALL_PHASES).addScope(introducedScope, context.bindings, _syntax.ALL_PHASES, { flip: true }); + expandSetter(term) { + return this.doFunctionExpansion(term, 'Setter'); + } + + expandGetter(term) { + return this.doFunctionExpansion(term, 'Getter'); + } + + expandFunctionDeclaration(term) { + return this.doFunctionExpansion(term, "FunctionDeclaration"); + } + + expandFunctionExpression(term) { + return this.doFunctionExpansion(term, "FunctionExpression"); + } + + expandCompoundAssignmentExpression(term) { + return new _terms2.default("CompoundAssignmentExpression", { + binding: this.expand(term.binding), + operator: term.operator, + expression: this.expand(term.expression) + }); + } + + expandAssignmentExpression(term) { + return new _terms2.default("AssignmentExpression", { + binding: this.expand(term.binding), + expression: this.expand(term.expression) + }); + } + + expandEmptyStatement(term) { + return term; + } + + expandLiteralBooleanExpression(term) { + return term; + } + + expandLiteralNumericExpression(term) { + return term; + } + expandLiteralInfinityExpression(term) { + return term; + } + + expandIdentifierExpression(term) { + let trans = this.context.env.get(term.name.resolve(this.context.phase)); + if (trans) { + return new _terms2.default("IdentifierExpression", { + name: trans.id + }); } - return { done: false, value: new SyntaxOrTermWrapper_401(value_461, context) }; + return term; + } + + expandLiteralNullExpression(term) { + return term; + } + + expandLiteralStringExpression(term) { + return term; + } + + expandLiteralRegExpExpression(term) { + return term; } } - exports.default = MacroContext; - exports.SyntaxOrTermWrapper = SyntaxOrTermWrapper_401; - exports.unwrap = unwrap_402; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L21hY3JvLWNvbnRleHQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUNBOztBQUNBOztJQUFhLEM7Ozs7OztBQUNiLE1BQU0sV0FBVyxvQkFBTSxJQUF2QjtBQUNBLE1BQU0sY0FBYyxvQkFBTSxPQUExQjtBQUNBLE1BQU0sY0FBYyxPQUFPLFNBQVAsQ0FBcEI7QUFDQSxNQUFNLGtCQUFrQixJQUFJLE9BQUosRUFBeEI7QUFDQSxNQUFNLGFBQWEsU0FBUztBQUMxQixNQUFJLE1BQU0sS0FBTixDQUFZLFdBQVosQ0FBSixFQUE4QjtBQUM1QixXQUFPLElBQVA7QUFDRDtBQUNELE1BQUksT0FBTyxNQUFNLEdBQWIsS0FBcUIsVUFBekIsRUFBcUM7QUFDbkMsV0FBTyxNQUFNLEdBQU4sRUFBUDtBQUNEO0FBQ0QsU0FBTyxJQUFQO0FBQ0QsQ0FSRDtBQVNBLE1BQU0sdUJBQU4sQ0FBOEI7QUFDNUIsY0FBWSxLQUFaLEVBQXFDO0FBQUEsUUFBbEIsV0FBa0IseURBQUosRUFBSTs7QUFDbkMsU0FBSyxXQUFMLElBQW9CLEtBQXBCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsV0FBZjtBQUNEO0FBQ0QsT0FBSyxRQUFMLEVBQWUsU0FBZixFQUEwQjtBQUN4QixRQUFJLFVBQVUsS0FBSyxXQUFMLENBQWQ7QUFDQSxRQUFJLE9BQU8sUUFBUSxJQUFmLEtBQXdCLFVBQTVCLEVBQXdDO0FBQ3RDLGFBQU8sUUFBUSxJQUFSLENBQWEsUUFBYixFQUF1QixTQUF2QixDQUFQO0FBQ0Q7QUFDRjtBQUNELGFBQVc7QUFDVCxXQUFPLEtBQUssSUFBTCxDQUFVLE1BQVYsRUFBa0IsSUFBbEIsQ0FBUDtBQUNEO0FBQ0QsYUFBVyxTQUFYLEVBQXNCO0FBQ3BCLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBVixFQUFvQixTQUFwQixDQUFQO0FBQ0Q7QUFDRCxhQUFXLFNBQVgsRUFBc0I7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RCxXQUFPLFVBQVA7QUFDRDtBQUNELFNBQU87QUFBQSxnQ0FDdUQsZ0JBQWdCLEdBQWhCLENBQW9CLElBQXBCLENBRHZEOztBQUFBLFVBQ0UsR0FERix5QkFDRSxHQURGO0FBQUEsVUFDTyxRQURQLHlCQUNPLFFBRFA7QUFBQSxVQUNpQixRQURqQix5QkFDaUIsUUFEakI7QUFBQSxVQUMyQixlQUQzQix5QkFDMkIsZUFEM0I7QUFBQSxVQUM0QyxPQUQ1Qyx5QkFDNEMsT0FENUM7O0FBRUwsUUFBSSxJQUFJLElBQUosQ0FBUyxJQUFULEtBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCLGFBQU8sRUFBQyxNQUFNLElBQVAsRUFBYSxPQUFPLElBQXBCLEVBQVA7QUFDRDtBQUNELFFBQUksWUFBWSxJQUFJLE9BQUosRUFBaEI7QUFDQSxRQUFJLENBQUMsUUFBTCxFQUFlO0FBQ2Isa0JBQVksVUFBVSxRQUFWLENBQW1CLFFBQW5CLEVBQTZCLFFBQVEsUUFBckMsc0JBQTJELFFBQTNELENBQW9FLGVBQXBFLEVBQXFGLFFBQVEsUUFBN0Ysc0JBQW1ILEVBQUMsTUFBTSxJQUFQLEVBQW5ILENBQVo7QUFDRDtBQUNELFdBQU8sRUFBQyxNQUFNLEtBQVAsRUFBYyxPQUFPLElBQUksdUJBQUosQ0FBNEIsU0FBNUIsRUFBdUMsT0FBdkMsQ0FBckIsRUFBUDtBQUNEO0FBdkorQjtrQkFBYixZO1FBeUpjLG1CLEdBQTNCLHVCO1FBQ2MsTSxHQUFkLFUiLCJmaWxlIjoibWFjcm8tY29udGV4dC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXBTeW50YXhSZWR1Y2VyIGZyb20gXCIuL21hcC1zeW50YXgtcmVkdWNlclwiO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHtFbmZvcmVzdGVyfSBmcm9tIFwiLi9lbmZvcmVzdGVyXCI7XG5pbXBvcnQgU3ludGF4LCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge01heWJlfSBmcm9tIFwicmFtZGEtZmFudGFzeVwiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5jb25zdCBKdXN0XzM5NiA9IE1heWJlLkp1c3Q7XG5jb25zdCBOb3RoaW5nXzM5NyA9IE1heWJlLk5vdGhpbmc7XG5jb25zdCBzeW1XcmFwXzM5OCA9IFN5bWJvbChcIndyYXBwZXJcIik7XG5jb25zdCBwcml2YXRlRGF0YV8zOTkgPSBuZXcgV2Vha01hcDtcbmNvbnN0IGdldFZhbF80MDAgPSB0XzQwNSA9PiB7XG4gIGlmICh0XzQwNS5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdF80MDUudmFsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdF80MDUudmFsKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuY2xhc3MgU3ludGF4T3JUZXJtV3JhcHBlcl80MDEge1xuICBjb25zdHJ1Y3RvcihzXzQwNiwgY29udGV4dF80MDcgPSB7fSkge1xuICAgIHRoaXNbc3ltV3JhcF8zOThdID0gc180MDY7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF80MDc7XG4gIH1cbiAgZnJvbSh0eXBlXzQwOCwgdmFsdWVfNDA5KSB7XG4gICAgbGV0IHN0eF80MTAgPSB0aGlzW3N5bVdyYXBfMzk4XTtcbiAgICBpZiAodHlwZW9mIHN0eF80MTAuZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gc3R4XzQxMC5mcm9tKHR5cGVfNDA4LCB2YWx1ZV80MDkpO1xuICAgIH1cbiAgfVxuICBmcm9tTnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwibnVsbFwiLCBudWxsKTtcbiAgfVxuICBmcm9tTnVtYmVyKHZhbHVlXzQxMSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJudW1iZXJcIiwgdmFsdWVfNDExKTtcbiAgfVxuICBmcm9tU3RyaW5nKHZhbHVlXzQxMikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJzdHJpbmdcIiwgdmFsdWVfNDEyKTtcbiAgfVxuICBmcm9tUHVuY3R1YXRvcih2YWx1ZV80MTMpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZV80MTMpO1xuICB9XG4gIGZyb21LZXl3b3JkKHZhbHVlXzQxNCkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJrZXl3b3JkXCIpO1xuICB9XG4gIGZyb21JZGVudGlmaWVyKHZhbHVlXzQxNSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlXzQxNSk7XG4gIH1cbiAgZnJvbVJlZ3VsYXJFeHByZXNzaW9uKHZhbHVlXzQxNikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZV80MTYpO1xuICB9XG4gIGZyb21CcmFjZXMoaW5uZXJfNDE3KSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImJyYWNlc1wiLCBpbm5lcl80MTcpO1xuICB9XG4gIGZyb21CcmFja2V0cyhpbm5lcl80MTgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXJfNDE4KTtcbiAgfVxuICBmcm9tUGFyZW5zKGlubmVyXzQxOSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJwYXJlbnNcIiwgaW5uZXJfNDE5KTtcbiAgfVxuICBtYXRjaCh0eXBlXzQyMCwgdmFsdWVfNDIxKSB7XG4gICAgbGV0IHN0eF80MjIgPSB0aGlzW3N5bVdyYXBfMzk4XTtcbiAgICBpZiAodHlwZW9mIHN0eF80MjIubWF0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHN0eF80MjIubWF0Y2godHlwZV80MjAsIHZhbHVlXzQyMSk7XG4gICAgfVxuICB9XG4gIGlzSWRlbnRpZmllcih2YWx1ZV80MjMpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImlkZW50aWZpZXJcIiwgdmFsdWVfNDIzKTtcbiAgfVxuICBpc0Fzc2lnbih2YWx1ZV80MjQpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImFzc2lnblwiLCB2YWx1ZV80MjQpO1xuICB9XG4gIGlzQm9vbGVhbkxpdGVyYWwodmFsdWVfNDI1KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJib29sZWFuXCIsIHZhbHVlXzQyNSk7XG4gIH1cbiAgaXNLZXl3b3JkKHZhbHVlXzQyNikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwia2V5d29yZFwiLCB2YWx1ZV80MjYpO1xuICB9XG4gIGlzTnVsbExpdGVyYWwodmFsdWVfNDI3KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJudWxsXCIsIHZhbHVlXzQyNyk7XG4gIH1cbiAgaXNOdW1lcmljTGl0ZXJhbCh2YWx1ZV80MjgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcIm51bWJlclwiLCB2YWx1ZV80MjgpO1xuICB9XG4gIGlzUHVuY3R1YXRvcih2YWx1ZV80MjkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInB1bmN0dWF0b3JcIiwgdmFsdWVfNDI5KTtcbiAgfVxuICBpc1N0cmluZ0xpdGVyYWwodmFsdWVfNDMwKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzdHJpbmdcIiwgdmFsdWVfNDMwKTtcbiAgfVxuICBpc1JlZ3VsYXJFeHByZXNzaW9uKHZhbHVlXzQzMSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicmVndWxhckV4cHJlc3Npb25cIiwgdmFsdWVfNDMxKTtcbiAgfVxuICBpc1RlbXBsYXRlKHZhbHVlXzQzMikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwidGVtcGxhdGVcIiwgdmFsdWVfNDMyKTtcbiAgfVxuICBpc0RlbGltaXRlcih2YWx1ZV80MzMpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImRlbGltaXRlclwiLCB2YWx1ZV80MzMpO1xuICB9XG4gIGlzUGFyZW5zKHZhbHVlXzQzNCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicGFyZW5zXCIsIHZhbHVlXzQzNCk7XG4gIH1cbiAgaXNCcmFjZXModmFsdWVfNDM1KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJicmFjZXNcIiwgdmFsdWVfNDM1KTtcbiAgfVxuICBpc0JyYWNrZXRzKHZhbHVlXzQzNikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYnJhY2tldHNcIiwgdmFsdWVfNDM2KTtcbiAgfVxuICBpc1N5bnRheFRlbXBsYXRlKHZhbHVlXzQzNykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwic3ludGF4VGVtcGxhdGVcIiwgdmFsdWVfNDM3KTtcbiAgfVxuICBpc0VPRih2YWx1ZV80MzgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImVvZlwiLCB2YWx1ZV80MzgpO1xuICB9XG4gIGxpbmVOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXNbc3ltV3JhcF8zOThdLmxpbmVOdW1iZXIoKTtcbiAgfVxuICB2YWwoKSB7XG4gICAgcmV0dXJuIGdldFZhbF80MDAodGhpc1tzeW1XcmFwXzM5OF0pO1xuICB9XG4gIGlubmVyKCkge1xuICAgIGxldCBzdHhfNDM5ID0gdGhpc1tzeW1XcmFwXzM5OF07XG4gICAgaWYgKCFzdHhfNDM5Lm1hdGNoKFwiZGVsaW1pdGVyXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gb25seSBnZXQgaW5uZXIgc3ludGF4IG9uIGEgZGVsaW1pdGVyXCIpO1xuICAgIH1cbiAgICBsZXQgZW5mXzQ0MCA9IG5ldyBFbmZvcmVzdGVyKHN0eF80MzkuaW5uZXIoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiBuZXcgTWFjcm9Db250ZXh0KGVuZl80NDAsIFwiaW5uZXJcIiwgdGhpcy5jb250ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gdW53cmFwXzQwMih4XzQ0MSkge1xuICBpZiAoeF80NDEgaW5zdGFuY2VvZiBTeW50YXhPclRlcm1XcmFwcGVyXzQwMSkge1xuICAgIHJldHVybiB4XzQ0MVtzeW1XcmFwXzM5OF07XG4gIH1cbiAgcmV0dXJuIHhfNDQxO1xufVxuZnVuY3Rpb24gY2xvbmVFbmZvcmVzdGVyXzQwMyhlbmZfNDQyKSB7XG4gIGNvbnN0IHtyZXN0LCBwcmV2LCBjb250ZXh0fSA9IGVuZl80NDI7XG4gIHJldHVybiBuZXcgRW5mb3Jlc3RlcihyZXN0LCBwcmV2LCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIE1hcmtlcl80MDQoKSB7fVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFjcm9Db250ZXh0IHtcbiAgY29uc3RydWN0b3IoZW5mXzQ0MywgbmFtZV80NDQsIGNvbnRleHRfNDQ1LCB1c2VTY29wZV80NDYsIGludHJvZHVjZWRTY29wZV80NDcpIHtcbiAgICBjb25zdCBzdGFydE1hcmtlcl80NDggPSBuZXcgTWFya2VyXzQwNDtcbiAgICBjb25zdCBzdGFydEVuZl80NDkgPSBjbG9uZUVuZm9yZXN0ZXJfNDAzKGVuZl80NDMpO1xuICAgIGNvbnN0IHByaXZfNDUwID0ge25hbWU6IG5hbWVfNDQ0LCBjb250ZXh0OiBjb250ZXh0XzQ0NSwgc3RhcnRNYXJrZXI6IHN0YXJ0TWFya2VyXzQ0OCwgbWFya2VyczogbmV3IE1hcChbW3N0YXJ0TWFya2VyXzQ0OCwgZW5mXzQ0M11dKX07XG4gICAgaWYgKHVzZVNjb3BlXzQ0NiAmJiBpbnRyb2R1Y2VkU2NvcGVfNDQ3KSB7XG4gICAgICBwcml2XzQ1MC5ub1Njb3BlcyA9IGZhbHNlO1xuICAgICAgcHJpdl80NTAudXNlU2NvcGUgPSB1c2VTY29wZV80NDY7XG4gICAgICBwcml2XzQ1MC5pbnRyb2R1Y2VkU2NvcGUgPSBpbnRyb2R1Y2VkU2NvcGVfNDQ3O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcml2XzQ1MC5ub1Njb3BlcyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGVEYXRhXzM5OS5zZXQodGhpcywgcHJpdl80NTApO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzW1N5bWJvbC5pdGVyYXRvcl0gPSAoKSA9PiB0aGlzO1xuICB9XG4gIG5hbWUoKSB7XG4gICAgY29uc3Qge25hbWUsIGNvbnRleHR9ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICByZXR1cm4gbmV3IFN5bnRheE9yVGVybVdyYXBwZXJfNDAxKG5hbWUsIGNvbnRleHQpO1xuICB9XG4gIGV4cGFuZCh0eXBlXzQ1MSkge1xuICAgIGNvbnN0IHtlbmYsIGNvbnRleHR9ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICBpZiAoZW5mLnJlc3Quc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtkb25lOiB0cnVlLCB2YWx1ZTogbnVsbH07XG4gICAgfVxuICAgIGVuZi5leHBhbmRNYWNybygpO1xuICAgIGxldCBvcmlnaW5hbFJlc3RfNDUyID0gZW5mLnJlc3Q7XG4gICAgbGV0IHZhbHVlXzQ1MztcbiAgICBzd2l0Y2ggKHR5cGVfNDUxKSB7XG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJleHByXCI6XG4gICAgICAgIHZhbHVlXzQ1MyA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkV4cHJlc3Npb25cIjpcbiAgICAgICAgdmFsdWVfNDUzID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJzdG10XCI6XG4gICAgICAgIHZhbHVlXzQ1MyA9IGVuZi5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJCbG9ja1N0YXRlbWVudFwiOlxuICAgICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiSWZTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJGb3JTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJTd2l0Y2hTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJCcmVha1N0YXRlbWVudFwiOlxuICAgICAgY2FzZSBcIkNvbnRpbnVlU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiRGVidWdnZXJTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJXaXRoU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiVHJ5U3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiVGhyb3dTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiUmV0dXJuU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KF8ud2hlcmVFcSh7dHlwZTogdHlwZV80NTF9LCB2YWx1ZV80NTMpLCBgRXhwZWN0aW5nIGEgJHt0eXBlXzQ1MX1gLCB2YWx1ZV80NTMsIG9yaWdpbmFsUmVzdF80NTIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgdmFsdWVfNDUzID0gZW5mLmVuZm9yZXN0WWllbGRFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3RDbGFzcyh7aXNFeHByOiB0cnVlfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93RXhwcmVzc2lvblwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3ROZXdFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlRoaXNFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiRnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiSWRlbnRpZmllckV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsUmVnRXhwRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJBcnJheUV4cHJlc3Npb25cIjpcbiAgICAgICAgdmFsdWVfNDUzID0gZW5mLmVuZm9yZXN0UHJpbWFyeUV4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiVXBkYXRlRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgICAgIHZhbHVlXzQ1MyA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIGV4cGVjdChfLndoZXJlRXEoe3R5cGU6IHR5cGVfNDUxfSwgdmFsdWVfNDUzKSwgYEV4cGVjdGluZyBhICR7dHlwZV80NTF9YCwgdmFsdWVfNDUzLCBvcmlnaW5hbFJlc3RfNDUyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHRlcm0gdHlwZTogXCIgKyB0eXBlXzQ1MSk7XG4gICAgfVxuICAgIHJldHVybiB7ZG9uZTogZmFsc2UsIHZhbHVlOiBuZXcgU3ludGF4T3JUZXJtV3JhcHBlcl80MDEodmFsdWVfNDUzLCBjb250ZXh0KX07XG4gIH1cbiAgX3Jlc3QoZW5mXzQ1NCkge1xuICAgIGNvbnN0IHByaXZfNDU1ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICBpZiAocHJpdl80NTUubWFya2Vycy5nZXQocHJpdl80NTUuc3RhcnRNYXJrZXIpID09PSBlbmZfNDU0KSB7XG4gICAgICByZXR1cm4gcHJpdl80NTUuZW5mLnJlc3Q7XG4gICAgfVxuICAgIHRocm93IEVycm9yKFwiVW5hdXRob3JpemVkIGFjY2VzcyFcIik7XG4gIH1cbiAgcmVzZXQobWFya2VyXzQ1Nikge1xuICAgIGNvbnN0IHByaXZfNDU3ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICBsZXQgZW5mXzQ1ODtcbiAgICBpZiAobWFya2VyXzQ1NiA9PSBudWxsKSB7XG4gICAgICBlbmZfNDU4ID0gcHJpdl80NTcubWFya2Vycy5nZXQocHJpdl80NTcuc3RhcnRNYXJrZXIpO1xuICAgIH0gZWxzZSBpZiAobWFya2VyXzQ1NiAmJiBtYXJrZXJfNDU2IGluc3RhbmNlb2YgTWFya2VyXzQwNCkge1xuICAgICAgaWYgKHByaXZfNDU3Lm1hcmtlcnMuaGFzKG1hcmtlcl80NTYpKSB7XG4gICAgICAgIGVuZl80NTggPSBwcml2XzQ1Ny5tYXJrZXJzLmdldChtYXJrZXJfNDU2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1hcmtlciBtdXN0IG9yaWdpbmF0ZSBmcm9tIHRoaXMgY29udGV4dFwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWFya2VyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTWFya2VyXCIpO1xuICAgIH1cbiAgICBwcml2XzQ1Ny5lbmYgPSBjbG9uZUVuZm9yZXN0ZXJfNDAzKGVuZl80NTgpO1xuICB9XG4gIG1hcmsoKSB7XG4gICAgY29uc3QgcHJpdl80NTkgPSBwcml2YXRlRGF0YV8zOTkuZ2V0KHRoaXMpO1xuICAgIGxldCBtYXJrZXJfNDYwO1xuICAgIGlmIChwcml2XzQ1OS5lbmYucmVzdCA9PT0gcHJpdl80NTkubWFya2Vycy5nZXQocHJpdl80NTkuc3RhcnRNYXJrZXIpLnJlc3QpIHtcbiAgICAgIG1hcmtlcl80NjAgPSBwcml2XzQ1OS5zdGFydE1hcmtlcjtcbiAgICB9IGVsc2UgaWYgKHByaXZfNDU5LmVuZi5yZXN0LmlzRW1wdHkoKSkge1xuICAgICAgaWYgKCFwcml2XzQ1OS5lbmRNYXJrZXIpIHByaXZfNDU5LmVuZE1hcmtlciA9IG5ldyBNYXJrZXJfNDA0O1xuICAgICAgbWFya2VyXzQ2MCA9IHByaXZfNDU5LmVuZE1hcmtlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFya2VyXzQ2MCA9IG5ldyBNYXJrZXJfNDA0O1xuICAgIH1cbiAgICBpZiAoIXByaXZfNDU5Lm1hcmtlcnMuaGFzKG1hcmtlcl80NjApKSB7XG4gICAgICBwcml2XzQ1OS5tYXJrZXJzLnNldChtYXJrZXJfNDYwLCBjbG9uZUVuZm9yZXN0ZXJfNDAzKHByaXZfNDU5LmVuZikpO1xuICAgIH1cbiAgICByZXR1cm4gbWFya2VyXzQ2MDtcbiAgfVxuICBuZXh0KCkge1xuICAgIGNvbnN0IHtlbmYsIG5vU2NvcGVzLCB1c2VTY29wZSwgaW50cm9kdWNlZFNjb3BlLCBjb250ZXh0fSA9IHByaXZhdGVEYXRhXzM5OS5nZXQodGhpcyk7XG4gICAgaWYgKGVuZi5yZXN0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB7ZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGx9O1xuICAgIH1cbiAgICBsZXQgdmFsdWVfNDYxID0gZW5mLmFkdmFuY2UoKTtcbiAgICBpZiAoIW5vU2NvcGVzKSB7XG4gICAgICB2YWx1ZV80NjEgPSB2YWx1ZV80NjEuYWRkU2NvcGUodXNlU2NvcGUsIGNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpLmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUywge2ZsaXA6IHRydWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IG5ldyBTeW50YXhPclRlcm1XcmFwcGVyXzQwMSh2YWx1ZV80NjEsIGNvbnRleHQpfTtcbiAgfVxufVxuZXhwb3J0IHtTeW50YXhPclRlcm1XcmFwcGVyXzQwMSBhcyBTeW50YXhPclRlcm1XcmFwcGVyfTtcbmV4cG9ydCB7dW53cmFwXzQwMiBhcyB1bndyYXB9Il19 + exports.default = TermExpander; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXJtLWV4cGFuZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVlLE1BQU0sWUFBTixpQ0FBeUM7QUFDdEQsY0FBWSxPQUFaLEVBQXFCO0FBQ25CLFVBQU0sUUFBTixFQUFnQixJQUFoQjtBQUNBLFNBQUssT0FBTCxHQUFlLE9BQWY7QUFDRDs7QUFFRCxTQUFPLElBQVAsRUFBYTtBQUNYLFdBQU8sS0FBSyxRQUFMLENBQWMsSUFBZCxDQUFQO0FBQ0Q7O0FBRUQsZUFBYSxJQUFiLEVBQW1CO0FBQ2pCLFdBQU8sSUFBUDtBQUNEOztBQUVELDJCQUF5QixJQUF6QixFQUErQjtBQUM3QixXQUFPLG9CQUFTLG9CQUFULEVBQStCO0FBQ3BDLFdBQUssS0FBSyxHQUFMLElBQVksSUFBWixHQUFtQixJQUFuQixHQUEwQixLQUFLLE1BQUwsQ0FBWSxLQUFLLEdBQWpCLENBREs7QUFFcEMsZ0JBQVUsS0FBSyxRQUFMLENBQWMsT0FBZDtBQUYwQixLQUEvQixDQUFQO0FBSUQ7O0FBRUQsdUJBQXFCLElBQXJCLEVBQTJCO0FBQ3pCLFdBQU8sb0JBQVMsZ0JBQVQsRUFBMkI7QUFDaEMsYUFBTyxLQUFLLEtBQUwsR0FBYSxLQUFLLEtBQUwsQ0FBVyxHQUFYLEVBQWIsR0FBZ0M7QUFEUCxLQUEzQixDQUFQO0FBR0Q7O0FBRUQseUJBQXVCLElBQXZCLEVBQTZCO0FBQzNCLFdBQU8sb0JBQVMsa0JBQVQsRUFBNkI7QUFDbEMsWUFBTSxLQUFLLE1BQUwsQ0FBWSxLQUFLLElBQWpCLENBRDRCO0FBRWxDLFlBQU0sS0FBSyxNQUFMLENBQVksS0FBSyxJQUFqQjtBQUY0QixLQUE3QixDQUFQO0FBSUQ7O0FBRUQsc0JBQW9CLElBQXBCLEVBQTBCO0FBQ3hCLFdBQU8sb0JBQVMsZUFBVCxFQUEwQjtBQUMvQixZQUFN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RUQsNkJBQTJCLElBQTNCLEVBQWlDO0FBQy9CLFdBQU8sb0JBQVMsc0JBQVQsRUFBaUM7QUFDdEMsZUFBUyxLQUFLLE1BQUwsQ0FBWSxLQUFLLE9BQWpCLENBRDZCO0FBRXRDLGtCQUFZLEtBQUssTUFBTCxDQUFZLEtBQUssVUFBakI7QUFGMEIsS0FBakMsQ0FBUDtBQUlEOztBQUVELHVCQUFxQixJQUFyQixFQUEyQjtBQUN6QixXQUFPLElBQVA7QUFDRDs7QUFFRCxpQ0FBK0IsSUFBL0IsRUFBcUM7QUFDbkMsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsaUNBQStCLElBQS9CLEVBQXFDO0FBQ25DLFdBQU8sSUFBUDtBQUNEO0FBQ0Qsa0NBQWdDLElBQWhDLEVBQXNDO0FBQ3BDLFdBQU8sSUFBUDtBQUNEOztBQUVELDZCQUEyQixJQUEzQixFQUFpQztBQUMvQixRQUFJLFFBQVEsS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixLQUFLLElBQUwsQ0FBVSxPQUFWLENBQWtCLEtBQUssT0FBTCxDQUFhLEtBQS9CLENBQXJCLENBQVo7QUFDQSxRQUFJLEtBQUosRUFBVztBQUNULGFBQU8sb0JBQVMsc0JBQVQsRUFBaUM7QUFDdEMsY0FBTSxNQUFNO0FBRDBCLE9BQWpDLENBQVA7QUFHRDtBQUNELFdBQU8sSUFBUDtBQUNEOztBQUVELDhCQUE0QixJQUE1QixFQUFrQztBQUNoQyxXQUFPLElBQVA7QUFDRDs7QUFFRCxnQ0FBOEIsSUFBOUIsRUFBb0M7QUFDbEMsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsZ0NBQThCLElBQTlCLEVBQW9DO0FBQ2xDLFdBQU8sSUFBUDtBQUNEO0FBMW1CcUQ7a0JBQW5DLFkiLCJmaWxlIjoidGVybS1leHBhbmRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpc3QgfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IFRlcm0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IGZyZXNoU2NvcGUgfSBmcm9tIFwiLi9zY29wZVwiO1xuaW1wb3J0IEFwcGx5U2NvcGVJblBhcmFtc1JlZHVjZXIgZnJvbSBcIi4vYXBwbHktc2NvcGUtaW4tcGFyYW1zLXJlZHVjZXJcIjtcbmltcG9ydCBDb21waWxlciBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCBTeW50YXgsIHsgQUxMX1BIQVNFUyB9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHsgc2VyaWFsaXplciB9IGZyb20gXCIuL3NlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IEVuZm9yZXN0ZXIgfSBmcm9tIFwiLi9lbmZvcmVzdGVyXCI7XG5pbXBvcnQgeyBwcm9jZXNzVGVtcGxhdGUgfSBmcm9tICcuL3RlbXBsYXRlLXByb2Nlc3Nvci5qcyc7XG5pbXBvcnQgQVNURGlzcGF0Y2hlciBmcm9tICcuL2FzdC1kaXNwYXRjaGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVybUV4cGFuZGVyIGV4dGVuZHMgQVNURGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcbiAgICBzdXBlcignZXhwYW5kJywgdHJ1ZSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIGV4cGFuZCh0ZXJtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2godGVybSk7XG4gIH1cblxuICBleHBhbmRQcmFnbWEodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kVGVtcGxhdGVFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1RlbXBsYXRlRXhwcmVzc2lvbicsIHtcbiAgICAgIHRhZzogdGVybS50YWcgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtLnRhZyksXG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEJyZWFrU3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0JyZWFrU3RhdGVtZW50Jywge1xuICAgICAgbGFiZWw6IHRlcm0ubGFiZWwgPyB0ZXJtLmxhYmVsLnZhbCgpIDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRG9XaGlsZVN0YXRlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdEb1doaWxlU3RhdGVtZW50Jywge1xuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KSxcbiAgICAgIHRlc3Q6IHRoaXMuZXhwYW5kKHRlcm0udGVzdClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFdpdGhTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnV2l0aFN0YXRlbWVudCcsIHtcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSksXG4gICAgICBvYmplY3Q6IHRoaXMuZXhwYW5kKHRlcm0ub2JqZWN0KVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRGVidWdnZXJTdGF0ZW1lbnQodGVybSkgeyByZXR1cm4gdGVybTt9XG5cbiAgZXhwYW5kQ29udGludWVTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ29udGludWVTdGF0ZW1lbnQnLCB7XG4gICAgICBsYWJlbDogdGVybS5sYWJlbCA/IHRlcm0ubGFiZWwudmFsKCkgOiBudWxsXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCcsIHtcbiAgICAgIGRpc2NyaW1pbmFudDogdGhpcy5leHBhbmQodGVybS5kaXNjcmltaW5hbnQpLFxuICAgICAgcHJlRGVmYXVsdENhc2VzOiB0ZXJtLnByZURlZmF1bHRDYXNlcy5tYXAoYyA9PiB0aGlzLmV4cGFuZChjKSkudG9BcnJheSgpLFxuICAgICAgZGVmYXVsdENhc2U6IHRoaXMuZXhwYW5kKHRlcm0uZGVmYXVsdENhc2UpLFxuICAgICAgcG9zdERlZmF1bHRDYXNlczogdGVybS5wb3N0RGVmYXVsdENhc2VzLm1hcChjID0+IHRoaXMuZXhwYW5kKGMpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDb21wdXRlZE1lbWJlckV4cHJlc3Npb24nLCB7XG4gICAgICBvYmplY3Q6IHRoaXMuZXhwYW5kKHRlcm0ub2JqZWN0KSxcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFN3aXRjaFN0YXRlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnQnLCB7XG4gICAgICBkaXNjcmltaW5hbnQ6IHRoaXMuZXhwYW5kKHRlcm0uZGlzY3JpbWluYW50KSxcbiAgICAgIGNhc2VzOiB0ZXJtLmNhc2VzLm1hcChjID0+IHRoaXMuZXhwYW5kKGMpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEZvcm1hbFBhcmFtZXRlcnModGVybSkge1xuICAgIGxldCByZXN0ID0gdGVybS5yZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5yZXN0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0Zvcm1hbFBhcmFtZXRlcnMnLCB7XG4gICAgICBpdGVtczogdGVybS5pdGVtcy5tYXAoaSA9PiB0aGlzLmV4cGFuZChpKSksXG4gICAgICByZXN0XG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBcnJvd0V4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybSwgJ0Fycm93RXhwcmVzc2lvbicpO1xuICB9XG5cbiAgZXhwYW5kU3dpdGNoRGVmYXVsdCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hEZWZhdWx0Jywge1xuICAgICAgY29uc2VxdWVudDogdGVybS5jb25zZXF1ZW50Lm1hcChjID0+IHRoaXMuZXhwYW5kKGMpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFN3aXRjaENhc2UodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnU3dpdGNoQ2FzZScsIHtcbiAgICAgIHRlc3Q6IHRoaXMuZXhwYW5kKHRlcm0udGVzdCksXG4gICAgICBjb25zZXF1ZW50OiB0ZXJtLmNvbnNlcXVlbnQubWFwKGMgPT4gdGhpcy5leHBhbmQoYykpLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRm9ySW5TdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRm9ySW5TdGF0ZW1lbnQnLCB7XG4gICAgICBsZWZ0OiB0aGlzLmV4cGFuZCh0ZXJtLmxlZnQpLFxuICAgICAgcmlnaHQ6IHRoaXMuZXhwYW5kKHRlcm0ucmlnaHQpLFxuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kVHJ5Q2F0Y2hTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVHJ5Q2F0Y2hTdGF0ZW1lbnQnLCB7XG4gICAgICBib2R5OiB0aGlzLmV4cGFuZCh0ZXJtLmJvZHkpLFxuICAgICAgY2F0Y2hDbGF1c2U6IHRoaXMuZXhwYW5kKHRlcm0uY2F0Y2hDbGF1c2UpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRUcnlGaW5hbGx5U3RhdGVtZW50KHRlcm0pIHtcbiAgICBsZXQgY2F0Y2hDbGF1c2UgPSB0ZXJtLmNhdGNoQ2xhdXNlID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5jYXRjaENsYXVzZSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdUcnlGaW5hbGx5U3RhdGVtZW50Jywge1xuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KSxcbiAgICAgIGNhdGNoQ2xhdXNlLFxuICAgICAgZmluYWxpemVyOiB0aGlzLmV4cGFuZCh0ZXJtLmZpbmFsaXplcilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENhdGNoQ2xhdXNlKHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0NhdGNoQ2xhdXNlJywge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSlcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFRocm93U3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1Rocm93U3RhdGVtZW50Jywge1xuICAgICAgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybS5leHByZXNzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRm9yT2ZTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRm9yT2ZTdGF0ZW1lbnQnLCB7XG4gICAgICBsZWZ0OiB0aGlzLmV4cGFuZCh0ZXJtLmxlZnQpLFxuICAgICAgcmlnaHQ6IHRoaXMuZXhwYW5kKHRlcm0ucmlnaHQpLFxuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQmluZGluZ0lkZW50aWZpZXIodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cbiAgZXhwYW5kQmluZGluZ1Byb3BlcnR5UHJvcGVydHkodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1Byb3BlcnR5UHJvcGVydHknLCB7XG4gICAgICBuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtLm5hbWUpLFxuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQ29tcHV0ZWRQcm9wZXJ0eU5hbWUodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ29tcHV0ZWRQcm9wZXJ0eU5hbWUnLCB7XG4gICAgICBleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRPYmplY3RCaW5kaW5nKHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ09iamVjdEJpbmRpbmcnLCB7XG4gICAgICBwcm9wZXJ0aWVzOiB0ZXJtLnByb3BlcnRpZXMubWFwKHQgPT4gdGhpcy5leHBhbmQodCkpLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQXJyYXlCaW5kaW5nKHRlcm0pIHtcbiAgICBsZXQgcmVzdEVsZW1lbnQgPSB0ZXJtLnJlc3RFbGVtZW50ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5yZXN0RWxlbWVudCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdBcnJheUJpbmRpbmcnLCB7XG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5tYXAodCA9PiB0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodCkpLnRvQXJyYXkoKSxcbiAgICAgIHJlc3RFbGVtZW50XG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRCaW5kaW5nV2l0aERlZmF1bHQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1dpdGhEZWZhdWx0Jywge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGluaXQ6IHRoaXMuZXhwYW5kKHRlcm0uaW5pdClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFNob3J0aGFuZFByb3BlcnR5KHRlcm0pIHtcbiAgICAvLyBiZWNhdXNlIGh5Z2llbmUsIHNob3J0aGFuZCBwcm9wZXJ0aWVzIG11c3QgdHVybiBpbnRvIERhdGFQcm9wZXJ0aWVzXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdEYXRhUHJvcGVydHknLCB7XG4gICAgICBuYW1lOiBuZXcgVGVybSgnU3RhdGljUHJvcGVydHlOYW1lJywge1xuICAgICAgICB2YWx1ZTogdGVybS5uYW1lXG4gICAgICB9KSxcbiAgICAgIGV4cHJlc3Npb246IG5ldyBUZXJtKCdJZGVudGlmaWVyRXhwcmVzc2lvbicsIHtcbiAgICAgICAgbmFtZTogdGVybS5uYW1lXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cblxuICBleHBhbmRGb3JTdGF0ZW1lbnQodGVybSkge1xuICAgIGxldCBpbml0ID0gdGVybS5pbml0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5pbml0KTtcbiAgICBsZXQgdGVzdCA9IHRlcm0udGVzdCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0udGVzdCk7XG4gICAgbGV0IHVwZGF0ZSA9IHRlcm0udXBkYXRlID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS51cGRhdGUpO1xuICAgIGxldCBib2R5ID0gdGhpcy5leHBhbmQodGVybS5ib2R5KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0ZvclN0YXRlbWVudCcsIHsgaW5pdCwgdGVzdCwgdXBkYXRlLCBib2R5IH0pO1xuICB9XG5cbiAgZXhwYW5kWWllbGRFeHByZXNzaW9uKHRlcm0pIHtcbiAgICBsZXQgZXhwciA9IHRlcm0uZXhwcmVzc2lvbiA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdZaWVsZEV4cHJlc3Npb24nLCB7XG4gICAgICBleHByZXNzaW9uOiBleHByXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRZaWVsZEdlbmVyYXRvckV4cHJlc3Npb24odGVybSkge1xuICAgIGxldCBleHByID0gdGVybS5leHByZXNzaW9uID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5leHByZXNzaW9uKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1lpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbicsIHtcbiAgICAgIGV4cHJlc3Npb246IGV4cHJcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFdoaWxlU3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1doaWxlU3RhdGVtZW50Jywge1xuICAgICAgdGVzdDogdGhpcy5leHBhbmQodGVybS50ZXN0KSxcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSlcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZElmU3RhdGVtZW50KHRlcm0pIHtcbiAgICBsZXQgY29uc2VxdWVudCA9IHRlcm0uY29uc2VxdWVudCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0uY29uc2VxdWVudCk7XG4gICAgbGV0IGFsdGVybmF0ZSA9IHRlcm0uYWx0ZXJuYXRlID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5hbHRlcm5hdGUpO1xuICAgIHJldHVybiBuZXcgVGVybSgnSWZTdGF0ZW1lbnQnLCB7XG4gICAgICB0ZXN0OiB0aGlzLmV4cGFuZCh0ZXJtLnRlc3QpLFxuICAgICAgY29uc2VxdWVudDogY29uc2VxdWVudCxcbiAgICAgIGFsdGVybmF0ZTogYWx0ZXJuYXRlXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRCbG9ja1N0YXRlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCbG9ja1N0YXRlbWVudCcsIHtcbiAgICAgIGJsb2NrOiB0aGlzLmV4cGFuZCh0ZXJtLmJsb2NrKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQmxvY2sodGVybSkge1xuICAgIGxldCBzY29wZSA9IGZyZXNoU2NvcGUoJ2Jsb2NrJyk7XG4gICAgdGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZS5wdXNoKHNjb3BlKTtcbiAgICBsZXQgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIodGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuZW52LCB0aGlzLmNvbnRleHQuc3RvcmUsIHRoaXMuY29udGV4dCk7XG5cbiAgICBsZXQgbWFya2VkQm9keSwgYm9keVRlcm07XG4gICAgbWFya2VkQm9keSA9IHRlcm0uc3RhdGVtZW50cy5tYXAoYiA9PiBiLmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpKTtcbiAgICBib2R5VGVybSA9IG5ldyBUZXJtKCdCbG9jaycsIHtcbiAgICAgIHN0YXRlbWVudHM6IGNvbXBpbGVyLmNvbXBpbGUobWFya2VkQm9keSlcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnBvcCgpO1xuICAgIHJldHVybiBib2R5VGVybTtcbiAgfVxuXG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCcsIHtcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmRlY2xhcmF0aW9uKVxuICAgIH0pO1xuICB9XG4gIGV4cGFuZFJldHVyblN0YXRlbWVudCh0ZXJtKSB7XG4gICAgaWYgKHRlcm0uZXhwcmVzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiUmV0dXJuU3RhdGVtZW50XCIsIHtcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENsYXNzRGVjbGFyYXRpb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ2xhc3NEZWNsYXJhdGlvbicsIHtcbiAgICAgIG5hbWU6IHRlcm0ubmFtZSA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0ubmFtZSksXG4gICAgICBzdXBlcjogdGVybS5zdXBlciA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0uc3VwZXIpLFxuICAgICAgZWxlbWVudHM6IHRlcm0uZWxlbWVudHMubWFwKGVsID0+IHRoaXMuZXhwYW5kKGVsKSkudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRDbGFzc0V4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ2xhc3NFeHByZXNzaW9uJywge1xuICAgICAgbmFtZTogdGVybS5uYW1lID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5uYW1lKSxcbiAgICAgIHN1cGVyOiB0ZXJtLnN1cGVyID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5zdXBlciksXG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5tYXAoZWwgPT4gdGhpcy5leHBhbmQoZWwpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENsYXNzRWxlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDbGFzc0VsZW1lbnQnLCB7XG4gICAgICBpc1N0YXRpYzogdGVybS5pc1N0YXRpYyxcbiAgICAgIG1ldGhvZDogdGhpcy5leHBhbmQodGVybS5tZXRob2QpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRUaGlzRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRTeW50YXhUZW1wbGF0ZSh0ZXJtKSB7XG4gICAgbGV0IHIgPSBwcm9jZXNzVGVtcGxhdGUodGVybS50ZW1wbGF0ZS5pbm5lcigpKTtcbiAgICBsZXQgc3RyID0gU3ludGF4LmZyb20oXCJzdHJpbmdcIiwgc2VyaWFsaXplci53cml0ZShyLnRlbXBsYXRlKSk7XG4gICAgbGV0IGNhbGxlZSA9IG5ldyBUZXJtKCdJZGVudGlmaWVyRXhwcmVzc2lvbicsIHsgbmFtZTogU3ludGF4LmZyb20oXCJpZGVudGlmaWVyXCIsICdzeW50YXhUZW1wbGF0ZScpIH0pO1xuXG4gICAgbGV0IGV4cGFuZGVkSW50ZXJwcyA9IHIuaW50ZXJwLm1hcChpID0+IHtcbiAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICByZXR1cm4gdGhpcy5leHBhbmQoZW5mLmVuZm9yZXN0KCdleHByZXNzaW9uJykpO1xuICAgIH0pO1xuXG4gICAgbGV0IGFyZ3MgPSBMaXN0Lm9mKG5ldyBUZXJtKCdMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbicsIHt2YWx1ZTogc3RyIH0pKVxuICAgICAgICAgICAgICAgICAgIC5jb25jYXQoZXhwYW5kZWRJbnRlcnBzKTtcblxuICAgIHJldHVybiBuZXcgVGVybSgnQ2FsbEV4cHJlc3Npb24nLCB7XG4gICAgICBjYWxsZWUsIGFyZ3VtZW50czogYXJnc1xuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kU3ludGF4UXVvdGUodGVybSkge1xuICAgIGxldCBzdHIgPSBuZXcgVGVybShcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiBTeW50YXguZnJvbShcInN0cmluZ1wiLCBzZXJpYWxpemVyLndyaXRlKHRlcm0ubmFtZSkpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiwge1xuICAgICAgdGFnOiB0ZXJtLnRlbXBsYXRlLnRhZyxcbiAgICAgIGVsZW1lbnRzOiB0ZXJtLnRlbXBsYXRlLmVsZW1lbnRzLnB1c2goc3RyKS5wdXNoKG5ldyBUZXJtKCdUZW1wbGF0ZUVsZW1lbnQnLCB7XG4gICAgICAgIHJhd1ZhbHVlOiAnJ1xuICAgICAgfSkpLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kU3RhdGljTWVtYmVyRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBvYmplY3Q6IHRoaXMuZXhwYW5kKHRlcm0ub2JqZWN0KSxcbiAgICAgIHByb3BlcnR5OiB0ZXJtLnByb3BlcnR5XG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBcnJheUV4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkFycmF5RXhwcmVzc2lvblwiLCB7XG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5tYXAodCA9PiB0ID09IG51bGwgPyB0IDogdGhpcy5leHBhbmQodCkpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRJbXBvcnQodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kSW1wb3J0TmFtZXNwYWNlKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnQnLCB7XG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5leHBhbmQodGVybS5kZWNsYXJhdGlvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydERlZmF1bHQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0RGVmYXVsdCcsIHtcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSlcbiAgICB9KTtcbiAgfVxuXG5cbiAgZXhwYW5kRXhwb3J0RnJvbSh0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRFeHBvcnRBbGxGcm9tKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydFNwZWNpZmllcih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRTdGF0aWNQcm9wZXJ0eU5hbWUodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kRGF0YVByb3BlcnR5KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge1xuICAgICAgbmFtZTogdGhpcy5leHBhbmQodGVybS5uYW1lKSxcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG5cbiAgZXhwYW5kT2JqZWN0RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7XG4gICAgICBwcm9wZXJ0aWVzOiB0ZXJtLnByb3BlcnRpZXMubWFwKHQgPT4gdGhpcy5leHBhbmQodCkpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRWYXJpYWJsZURlY2xhcmF0b3IodGVybSkge1xuICAgIGxldCBpbml0ID0gdGVybS5pbml0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5pbml0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0b3JcIiwge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGluaXQ6IGluaXRcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb24odGVybSkge1xuICAgIGlmICh0ZXJtLmtpbmQgPT09ICdzeW50YXgnIHx8IHRlcm0ua2luZCA9PT0gJ3N5bnRheHJlYycpIHtcbiAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsIHtcbiAgICAgIGtpbmQ6IHRlcm0ua2luZCxcbiAgICAgIGRlY2xhcmF0b3JzOiB0ZXJtLmRlY2xhcmF0b3JzLm1hcChkID0+IHRoaXMuZXhwYW5kKGQpKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kUGFyZW50aGVzaXplZEV4cHJlc3Npb24odGVybSkge1xuICAgIGlmICh0ZXJtLmlubmVyLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0XCIpO1xuICAgIH1cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGVybS5pbm5lciwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBsb29rYWhlYWQgPSBlbmYucGVlaygpO1xuICAgIGxldCB0ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGlmICh0ID09IG51bGwgfHwgZW5mLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgIHRocm93IGVuZi5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwidW5leHBlY3RlZCBzeW50YXhcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4cGFuZCh0KTtcbiAgfVxuXG4gIGV4cGFuZFVuYXJ5RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdVbmFyeUV4cHJlc3Npb24nLCB7XG4gICAgICBvcGVyYXRvcjogdGVybS5vcGVyYXRvcixcbiAgICAgIG9wZXJhbmQ6IHRoaXMuZXhwYW5kKHRlcm0ub3BlcmFuZClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFVwZGF0ZUV4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVXBkYXRlRXhwcmVzc2lvbicsIHtcbiAgICAgIGlzUHJlZml4OiB0ZXJtLmlzUHJlZml4LFxuICAgICAgb3BlcmF0b3I6IHRlcm0ub3BlcmF0b3IsXG4gICAgICBvcGVyYW5kOiB0aGlzLmV4cGFuZCh0ZXJtLm9wZXJhbmQpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRCaW5hcnlFeHByZXNzaW9uKHRlcm0pIHtcbiAgICBsZXQgbGVmdCA9IHRoaXMuZXhwYW5kKHRlcm0ubGVmdCk7XG4gICAgbGV0IHJpZ2h0ID0gdGhpcy5leHBhbmQodGVybS5yaWdodCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluYXJ5RXhwcmVzc2lvblwiLCB7XG4gICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgb3BlcmF0b3I6IHRlcm0ub3BlcmF0b3IsXG4gICAgICByaWdodDogcmlnaHRcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENvbmRpdGlvbmFsRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDb25kaXRpb25hbEV4cHJlc3Npb24nLCB7XG4gICAgICB0ZXN0OiB0aGlzLmV4cGFuZCh0ZXJtLnRlc3QpLFxuICAgICAgY29uc2VxdWVudDogdGhpcy5leHBhbmQodGVybS5jb25zZXF1ZW50KSxcbiAgICAgIGFsdGVybmF0ZTogdGhpcy5leHBhbmQodGVybS5hbHRlcm5hdGUpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmROZXdUYXJnZXRFeHByZXNzaW9uKHRlcm0pIHsgcmV0dXJuIHRlcm07IH1cblxuICBleHBhbmROZXdFeHByZXNzaW9uKHRlcm0pIHtcbiAgICBsZXQgY2FsbGVlID0gdGhpcy5leHBhbmQodGVybS5jYWxsZWUpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcih0ZXJtLmFyZ3VtZW50cywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBhcmdzID0gZW5mLmVuZm9yZXN0QXJndW1lbnRMaXN0KCkubWFwKGFyZyA9PiB0aGlzLmV4cGFuZChhcmcpKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ05ld0V4cHJlc3Npb24nLCB7XG4gICAgICBjYWxsZWUsXG4gICAgICBhcmd1bWVudHM6IGFyZ3MudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRTdXBlcih0ZXJtKSB7IHJldHVybiB0ZXJtOyB9XG5cbiAgZXhwYW5kQ2FsbEV4cHJlc3Npb24odGVybSkge1xuICAgIGxldCBjYWxsZWUgPSB0aGlzLmV4cGFuZCh0ZXJtLmNhbGxlZSk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRlcm0uYXJndW1lbnRzLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGFyZ3MgPSBlbmYuZW5mb3Jlc3RBcmd1bWVudExpc3QoKS5tYXAoYXJnID0+IHRoaXMuZXhwYW5kKGFyZykpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNhbGxFeHByZXNzaW9uXCIsIHtcbiAgICAgIGNhbGxlZTogY2FsbGVlLFxuICAgICAgYXJndW1lbnRzOiBhcmdzXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRTcHJlYWRFbGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1NwcmVhZEVsZW1lbnQnLCB7XG4gICAgICBleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRFeHByZXNzaW9uU3RhdGVtZW50KHRlcm0pIHtcbiAgICBsZXQgY2hpbGQgPSB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pO1xuICAgIHJldHVybiBuZXcgVGVybShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge1xuICAgICAgZXhwcmVzc2lvbjogY2hpbGRcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZExhYmVsZWRTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnTGFiZWxlZFN0YXRlbWVudCcsIHtcbiAgICAgIGxhYmVsOiB0ZXJtLmxhYmVsLnZhbCgpLFxuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KVxuICAgIH0pO1xuICB9XG5cbiAgZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtLCB0eXBlKSB7XG4gICAgbGV0IHNjb3BlID0gZnJlc2hTY29wZShcImZ1blwiKTtcbiAgICBsZXQgcmVkID0gbmV3IEFwcGx5U2NvcGVJblBhcmFtc1JlZHVjZXIoc2NvcGUsIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IHBhcmFtcztcbiAgICBpZiAodHlwZSAhPT0gJ0dldHRlcicgJiYgdHlwZSAhPT0gJ1NldHRlcicpIHtcbiAgICAgIHBhcmFtcyA9IHJlZC50cmFuc2Zvcm0odGVybS5wYXJhbXMpO1xuICAgICAgcGFyYW1zID0gdGhpcy5leHBhbmQocGFyYW1zKTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZS5wdXNoKHNjb3BlKTtcbiAgICBsZXQgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIodGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuZW52LCB0aGlzLmNvbnRleHQuc3RvcmUsIHRoaXMuY29udGV4dCk7XG5cbiAgICBsZXQgbWFya2VkQm9keSwgYm9keVRlcm07XG4gICAgaWYgKHRlcm0uYm9keSBpbnN0YW5jZW9mIFRlcm0pIHtcbiAgICAgIC8vIEFycm93IGZ1bmN0aW9ucyBoYXZlIGEgc2luZ2xlIHRlcm0gYXMgdGhlaXIgYm9keVxuICAgICAgYm9keVRlcm0gPSB0aGlzLmV4cGFuZCh0ZXJtLmJvZHkuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrZWRCb2R5ID0gdGVybS5ib2R5Lm1hcChiID0+IGIuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUykpO1xuICAgICAgYm9keVRlcm0gPSBuZXcgVGVybShcIkZ1bmN0aW9uQm9keVwiLCB7XG4gICAgICAgIGRpcmVjdGl2ZXM6IExpc3QoKSxcbiAgICAgICAgc3RhdGVtZW50czogY29tcGlsZXIuY29tcGlsZShtYXJrZWRCb2R5KVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udGV4dC5jdXJyZW50U2NvcGUucG9wKCk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ0dldHRlcicpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlLCB7XG4gICAgICAgIG5hbWU6IHRoaXMuZXhwYW5kKHRlcm0ubmFtZSksXG4gICAgICAgIGJvZHk6IGJvZHlUZXJtXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTZXR0ZXInKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgICBuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtLm5hbWUpLFxuICAgICAgICBwYXJhbTogdGVybS5wYXJhbSxcbiAgICAgICAgYm9keTogYm9keVRlcm1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0Fycm93RXhwcmVzc2lvbicpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlLCB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICBib2R5OiBib2R5VGVybVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSh0eXBlLCB7XG4gICAgICBuYW1lOiB0ZXJtLm5hbWUsXG4gICAgICBpc0dlbmVyYXRvcjogdGVybS5pc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgYm9keTogYm9keVRlcm1cbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZE1ldGhvZCh0ZXJtKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtLCAnTWV0aG9kJyk7XG4gIH1cblxuICBleHBhbmRTZXR0ZXIodGVybSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybSwgJ1NldHRlcicpO1xuICB9XG5cbiAgZXhwYW5kR2V0dGVyKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm0sICdHZXR0ZXInKTtcbiAgfVxuXG4gIGV4cGFuZEZ1bmN0aW9uRGVjbGFyYXRpb24odGVybSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybSwgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpO1xuICB9XG5cbiAgZXhwYW5kRnVuY3Rpb25FeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm0sIFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgZXhwYW5kQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7XG4gICAgICBiaW5kaW5nOiB0aGlzLmV4cGFuZCh0ZXJtLmJpbmRpbmcpLFxuICAgICAgb3BlcmF0b3I6IHRlcm0ub3BlcmF0b3IsXG4gICAgICBleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBc3NpZ25tZW50RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiwge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEVtcHR5U3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZExpdGVyYWxCb29sZWFuRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG4gIGV4cGFuZExpdGVyYWxJbmZpbml0eUV4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kSWRlbnRpZmllckV4cHJlc3Npb24odGVybSkge1xuICAgIGxldCB0cmFucyA9IHRoaXMuY29udGV4dC5lbnYuZ2V0KHRlcm0ubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkpO1xuICAgIGlmICh0cmFucykge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge1xuICAgICAgICBuYW1lOiB0cmFucy5pZFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kTGl0ZXJhbE51bGxFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZExpdGVyYWxTdHJpbmdFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZExpdGVyYWxSZWdFeHBFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxufVxuIl19 /***/ }, -/* 66 */ +/* 62 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -38550,33 +40091,125 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack value: true }); - var _terms = __webpack_require__(28); + var _terms = __webpack_require__(9); var _terms2 = _interopRequireDefault(_terms); - var _shiftReducer = __webpack_require__(33); + var _symbol = __webpack_require__(47); + + var _transforms = __webpack_require__(38); + + var _errors = __webpack_require__(23); + + var _syntax = __webpack_require__(46); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - class MapSyntaxReducer extends _shiftReducer.CloneReducer { - constructor(fn_462) { - super(); - this.fn = fn_462; + class ScopeApplyingReducer { + constructor(scope, context) { + this.context = context; + this.scope = scope; + } + + transform(term) { + let field = "transform" + term.type; + if (typeof this[field] === 'function') { + return this[field](term); + } + (0, _errors.assert)(false, "transform not implemented yet for: " + term.type); } - reduceBindingIdentifier(node_463, state_464) { - let name_465 = this.fn(node_463.name); - return new _terms2.default("BindingIdentifier", { name: name_465 }); + + transformFormalParameters(term) { + let rest = term.rest == null ? null : this.transform(term.rest); + return new _terms2.default('FormalParameters', { + items: term.items.map(it => this.transform(it)), + rest: rest + }); + } + + transformBindingWithDefault(term) { + return new _terms2.default('BindingWithDefault', { + binding: this.transform(term.binding), + init: term.init + }); + } + + transformObjectBinding(term) { + // TODO: much more complicated logic here + return term; + // return new Term('ObjectBinding', { + // properties: term.properties.map(prop => this.transform(prop)) + // }); + } + + transformBindingPropertyIdentifier(term) { + return new _terms2.default('BindingPropertyIdentifier', { + binding: this.transform(term.binding), + init: term.init + }); + } + + transformBindingPropertyProperty(term) { + return new _terms2.default('BindingPropertyProperty', { + name: term.name, + binding: this.transform(term.binding) + }); + } + + transformArrayBinding(term) { + return new _terms2.default('ArrayBinding', { + elements: term.elements.map(el => this.transform(el)), + restElement: term.restElement == null ? null : this.transform(term.restElement) + }); } - reduceIdentifierExpression(node_466, state_467) { - let name_468 = this.fn(node_466.name); - return new _terms2.default("IdentifierExpression", { name: name_468 }); + + transformBindingIdentifier(term) { + let name = term.name.addScope(this.scope, this.context.bindings, _syntax.ALL_PHASES); + let newBinding = (0, _symbol.gensym)(name.val()); + + this.context.env.set(newBinding.toString(), new _transforms.VarBindingTransform(name)); + this.context.bindings.add(name, { + binding: newBinding, + phase: this.context.phase, + skipDup: true + }); + + return new _terms2.default("BindingIdentifier", { name: name }); } } - exports.default = MapSyntaxReducer; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L21hcC1zeW50YXgtcmVkdWNlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ2UsTUFBTSxnQkFBTixvQ0FBNEM7QUFDekQsY0FBWSxNQUFaLEVBQW9CO0FBQ2xCO0FBQ0EsU0FBSyxFQUFMLEdBQVUsTUFBVjtBQUNEO0FBQ0QsMEJBQXdCLFFBQXhCLEVBQWtDLFNBQWxDLEVBQTZDO0FBQzNDLFFBQUksV0FBVyxLQUFLLEVBQUwsQ0FBUSxTQUFTLElBQWpCLENBQWY7QUFDQSxXQUFPLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsTUFBTSxRQUFQLEVBQTlCLENBQVA7QUFDRDtBQUNELDZCQUEyQixRQUEzQixFQUFxQyxTQUFyQyxFQUFnRDtBQUM5QyxRQUFJLFdBQVcsS0FBSyxFQUFMLENBQVEsU0FBUyxJQUFqQixDQUFmO0FBQ0EsV0FBTyxvQkFBUyxzQkFBVCxFQUFpQyxFQUFDLE1BQU0sUUFBUCxFQUFqQyxDQUFQO0FBQ0Q7QUFad0Q7a0JBQXRDLGdCIiwiZmlsZSI6Im1hcC1zeW50YXgtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge0Nsb25lUmVkdWNlcn0gZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcFN5bnRheFJlZHVjZXIgZXh0ZW5kcyBDbG9uZVJlZHVjZXIge1xuICBjb25zdHJ1Y3Rvcihmbl80NjIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm4gPSBmbl80NjI7XG4gIH1cbiAgcmVkdWNlQmluZGluZ0lkZW50aWZpZXIobm9kZV80NjMsIHN0YXRlXzQ2NCkge1xuICAgIGxldCBuYW1lXzQ2NSA9IHRoaXMuZm4obm9kZV80NjMubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IG5hbWVfNDY1fSk7XG4gIH1cbiAgcmVkdWNlSWRlbnRpZmllckV4cHJlc3Npb24obm9kZV80NjYsIHN0YXRlXzQ2Nykge1xuICAgIGxldCBuYW1lXzQ2OCA9IHRoaXMuZm4obm9kZV80NjYubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge25hbWU6IG5hbWVfNDY4fSk7XG4gIH1cbn1cbiJdfQ== + exports.default = ScopeApplyingReducer; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHBseS1zY29wZS1pbi1wYXJhbXMtcmVkdWNlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRWUsTUFBTSxvQkFBTixDQUEyQjtBQUN4QyxjQUFZLEtBQVosRUFBbUIsT0FBbkIsRUFBNEI7QUFDMUIsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDRDs7QUFFRCxZQUFVLElBQVYsRUFBZ0I7QUFDZCxRQUFJLFFBQVEsY0FBYyxLQUFLLElBQS9CO0FBQ0EsUUFBSSxPQUFPLEtBQUssS0FBTCxDQUFQLEtBQXVCLFVBQTNCLEVBQXVDO0FBQ3JDLGFBQU8sS0FBSyxLQUFMLEVBQVksSUFBWixDQUFQO0FBQ0Q7QUFDRCx3QkFBTyxLQUFQLEVBQWMsd0NBQXdDLEtBQUssSUFBM0Q7QUFDRDs7QUFFRCw0QkFBMEIsSUFBMUIsRUFBZ0M7QUFDOUIsUUFBSSxPQUFPLEtBQUssSUFBTCxJQUFhLElBQWIsR0FBb0IsSUFBcEIsR0FBMkIsS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFwQixDQUF0QztBQUNBLFdBQU8sb0JBQVMsa0JBQVQsRUFBNkI7QUFDbEMsYUFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBTSxLQUFLLFNBQUwsQ0FBZSxFQUFmLENBQXJCLENBRDJCO0FBRWxDO0FBRmtDLEtBQTdCLENBQVA7QUFJRDs7QUFHRCw4QkFBNEIsSUFBNUIsRUFBa0M7QUFDaEMsV0FBTyxvQkFBUyxvQkFBVCxFQUErQjtBQUNwQyxlQUFTLEtBQUssU0FBTCxDQUFlLEtBQUssT0FBcEIsQ0FEMkI7QUFFcEMsWUFBTSxLQUFLO0FBRnlCLEtBQS9CLENBQVA7QUFJRDs7QUFFRCx5QkFBdUIsSUFBdkIsRUFBNkI7QUFDM0I7QUFDQSxXQUFPLElBQVA7QUFDQTtBQUNBO0FBQ0E7QUFDRDs7QUFFRCxxQ0FBbUMsSUFBbkMsRUFBeUM7QUFDdkMsV0FBTyxvQkFBUywyQkFBVCxFQUFzQztBQUMzQyxlQUFTLEtBQUssU0FBTCxDQUFlLEtBQUssT0FBcEIsQ0FEa0M7QUFFM0MsWUFBTSxLQUFLO0FBRmdDLEtBQXRDLENBQVA7QUFJRDs7QUFFRCxtQ0FBaUMsSUFBakMsRUFBdUM7QUFDckMsV0FBTyxvQkFBUyx5QkFBVCxFQUFvQztBQUN6QyxZQUFNLEtBQUssSUFEOEI7QUFFekMsZUFBUyxLQUFLLFNBQUwsQ0FBZSxLQUFLLE9BQXBCO0FBRmdDLEtBQXBDLENBQVA7QUFJRDs7QUFFRCx3QkFBc0IsSUFBdEIsRUFBNEI7QUFDMUIsV0FBTyxvQkFBUyxjQUFULEVBQXlCO0FBQzlCLGdCQUFVLEtBQUssUUFBTCxDQUFjLEdBQWQsQ0FBa0IsTUFBTSxLQUFLLFNBQUwsQ0FBZSxFQUFmLENBQXhCLENBRG9CO0FBRTlCLG1CQUFhLEtBQUssV0FBTCxJQUFvQixJQUFwQixHQUEyQixJQUEzQixHQUFrQyxLQUFLLFNBQUwsQ0FBZSxLQUFLLFdBQXBCO0FBRmpCLEtBQXpCLENBQVA7QUFJRDs7QUFFRCw2QkFBMkIsSUFBM0IsRUFBaUM7QUFDL0IsUUFBSSxPQUFPLEtBQUssSUFBTCxDQUFVLFFBQVYsQ0FBbUIsS0FBSyxLQUF4QixFQUErQixLQUFLLE9BQUwsQ0FBYSxRQUE1QyxxQkFBWDtBQUNBLFFBQUksYUFBYSxvQkFBTyxLQUFLLEdBQUwsRUFBUCxDQUFqQjs7QUFFQSxTQUFLLE9BQUwsQ0FBYSxHQUFiLENBQWlCLEdBQWpCLENBQXFCLFdBQVcsUUFBWCxFQUFyQixFQUE0QyxvQ0FBd0IsSUFBeEIsQ0FBNUM7QUFDQSxTQUFLLE9BQUwsQ0FBYSxRQUFiLENBQXNCLEdBQXRCLENBQTBCLElBQTFCLEVBQWdDO0FBQzlCLGVBQVMsVUFEcUI7QUFFOUIsYUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUZVO0FBRzlCLGVBQVM7QUFIcUIsS0FBaEM7O0FBTUEsV0FBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFFLFVBQUYsRUFBOUIsQ0FBUDtBQUNEO0FBdkV1QztrQkFBckIsb0IiLCJmaWxlIjoiYXBwbHktc2NvcGUtaW4tcGFyYW1zLXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVybSBmcm9tIFwiLi90ZXJtc1wiO1xuaW1wb3J0IHsgZ2Vuc3ltIH0gZnJvbSBcIi4vc3ltYm9sXCI7XG5pbXBvcnQgeyBWYXJCaW5kaW5nVHJhbnNmb3JtIH0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IEFMTF9QSEFTRVMgfSBmcm9tICcuL3N5bnRheCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjb3BlQXBwbHlpbmdSZWR1Y2VyIHtcbiAgY29uc3RydWN0b3Ioc2NvcGUsIGNvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgfVxuXG4gIHRyYW5zZm9ybSh0ZXJtKSB7XG4gICAgbGV0IGZpZWxkID0gXCJ0cmFuc2Zvcm1cIiArIHRlcm0udHlwZTtcbiAgICBpZiAodHlwZW9mIHRoaXNbZmllbGRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpc1tmaWVsZF0odGVybSk7XG4gICAgfVxuICAgIGFzc2VydChmYWxzZSwgXCJ0cmFuc2Zvcm0gbm90IGltcGxlbWVudGVkIHlldCBmb3I6IFwiICsgdGVybS50eXBlKTtcbiAgfVxuXG4gIHRyYW5zZm9ybUZvcm1hbFBhcmFtZXRlcnModGVybSkge1xuICAgIGxldCByZXN0ID0gdGVybS5yZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy50cmFuc2Zvcm0odGVybS5yZXN0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0Zvcm1hbFBhcmFtZXRlcnMnLCB7XG4gICAgICBpdGVtczogdGVybS5pdGVtcy5tYXAoaXQgPT4gdGhpcy50cmFuc2Zvcm0oaXQpKSxcbiAgICAgIHJlc3RcbiAgICB9KTtcbiAgfVxuXG5cbiAgdHJhbnNmb3JtQmluZGluZ1dpdGhEZWZhdWx0KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdXaXRoRGVmYXVsdCcsIHtcbiAgICAgIGJpbmRpbmc6IHRoaXMudHJhbnNmb3JtKHRlcm0uYmluZGluZyksXG4gICAgICBpbml0OiB0ZXJtLmluaXRcbiAgICB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybU9iamVjdEJpbmRpbmcodGVybSkge1xuICAgIC8vIFRPRE86IG11Y2ggbW9yZSBjb21wbGljYXRlZCBsb2dpYyBoZXJlXG4gICAgcmV0dXJuIHRlcm07XG4gICAgLy8gcmV0dXJuIG5ldyBUZXJtKCdPYmplY3RCaW5kaW5nJywge1xuICAgIC8vICAgcHJvcGVydGllczogdGVybS5wcm9wZXJ0aWVzLm1hcChwcm9wID0+IHRoaXMudHJhbnNmb3JtKHByb3ApKVxuICAgIC8vIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyJywge1xuICAgICAgYmluZGluZzogdGhpcy50cmFuc2Zvcm0odGVybS5iaW5kaW5nKSxcbiAgICAgIGluaXQ6IHRlcm0uaW5pdFxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtQmluZGluZ1Byb3BlcnR5UHJvcGVydHkodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1Byb3BlcnR5UHJvcGVydHknLCB7XG4gICAgICBuYW1lOiB0ZXJtLm5hbWUsXG4gICAgICBiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybSh0ZXJtLmJpbmRpbmcpXG4gICAgfSk7XG4gIH1cblxuICB0cmFuc2Zvcm1BcnJheUJpbmRpbmcodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQXJyYXlCaW5kaW5nJywge1xuICAgICAgZWxlbWVudHM6IHRlcm0uZWxlbWVudHMubWFwKGVsID0+IHRoaXMudHJhbnNmb3JtKGVsKSksXG4gICAgICByZXN0RWxlbWVudDogdGVybS5yZXN0RWxlbWVudCA9PSBudWxsID8gbnVsbCA6IHRoaXMudHJhbnNmb3JtKHRlcm0ucmVzdEVsZW1lbnQpXG4gICAgfSk7XG4gIH1cblxuICB0cmFuc2Zvcm1CaW5kaW5nSWRlbnRpZmllcih0ZXJtKSB7XG4gICAgbGV0IG5hbWUgPSB0ZXJtLm5hbWUuYWRkU2NvcGUodGhpcy5zY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKTtcbiAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lLnZhbCgpKTtcblxuICAgIHRoaXMuY29udGV4dC5lbnYuc2V0KG5ld0JpbmRpbmcudG9TdHJpbmcoKSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0obmFtZSkpO1xuICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQobmFtZSwge1xuICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsXG4gICAgICBza2lwRHVwOiB0cnVlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7IG5hbWUgfSk7XG4gIH1cbn1cbiJdfQ== /***/ }, -/* 67 */ +/* 63 */ +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + class ASTDispatcher { + constructor(prefix, errorIfMissing) { + this.errorIfMissing = errorIfMissing; + this.prefix = prefix; + } + + dispatch(term) { + let field = this.prefix + term.type; + if (typeof this[field] === 'function') { + return this[field](term); + } else if (!this.errorIfMissing) { + return term; + } + throw new Error(`Missing implementation for: ${ field }`); + } + } + exports.default = ASTDispatcher; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3QtZGlzcGF0Y2hlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFlLE1BQU0sYUFBTixDQUFvQjtBQUNqQyxjQUFZLE1BQVosRUFBb0IsY0FBcEIsRUFBb0M7QUFDbEMsU0FBSyxjQUFMLEdBQXNCLGNBQXRCO0FBQ0EsU0FBSyxNQUFMLEdBQWMsTUFBZDtBQUNEOztBQUVELFdBQVMsSUFBVCxFQUFlO0FBQ2IsUUFBSSxRQUFRLEtBQUssTUFBTCxHQUFjLEtBQUssSUFBL0I7QUFDQSxRQUFJLE9BQU8sS0FBSyxLQUFMLENBQVAsS0FBdUIsVUFBM0IsRUFBdUM7QUFDckMsYUFBTyxLQUFLLEtBQUwsRUFBWSxJQUFaLENBQVA7QUFDRCxLQUZELE1BRU8sSUFBSSxDQUFDLEtBQUssY0FBVixFQUEwQjtBQUMvQixhQUFPLElBQVA7QUFDRDtBQUNELFVBQU0sSUFBSSxLQUFKLENBQVcsZ0NBQThCLEtBQU0sR0FBL0MsQ0FBTjtBQUNEO0FBZGdDO2tCQUFkLGEiLCJmaWxlIjoiYXN0LWRpc3BhdGNoZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IocHJlZml4LCBlcnJvcklmTWlzc2luZykge1xuICAgIHRoaXMuZXJyb3JJZk1pc3NpbmcgPSBlcnJvcklmTWlzc2luZztcbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgfVxuXG4gIGRpc3BhdGNoKHRlcm0pIHtcbiAgICBsZXQgZmllbGQgPSB0aGlzLnByZWZpeCArIHRlcm0udHlwZTtcbiAgICBpZiAodHlwZW9mIHRoaXNbZmllbGRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpc1tmaWVsZF0odGVybSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5lcnJvcklmTWlzc2luZykge1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBmb3I6ICR7ZmllbGR9YCk7XG4gIH1cbn1cbiJdfQ== + +/***/ }, +/* 64 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -38584,77 +40217,382 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack Object.defineProperty(exports, "__esModule", { value: true }); - exports.collectBindings = exports.CollectBindingSyntax = undefined; - var _symbol = __webpack_require__(45); + var _immutable = __webpack_require__(3); - var _transforms = __webpack_require__(32); + var _enforester = __webpack_require__(56); - var _errors = __webpack_require__(13); + var _termExpander = __webpack_require__(61); - var _terms = __webpack_require__(28); + var _termExpander2 = _interopRequireDefault(_termExpander); - var _terms2 = _interopRequireDefault(_terms); + var _env = __webpack_require__(37); - var _immutable = __webpack_require__(11); + var _env2 = _interopRequireDefault(_env); - var _astDispatcher = __webpack_require__(64); + var _ramda = __webpack_require__(10); - var _astDispatcher2 = _interopRequireDefault(_astDispatcher); + var _ = _interopRequireWildcard(_ramda); - var _ramda = __webpack_require__(27); + var _terms = __webpack_require__(9); - var _ = _interopRequireWildcard(_ramda); + var T = _interopRequireWildcard(_terms); + + var _symbol = __webpack_require__(47); + + var _transforms = __webpack_require__(38); + + var _errors = __webpack_require__(23); + + var _loadSyntax = __webpack_require__(48); + + var _scope = __webpack_require__(58); + + var _syntax = __webpack_require__(46); + + var _astDispatcher = __webpack_require__(63); + + var _astDispatcher2 = _interopRequireDefault(_astDispatcher); + + var _hygieneUtils = __webpack_require__(65); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - class CollectBindingSyntax_346 extends _astDispatcher2.default { + function bindImports(impTerm, exModule, context) { + let names = []; + let phase = impTerm.forSyntax ? context.phase + 1 : context.phase; + impTerm.namedImports.forEach(specifier => { + let name = specifier.binding.name; + let exportName = findNameInExports(name, exModule.exportEntries); + if (exportName != null) { + let newBinding = (0, _symbol.gensym)(name.val()); + context.store.set(newBinding.toString(), new _transforms.VarBindingTransform(name)); + context.bindings.addForward(name, exportName, newBinding, phase); + names.push(name); + } + }); + return (0, _immutable.List)(names); + } + + function findNameInExports(name, exp) { + let foundNames = exp.reduce((acc, e) => { + if (T.isExportFrom(e)) { + return acc.concat(e.namedExports.reduce((acc, specifier) => { + if (specifier.exportedName.val() === name.val()) { + return acc.concat(specifier.exportedName); + } + return acc; + }, (0, _immutable.List)())); + } else if (T.isExport(e)) { + return acc.concat(e.declaration.declarators.reduce((acc, decl) => { + if (decl.binding.name.val() === name.val()) { + return acc.concat(decl.binding.name); + } + return acc; + }, (0, _immutable.List)())); + } + return acc; + }, (0, _immutable.List)()); + (0, _errors.assert)(foundNames.size <= 1, 'expecting no more than 1 matching name in exports'); + return foundNames.get(0); + } + + function removeNames(impTerm, names) { + let namedImports = impTerm.namedImports.filter(specifier => !names.contains(specifier.binding.name)); + return impTerm.extend({ namedImports: namedImports }); + } + + // function bindAllSyntaxExports(exModule, toSynth, context) { + // let phase = context.phase; + // exModule.exportEntries.forEach(ex => { + // if (isExportSyntax(ex)) { + // ex.declaration.declarators.forEach(decl => { + // let name = decl.binding.name; + // let newBinding = gensym(name.val()); + // let storeName = exModule.moduleSpecifier + ":" + name.val() + ":" + phase; + // let synthStx = Syntax.fromIdentifier(name.val(), toSynth); + // let storeStx = Syntax.fromIdentifier(storeName, toSynth); + // context.bindings.addForward(synthStx, storeStx, newBinding, phase); + // }); + // } + // }); + // } + + class TokenExpander extends _astDispatcher2.default { + constructor(context) { + super('expand', false); + this.context = context; + } + + expand(stxl) { + let result = []; + if (stxl.size === 0) { + return (0, _immutable.List)(result); + } + let prev = (0, _immutable.List)(); + let enf = new _enforester.Enforester(stxl, prev, this.context); + + while (!enf.done) { + result.push(this.dispatch(enf.enforest())); + } + + return (0, _immutable.List)(result); + } + + expandVariableDeclarationStatement(term) { + return term.extend({ + declaration: this.registerVariableDeclaration(term.declaration) + }); + } + + expandFunctionDeclaration(term) { + let registeredTerm = this.registerFunctionOrClass(term); + let stx = registeredTerm.name.name; + this.context.env.set(stx.resolve(this.context.phase), new _transforms.VarBindingTransform(stx)); + return registeredTerm; + } + + // TODO: think about function expressions + + expandImport(term) { + let path = term.moduleSpecifier.val(); + let mod; + if (term.forSyntax) { + mod = this.context.modules.getAtPhase(path, this.context.phase + 1, this.context.cwd); + this.context.store = this.context.modules.visit(mod, this.context.phase + 1, this.context.store); + this.context.store = this.context.modules.invoke(mod, this.context.phase + 1, this.context.store); + } else { + mod = this.context.modules.getAtPhase(path, this.context.phase, this.context.cwd); + this.context.store = this.context.modules.visit(mod, this.context.phase, this.context.store); + } + let boundNames = bindImports(term, mod, this.context); + return removeNames(term, boundNames); + } + + expandExport(term) { + if (T.isFunctionDeclaration(term.declaration) || T.isClassDeclaration(term.declaration)) { + return term.extend({ + declaration: this.registerFunctionOrClass(term.declaration) + }); + } else if (T.isVariableDeclaration(term.declaration)) { + return term.extend({ + declaration: this.registerVariableDeclaration(term.declaration) + }); + } + return term; + } + + // [isPragma, term => { + // let pathStx = term.items.get(0); + // if (pathStx.val() === 'base') { + // return term; + // } + // let mod = this.context.modules.loadAndCompile(pathStx.val()); + // store = this.context.modules.visit(mod, phase, store); + // bindAllSyntaxExports(mod, pathStx, this.context); + // return term; + // }], + + registerFunctionOrClass(term) { + let name = term.name.removeScope(this.context.useScope, this.context.phase); + (0, _hygieneUtils.collectBindings)(term.name).forEach(stx => { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: this.context.phase, + skipDup: false + }); + // the meaning of a function declaration name is a runtime var binding + this.context.env.set(newBinding.toString(), new _transforms.VarBindingTransform(stx)); + }); + return term.extend({ name: name }); + } + + registerVariableDeclaration(term) { + if (T.isSyntaxDeclaration(term) || T.isSyntaxrecDeclaration(term)) { + return this.registerSyntaxDeclaration(term); + } + return term.extend({ + declarators: term.declarators.map(decl => { + let binding = decl.binding.removeScope(this.context.useScope, this.context.phase); + (0, _hygieneUtils.collectBindings)(binding).forEach(stx => { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: this.context.phase, + skipDup: term.kind === 'var' + }); + // the meaning of a var/let/const declaration is a var binding + this.context.env.set(newBinding.toString(), new _transforms.VarBindingTransform(stx)); + }); + return decl.extend({ binding: binding }); + }) + }); + } + + registerSyntaxDeclaration(term) { + // syntax id^{a, b} = ^{a, b} + // -> + // syntaxrec id^{a,b,c} = function() { return <> } + // syntaxrec id^{a,b} = ^{a,b,c} + if (T.isSyntaxDeclaration(term)) { + let scope = (0, _scope.freshScope)('nonrec'); + term = term.extend({ + declarators: term.declarators.map(decl => { + let name = decl.binding.name; + let nameAdded = name.addScope(scope, this.context.bindings, _syntax.ALL_PHASES); + let nameRemoved = name.removeScope(this.context.currentScope[this.context.currentScope.length - 1], this.context.phase); + let newBinding = (0, _symbol.gensym)(name.val()); + this.context.bindings.addForward(nameAdded, nameRemoved, newBinding, this.context.phase); + return decl.extend({ + init: decl.init.addScope(scope, this.context.bindings, _syntax.ALL_PHASES) + }); + }) + }); + } + + // for syntax declarations we need to load the compiletime value + // into the environment + return term.extend({ + declarators: term.declarators.map(decl => { + let binding = decl.binding.removeScope(this.context.useScope, this.context.phase); + // each compiletime value needs to be expanded with a fresh + // environment and in the next higher phase + let syntaxExpander = new _termExpander2.default(_.merge(this.context, { + phase: this.context.phase + 1, + env: new _env2.default(), + store: this.context.store + })); + let init = syntaxExpander.expand(decl.init); + let val = (0, _loadSyntax.evalCompiletimeValue)(init.gen(), _.merge(this.context, { + phase: this.context.phase + 1 + })); + (0, _hygieneUtils.collectBindings)(binding).forEach(stx => { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: this.context.phase, + skipDup: false + }); + let resolvedName = stx.resolve(this.context.phase); + this.context.env.set(resolvedName, new _transforms.CompiletimeTransform(val)); + }); + return decl.extend({ binding: binding, init: init }); + }) + }); + } + } + exports.default = TokenExpander; + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi1leHBhbmRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0lBQVksQzs7QUFDWjs7SUFBWSxDOztBQUNaOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLFNBQVMsV0FBVCxDQUFxQixPQUFyQixFQUE4QixRQUE5QixFQUF3QyxPQUF4QyxFQUFpRDtBQUMvQyxNQUFJLFFBQVEsRUFBWjtBQUNBLE1BQUksUUFBUSxRQUFRLFNBQVIsR0FBb0IsUUFBUSxLQUFSLEdBQWdCLENBQXBDLEdBQXdDLFFBQVEsS0FBNUQ7QUFDQSxVQUFRLFlBQVIsQ0FBcUIsT0FBckIsQ0FBNkIsYUFBYTtBQUN4QyxRQUFJLE9BQU8sVUFBVSxPQUFWLENBQWtCLElBQTdCO0FBQ0EsUUFBSSxhQUFhLGtCQUFrQixJQUFsQixFQUF3QixTQUFTLGFBQWpDLENBQWpCO0FBQ0EsUUFBSSxjQUFjLElBQWxCLEVBQXdCO0FBQ3RCLFVBQUksYUFBYSxvQkFBTyxLQUFLLEdBQUwsRUFBUCxDQUFqQjtBQUNBLGNBQVEsS0FBUixDQUFjLEdBQWQsQ0FBa0IsV0FBVyxRQUFYLEVBQWxCLEVBQXlDLG9DQUF3QixJQUF4QixDQUF6QztBQUNBLGNBQVEsUUFBUixDQUFpQixVQUFqQixDQUE0QixJQUE1QixFQUFrQyxVQUFsQyxFQUE4QyxVQUE5QyxFQUEwRCxLQUExRDtBQUNBLFlBQU0sSUFBTixDQUFXLElBQVg7QUFDRDtBQUNGLEdBVEQ7QUFVQSxTQUFPLHFCQUFLLEtBQUwsQ0FBUDtBQUNEOztBQUdELFNBQVMsaUJBQVQsQ0FBMkIsSUFBM0IsRUFBaUMsR0FBakMsRUFBc0M7QUFDcEMsTUFBSSxhQUFhLElBQUksTUFBSixDQUFXLENBQUMsR0FBRCxFQUFNLENBQU4sS0FBWTtBQUN0QyxRQUFJLEVBQUUsWUFBRixDQUFlLENBQWYsQ0FBSixFQUF1QjtBQUNyQixhQUFPLElBQUksTUFBSixDQUFXLEVBQUUsWUFBRixDQUFlLE1BQWYsQ0FBc0IsQ0FBQyxHQUFELEVBQU0sU0FBTixLQUFvQjtBQUMxRCxZQUFJLFVBQVUsWUFBVixDQUF1QixHQUF2QixPQUFpQyxLQUFLLEdBQUwsRUFBckMsRUFBaUQ7QUFDL0MsaUJBQU8sSUFBSSxNQUFKLENBQVcsVUFBVSxZQUFyQixDQUFQO0FBQ0Q7QUFDRCxlQUFPLEdBQVA7QUFDRCxPQUxpQixFQUtmLHNCQUxlLENBQVgsQ0FBUDtBQU1ELEtBUEQsTUFPTyxJQUFJLEVBQUUsUUFBRixDQUFXLENBQVgsQ0FBSixFQUFtQjtBQUN4QixhQUFPLElBQUksTUFBSixDQUFXLEVBQUUsV0FBRixDQUFjLFdBQWQsQ0FBMEIsTUFBMUIsQ0FBaUMsQ0FBQyxHQUFELEVBQU0sSUFBTixLQUFlO0FBQ2hFLFlBQUksS0FBSyxPQUFMLENBQWEsSUFBYixDQUFrQixHQUFsQixPQUE0QixLQUFLLEdBQUwsRUFBaEMsRUFBNEM7QUFDMUMsaUJBQU8sSUFBSSxNQUFKLENBQVcsS0FBSyxPQUFMLENBQWEsSUFBeEIsQ0FBUDtBQUNEO0FBQ0QsZUFBTyxHQUFQO0FBQ0QsT0FMaUIsRUFLZixzQkFMZSxDQUFYLENBQVA7QUFNRDtBQUNELFdBQU8sR0FBUDtBQUNELEdBakJnQixFQWlCZCxzQkFqQmMsQ0FBakI7QUFrQkEsc0JBQU8sV0FBVyxJQUFYLElBQW1CLENBQTFCLEVBQTZCLG1EQUE3QjtBQUNBLFNBQU8sV0FBVyxHQUFYLENBQWUsQ0FBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxXQUFULENBQXFCLE9BQXJCLEVBQThCLEtBQTlCLEVBQXFDO0FBQ25DLE1BQUksZUFBZSxRQUFRLFlBQVIsQ0FBcUIsTUFBckIsQ0FBNEIsYUFBYSxDQUFDLE1BQU0sUUFBTixDQUFlLFVBQVUsT0FBVixDQUFrQixJQUFqQyxDQUExQyxDQUFuQjtBQUNBLFNBQU8sUUFBUSxNQUFSLENBQWUsRUFBRSwwQkFBRixFQUFmLENBQVA7QUFDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWUsTUFBTSxhQUFOLGlDQUEwQztBQUN2RCxjQUFZLE9BQVosRUFBcUI7QUFDbkIsVUFBTSxRQUFOLEVBQWdCLEtBQWhCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEOztBQUVELFNBQU8sSUFBUCxFQUFhO0FBQ1gsUUFBSSxTQUFTLEVBQWI7QUFDQSxRQUFJLEtBQUssSUFBTCxLQUFjLENBQWxCLEVBQXFCO0FBQ25CLGFBQU8scUJBQUssTUFBTCxDQUFQO0FBQ0Q7QUFDRCxRQUFJLE9BQU8sc0JBQVg7QUFDQSxRQUFJLE1BQU0sMkJBQWUsSUFBZixFQUFxQixJQUFyQixFQUEyQixLQUFLLE9BQWhDLENBQVY7O0FBRUEsV0FBTSxDQUFDLElBQUksSUFBWCxFQUFpQjtBQUNmLGFBQU8sSUFBUCxDQUFZLEtBQUssUUFBTCxDQUFjLElBQUksUUFBSixFQUFkLENBQVo7QUFDRDs7QUFFRCxXQUFPLHFCQUFLLE1BQUwsQ0FBUDtBQUNEOztBQUVELHFDQUFtQyxJQUFuQyxFQUF5QztBQUN2QyxXQUFPLEtBQUssTUFBTCxDQUFZO0FBQ2pCLG1CQUFhLEtBQUssMkJBQUwsQ0FBaUMsS0FBSyxXQUF0QztBQURJLEtBQVosQ0FBUDtBQUdEOztBQUVELDRCQUEwQixJQUExQixFQUFnQztBQUM5QixRQUFJLGlCQUFpQixLQUFLLHVCQUFMLENBQTZCLElBQTdCLENBQXJCO0FBQ0EsUUFBSSxNQUFNLGVBQWUsSUFBZixDQUFvQixJQUE5QjtBQUNBLFNBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsSUFBSSxPQUFKLENBQVksS0FBSyxPQUFMLENBQWEsS0FBekIsQ0FBckIsRUFDcUIsb0NBQXdCLEdBQXhCLENBRHJCO0FBRUEsV0FBTyxjQUFQO0FBQ0Q7O0FBRUQ7O0FBRUEsZUFBYSxJQUFiLEVBQW1CO0FBQ2pCLFFBQUksT0FBTyxLQUFLLGVBQUwsQ0FBcUIsR0FBckIsRUFBWDtBQUNBLFFBQUksR0FBSjtBQUNBLFFBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2xCLFlBQU0sS0FBSyxPQUFMLENBQWEsT0FBYixDQUFxQixVQUFyQixDQUFnQyxJQUFoQyxFQUFzQyxLQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLENBQTNELEVBQThELEtBQUssT0FBTCxDQUFhLEdBQTNFLENBQU47QUFDQSxXQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLEtBQUssT0FBTCxDQUFhLE9BQWIsQ0FBcUIsS0FBckIsQ0FBMkIsR0FBM0IsRUFBZ0MsS0FBSyxPQUFMLENBQWEsS0FBYixHQUFxQixDQUFyRCxFQUF3RCxLQUFLLE9BQUwsQ0FBYSxLQUFyRSxDQUFyQjtBQUNBLFdBQUssT0FBTCxDQUFhLEtBQWIsR0FBcUIsS0FBSyxPQUFMLENBQWEsT0FBYixDQUFxQixNQUFyQixDQUE0QixHQUE1QixFQUFpQyxLQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLENBQXRELEVBQXlELEtBQUssT0FBTCxDQUFhLEtBQXRFLENBQXJCO0FBQ0QsS0FKRCxNQUlPO0FBQ0wsWUFBTSxLQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLFVBQXJCLENBQWdDLElBQWhDLEVBQXNDLEtBQUssT0FBTCxDQUFhLEtBQW5ELEVBQTBELEtBQUssT0FBTCxDQUFhLEdBQXZFLENBQU47QUFDQSxXQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLEtBQUssT0FBTCxDQUFhLE9BQWIsQ0FBcUIsS0FBckIsQ0FBMkIsR0FBM0IsRUFBZ0MsS0FBSyxPQUFMLENBQWEsS0FBN0MsRUFBb0QsS0FBSyxPQUFMLENBQWEsS0FBakUsQ0FBckI7QUFDRDtBQUNELFFBQUksYUFBYSxZQUFZLElBQVosRUFBa0IsR0FBbEIsRUFBdUIsS0FBSyxPQUE1QixDQUFqQjtBQUNBLFdBQU8sWUFBWSxJQUFaLEVBQWtCLFVBQWxCLENBQVA7QUFDRDs7QUFFRCxlQUFhLElBQWIsRUFBbUI7QUFDakIsUUFBSSxFQUFFLHFCQUFGLENBQXdCLEtBQUssV0FBN0IsS0FBNkMsRUFBRSxrQkFBRixDQUFxQixLQUFLLFdBQTFCLENBQWpELEVBQXlGO0FBQ3ZGLGFBQU8sS0FBSyxNQUFMLENBQVk7QUFDakIscUJBQWEsS0FBSyx1QkFBTCxDQUE2QixLQUFLLFdBQWxDO0FBREksT0FBWixDQUFQO0FBR0QsS0FKRCxNQUlPLElBQUksRUFBRSxxQkFBRixDQUF3QixLQUFLLFdBQTdCLENBQUosRUFBK0M7QUFDcEQsYUFBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixxQkFBYSxLQUFLLDJCQUFMLENBQWlDLEtBQUssV0FBdEM7QUFESSxPQUFaLENBQVA7QUFHRDtBQUNELFdBQU8sSUFBUDtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBLDBCQUF3QixJQUF4QixFQUE4QjtBQUM1QixRQUFJLE9BQU8sS0FBSyxJQUFMLENBQVUsV0FBVixDQUFzQixLQUFLLE9BQUwsQ0FBYSxRQUFuQyxFQUE2QyxLQUFLLE9BQUwsQ0FBYSxLQUExRCxDQUFYO0FBQ0EsdUNBQWdCLEtBQUssSUFBckIsRUFBMkIsT0FBM0IsQ0FBbUMsT0FBTztBQUN4QyxVQUFJLGFBQWEsb0JBQU8sSUFBSSxHQUFKLEVBQVAsQ0FBakI7QUFDQSxXQUFLLE9BQUwsQ0FBYSxRQUFiLENBQXNCLEdBQXRCLENBQTBCLEdBQTFCLEVBQStCO0FBQzdCLGlCQUFTLFVBRG9CO0FBRTdCLGVBQU8sS0FBSyxPQUFMLENBQWEsS0FGUztBQUc3QixpQkFBUztBQUhvQixPQUEvQjtBQUtBO0FBQ0EsV0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixXQUFXLFFBQVgsRUFBckIsRUFBNEMsb0NBQXdCLEdBQXhCLENBQTVDO0FBQ0QsS0FURDtBQVVBLFdBQU8sS0FBSyxNQUFMLENBQVksRUFBRSxVQUFGLEVBQVosQ0FBUDtBQUNEOztBQUVELDhCQUE0QixJQUE1QixFQUFrQztBQUNoQyxRQUFJLEVBQUUsbUJBQUYsQ0FBc0IsSUFBdEIsS0FBK0IsRUFBRSxzQkFBRixDQUF5QixJQUF6QixDQUFuQyxFQUFtRTtBQUNqRSxhQUFPLEtBQUsseUJBQUwsQ0FBK0IsSUFBL0IsQ0FBUDtBQUNEO0FBQ0QsV0FBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixtQkFBYSxLQUFLLFdBQUwsQ0FBaUIsR0FBakIsQ0FBcUIsUUFBUTtBQUN4QyxZQUFJLFVBQVUsS0FBSyxPQUFMLENBQWEsV0FBYixDQUF5QixLQUFLLE9BQUwsQ0FBYSxRQUF0QyxFQUFnRCxLQUFLLE9BQUwsQ0FBYSxLQUE3RCxDQUFkO0FBQ0EsMkNBQWdCLE9BQWhCLEVBQXlCLE9BQXpCLENBQWlDLE9BQU87QUFDdEMsY0FBSSxhQUFhLG9CQUFPLElBQUksR0FBSixFQUFQLENBQWpCO0FBQ0EsZUFBSyxPQUFMLENBQWEsUUFBYixDQUFzQixHQUF0QixDQUEwQixHQUExQixFQUErQjtBQUM3QixxQkFBUyxVQURvQjtBQUU3QixtQkFBTyxLQUFLLE9BQUwsQ0FBYSxLQUZTO0FBRzdCLHFCQUFTLEtBQUssSUFBTCxLQUFjO0FBSE0sV0FBL0I7QUFLQTtBQUNBLGVBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsV0FBVyxRQUFYLEVBQXJCLEVBQTRDLG9DQUF3QixHQUF4QixDQUE1QztBQUNELFNBVEQ7QUFVQSxlQUFPLEtBQUssTUFBTCxDQUFZLEVBQUUsZ0JBQUYsRUFBWixDQUFQO0FBQ0QsT0FiWTtBQURJLEtBQVosQ0FBUDtBQWdCRDs7QUFFRCw0QkFBMEIsSUFBMUIsRUFBZ0M7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFJLEVBQUUsbUJBQUYsQ0FBc0IsSUFBdEIsQ0FBSixFQUFpQztBQUMvQixVQUFJLFFBQVEsdUJBQVcsUUFBWCxDQUFaO0FBQ0EsYUFBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixxQkFBYSxLQUFLLFdBQUwsQ0FBaUIsR0FBakIsQ0FBcUIsUUFBUTtBQUN4QyxjQUFJLE9BQU8sS0FBSyxPQUFMLENBQWEsSUFBeEI7QUFDQSxjQUFJLFlBQVksS0FBSyxRQUFMLENBQWMsS0FBZCxFQUFxQixLQUFLLE9BQUwsQ0FBYSxRQUFsQyxxQkFBaEI7QUFDQSxjQUFJLGNBQWMsS0FBSyxXQUFMLENBQWlCLEtBQUssT0FBTCxDQUFhLFlBQWIsQ0FBMEIsS0FBSyxPQUFMLENBQWEsWUFBYixDQUEwQixNQUExQixHQUFtQyxDQUE3RCxDQUFqQixFQUFrRixLQUFLLE9BQUwsQ0FBYSxLQUEvRixDQUFsQjtBQUNBLGNBQUksYUFBYSxvQkFBTyxLQUFLLEdBQUwsRUFBUCxDQUFqQjtBQUNBLGVBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsVUFBdEIsQ0FBaUMsU0FBakMsRUFBNEMsV0FBNUMsRUFBeUQsVUFBekQsRUFBcUUsS0FBSyxPQUFMLENBQWEsS0FBbEY7QUFDQSxpQkFBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixrQkFBTSxLQUFLLElBQUwsQ0FBVSxRQUFWLENBQW1CLEtBQW5CLEVBQTBCLEtBQUssT0FBTCxDQUFhLFFBQXZDO0FBRFcsV0FBWixDQUFQO0FBR0QsU0FUWTtBQURJLE9BQVosQ0FBUDtBQVlEOztBQUVEO0FBQ0E7QUFDQSxXQUFPLEtBQUssTUFBTCxDQUFZO0FBQ2pCLG1CQUFhLEtBQUssV0FBTCxDQUFpQixHQUFqQixDQUFxQixRQUFRO0FBQ3hDLFlBQUksVUFBVSxLQUFLLE9BQUwsQ0FBYSxXQUFiLENBQXlCLEtBQUssT0FBTCxDQUFhLFFBQXRDLEVBQWdELEtBQUssT0FBTCxDQUFhLEtBQTdELENBQWQ7QUFDQTtBQUNBO0FBQ0EsWUFBSSxpQkFBaUIsMkJBQWlCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQjtBQUMxRCxpQkFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLENBRDhCO0FBRTFELGVBQUssbUJBRnFEO0FBRzFELGlCQUFPLEtBQUssT0FBTCxDQUFhO0FBSHNDLFNBQXRCLENBQWpCLENBQXJCO0FBS0EsWUFBSSxPQUFPLGVBQWUsTUFBZixDQUFzQixLQUFLLElBQTNCLENBQVg7QUFDQSxZQUFJLE1BQU0sc0NBQXFCLEtBQUssR0FBTCxFQUFyQixFQUFpQyxFQUFFLEtBQUYsQ0FBUSxLQUFLLE9BQWIsRUFBc0I7QUFDL0QsaUJBQU8sS0FBSyxPQUFMLENBQWEsS0FBYixHQUFxQjtBQURtQyxTQUF0QixDQUFqQyxDQUFWO0FBR0EsMkNBQWdCLE9BQWhCLEVBQXlCLE9BQXpCLENBQWlDLE9BQU87QUFDdEMsY0FBSSxhQUFhLG9CQUFPLElBQUksR0FBSixFQUFQLENBQWpCO0FBQ0EsZUFBSyxPQUFMLENBQWEsUUFBYixDQUFzQixHQUF0QixDQUEwQixHQUExQixFQUErQjtBQUM3QixxQkFBUyxVQURvQjtBQUU3QixtQkFBTyxLQUFLLE9BQUwsQ0FBYSxLQUZTO0FBRzdCLHFCQUFTO0FBSG9CLFdBQS9CO0FBS0EsY0FBSSxlQUFlLElBQUksT0FBSixDQUFZLEtBQUssT0FBTCxDQUFhLEtBQXpCLENBQW5CO0FBQ0EsZUFBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixZQUFyQixFQUFtQyxxQ0FBeUIsR0FBekIsQ0FBbkM7QUFDRCxTQVREO0FBVUEsZUFBTyxLQUFLLE1BQUwsQ0FBWSxFQUFFLGdCQUFGLEVBQVcsVUFBWCxFQUFaLENBQVA7QUFDRCxPQXhCWTtBQURJLEtBQVosQ0FBUDtBQTJCRDtBQXBLc0Q7a0JBQXBDLGEiLCJmaWxlIjoidG9rZW4tZXhwYW5kZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaXN0IH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7ICBFbmZvcmVzdGVyIH0gZnJvbSBcIi4vZW5mb3Jlc3RlclwiO1xuaW1wb3J0IFRlcm1FeHBhbmRlciBmcm9tIFwiLi90ZXJtLWV4cGFuZGVyLmpzXCI7XG5pbXBvcnQgRW52IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCAqIGFzIFQgZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IGdlbnN5bSB9IGZyb20gJy4vc3ltYm9sJztcbmltcG9ydCB7IFZhckJpbmRpbmdUcmFuc2Zvcm0sIENvbXBpbGV0aW1lVHJhbnNmb3JtIH0gZnJvbSAnLi90cmFuc2Zvcm1zJztcbmltcG9ydCB7ICBhc3NlcnQgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IGV2YWxDb21waWxldGltZVZhbHVlIH0gZnJvbSAnLi9sb2FkLXN5bnRheCc7XG5pbXBvcnQgeyAgZnJlc2hTY29wZSB9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgeyBBTExfUEhBU0VTIH0gZnJvbSAnLi9zeW50YXgnO1xuaW1wb3J0IEFTVERpc3BhdGNoZXIgZnJvbSAnLi9hc3QtZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBjb2xsZWN0QmluZGluZ3MgfSBmcm9tICcuL2h5Z2llbmUtdXRpbHMnO1xuXG5mdW5jdGlvbiBiaW5kSW1wb3J0cyhpbXBUZXJtLCBleE1vZHVsZSwgY29udGV4dCkge1xuICBsZXQgbmFtZXMgPSBbXTtcbiAgbGV0IHBoYXNlID0gaW1wVGVybS5mb3JTeW50YXggPyBjb250ZXh0LnBoYXNlICsgMSA6IGNvbnRleHQucGhhc2U7XG4gIGltcFRlcm0ubmFtZWRJbXBvcnRzLmZvckVhY2goc3BlY2lmaWVyID0+IHtcbiAgICBsZXQgbmFtZSA9IHNwZWNpZmllci5iaW5kaW5nLm5hbWU7XG4gICAgbGV0IGV4cG9ydE5hbWUgPSBmaW5kTmFtZUluRXhwb3J0cyhuYW1lLCBleE1vZHVsZS5leHBvcnRFbnRyaWVzKTtcbiAgICBpZiAoZXhwb3J0TmFtZSAhPSBudWxsKSB7XG4gICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lLnZhbCgpKTtcbiAgICAgIGNvbnRleHQuc3RvcmUuc2V0KG5ld0JpbmRpbmcudG9TdHJpbmcoKSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0obmFtZSkpO1xuICAgICAgY29udGV4dC5iaW5kaW5ncy5hZGRGb3J3YXJkKG5hbWUsIGV4cG9ydE5hbWUsIG5ld0JpbmRpbmcsIHBoYXNlKTtcbiAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIExpc3QobmFtZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZpbmROYW1lSW5FeHBvcnRzKG5hbWUsIGV4cCkge1xuICBsZXQgZm91bmROYW1lcyA9IGV4cC5yZWR1Y2UoKGFjYywgZSkgPT4ge1xuICAgIGlmIChULmlzRXhwb3J0RnJvbShlKSkge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZS5uYW1lZEV4cG9ydHMucmVkdWNlKChhY2MsIHNwZWNpZmllcikgPT4ge1xuICAgICAgICBpZiAoc3BlY2lmaWVyLmV4cG9ydGVkTmFtZS52YWwoKSA9PT0gbmFtZS52YWwoKSkge1xuICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHNwZWNpZmllci5leHBvcnRlZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9IGVsc2UgaWYgKFQuaXNFeHBvcnQoZSkpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KGUuZGVjbGFyYXRpb24uZGVjbGFyYXRvcnMucmVkdWNlKChhY2MsIGRlY2wpID0+IHtcbiAgICAgICAgaWYgKGRlY2wuYmluZGluZy5uYW1lLnZhbCgpID09PSBuYW1lLnZhbCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZGVjbC5iaW5kaW5nLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgTGlzdCgpKTtcbiAgYXNzZXJ0KGZvdW5kTmFtZXMuc2l6ZSA8PSAxLCAnZXhwZWN0aW5nIG5vIG1vcmUgdGhhbiAxIG1hdGNoaW5nIG5hbWUgaW4gZXhwb3J0cycpO1xuICByZXR1cm4gZm91bmROYW1lcy5nZXQoMCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzKGltcFRlcm0sIG5hbWVzKSB7XG4gIGxldCBuYW1lZEltcG9ydHMgPSBpbXBUZXJtLm5hbWVkSW1wb3J0cy5maWx0ZXIoc3BlY2lmaWVyID0+ICFuYW1lcy5jb250YWlucyhzcGVjaWZpZXIuYmluZGluZy5uYW1lKSk7XG4gIHJldHVybiBpbXBUZXJtLmV4dGVuZCh7IG5hbWVkSW1wb3J0cyB9KTtcbn1cblxuLy8gZnVuY3Rpb24gYmluZEFsbFN5bnRheEV4cG9ydHMoZXhNb2R1bGUsIHRvU3ludGgsIGNvbnRleHQpIHtcbi8vICAgbGV0IHBoYXNlID0gY29udGV4dC5waGFzZTtcbi8vICAgZXhNb2R1bGUuZXhwb3J0RW50cmllcy5mb3JFYWNoKGV4ID0+IHtcbi8vICAgICBpZiAoaXNFeHBvcnRTeW50YXgoZXgpKSB7XG4vLyAgICAgICBleC5kZWNsYXJhdGlvbi5kZWNsYXJhdG9ycy5mb3JFYWNoKGRlY2wgPT4ge1xuLy8gICAgICAgICBsZXQgbmFtZSA9IGRlY2wuYmluZGluZy5uYW1lO1xuLy8gICAgICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lLnZhbCgpKTtcbi8vICAgICAgICAgbGV0IHN0b3JlTmFtZSA9IGV4TW9kdWxlLm1vZHVsZVNwZWNpZmllciArIFwiOlwiICsgbmFtZS52YWwoKSArIFwiOlwiICsgcGhhc2U7XG4vLyAgICAgICAgIGxldCBzeW50aFN0eCA9IFN5bnRheC5mcm9tSWRlbnRpZmllcihuYW1lLnZhbCgpLCB0b1N5bnRoKTtcbi8vICAgICAgICAgbGV0IHN0b3JlU3R4ID0gU3ludGF4LmZyb21JZGVudGlmaWVyKHN0b3JlTmFtZSwgdG9TeW50aCk7XG4vLyAgICAgICAgIGNvbnRleHQuYmluZGluZ3MuYWRkRm9yd2FyZChzeW50aFN0eCwgc3RvcmVTdHgsIG5ld0JpbmRpbmcsIHBoYXNlKTtcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfSk7XG4vLyB9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRva2VuRXhwYW5kZXIgZXh0ZW5kcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgIHN1cGVyKCdleHBhbmQnLCBmYWxzZSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIGV4cGFuZChzdHhsKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGlmIChzdHhsLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gICAgfVxuICAgIGxldCBwcmV2ID0gTGlzdCgpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihzdHhsLCBwcmV2LCB0aGlzLmNvbnRleHQpO1xuXG4gICAgd2hpbGUoIWVuZi5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmRpc3BhdGNoKGVuZi5lbmZvcmVzdCgpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIExpc3QocmVzdWx0KTtcbiAgfVxuXG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiB0ZXJtLmV4dGVuZCh7XG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybS5kZWNsYXJhdGlvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEZ1bmN0aW9uRGVjbGFyYXRpb24odGVybSkge1xuICAgIGxldCByZWdpc3RlcmVkVGVybSA9IHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybSk7XG4gICAgbGV0IHN0eCA9IHJlZ2lzdGVyZWRUZXJtLm5hbWUubmFtZTtcbiAgICB0aGlzLmNvbnRleHQuZW52LnNldChzdHgucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWYXJCaW5kaW5nVHJhbnNmb3JtKHN0eCkpO1xuICAgIHJldHVybiByZWdpc3RlcmVkVGVybTtcbiAgfVxuXG4gIC8vIFRPRE86IHRoaW5rIGFib3V0IGZ1bmN0aW9uIGV4cHJlc3Npb25zXG5cbiAgZXhwYW5kSW1wb3J0KHRlcm0pIHtcbiAgICBsZXQgcGF0aCA9IHRlcm0ubW9kdWxlU3BlY2lmaWVyLnZhbCgpO1xuICAgIGxldCBtb2Q7XG4gICAgaWYgKHRlcm0uZm9yU3ludGF4KSB7XG4gICAgICBtb2QgPSB0aGlzLmNvbnRleHQubW9kdWxlcy5nZXRBdFBoYXNlKHBhdGgsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMudmlzaXQobW9kLCB0aGlzLmNvbnRleHQucGhhc2UgKyAxLCB0aGlzLmNvbnRleHQuc3RvcmUpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuaW52b2tlKG1vZCwgdGhpcy5jb250ZXh0LnBoYXNlICsgMSwgdGhpcy5jb250ZXh0LnN0b3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuZ2V0QXRQaGFzZShwYXRoLCB0aGlzLmNvbnRleHQucGhhc2UsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMudmlzaXQobW9kLCB0aGlzLmNvbnRleHQucGhhc2UsIHRoaXMuY29udGV4dC5zdG9yZSk7XG4gICAgfVxuICAgIGxldCBib3VuZE5hbWVzID0gYmluZEltcG9ydHModGVybSwgbW9kLCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiByZW1vdmVOYW1lcyh0ZXJtLCBib3VuZE5hbWVzKTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydCh0ZXJtKSB7XG4gICAgaWYgKFQuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKHRlcm0uZGVjbGFyYXRpb24pIHx8IFQuaXNDbGFzc0RlY2xhcmF0aW9uKHRlcm0uZGVjbGFyYXRpb24pKSB7XG4gICAgICByZXR1cm4gdGVybS5leHRlbmQoe1xuICAgICAgICBkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlckZ1bmN0aW9uT3JDbGFzcyh0ZXJtLmRlY2xhcmF0aW9uKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChULmlzVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtLmRlY2xhcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHRlcm0uZXh0ZW5kKHtcbiAgICAgICAgZGVjbGFyYXRpb246IHRoaXMucmVnaXN0ZXJWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm0uZGVjbGFyYXRpb24pXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICAvLyBbaXNQcmFnbWEsIHRlcm0gPT4ge1xuICAvLyAgIGxldCBwYXRoU3R4ID0gdGVybS5pdGVtcy5nZXQoMCk7XG4gIC8vICAgaWYgKHBhdGhTdHgudmFsKCkgPT09ICdiYXNlJykge1xuICAvLyAgICAgcmV0dXJuIHRlcm07XG4gIC8vICAgfVxuICAvLyAgIGxldCBtb2QgPSB0aGlzLmNvbnRleHQubW9kdWxlcy5sb2FkQW5kQ29tcGlsZShwYXRoU3R4LnZhbCgpKTtcbiAgLy8gICBzdG9yZSA9IHRoaXMuY29udGV4dC5tb2R1bGVzLnZpc2l0KG1vZCwgcGhhc2UsIHN0b3JlKTtcbiAgLy8gICBiaW5kQWxsU3ludGF4RXhwb3J0cyhtb2QsIHBhdGhTdHgsIHRoaXMuY29udGV4dCk7XG4gIC8vICAgcmV0dXJuIHRlcm07XG4gIC8vIH1dLFxuXG5cbiAgcmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybSkge1xuICAgIGxldCBuYW1lID0gdGVybS5uYW1lLnJlbW92ZVNjb3BlKHRoaXMuY29udGV4dC51c2VTY29wZSwgdGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICBjb2xsZWN0QmluZGluZ3ModGVybS5uYW1lKS5mb3JFYWNoKHN0eCA9PiB7XG4gICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShzdHgudmFsKCkpO1xuICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChzdHgsIHtcbiAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgcGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSxcbiAgICAgICAgc2tpcER1cDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgLy8gdGhlIG1lYW5pbmcgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBuYW1lIGlzIGEgcnVudGltZSB2YXIgYmluZGluZ1xuICAgICAgdGhpcy5jb250ZXh0LmVudi5zZXQobmV3QmluZGluZy50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHgpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVybS5leHRlbmQoeyBuYW1lIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm0pIHtcbiAgICBpZiAoVC5pc1N5bnRheERlY2xhcmF0aW9uKHRlcm0pIHx8IFQuaXNTeW50YXhyZWNEZWNsYXJhdGlvbih0ZXJtKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJTeW50YXhEZWNsYXJhdGlvbih0ZXJtKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm0uZXh0ZW5kKHtcbiAgICAgIGRlY2xhcmF0b3JzOiB0ZXJtLmRlY2xhcmF0b3JzLm1hcChkZWNsID0+IHtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSBkZWNsLmJpbmRpbmcucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LnVzZVNjb3BlLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgICBjb2xsZWN0QmluZGluZ3MoYmluZGluZykuZm9yRWFjaChzdHggPT4ge1xuICAgICAgICAgIGxldCBuZXdCaW5kaW5nID0gZ2Vuc3ltKHN0eC52YWwoKSk7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChzdHgsIHtcbiAgICAgICAgICAgIGJpbmRpbmc6IG5ld0JpbmRpbmcsXG4gICAgICAgICAgICBwaGFzZTogdGhpcy5jb250ZXh0LnBoYXNlLFxuICAgICAgICAgICAgc2tpcER1cDogdGVybS5raW5kID09PSAndmFyJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIHRoZSBtZWFuaW5nIG9mIGEgdmFyL2xldC9jb25zdCBkZWNsYXJhdGlvbiBpcyBhIHZhciBiaW5kaW5nXG4gICAgICAgICAgdGhpcy5jb250ZXh0LmVudi5zZXQobmV3QmluZGluZy50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkZWNsLmV4dGVuZCh7IGJpbmRpbmcgfSk7XG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJTeW50YXhEZWNsYXJhdGlvbih0ZXJtKSB7XG4gICAgLy8gc3ludGF4IGlkXnthLCBifSA9IDxpbml0Pl57YSwgYn1cbiAgICAvLyAtPlxuICAgIC8vIHN5bnRheHJlYyBpZF57YSxiLGN9ID0gZnVuY3Rpb24oKSB7IHJldHVybiA8PGlkXnthfT4+IH1cbiAgICAvLyBzeW50YXhyZWMgaWRee2EsYn0gPSA8aW5pdD5ee2EsYixjfVxuICAgIGlmIChULmlzU3ludGF4RGVjbGFyYXRpb24odGVybSkpIHtcbiAgICAgIGxldCBzY29wZSA9IGZyZXNoU2NvcGUoJ25vbnJlYycpO1xuICAgICAgdGVybSA9IHRlcm0uZXh0ZW5kKHtcbiAgICAgICAgZGVjbGFyYXRvcnM6IHRlcm0uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAgICAgICAgIGxldCBuYW1lID0gZGVjbC5iaW5kaW5nLm5hbWU7XG4gICAgICAgICAgbGV0IG5hbWVBZGRlZCA9IG5hbWUuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUyk7XG4gICAgICAgICAgbGV0IG5hbWVSZW1vdmVkID0gbmFtZS5yZW1vdmVTY29wZSh0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlW3RoaXMuY29udGV4dC5jdXJyZW50U2NvcGUubGVuZ3RoIC0gMV0sIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0obmFtZS52YWwoKSk7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZEZvcndhcmQobmFtZUFkZGVkLCBuYW1lUmVtb3ZlZCwgbmV3QmluZGluZywgdGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgICAgICByZXR1cm4gZGVjbC5leHRlbmQoe1xuICAgICAgICAgICAgaW5pdDogZGVjbC5pbml0LmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmb3Igc3ludGF4IGRlY2xhcmF0aW9ucyB3ZSBuZWVkIHRvIGxvYWQgdGhlIGNvbXBpbGV0aW1lIHZhbHVlXG4gICAgLy8gaW50byB0aGUgZW52aXJvbm1lbnRcbiAgICByZXR1cm4gdGVybS5leHRlbmQoe1xuICAgICAgZGVjbGFyYXRvcnM6IHRlcm0uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAgICAgICBsZXQgYmluZGluZyA9IGRlY2wuYmluZGluZy5yZW1vdmVTY29wZSh0aGlzLmNvbnRleHQudXNlU2NvcGUsIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgICAgIC8vIGVhY2ggY29tcGlsZXRpbWUgdmFsdWUgbmVlZHMgdG8gYmUgZXhwYW5kZWQgd2l0aCBhIGZyZXNoXG4gICAgICAgIC8vIGVudmlyb25tZW50IGFuZCBpbiB0aGUgbmV4dCBoaWdoZXIgcGhhc2VcbiAgICAgICAgbGV0IHN5bnRheEV4cGFuZGVyID0gbmV3IFRlcm1FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge1xuICAgICAgICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UgKyAxLFxuICAgICAgICAgIGVudjogbmV3IEVudigpLFxuICAgICAgICAgIHN0b3JlOiB0aGlzLmNvbnRleHQuc3RvcmVcbiAgICAgICAgfSkpO1xuICAgICAgICBsZXQgaW5pdCA9IHN5bnRheEV4cGFuZGVyLmV4cGFuZChkZWNsLmluaXQpO1xuICAgICAgICBsZXQgdmFsID0gZXZhbENvbXBpbGV0aW1lVmFsdWUoaW5pdC5nZW4oKSwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtcbiAgICAgICAgICBwaGFzZTogdGhpcy5jb250ZXh0LnBoYXNlICsgMVxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbGxlY3RCaW5kaW5ncyhiaW5kaW5nKS5mb3JFYWNoKHN0eCA9PiB7XG4gICAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4LnZhbCgpKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eCwge1xuICAgICAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsXG4gICAgICAgICAgICBza2lwRHVwOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxldCByZXNvbHZlZE5hbWUgPSBzdHgucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5lbnYuc2V0KHJlc29sdmVkTmFtZSwgbmV3IENvbXBpbGV0aW1lVHJhbnNmb3JtKHZhbCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlY2wuZXh0ZW5kKHsgYmluZGluZywgaW5pdCB9KTtcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ== + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.CollectBindingSyntax = undefined; + exports.collectBindings = collectBindings; + + var _immutable = __webpack_require__(3); + + var _astDispatcher = __webpack_require__(63); + + var _astDispatcher2 = _interopRequireDefault(_astDispatcher); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + class CollectBindingSyntax extends _astDispatcher2.default { constructor() { - super("collect", true); + super('collect', true); this.names = (0, _immutable.List)(); } - collect(term_348) { - return this.dispatch(term_348); + + // registerSyntax(stx) { + // let newBinding = gensym(stx.val()); + // this.context.bindings.add(stx, { + // binding: newBinding, + // phase: this.context.phase, + // // skip dup because js allows variable redeclarations + // // (technically only for `var` but we can let later stages of the pipeline + // // handle incorrect redeclarations of `const` and `let`) + // skipDup: true + // }); + // return stx; + // } + + collect(term) { + return this.dispatch(term); } - collectBindingIdentifier(term_349) { - return this.names.concat(term_349.name); + + collectBindingIdentifier(term) { + return this.names.concat(term.name); } - collectBindingPropertyIdentifier(term_350) { - return this.collect(term_350.binding); + + collectBindingPropertyIdentifier(term) { + return this.collect(term.binding); } - collectBindingPropertyProperty(term_351) { - return this.collect(term_351.binding); + + collectBindingPropertyProperty(term) { + return this.collect(term.binding); } - collectArrayBinding(term_352) { - let restElement_353 = null; - if (term_352.restElement != null) { - restElement_353 = this.collect(term_352.restElement); + + collectArrayBinding(term) { + let restElement = null; + if (term.restElement != null) { + restElement = this.collect(term.restElement); } - return this.names.concat(restElement_353).concat(term_352.elements.filter(el_354 => el_354 != null).flatMap(el_355 => this.collect(el_355))); + return this.names.concat(restElement).concat(term.elements.filter(el => el != null).flatMap(el => this.collect(el))); } - collectObjectBinding(term_356) { + + collectObjectBinding() { + // return term.properties.flatMap(prop => this.collect(prop)); return (0, _immutable.List)(); } + + // registerVariableDeclaration(term) { + // let declarators = term.declarators.map(decl => { + // return decl.extend({ + // binding: this.register(decl.binding) + // }); + // }); + // return term.extend({ declarators }); + // } + // + // registerFunctionDeclaration(term) { + // return term.extend({ + // name: this.register(term.name) + // }); + // } + // + // registerExport(term) { + // return term.extend({ + // declaration: this.register(term.declaration) + // }); + // } } - function collectBindings_347(term_357) { - return new CollectBindingSyntax_346().collect(term_357); + + exports.CollectBindingSyntax = CollectBindingSyntax; + function collectBindings(term) { + return new CollectBindingSyntax().collect(term); } - exports.CollectBindingSyntax = CollectBindingSyntax_346; - exports.collectBindings = collectBindings_347; - //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2h5Z2llbmUtdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7SUFBYSxDOzs7Ozs7QUFDYixNQUFNLHdCQUFOLGlDQUFxRDtBQUNuRCxnQkFBYztBQUNaLFVBQU0sU0FBTixFQUFpQixJQUFqQjtBQUNBLFNBQUssS0FBTCxHQUFhLHNCQUFiO0FBQ0Q7QUFDRCxVQUFRLFFBQVIsRUFBa0I7QUFDaEIsV0FBTyxLQUFLLFFBQUwsQ0FBYyxRQUFkLENBQVA7QUFDRDtBQUNELDJCQUF5QixRQUF6QixFQUFtQztBQUNqQyxXQUFPLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBa0IsU0FBUyxJQUEzQixDQUFQO0FBQ0Q7QUFDRCxtQ0FBaUMsUUFBakMsRUFBMkM7QUFDekMsV0FBTyxLQUFLLE9BQUwsQ0FBYSxTQUFTLE9BQXRCLENBQVA7QUFDRDtBQUNELGlDQUErQixRQUEvQixFQUF5QztBQUN2QyxXQUFPLEtBQUssT0FBTCxDQUFhLFNBQVMsT0FBdEIsQ0FBUDtBQUNEO0FBQ0Qsc0JBQW9CLFFBQXBCLEVBQThCO0FBQzVCLFFBQUksa0JBQWtCLElBQXRCO0FBQ0EsUUFBSSxTQUFTLFdBQVQsSUFBd0IsSUFBNUIsRUFBa0M7QUFDaEMsd0JBQWtCLEtBQUssT0FBTCxDQUFhLFNBQVMsV0FBdEIsQ0FBbEI7QUFDRDtBQUNELFdBQU8sS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixlQUFsQixFQUFtQyxNQUFuQyxDQUEwQyxTQUFTLFFBQVQsQ0FBa0IsTUFBbEIsQ0FBeUIsVUFBVSxVQUFVLElBQTdDLEVBQW1ELE9BQW5ELENBQTJELFVBQVUsS0FBSyxPQUFMLENBQWEsTUFBYixDQUFyRSxDQUExQyxDQUFQO0FBQ0Q7QUFDRCx1QkFBcUIsUUFBckIsRUFBK0I7QUFDN0IsV0FBTyxzQkFBUDtBQUNEO0FBMUJrRDtBQTRCckQsU0FBUyxtQkFBVCxDQUE2QixRQUE3QixFQUF1QztBQUNyQyxTQUFRLElBQUksd0JBQUosRUFBRCxDQUErQixPQUEvQixDQUF1QyxRQUF2QyxDQUFQO0FBQ0Q7UUFDbUMsb0IsR0FBNUIsd0I7UUFDdUIsZSxHQUF2QixtQiIsImZpbGUiOiJoeWdpZW5lLXV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtnZW5zeW19IGZyb20gXCIuL3N5bWJvbFwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHtleHBlY3QsIGFzc2VydH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgVGVybSwge2lzRU9GLCBpc0JpbmRpbmdJZGVudGlmaWVyLCBpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5LCBpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXIsIGlzT2JqZWN0QmluZGluZywgaXNBcnJheUJpbmRpbmcsIGlzRnVuY3Rpb25EZWNsYXJhdGlvbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24sIGlzRnVuY3Rpb25UZXJtLCBpc0Z1bmN0aW9uV2l0aE5hbWUsIGlzU3ludGF4RGVjbGFyYXRpb24sIGlzU3ludGF4cmVjRGVjbGFyYXRpb24sIGlzVmFyaWFibGVEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LCBpc0ltcG9ydCwgaXNFeHBvcnQsIGlzUHJhZ21hLCBpc0V4cG9ydFN5bnRheH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IEFTVERpc3BhdGNoZXIgZnJvbSBcIi4vYXN0LWRpc3BhdGNoZXJcIjtcbmltcG9ydCAgKiBhcyBfIGZyb20gXCJyYW1kYVwiO1xuY2xhc3MgQ29sbGVjdEJpbmRpbmdTeW50YXhfMzQ2IGV4dGVuZHMgQVNURGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiY29sbGVjdFwiLCB0cnVlKTtcbiAgICB0aGlzLm5hbWVzID0gTGlzdCgpO1xuICB9XG4gIGNvbGxlY3QodGVybV8zNDgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaCh0ZXJtXzM0OCk7XG4gIH1cbiAgY29sbGVjdEJpbmRpbmdJZGVudGlmaWVyKHRlcm1fMzQ5KSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuY29uY2F0KHRlcm1fMzQ5Lm5hbWUpO1xuICB9XG4gIGNvbGxlY3RCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyKHRlcm1fMzUwKSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdCh0ZXJtXzM1MC5iaW5kaW5nKTtcbiAgfVxuICBjb2xsZWN0QmluZGluZ1Byb3BlcnR5UHJvcGVydHkodGVybV8zNTEpIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRlcm1fMzUxLmJpbmRpbmcpO1xuICB9XG4gIGNvbGxlY3RBcnJheUJpbmRpbmcodGVybV8zNTIpIHtcbiAgICBsZXQgcmVzdEVsZW1lbnRfMzUzID0gbnVsbDtcbiAgICBpZiAodGVybV8zNTIucmVzdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgcmVzdEVsZW1lbnRfMzUzID0gdGhpcy5jb2xsZWN0KHRlcm1fMzUyLnJlc3RFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuY29uY2F0KHJlc3RFbGVtZW50XzM1MykuY29uY2F0KHRlcm1fMzUyLmVsZW1lbnRzLmZpbHRlcihlbF8zNTQgPT4gZWxfMzU0ICE9IG51bGwpLmZsYXRNYXAoZWxfMzU1ID0+IHRoaXMuY29sbGVjdChlbF8zNTUpKSk7XG4gIH1cbiAgY29sbGVjdE9iamVjdEJpbmRpbmcodGVybV8zNTYpIHtcbiAgICByZXR1cm4gTGlzdCgpO1xuICB9XG59XG5mdW5jdGlvbiBjb2xsZWN0QmluZGluZ3NfMzQ3KHRlcm1fMzU3KSB7XG4gIHJldHVybiAobmV3IENvbGxlY3RCaW5kaW5nU3ludGF4XzM0NikuY29sbGVjdCh0ZXJtXzM1Nyk7XG59XG5leHBvcnQge0NvbGxlY3RCaW5kaW5nU3ludGF4XzM0NiBhcyBDb2xsZWN0QmluZGluZ1N5bnRheH07XG5leHBvcnQge2NvbGxlY3RCaW5kaW5nc18zNDcgYXMgY29sbGVjdEJpbmRpbmdzfSJdfQ== + //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oeWdpZW5lLXV0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztRQTZFZ0IsZSxHQUFBLGU7O0FBN0VoQjs7QUFFQTs7Ozs7O0FBRU8sTUFBTSxvQkFBTixpQ0FBaUQ7QUFDdEQsZ0JBQWM7QUFDWixVQUFNLFNBQU4sRUFBaUIsSUFBakI7QUFDQSxTQUFLLEtBQUwsR0FBYSxzQkFBYjtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFRLElBQVIsRUFBYztBQUNaLFdBQU8sS0FBSyxRQUFMLENBQWMsSUFBZCxDQUFQO0FBQ0Q7O0FBRUQsMkJBQXlCLElBQXpCLEVBQStCO0FBQzdCLFdBQU8sS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixLQUFLLElBQXZCLENBQVA7QUFDRDs7QUFFRCxtQ0FBaUMsSUFBakMsRUFBdUM7QUFDckMsV0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUFLLE9BQWxCLENBQVA7QUFDRDs7QUFFRCxpQ0FBZ0MsSUFBaEMsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUFLLE9BQWxCLENBQVA7QUFDRDs7QUFFRCxzQkFBcUIsSUFBckIsRUFBMkI7QUFDekIsUUFBSSxjQUFjLElBQWxCO0FBQ0EsUUFBSSxLQUFLLFdBQUwsSUFBb0IsSUFBeEIsRUFBOEI7QUFDNUIsb0JBQWMsS0FBSyxPQUFMLENBQWEsS0FBSyxXQUFsQixDQUFkO0FBQ0Q7QUFDRCxXQUFPLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBa0IsV0FBbEIsRUFBK0IsTUFBL0IsQ0FDTCxLQUFLLFFBQUwsQ0FBYyxNQUFkLENBQXFCLE1BQU0sTUFBTSxJQUFqQyxFQUNjLE9BRGQsQ0FDc0IsTUFBTSxLQUFLLE9BQUwsQ0FBYSxFQUFiLENBRDVCLENBREssQ0FBUDtBQUlEOztBQUVELHlCQUF3QjtBQUN0QjtBQUNBLFdBQU8sc0JBQVA7QUFDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEVzRDs7UUFBM0Msb0IsR0FBQSxvQjtBQXlFTixTQUFTLGVBQVQsQ0FBeUIsSUFBekIsRUFBK0I7QUFDcEMsU0FBTyxJQUFJLG9CQUFKLEdBQTJCLE9BQTNCLENBQW1DLElBQW5DLENBQVA7QUFDRCIsImZpbGUiOiJoeWdpZW5lLXV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlzdCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbmltcG9ydCBBU1REaXNwYXRjaGVyIGZyb20gJy4vYXN0LWRpc3BhdGNoZXInO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdEJpbmRpbmdTeW50YXggZXh0ZW5kcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2NvbGxlY3QnLCB0cnVlKTtcbiAgICB0aGlzLm5hbWVzID0gTGlzdCgpO1xuICB9XG5cbiAgLy8gcmVnaXN0ZXJTeW50YXgoc3R4KSB7XG4gIC8vICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4LnZhbCgpKTtcbiAgLy8gICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eCwge1xuICAvLyAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgLy8gICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsXG4gIC8vICAgICAvLyBza2lwIGR1cCBiZWNhdXNlIGpzIGFsbG93cyB2YXJpYWJsZSByZWRlY2xhcmF0aW9uc1xuICAvLyAgICAgLy8gKHRlY2huaWNhbGx5IG9ubHkgZm9yIGB2YXJgIGJ1dCB3ZSBjYW4gbGV0IGxhdGVyIHN0YWdlcyBvZiB0aGUgcGlwZWxpbmVcbiAgLy8gICAgIC8vIGhhbmRsZSBpbmNvcnJlY3QgcmVkZWNsYXJhdGlvbnMgb2YgYGNvbnN0YCBhbmQgYGxldGApXG4gIC8vICAgICBza2lwRHVwOiB0cnVlXG4gIC8vICAgfSk7XG4gIC8vICAgcmV0dXJuIHN0eDtcbiAgLy8gfVxuXG4gIGNvbGxlY3QodGVybSkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKHRlcm0pO1xuICB9XG5cbiAgY29sbGVjdEJpbmRpbmdJZGVudGlmaWVyKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5jb25jYXQodGVybS5uYW1lKTtcbiAgfVxuXG4gIGNvbGxlY3RCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRlcm0uYmluZGluZyk7XG4gIH1cblxuICBjb2xsZWN0QmluZGluZ1Byb3BlcnR5UHJvcGVydHkgKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRlcm0uYmluZGluZyk7XG4gIH1cblxuICBjb2xsZWN0QXJyYXlCaW5kaW5nICh0ZXJtKSB7XG4gICAgbGV0IHJlc3RFbGVtZW50ID0gbnVsbDtcbiAgICBpZiAodGVybS5yZXN0RWxlbWVudCAhPSBudWxsKSB7XG4gICAgICByZXN0RWxlbWVudCA9IHRoaXMuY29sbGVjdCh0ZXJtLnJlc3RFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuY29uY2F0KHJlc3RFbGVtZW50KS5jb25jYXQoXG4gICAgICB0ZXJtLmVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKGVsID0+IHRoaXMuY29sbGVjdChlbCkpXG4gICAgKTtcbiAgfVxuXG4gIGNvbGxlY3RPYmplY3RCaW5kaW5nICgpIHtcbiAgICAvLyByZXR1cm4gdGVybS5wcm9wZXJ0aWVzLmZsYXRNYXAocHJvcCA9PiB0aGlzLmNvbGxlY3QocHJvcCkpO1xuICAgIHJldHVybiBMaXN0KCk7XG4gIH1cblxuICAvLyByZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybSkge1xuICAvLyAgIGxldCBkZWNsYXJhdG9ycyA9IHRlcm0uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAvLyAgICAgcmV0dXJuIGRlY2wuZXh0ZW5kKHtcbiAgLy8gICAgICAgYmluZGluZzogdGhpcy5yZWdpc3RlcihkZWNsLmJpbmRpbmcpXG4gIC8vICAgICB9KTtcbiAgLy8gICB9KTtcbiAgLy8gICByZXR1cm4gdGVybS5leHRlbmQoeyBkZWNsYXJhdG9ycyB9KTtcbiAgLy8gfVxuICAvL1xuICAvLyByZWdpc3RlckZ1bmN0aW9uRGVjbGFyYXRpb24odGVybSkge1xuICAvLyAgIHJldHVybiB0ZXJtLmV4dGVuZCh7XG4gIC8vICAgICBuYW1lOiB0aGlzLnJlZ2lzdGVyKHRlcm0ubmFtZSlcbiAgLy8gICB9KTtcbiAgLy8gfVxuICAvL1xuICAvLyByZWdpc3RlckV4cG9ydCh0ZXJtKSB7XG4gIC8vICAgcmV0dXJuIHRlcm0uZXh0ZW5kKHtcbiAgLy8gICAgIGRlY2xhcmF0aW9uOiB0aGlzLnJlZ2lzdGVyKHRlcm0uZGVjbGFyYXRpb24pXG4gIC8vICAgfSk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCaW5kaW5ncyh0ZXJtKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdEJpbmRpbmdTeW50YXgoKS5jb2xsZWN0KHRlcm0pO1xufVxuIl19 /***/ }, -/* 68 */ +/* 66 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; // MODULES // - var isString = __webpack_require__( 69 ), - re = __webpack_require__( 70 ); + var isString = __webpack_require__( 67 ), + re = __webpack_require__( 68 ); // DIRNAME // @@ -38680,7 +40618,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /***/ }, -/* 69 */ +/* 67 */ /***/ function(module, exports) { /** @@ -38731,14 +40669,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /***/ }, -/* 70 */ +/* 68 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; // MODULES // - var isWindows = __webpack_require__( 71 ); + var isWindows = __webpack_require__( 69 ); // REGEX // @@ -38747,8 +40685,8 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack win32, re; - posix = __webpack_require__( 73 ); - win32 = __webpack_require__( 74 ); + posix = __webpack_require__( 71 ); + win32 = __webpack_require__( 72 ); if ( isWindows ) { re = win32; @@ -38765,14 +40703,14 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /***/ }, -/* 71 */ +/* 69 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; // MODULES // - var platform = __webpack_require__( 72 ); + var platform = __webpack_require__( 70 ); // EXPORTS // @@ -38781,7 +40719,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /***/ }, -/* 72 */ +/* 70 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(process) {'use strict'; @@ -38793,7 +40731,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2))) /***/ }, -/* 73 */ +/* 71 */ /***/ function(module, exports) { 'use strict'; @@ -38870,7 +40808,7 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /***/ }, -/* 74 */ +/* 72 */ /***/ function(module, exports) { 'use strict'; @@ -38955,19 +40893,19 @@ define("sweet", [], function() { return /******/ (function(modules) { // webpack /***/ }, -/* 75 */ +/* 73 */ /***/ function(module, exports) { /* (ignored) */ /***/ }, -/* 76 */ +/* 74 */ /***/ function(module, exports) { /* (ignored) */ /***/ }, -/* 77 */ +/* 75 */ /***/ function(module, exports) { /* (ignored) */ diff --git a/dist/apply-scope-in-params-reducer.js b/dist/apply-scope-in-params-reducer.js index 87e57650..351161c7 100644 --- a/dist/apply-scope-in-params-reducer.js +++ b/dist/apply-scope-in-params-reducer.js @@ -19,43 +19,76 @@ var _syntax = require("./syntax"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class ScopeApplyingReducer { - constructor(scope_0, context_1) { - this.context = context_1; - this.scope = scope_0; - } - transform(term_2) { - let field_3 = "transform" + term_2.type; - if (typeof this[field_3] === "function") { - return this[field_3](term_2); + constructor(scope, context) { + this.context = context; + this.scope = scope; + } + + transform(term) { + let field = "transform" + term.type; + if (typeof this[field] === 'function') { + return this[field](term); } - (0, _errors.assert)(false, "transform not implemented yet for: " + term_2.type); + (0, _errors.assert)(false, "transform not implemented yet for: " + term.type); } - transformFormalParameters(term_4) { - let rest_5 = term_4.rest == null ? null : this.transform(term_4.rest); - return new _terms2.default("FormalParameters", { items: term_4.items.map(it_6 => this.transform(it_6)), rest: rest_5 }); + + transformFormalParameters(term) { + let rest = term.rest == null ? null : this.transform(term.rest); + return new _terms2.default('FormalParameters', { + items: term.items.map(it => this.transform(it)), + rest: rest + }); } - transformBindingWithDefault(term_7) { - return new _terms2.default("BindingWithDefault", { binding: this.transform(term_7.binding), init: term_7.init }); + + transformBindingWithDefault(term) { + return new _terms2.default('BindingWithDefault', { + binding: this.transform(term.binding), + init: term.init + }); } - transformObjectBinding(term_8) { - return term_8; + + transformObjectBinding(term) { + // TODO: much more complicated logic here + return term; + // return new Term('ObjectBinding', { + // properties: term.properties.map(prop => this.transform(prop)) + // }); } - transformBindingPropertyIdentifier(term_9) { - return new _terms2.default("BindingPropertyIdentifier", { binding: this.transform(term_9.binding), init: term_9.init }); + + transformBindingPropertyIdentifier(term) { + return new _terms2.default('BindingPropertyIdentifier', { + binding: this.transform(term.binding), + init: term.init + }); } - transformBindingPropertyProperty(term_10) { - return new _terms2.default("BindingPropertyProperty", { name: term_10.name, binding: this.transform(term_10.binding) }); + + transformBindingPropertyProperty(term) { + return new _terms2.default('BindingPropertyProperty', { + name: term.name, + binding: this.transform(term.binding) + }); } - transformArrayBinding(term_11) { - return new _terms2.default("ArrayBinding", { elements: term_11.elements.map(el_12 => this.transform(el_12)), restElement: term_11.restElement == null ? null : this.transform(term_11.restElement) }); + + transformArrayBinding(term) { + return new _terms2.default('ArrayBinding', { + elements: term.elements.map(el => this.transform(el)), + restElement: term.restElement == null ? null : this.transform(term.restElement) + }); } - transformBindingIdentifier(term_13) { - let name_14 = term_13.name.addScope(this.scope, this.context.bindings, _syntax.ALL_PHASES); - let newBinding_15 = (0, _symbol.gensym)(name_14.val()); - this.context.env.set(newBinding_15.toString(), new _transforms.VarBindingTransform(name_14)); - this.context.bindings.add(name_14, { binding: newBinding_15, phase: this.context.phase, skipDup: true }); - return new _terms2.default("BindingIdentifier", { name: name_14 }); + + transformBindingIdentifier(term) { + let name = term.name.addScope(this.scope, this.context.bindings, _syntax.ALL_PHASES); + let newBinding = (0, _symbol.gensym)(name.val()); + + this.context.env.set(newBinding.toString(), new _transforms.VarBindingTransform(name)); + this.context.bindings.add(name, { + binding: newBinding, + phase: this.context.phase, + skipDup: true + }); + + return new _terms2.default("BindingIdentifier", { name: name }); } } exports.default = ScopeApplyingReducer; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2FwcGx5LXNjb3BlLWluLXBhcmFtcy1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDZSxNQUFNLG9CQUFOLENBQTJCO0FBQ3hDLGNBQVksT0FBWixFQUFxQixTQUFyQixFQUFnQztBQUM5QixTQUFLLE9BQUwsR0FBZSxTQUFmO0FBQ0EsU0FBSyxLQUFMLEdBQWEsT0FBYjtBQUNEO0FBQ0QsWUFBVSxNQUFWLEVBQWtCO0FBQ2hCLFFBQUksVUFBVSxjQUFjLE9BQU8sSUFBbkM7QUFDQSxRQUFJLE9BQU8sS0FBSyxPQUFMLENBQVAsS0FBeUIsVUFBN0IsRUFBeUM7QUFDdkMsYUFBTyxLQUFLLE9BQUwsRUFBYyxNQUFkLENBQVA7QUFDRDtBQUNELHdCQUFPLEtBQVAsRUFBYyx3Q0FBd0MsT0FBTyxJQUE3RDtBQUNEO0FBQ0QsNEJBQTBCLE1BQTFCLEVBQWtDO0FBQ2hDLFFBQUksU0FBUyxPQUFPLElBQVAsSUFBZSxJQUFmLEdBQXNCLElBQXRCLEdBQTZCLEtBQUssU0FBTCxDQUFlLE9BQU8sSUFBdEIsQ0FBMUM7QUFDQSxXQUFPLG9CQUFTLGtCQUFULEVBQTZCLEVBQUMsT0FBTyxPQUFPLEtBQVAsQ0FBYSxHQUFiLENBQWlCLFFBQVEsS0FBSyxTQUFMLENBQWUsSUFBZixDQUF6QixDQUFSLEVBQXdELE1BQU0sTUFBOUQsRUFBN0IsQ0FBUDtBQUNEO0FBQ0QsOEJBQTRCLE1BQTVCLEVBQW9DO0FBQ2xDLFdBQU8sb0JBQVMsb0JBQVQsRUFBK0IsRUFBQyxTQUFTLEtBQUssU0FBTCxDQUFlLE9BQU8sT0FBdEIsQ0FBVixFQUEwQyxNQUFNLE9BQU8sSUFBdkQsRUFBL0IsQ0FBUDtBQUNEO0FBQ0QseUJBQXVCLE1BQXZCLEVBQStCO0FBQzdCLFdBQU8sTUFBUDtBQUNEO0FBQ0QscUNBQW1DLE1BQW5DLEVBQTJDO0FBQ3pDLFdBQU8sb0JBQVMsMkJBQVQsRUFBc0MsRUFBQyxTQUFTLEtBQUssU0FBTCxDQUFlLE9BQU8sT0FBdEIsQ0FBVixFQUEwQyxNQUFNLE9BQU8sSUFBdkQsRUFBdEMsQ0FBUDtBQUNEO0FBQ0QsbUNBQWlDLE9BQWpDLEVBQTBDO0FBQ3hDLFdBQU8sb0JBQVMseUJBQVQsRUFBb0MsRUFBQyxNQUFNLFFBQVEsSUFBZixFQUFxQixTQUFTLEtBQUssU0FBTCxDQUFlLFFBQVEsT0FBdkIsQ0FBOUIsRUFBcEMsQ0FBUDtBQUNEO0FBQ0Qsd0JBQXNCLE9BQXRCLEVBQStCO0FBQzdCLFdBQU8sb0JBQVMsY0FBVCxFQUF5QixFQUFDLFVBQVUsUUFBUSxRQUFSLENBQWlCLEdBQWpCLENBQXFCLFNBQVMsS0FBSyxTQUFMLENBQWUsS0FBZixDQUE5QixDQUFYLEVBQWlFLGFBQWEsUUFBUSxXQUFSLElBQXVCLElBQXZCLEdBQThCLElBQTlCLEdBQXFDLEtBQUssU0FBTCxDQUFlLFFBQVEsV0FBdkIsQ0FBbkgsRUFBekIsQ0FBUDtBQUNEO0FBQ0QsNkJBQTJCLE9BQTNCLEVBQW9DO0FBQ2xDLFFBQUksVUFBVSxRQUFRLElBQVIsQ0FBYSxRQUFiLENBQXNCLEtBQUssS0FBM0IsRUFBa0MsS0FBSyxPQUFMLENBQWEsUUFBL0MscUJBQWQ7QUFDQSxRQUFJLGdCQUFnQixvQkFBTyxRQUFRLEdBQVIsRUFBUCxDQUFwQjtBQUNBLFNBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsY0FBYyxRQUFkLEVBQXJCLEVBQStDLG9DQUF3QixPQUF4QixDQUEvQztBQUNBLFNBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsR0FBdEIsQ0FBMEIsT0FBMUIsRUFBbUMsRUFBQyxTQUFTLGFBQVYsRUFBeUIsT0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUE3QyxFQUFvRCxTQUFTLElBQTdELEVBQW5DO0FBQ0EsV0FBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sT0FBUCxFQUE5QixDQUFQO0FBQ0Q7QUFyQ3VDO2tCQUFyQixvQiIsImZpbGUiOiJhcHBseS1zY29wZS1pbi1wYXJhbXMtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge2dlbnN5bX0gZnJvbSBcIi4vc3ltYm9sXCI7XG5pbXBvcnQge1ZhckJpbmRpbmdUcmFuc2Zvcm19IGZyb20gXCIuL3RyYW5zZm9ybXNcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY29wZUFwcGx5aW5nUmVkdWNlciB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlXzAsIGNvbnRleHRfMSkge1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRfMTtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGVfMDtcbiAgfVxuICB0cmFuc2Zvcm0odGVybV8yKSB7XG4gICAgbGV0IGZpZWxkXzMgPSBcInRyYW5zZm9ybVwiICsgdGVybV8yLnR5cGU7XG4gICAgaWYgKHR5cGVvZiB0aGlzW2ZpZWxkXzNdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0aGlzW2ZpZWxkXzNdKHRlcm1fMik7XG4gICAgfVxuICAgIGFzc2VydChmYWxzZSwgXCJ0cmFuc2Zvcm0gbm90IGltcGxlbWVudGVkIHlldCBmb3I6IFwiICsgdGVybV8yLnR5cGUpO1xuICB9XG4gIHRyYW5zZm9ybUZvcm1hbFBhcmFtZXRlcnModGVybV80KSB7XG4gICAgbGV0IHJlc3RfNSA9IHRlcm1fNC5yZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy50cmFuc2Zvcm0odGVybV80LnJlc3QpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge2l0ZW1zOiB0ZXJtXzQuaXRlbXMubWFwKGl0XzYgPT4gdGhpcy50cmFuc2Zvcm0oaXRfNikpLCByZXN0OiByZXN0XzV9KTtcbiAgfVxuICB0cmFuc2Zvcm1CaW5kaW5nV2l0aERlZmF1bHQodGVybV83KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ1dpdGhEZWZhdWx0XCIsIHtiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybSh0ZXJtXzcuYmluZGluZyksIGluaXQ6IHRlcm1fNy5pbml0fSk7XG4gIH1cbiAgdHJhbnNmb3JtT2JqZWN0QmluZGluZyh0ZXJtXzgpIHtcbiAgICByZXR1cm4gdGVybV84O1xuICB9XG4gIHRyYW5zZm9ybUJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXIodGVybV85KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllclwiLCB7YmluZGluZzogdGhpcy50cmFuc2Zvcm0odGVybV85LmJpbmRpbmcpLCBpbml0OiB0ZXJtXzkuaW5pdH0pO1xuICB9XG4gIHRyYW5zZm9ybUJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5KHRlcm1fMTApIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eVwiLCB7bmFtZTogdGVybV8xMC5uYW1lLCBiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybSh0ZXJtXzEwLmJpbmRpbmcpfSk7XG4gIH1cbiAgdHJhbnNmb3JtQXJyYXlCaW5kaW5nKHRlcm1fMTEpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiB0ZXJtXzExLmVsZW1lbnRzLm1hcChlbF8xMiA9PiB0aGlzLnRyYW5zZm9ybShlbF8xMikpLCByZXN0RWxlbWVudDogdGVybV8xMS5yZXN0RWxlbWVudCA9PSBudWxsID8gbnVsbCA6IHRoaXMudHJhbnNmb3JtKHRlcm1fMTEucmVzdEVsZW1lbnQpfSk7XG4gIH1cbiAgdHJhbnNmb3JtQmluZGluZ0lkZW50aWZpZXIodGVybV8xMykge1xuICAgIGxldCBuYW1lXzE0ID0gdGVybV8xMy5uYW1lLmFkZFNjb3BlKHRoaXMuc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUyk7XG4gICAgbGV0IG5ld0JpbmRpbmdfMTUgPSBnZW5zeW0obmFtZV8xNC52YWwoKSk7XG4gICAgdGhpcy5jb250ZXh0LmVudi5zZXQobmV3QmluZGluZ18xNS50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShuYW1lXzE0KSk7XG4gICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChuYW1lXzE0LCB7YmluZGluZzogbmV3QmluZGluZ18xNSwgcGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSwgc2tpcER1cDogdHJ1ZX0pO1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiBuYW1lXzE0fSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHBseS1zY29wZS1pbi1wYXJhbXMtcmVkdWNlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRWUsTUFBTSxvQkFBTixDQUEyQjtBQUN4QyxjQUFZLEtBQVosRUFBbUIsT0FBbkIsRUFBNEI7QUFDMUIsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDRDs7QUFFRCxZQUFVLElBQVYsRUFBZ0I7QUFDZCxRQUFJLFFBQVEsY0FBYyxLQUFLLElBQS9CO0FBQ0EsUUFBSSxPQUFPLEtBQUssS0FBTCxDQUFQLEtBQXVCLFVBQTNCLEVBQXVDO0FBQ3JDLGFBQU8sS0FBSyxLQUFMLEVBQVksSUFBWixDQUFQO0FBQ0Q7QUFDRCx3QkFBTyxLQUFQLEVBQWMsd0NBQXdDLEtBQUssSUFBM0Q7QUFDRDs7QUFFRCw0QkFBMEIsSUFBMUIsRUFBZ0M7QUFDOUIsUUFBSSxPQUFPLEtBQUssSUFBTCxJQUFhLElBQWIsR0FBb0IsSUFBcEIsR0FBMkIsS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFwQixDQUF0QztBQUNBLFdBQU8sb0JBQVMsa0JBQVQsRUFBNkI7QUFDbEMsYUFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBTSxLQUFLLFNBQUwsQ0FBZSxFQUFmLENBQXJCLENBRDJCO0FBRWxDO0FBRmtDLEtBQTdCLENBQVA7QUFJRDs7QUFHRCw4QkFBNEIsSUFBNUIsRUFBa0M7QUFDaEMsV0FBTyxvQkFBUyxvQkFBVCxFQUErQjtBQUNwQyxlQUFTLEtBQUssU0FBTCxDQUFlLEtBQUssT0FBcEIsQ0FEMkI7QUFFcEMsWUFBTSxLQUFLO0FBRnlCLEtBQS9CLENBQVA7QUFJRDs7QUFFRCx5QkFBdUIsSUFBdkIsRUFBNkI7QUFDM0I7QUFDQSxXQUFPLElBQVA7QUFDQTtBQUNBO0FBQ0E7QUFDRDs7QUFFRCxxQ0FBbUMsSUFBbkMsRUFBeUM7QUFDdkMsV0FBTyxvQkFBUywyQkFBVCxFQUFzQztBQUMzQyxlQUFTLEtBQUssU0FBTCxDQUFlLEtBQUssT0FBcEIsQ0FEa0M7QUFFM0MsWUFBTSxLQUFLO0FBRmdDLEtBQXRDLENBQVA7QUFJRDs7QUFFRCxtQ0FBaUMsSUFBakMsRUFBdUM7QUFDckMsV0FBTyxvQkFBUyx5QkFBVCxFQUFvQztBQUN6QyxZQUFNLEtBQUssSUFEOEI7QUFFekMsZUFBUyxLQUFLLFNBQUwsQ0FBZSxLQUFLLE9BQXBCO0FBRmdDLEtBQXBDLENBQVA7QUFJRDs7QUFFRCx3QkFBc0IsSUFBdEIsRUFBNEI7QUFDMUIsV0FBTyxvQkFBUyxjQUFULEVBQXlCO0FBQzlCLGdCQUFVLEtBQUssUUFBTCxDQUFjLEdBQWQsQ0FBa0IsTUFBTSxLQUFLLFNBQUwsQ0FBZSxFQUFmLENBQXhCLENBRG9CO0FBRTlCLG1CQUFhLEtBQUssV0FBTCxJQUFvQixJQUFwQixHQUEyQixJQUEzQixHQUFrQyxLQUFLLFNBQUwsQ0FBZSxLQUFLLFdBQXBCO0FBRmpCLEtBQXpCLENBQVA7QUFJRDs7QUFFRCw2QkFBMkIsSUFBM0IsRUFBaUM7QUFDL0IsUUFBSSxPQUFPLEtBQUssSUFBTCxDQUFVLFFBQVYsQ0FBbUIsS0FBSyxLQUF4QixFQUErQixLQUFLLE9BQUwsQ0FBYSxRQUE1QyxxQkFBWDtBQUNBLFFBQUksYUFBYSxvQkFBTyxLQUFLLEdBQUwsRUFBUCxDQUFqQjs7QUFFQSxTQUFLLE9BQUwsQ0FBYSxHQUFiLENBQWlCLEdBQWpCLENBQXFCLFdBQVcsUUFBWCxFQUFyQixFQUE0QyxvQ0FBd0IsSUFBeEIsQ0FBNUM7QUFDQSxTQUFLLE9BQUwsQ0FBYSxRQUFiLENBQXNCLEdBQXRCLENBQTBCLElBQTFCLEVBQWdDO0FBQzlCLGVBQVMsVUFEcUI7QUFFOUIsYUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUZVO0FBRzlCLGVBQVM7QUFIcUIsS0FBaEM7O0FBTUEsV0FBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFFLFVBQUYsRUFBOUIsQ0FBUDtBQUNEO0FBdkV1QztrQkFBckIsb0IiLCJmaWxlIjoiYXBwbHktc2NvcGUtaW4tcGFyYW1zLXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVybSBmcm9tIFwiLi90ZXJtc1wiO1xuaW1wb3J0IHsgZ2Vuc3ltIH0gZnJvbSBcIi4vc3ltYm9sXCI7XG5pbXBvcnQgeyBWYXJCaW5kaW5nVHJhbnNmb3JtIH0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IEFMTF9QSEFTRVMgfSBmcm9tICcuL3N5bnRheCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjb3BlQXBwbHlpbmdSZWR1Y2VyIHtcbiAgY29uc3RydWN0b3Ioc2NvcGUsIGNvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgfVxuXG4gIHRyYW5zZm9ybSh0ZXJtKSB7XG4gICAgbGV0IGZpZWxkID0gXCJ0cmFuc2Zvcm1cIiArIHRlcm0udHlwZTtcbiAgICBpZiAodHlwZW9mIHRoaXNbZmllbGRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpc1tmaWVsZF0odGVybSk7XG4gICAgfVxuICAgIGFzc2VydChmYWxzZSwgXCJ0cmFuc2Zvcm0gbm90IGltcGxlbWVudGVkIHlldCBmb3I6IFwiICsgdGVybS50eXBlKTtcbiAgfVxuXG4gIHRyYW5zZm9ybUZvcm1hbFBhcmFtZXRlcnModGVybSkge1xuICAgIGxldCByZXN0ID0gdGVybS5yZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy50cmFuc2Zvcm0odGVybS5yZXN0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0Zvcm1hbFBhcmFtZXRlcnMnLCB7XG4gICAgICBpdGVtczogdGVybS5pdGVtcy5tYXAoaXQgPT4gdGhpcy50cmFuc2Zvcm0oaXQpKSxcbiAgICAgIHJlc3RcbiAgICB9KTtcbiAgfVxuXG5cbiAgdHJhbnNmb3JtQmluZGluZ1dpdGhEZWZhdWx0KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdXaXRoRGVmYXVsdCcsIHtcbiAgICAgIGJpbmRpbmc6IHRoaXMudHJhbnNmb3JtKHRlcm0uYmluZGluZyksXG4gICAgICBpbml0OiB0ZXJtLmluaXRcbiAgICB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybU9iamVjdEJpbmRpbmcodGVybSkge1xuICAgIC8vIFRPRE86IG11Y2ggbW9yZSBjb21wbGljYXRlZCBsb2dpYyBoZXJlXG4gICAgcmV0dXJuIHRlcm07XG4gICAgLy8gcmV0dXJuIG5ldyBUZXJtKCdPYmplY3RCaW5kaW5nJywge1xuICAgIC8vICAgcHJvcGVydGllczogdGVybS5wcm9wZXJ0aWVzLm1hcChwcm9wID0+IHRoaXMudHJhbnNmb3JtKHByb3ApKVxuICAgIC8vIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyJywge1xuICAgICAgYmluZGluZzogdGhpcy50cmFuc2Zvcm0odGVybS5iaW5kaW5nKSxcbiAgICAgIGluaXQ6IHRlcm0uaW5pdFxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtQmluZGluZ1Byb3BlcnR5UHJvcGVydHkodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1Byb3BlcnR5UHJvcGVydHknLCB7XG4gICAgICBuYW1lOiB0ZXJtLm5hbWUsXG4gICAgICBiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybSh0ZXJtLmJpbmRpbmcpXG4gICAgfSk7XG4gIH1cblxuICB0cmFuc2Zvcm1BcnJheUJpbmRpbmcodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQXJyYXlCaW5kaW5nJywge1xuICAgICAgZWxlbWVudHM6IHRlcm0uZWxlbWVudHMubWFwKGVsID0+IHRoaXMudHJhbnNmb3JtKGVsKSksXG4gICAgICByZXN0RWxlbWVudDogdGVybS5yZXN0RWxlbWVudCA9PSBudWxsID8gbnVsbCA6IHRoaXMudHJhbnNmb3JtKHRlcm0ucmVzdEVsZW1lbnQpXG4gICAgfSk7XG4gIH1cblxuICB0cmFuc2Zvcm1CaW5kaW5nSWRlbnRpZmllcih0ZXJtKSB7XG4gICAgbGV0IG5hbWUgPSB0ZXJtLm5hbWUuYWRkU2NvcGUodGhpcy5zY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKTtcbiAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lLnZhbCgpKTtcblxuICAgIHRoaXMuY29udGV4dC5lbnYuc2V0KG5ld0JpbmRpbmcudG9TdHJpbmcoKSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0obmFtZSkpO1xuICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQobmFtZSwge1xuICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsXG4gICAgICBza2lwRHVwOiB0cnVlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7IG5hbWUgfSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/ast-dispatcher.js b/dist/ast-dispatcher.js index 5d99c509..2387dd39 100644 --- a/dist/ast-dispatcher.js +++ b/dist/ast-dispatcher.js @@ -1,22 +1,23 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); class ASTDispatcher { - constructor(prefix_16, errorIfMissing_17) { - this.errorIfMissing = errorIfMissing_17; - this.prefix = prefix_16; + constructor(prefix, errorIfMissing) { + this.errorIfMissing = errorIfMissing; + this.prefix = prefix; } - dispatch(term_18) { - let field_19 = this.prefix + term_18.type; - if (typeof this[field_19] === "function") { - return this[field_19](term_18); + + dispatch(term) { + let field = this.prefix + term.type; + if (typeof this[field] === 'function') { + return this[field](term); } else if (!this.errorIfMissing) { - return term_18; + return term; } - throw new Error(`Missing implementation for: ${ field_19 }`); + throw new Error(`Missing implementation for: ${ field }`); } } exports.default = ASTDispatcher; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2FzdC1kaXNwYXRjaGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQWUsTUFBTSxhQUFOLENBQW9CO0FBQ2pDLGNBQVksU0FBWixFQUF1QixpQkFBdkIsRUFBMEM7QUFDeEMsU0FBSyxjQUFMLEdBQXNCLGlCQUF0QjtBQUNBLFNBQUssTUFBTCxHQUFjLFNBQWQ7QUFDRDtBQUNELFdBQVMsT0FBVCxFQUFrQjtBQUNoQixRQUFJLFdBQVcsS0FBSyxNQUFMLEdBQWMsUUFBUSxJQUFyQztBQUNBLFFBQUksT0FBTyxLQUFLLFFBQUwsQ0FBUCxLQUEwQixVQUE5QixFQUEwQztBQUN4QyxhQUFPLEtBQUssUUFBTCxFQUFlLE9BQWYsQ0FBUDtBQUNELEtBRkQsTUFFTyxJQUFJLENBQUMsS0FBSyxjQUFWLEVBQTBCO0FBQy9CLGFBQU8sT0FBUDtBQUNEO0FBQ0QsVUFBTSxJQUFJLEtBQUosQ0FBVyxnQ0FBOEIsUUFBUyxHQUFsRCxDQUFOO0FBQ0Q7QUFiZ0M7a0JBQWQsYSIsImZpbGUiOiJhc3QtZGlzcGF0Y2hlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFTVERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3RvcihwcmVmaXhfMTYsIGVycm9ySWZNaXNzaW5nXzE3KSB7XG4gICAgdGhpcy5lcnJvcklmTWlzc2luZyA9IGVycm9ySWZNaXNzaW5nXzE3O1xuICAgIHRoaXMucHJlZml4ID0gcHJlZml4XzE2O1xuICB9XG4gIGRpc3BhdGNoKHRlcm1fMTgpIHtcbiAgICBsZXQgZmllbGRfMTkgPSB0aGlzLnByZWZpeCArIHRlcm1fMTgudHlwZTtcbiAgICBpZiAodHlwZW9mIHRoaXNbZmllbGRfMTldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0aGlzW2ZpZWxkXzE5XSh0ZXJtXzE4KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmVycm9ySWZNaXNzaW5nKSB7XG4gICAgICByZXR1cm4gdGVybV8xODtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGltcGxlbWVudGF0aW9uIGZvcjogJHtmaWVsZF8xOX1gKTtcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3QtZGlzcGF0Y2hlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFlLE1BQU0sYUFBTixDQUFvQjtBQUNqQyxjQUFZLE1BQVosRUFBb0IsY0FBcEIsRUFBb0M7QUFDbEMsU0FBSyxjQUFMLEdBQXNCLGNBQXRCO0FBQ0EsU0FBSyxNQUFMLEdBQWMsTUFBZDtBQUNEOztBQUVELFdBQVMsSUFBVCxFQUFlO0FBQ2IsUUFBSSxRQUFRLEtBQUssTUFBTCxHQUFjLEtBQUssSUFBL0I7QUFDQSxRQUFJLE9BQU8sS0FBSyxLQUFMLENBQVAsS0FBdUIsVUFBM0IsRUFBdUM7QUFDckMsYUFBTyxLQUFLLEtBQUwsRUFBWSxJQUFaLENBQVA7QUFDRCxLQUZELE1BRU8sSUFBSSxDQUFDLEtBQUssY0FBVixFQUEwQjtBQUMvQixhQUFPLElBQVA7QUFDRDtBQUNELFVBQU0sSUFBSSxLQUFKLENBQVcsZ0NBQThCLEtBQU0sR0FBL0MsQ0FBTjtBQUNEO0FBZGdDO2tCQUFkLGEiLCJmaWxlIjoiYXN0LWRpc3BhdGNoZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IocHJlZml4LCBlcnJvcklmTWlzc2luZykge1xuICAgIHRoaXMuZXJyb3JJZk1pc3NpbmcgPSBlcnJvcklmTWlzc2luZztcbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgfVxuXG4gIGRpc3BhdGNoKHRlcm0pIHtcbiAgICBsZXQgZmllbGQgPSB0aGlzLnByZWZpeCArIHRlcm0udHlwZTtcbiAgICBpZiAodHlwZW9mIHRoaXNbZmllbGRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpc1tmaWVsZF0odGVybSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5lcnJvcklmTWlzc2luZykge1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBmb3I6ICR7ZmllbGR9YCk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/binding-map.js b/dist/binding-map.js index 57e0adbf..a07f99a7 100644 --- a/dist/binding-map.js +++ b/dist/binding-map.js @@ -10,49 +10,73 @@ var _errors = require("./errors"); var _ramdaFantasy = require("ramda-fantasy"); -var _syntax = require("./syntax"); - class BindingMap { constructor() { this._map = new Map(); } - add(stx_20, _ref) { + + // given a syntax object and a binding, + // add the binding to the map associating the binding with the syntax object's + // scope set + add(stx, _ref) { let binding = _ref.binding; let phase = _ref.phase; var _ref$skipDup = _ref.skipDup; let skipDup = _ref$skipDup === undefined ? false : _ref$skipDup; - let stxName_21 = stx_20.val(); - let allScopeset_22 = stx_20.scopesets.all; - let scopeset_23 = stx_20.scopesets.phase.has(phase) ? stx_20.scopesets.phase.get(phase) : (0, _immutable.List)(); - scopeset_23 = allScopeset_22.concat(scopeset_23); + let stxName = stx.val(); + let allScopeset = stx.scopesets.all; + let scopeset = stx.scopesets.phase.has(phase) ? stx.scopesets.phase.get(phase) : (0, _immutable.List)(); + scopeset = allScopeset.concat(scopeset); (0, _errors.assert)(phase != null, "must provide a phase for binding add"); - if (this._map.has(stxName_21)) { - let scopesetBindingList = this._map.get(stxName_21); - if (skipDup && scopesetBindingList.some(s_24 => s_24.scopes.equals(scopeset_23))) { + + if (this._map.has(stxName)) { + let scopesetBindingList = this._map.get(stxName); + if (skipDup && scopesetBindingList.some(s => s.scopes.equals(scopeset))) { return; } - this._map.set(stxName_21, scopesetBindingList.push({ scopes: scopeset_23, binding: binding, alias: _ramdaFantasy.Maybe.Nothing() })); + this._map.set(stxName, scopesetBindingList.push({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.Nothing() + })); } else { - this._map.set(stxName_21, _immutable.List.of({ scopes: scopeset_23, binding: binding, alias: _ramdaFantasy.Maybe.Nothing() })); + this._map.set(stxName, _immutable.List.of({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.Nothing() + })); } } - addForward(stx_25, forwardStx_26, binding_27, phase_28) { - let stxName_29 = stx_25.token.value; - let allScopeset_30 = stx_25.scopesets.all; - let scopeset_31 = stx_25.scopesets.phase.has(phase_28) ? stx_25.scopesets.phase.get(phase_28) : (0, _immutable.List)(); - scopeset_31 = allScopeset_30.concat(scopeset_31); - (0, _errors.assert)(phase_28 != null, "must provide a phase for binding add"); - if (this._map.has(stxName_29)) { - let scopesetBindingList = this._map.get(stxName_29); - this._map.set(stxName_29, scopesetBindingList.push({ scopes: scopeset_31, binding: binding_27, alias: _ramdaFantasy.Maybe.of(forwardStx_26) })); + + addForward(stx, forwardStx, binding, phase) { + let stxName = stx.token.value; + let allScopeset = stx.scopesets.all; + let scopeset = stx.scopesets.phase.has(phase) ? stx.scopesets.phase.get(phase) : (0, _immutable.List)(); + scopeset = allScopeset.concat(scopeset); + (0, _errors.assert)(phase != null, "must provide a phase for binding add"); + + if (this._map.has(stxName)) { + let scopesetBindingList = this._map.get(stxName); + this._map.set(stxName, scopesetBindingList.push({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.of(forwardStx) + })); } else { - this._map.set(stxName_29, _immutable.List.of({ scopes: scopeset_31, binding: binding_27, alias: _ramdaFantasy.Maybe.of(forwardStx_26) })); + this._map.set(stxName, _immutable.List.of({ + scopes: scopeset, + binding: binding, + alias: _ramdaFantasy.Maybe.of(forwardStx) + })); } } - get(stx_32) { - return this._map.get(stx_32.token.value); + + // Syntax -> ?List<{ scopes: ScopeSet, binding: Binding }> + get(stx) { + return this._map.get(stx.token.value); } + } exports.default = BindingMap; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2JpbmRpbmctbWFwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNlLE1BQU0sVUFBTixDQUFpQjtBQUM5QixnQkFBYztBQUNaLFNBQUssSUFBTCxHQUFZLElBQUksR0FBSixFQUFaO0FBQ0Q7QUFDRCxNQUFJLE1BQUosUUFBK0M7QUFBQSxRQUFsQyxPQUFrQyxRQUFsQyxPQUFrQztBQUFBLFFBQXpCLEtBQXlCLFFBQXpCLEtBQXlCO0FBQUEsNEJBQWxCLE9BQWtCO0FBQUEsUUFBbEIsT0FBa0IsZ0NBQVIsS0FBUTs7QUFDN0MsUUFBSSxhQUFhLE9BQU8sR0FBUCxFQUFqQjtBQUNBLFFBQUksaUJBQWlCLE9BQU8sU0FBUCxDQUFpQixHQUF0QztBQUNBLFFBQUksY0FBYyxPQUFPLFNBQVAsQ0FBaUIsS0FBakIsQ0FBdUIsR0FBdkIsQ0FBMkIsS0FBM0IsSUFBb0MsT0FBTyxTQUFQLENBQWlCLEtBQWpCLENBQXVCLEdBQXZCLENBQTJCLEtBQTNCLENBQXBDLEdBQXdFLHNCQUExRjtBQUNBLGtCQUFjLGVBQWUsTUFBZixDQUFzQixXQUF0QixDQUFkO0FBQ0Esd0JBQU8sU0FBUyxJQUFoQixFQUFzQixzQ0FBdEI7QUFDQSxRQUFJLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxVQUFkLENBQUosRUFBK0I7QUFDN0IsVUFBSSxzQkFBc0IsS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLFVBQWQsQ0FBMUI7QUFDQSxVQUFJLFdBQVcsb0JBQW9CLElBQXBCLENBQXlCLFFBQVEsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixXQUFuQixDQUFqQyxDQUFmLEVBQWtGO0FBQ2hGO0FBQ0Q7QUFDRCxXQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxFQUEwQixvQkFBb0IsSUFBcEIsQ0FBeUIsRUFBQyxRQUFRLFdBQVQsRUFBc0IsU0FBUyxPQUEvQixFQUF3QyxPQUFPLG9CQUFNLE9BQU4sRUFBL0MsRUFBekIsQ0FBMUI7QUFDRCxLQU5ELE1BTU87QUFDTCxXQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxFQUEwQixnQkFBSyxFQUFMLENBQVEsRUFBQyxRQUFRLFdBQVQsRUFBc0IsU0FBUyxPQUEvQixFQUF3QyxPQUFPLG9CQUFNLE9BQU4sRUFBL0MsRUFBUixDQUExQjtBQUNEO0FBQ0Y7QUFDRCxhQUFXLE1BQVgsRUFBbUIsYUFBbkIsRUFBa0MsVUFBbEMsRUFBOEMsUUFBOUMsRUFBd0Q7QUFDdEQsUUFBSSxhQUFhLE9BQU8sS0FBUCxDQUFhLEtBQTlCO0FBQ0EsUUFBSSxpQkFBaUIsT0FBTyxTQUFQLENBQWlCLEdBQXRDO0FBQ0EsUUFBSSxjQUFjLE9BQU8sU0FBUCxDQUFpQixLQUFqQixDQUF1QixHQUF2QixDQUEyQixRQUEzQixJQUF1QyxPQUFPLFNBQVAsQ0FBaUIsS0FBakIsQ0FBdUIsR0FBdkIsQ0FBMkIsUUFBM0IsQ0FBdkMsR0FBOEUsc0JBQWhHO0FBQ0Esa0JBQWMsZUFBZSxNQUFmLENBQXNCLFdBQXRCLENBQWQ7QUFDQSx3QkFBTyxZQUFZLElBQW5CLEVBQXlCLHNDQUF6QjtBQUNBLFFBQUksS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLFVBQWQsQ0FBSixFQUErQjtBQUM3QixVQUFJLHNCQUFzQixLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxDQUExQjtBQUNBLFdBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxVQUFkLEVBQTBCLG9CQUFvQixJQUFwQixDQUF5QixFQUFDLFFBQVEsV0FBVCxFQUFzQixTQUFTLFVBQS9CLEVBQTJDLE9BQU8sb0JBQU0sRUFBTixDQUFTLGFBQVQsQ0FBbEQsRUFBekIsQ0FBMUI7QUFDRCxLQUhELE1BR087QUFDTCxXQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsVUFBZCxFQUEwQixnQkFBSyxFQUFMLENBQVEsRUFBQyxRQUFRLFdBQVQsRUFBc0IsU0FBUyxVQUEvQixFQUEyQyxPQUFPLG9CQUFNLEVBQU4sQ0FBUyxhQUFULENBQWxELEVBQVIsQ0FBMUI7QUFDRDtBQUNGO0FBQ0QsTUFBSSxNQUFKLEVBQVk7QUFDVixXQUFPLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxPQUFPLEtBQVAsQ0FBYSxLQUEzQixDQUFQO0FBQ0Q7QUFuQzZCO2tCQUFYLFUiLCJmaWxlIjoiYmluZGluZy1tYXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3R9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCB7ZXhwZWN0LCBhc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtNYXliZX0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmltcG9ydCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCaW5kaW5nTWFwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fbWFwID0gbmV3IE1hcDtcbiAgfVxuICBhZGQoc3R4XzIwLCB7YmluZGluZywgcGhhc2UsIHNraXBEdXAgPSBmYWxzZX0pIHtcbiAgICBsZXQgc3R4TmFtZV8yMSA9IHN0eF8yMC52YWwoKTtcbiAgICBsZXQgYWxsU2NvcGVzZXRfMjIgPSBzdHhfMjAuc2NvcGVzZXRzLmFsbDtcbiAgICBsZXQgc2NvcGVzZXRfMjMgPSBzdHhfMjAuc2NvcGVzZXRzLnBoYXNlLmhhcyhwaGFzZSkgPyBzdHhfMjAuc2NvcGVzZXRzLnBoYXNlLmdldChwaGFzZSkgOiBMaXN0KCk7XG4gICAgc2NvcGVzZXRfMjMgPSBhbGxTY29wZXNldF8yMi5jb25jYXQoc2NvcGVzZXRfMjMpO1xuICAgIGFzc2VydChwaGFzZSAhPSBudWxsLCBcIm11c3QgcHJvdmlkZSBhIHBoYXNlIGZvciBiaW5kaW5nIGFkZFwiKTtcbiAgICBpZiAodGhpcy5fbWFwLmhhcyhzdHhOYW1lXzIxKSkge1xuICAgICAgbGV0IHNjb3Blc2V0QmluZGluZ0xpc3QgPSB0aGlzLl9tYXAuZ2V0KHN0eE5hbWVfMjEpO1xuICAgICAgaWYgKHNraXBEdXAgJiYgc2NvcGVzZXRCaW5kaW5nTGlzdC5zb21lKHNfMjQgPT4gc18yNC5zY29wZXMuZXF1YWxzKHNjb3Blc2V0XzIzKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbWFwLnNldChzdHhOYW1lXzIxLCBzY29wZXNldEJpbmRpbmdMaXN0LnB1c2goe3Njb3Blczogc2NvcGVzZXRfMjMsIGJpbmRpbmc6IGJpbmRpbmcsIGFsaWFzOiBNYXliZS5Ob3RoaW5nKCl9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZV8yMSwgTGlzdC5vZih7c2NvcGVzOiBzY29wZXNldF8yMywgYmluZGluZzogYmluZGluZywgYWxpYXM6IE1heWJlLk5vdGhpbmcoKX0pKTtcbiAgICB9XG4gIH1cbiAgYWRkRm9yd2FyZChzdHhfMjUsIGZvcndhcmRTdHhfMjYsIGJpbmRpbmdfMjcsIHBoYXNlXzI4KSB7XG4gICAgbGV0IHN0eE5hbWVfMjkgPSBzdHhfMjUudG9rZW4udmFsdWU7XG4gICAgbGV0IGFsbFNjb3Blc2V0XzMwID0gc3R4XzI1LnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHNjb3Blc2V0XzMxID0gc3R4XzI1LnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2VfMjgpID8gc3R4XzI1LnNjb3Blc2V0cy5waGFzZS5nZXQocGhhc2VfMjgpIDogTGlzdCgpO1xuICAgIHNjb3Blc2V0XzMxID0gYWxsU2NvcGVzZXRfMzAuY29uY2F0KHNjb3Blc2V0XzMxKTtcbiAgICBhc3NlcnQocGhhc2VfMjggIT0gbnVsbCwgXCJtdXN0IHByb3ZpZGUgYSBwaGFzZSBmb3IgYmluZGluZyBhZGRcIik7XG4gICAgaWYgKHRoaXMuX21hcC5oYXMoc3R4TmFtZV8yOSkpIHtcbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gdGhpcy5fbWFwLmdldChzdHhOYW1lXzI5KTtcbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZV8yOSwgc2NvcGVzZXRCaW5kaW5nTGlzdC5wdXNoKHtzY29wZXM6IHNjb3Blc2V0XzMxLCBiaW5kaW5nOiBiaW5kaW5nXzI3LCBhbGlhczogTWF5YmUub2YoZm9yd2FyZFN0eF8yNil9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZV8yOSwgTGlzdC5vZih7c2NvcGVzOiBzY29wZXNldF8zMSwgYmluZGluZzogYmluZGluZ18yNywgYWxpYXM6IE1heWJlLm9mKGZvcndhcmRTdHhfMjYpfSkpO1xuICAgIH1cbiAgfVxuICBnZXQoc3R4XzMyKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcC5nZXQoc3R4XzMyLnRva2VuLnZhbHVlKTtcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,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VDtBQUhzQixPQUFSLENBQXZCO0FBS0Q7QUFFRjs7QUFFRDtBQUNBLE1BQUksR0FBSixFQUFTO0FBQ1AsV0FBTyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsSUFBSSxLQUFKLENBQVUsS0FBeEIsQ0FBUDtBQUNEOztBQTdENkI7a0JBQVgsVSIsImZpbGUiOiJiaW5kaW5nLW1hcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IE1heWJlIH0gZnJvbSAncmFtZGEtZmFudGFzeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJpbmRpbmdNYXAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvLyBnaXZlbiBhIHN5bnRheCBvYmplY3QgYW5kIGEgYmluZGluZyxcbiAgLy8gYWRkIHRoZSBiaW5kaW5nIHRvIHRoZSBtYXAgYXNzb2NpYXRpbmcgdGhlIGJpbmRpbmcgd2l0aCB0aGUgc3ludGF4IG9iamVjdCdzXG4gIC8vIHNjb3BlIHNldFxuICBhZGQoc3R4LCB7IGJpbmRpbmcsIHBoYXNlLCBza2lwRHVwID0gZmFsc2UgfSkge1xuICAgIGxldCBzdHhOYW1lID0gc3R4LnZhbCgpO1xuICAgIGxldCBhbGxTY29wZXNldCA9IHN0eC5zY29wZXNldHMuYWxsO1xuICAgIGxldCBzY29wZXNldCA9IHN0eC5zY29wZXNldHMucGhhc2UuaGFzKHBoYXNlKSA/IHN0eC5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlKSA6IExpc3QoKTtcbiAgICBzY29wZXNldCA9IGFsbFNjb3Blc2V0LmNvbmNhdChzY29wZXNldCk7XG4gICAgYXNzZXJ0KHBoYXNlICE9IG51bGwsIFwibXVzdCBwcm92aWRlIGEgcGhhc2UgZm9yIGJpbmRpbmcgYWRkXCIpO1xuXG4gICAgaWYgKHRoaXMuX21hcC5oYXMoc3R4TmFtZSkpIHtcbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gdGhpcy5fbWFwLmdldChzdHhOYW1lKTtcbiAgICAgIGlmIChza2lwRHVwICYmIHNjb3Blc2V0QmluZGluZ0xpc3Quc29tZShzID0+IHMuc2NvcGVzLmVxdWFscyhzY29wZXNldCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21hcC5zZXQoc3R4TmFtZSwgc2NvcGVzZXRCaW5kaW5nTGlzdC5wdXNoKHtcbiAgICAgICAgc2NvcGVzOiBzY29wZXNldCxcbiAgICAgICAgYmluZGluZzogYmluZGluZyxcbiAgICAgICAgYWxpYXM6IE1heWJlLk5vdGhpbmcoKVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXAuc2V0KHN0eE5hbWUsIExpc3Qub2Yoe1xuICAgICAgICBzY29wZXM6IHNjb3Blc2V0LFxuICAgICAgICBiaW5kaW5nOiBiaW5kaW5nLFxuICAgICAgICBhbGlhczogTWF5YmUuTm90aGluZygpXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgYWRkRm9yd2FyZChzdHgsIGZvcndhcmRTdHgsIGJpbmRpbmcsIHBoYXNlKSB7XG4gICAgbGV0IHN0eE5hbWUgPSBzdHgudG9rZW4udmFsdWU7XG4gICAgbGV0IGFsbFNjb3Blc2V0ID0gc3R4LnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHNjb3Blc2V0ID0gc3R4LnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2UpID8gc3R4LnNjb3Blc2V0cy5waGFzZS5nZXQocGhhc2UpIDogTGlzdCgpO1xuICAgIHNjb3Blc2V0ID0gYWxsU2NvcGVzZXQuY29uY2F0KHNjb3Blc2V0KTtcbiAgICBhc3NlcnQocGhhc2UgIT0gbnVsbCwgXCJtdXN0IHByb3ZpZGUgYSBwaGFzZSBmb3IgYmluZGluZyBhZGRcIik7XG5cbiAgICBpZiAodGhpcy5fbWFwLmhhcyhzdHhOYW1lKSkge1xuICAgICAgbGV0IHNjb3Blc2V0QmluZGluZ0xpc3QgPSB0aGlzLl9tYXAuZ2V0KHN0eE5hbWUpO1xuICAgICAgdGhpcy5fbWFwLnNldChzdHhOYW1lLCBzY29wZXNldEJpbmRpbmdMaXN0LnB1c2goe1xuICAgICAgICBzY29wZXM6IHNjb3Blc2V0LFxuICAgICAgICBiaW5kaW5nOiBiaW5kaW5nLFxuICAgICAgICBhbGlhczogTWF5YmUub2YoZm9yd2FyZFN0eClcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWFwLnNldChzdHhOYW1lLCBMaXN0Lm9mKHtcbiAgICAgICAgc2NvcGVzOiBzY29wZXNldCxcbiAgICAgICAgYmluZGluZzogYmluZGluZyxcbiAgICAgICAgYWxpYXM6IE1heWJlLm9mKGZvcndhcmRTdHgpXG4gICAgICB9KSk7XG4gICAgfVxuXG4gIH1cblxuICAvLyBTeW50YXggLT4gP0xpc3Q8eyBzY29wZXM6IFNjb3BlU2V0LCBiaW5kaW5nOiBCaW5kaW5nIH0+XG4gIGdldChzdHgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwLmdldChzdHgudG9rZW4udmFsdWUpO1xuICB9XG5cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/compiler.js b/dist/compiler.js index 2be7637b..5893a789 100644 --- a/dist/compiler.js +++ b/dist/compiler.js @@ -1,22 +1,18 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var _immutable = require("immutable"); - -var _termExpander = require("./term-expander.js"); +var _termExpander = require('./term-expander.js'); var _termExpander2 = _interopRequireDefault(_termExpander); -var _tokenExpander = require("./token-expander"); +var _tokenExpander = require('./token-expander'); var _tokenExpander2 = _interopRequireDefault(_tokenExpander); -var _scope = require("./scope"); - -var _ramda = require("ramda"); +var _ramda = require('ramda'); var _ = _interopRequireWildcard(_ramda); @@ -25,17 +21,27 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class Compiler { - constructor(phase_33, env_34, store_35, context_36) { - this.phase = phase_33; - this.env = env_34; - this.store = store_35; - this.context = context_36; + constructor(phase, env, store, context) { + this.phase = phase; + this.env = env; + this.store = store; + this.context = context; } - compile(stxl_37) { - let tokenExpander_38 = new _tokenExpander2.default(_.merge(this.context, { phase: this.phase, env: this.env, store: this.store })); - let termExpander_39 = new _termExpander2.default(_.merge(this.context, { phase: this.phase, env: this.env, store: this.store })); - return _.pipe(_.bind(tokenExpander_38.expand, tokenExpander_38), _.map(t_40 => termExpander_39.expand(t_40)))(stxl_37); + + compile(stxl) { + let tokenExpander = new _tokenExpander2.default(_.merge(this.context, { + phase: this.phase, + env: this.env, + store: this.store + })); + let termExpander = new _termExpander2.default(_.merge(this.context, { + phase: this.phase, + env: this.env, + store: this.store + })); + + return _.pipe(_.bind(tokenExpander.expand, tokenExpander), _.map(t => termExpander.expand(t)))(stxl); } } exports.default = Compiler; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2NvbXBpbGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7SUFBYSxDOzs7Ozs7QUFDRSxNQUFNLFFBQU4sQ0FBZTtBQUM1QixjQUFZLFFBQVosRUFBc0IsTUFBdEIsRUFBOEIsUUFBOUIsRUFBd0MsVUFBeEMsRUFBb0Q7QUFDbEQsU0FBSyxLQUFMLEdBQWEsUUFBYjtBQUNBLFNBQUssR0FBTCxHQUFXLE1BQVg7QUFDQSxTQUFLLEtBQUwsR0FBYSxRQUFiO0FBQ0EsU0FBSyxPQUFMLEdBQWUsVUFBZjtBQUNEO0FBQ0QsVUFBUSxPQUFSLEVBQWlCO0FBQ2YsUUFBSSxtQkFBbUIsNEJBQWtCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQixFQUFDLE9BQU8sS0FBSyxLQUFiLEVBQW9CLEtBQUssS0FBSyxHQUE5QixFQUFtQyxPQUFPLEtBQUssS0FBL0MsRUFBdEIsQ0FBbEIsQ0FBdkI7QUFDQSxRQUFJLGtCQUFrQiwyQkFBaUIsRUFBRSxLQUFGLENBQVEsS0FBSyxPQUFiLEVBQXNCLEVBQUMsT0FBTyxLQUFLLEtBQWIsRUFBb0IsS0FBSyxLQUFLLEdBQTlCLEVBQW1DLE9BQU8sS0FBSyxLQUEvQyxFQUF0QixDQUFqQixDQUF0QjtBQUNBLFdBQU8sRUFBRSxJQUFGLENBQU8sRUFBRSxJQUFGLENBQU8saUJBQWlCLE1BQXhCLEVBQWdDLGdCQUFoQyxDQUFQLEVBQTBELEVBQUUsR0FBRixDQUFNLFFBQVEsZ0JBQWdCLE1BQWhCLENBQXVCLElBQXZCLENBQWQsQ0FBMUQsRUFBdUcsT0FBdkcsQ0FBUDtBQUNEO0FBWDJCO2tCQUFULFEiLCJmaWxlIjoiY29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3R9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlci5qc1wiO1xuaW1wb3J0IFRva2VuRXhwYW5kZXIgZnJvbSBcIi4vdG9rZW4tZXhwYW5kZXJcIjtcbmltcG9ydCB7U2NvcGUsIGZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgICogYXMgXyBmcm9tIFwicmFtZGFcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBpbGVyIHtcbiAgY29uc3RydWN0b3IocGhhc2VfMzMsIGVudl8zNCwgc3RvcmVfMzUsIGNvbnRleHRfMzYpIHtcbiAgICB0aGlzLnBoYXNlID0gcGhhc2VfMzM7XG4gICAgdGhpcy5lbnYgPSBlbnZfMzQ7XG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlXzM1O1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRfMzY7XG4gIH1cbiAgY29tcGlsZShzdHhsXzM3KSB7XG4gICAgbGV0IHRva2VuRXhwYW5kZXJfMzggPSBuZXcgVG9rZW5FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge3BoYXNlOiB0aGlzLnBoYXNlLCBlbnY6IHRoaXMuZW52LCBzdG9yZTogdGhpcy5zdG9yZX0pKTtcbiAgICBsZXQgdGVybUV4cGFuZGVyXzM5ID0gbmV3IFRlcm1FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge3BoYXNlOiB0aGlzLnBoYXNlLCBlbnY6IHRoaXMuZW52LCBzdG9yZTogdGhpcy5zdG9yZX0pKTtcbiAgICByZXR1cm4gXy5waXBlKF8uYmluZCh0b2tlbkV4cGFuZGVyXzM4LmV4cGFuZCwgdG9rZW5FeHBhbmRlcl8zOCksIF8ubWFwKHRfNDAgPT4gdGVybUV4cGFuZGVyXzM5LmV4cGFuZCh0XzQwKSkpKHN0eGxfMzcpO1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21waWxlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7O0lBQVksQzs7Ozs7O0FBR0csTUFBTSxRQUFOLENBQWU7QUFDNUIsY0FBWSxLQUFaLEVBQW1CLEdBQW5CLEVBQXdCLEtBQXhCLEVBQStCLE9BQS9CLEVBQXdDO0FBQ3RDLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0EsU0FBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLFNBQUssT0FBTCxHQUFlLE9BQWY7QUFDRDs7QUFFRCxVQUFRLElBQVIsRUFBYztBQUNaLFFBQUksZ0JBQWdCLDRCQUFrQixFQUFFLEtBQUYsQ0FBUSxLQUFLLE9BQWIsRUFBc0I7QUFDMUQsYUFBTyxLQUFLLEtBRDhDO0FBRTFELFdBQUssS0FBSyxHQUZnRDtBQUcxRCxhQUFPLEtBQUs7QUFIOEMsS0FBdEIsQ0FBbEIsQ0FBcEI7QUFLQSxRQUFJLGVBQWUsMkJBQWlCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQjtBQUN4RCxhQUFPLEtBQUssS0FENEM7QUFFeEQsV0FBSyxLQUFLLEdBRjhDO0FBR3hELGFBQU8sS0FBSztBQUg0QyxLQUF0QixDQUFqQixDQUFuQjs7QUFNQSxXQUFPLEVBQUUsSUFBRixDQUNMLEVBQUUsSUFBRixDQUFPLGNBQWMsTUFBckIsRUFBNkIsYUFBN0IsQ0FESyxFQUVMLEVBQUUsR0FBRixDQUFNLEtBQUssYUFBYSxNQUFiLENBQW9CLENBQXBCLENBQVgsQ0FGSyxFQUdMLElBSEssQ0FBUDtBQUlEO0FBeEIyQjtrQkFBVCxRIiwiZmlsZSI6ImNvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlcm1FeHBhbmRlciBmcm9tIFwiLi90ZXJtLWV4cGFuZGVyLmpzXCI7XG5pbXBvcnQgVG9rZW5FeHBhbmRlciBmcm9tICcuL3Rva2VuLWV4cGFuZGVyJztcbmltcG9ydCAqIGFzIF8gZnJvbSAncmFtZGEnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBpbGVyIHtcbiAgY29uc3RydWN0b3IocGhhc2UsIGVudiwgc3RvcmUsIGNvbnRleHQpIHtcbiAgICB0aGlzLnBoYXNlID0gcGhhc2U7XG4gICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICBjb21waWxlKHN0eGwpIHtcbiAgICBsZXQgdG9rZW5FeHBhbmRlciA9IG5ldyBUb2tlbkV4cGFuZGVyKF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7XG4gICAgICBwaGFzZTogdGhpcy5waGFzZSxcbiAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICBzdG9yZTogdGhpcy5zdG9yZVxuICAgIH0pKTtcbiAgICBsZXQgdGVybUV4cGFuZGVyID0gbmV3IFRlcm1FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge1xuICAgICAgcGhhc2U6IHRoaXMucGhhc2UsXG4gICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgc3RvcmU6IHRoaXMuc3RvcmVcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gXy5waXBlKFxuICAgICAgXy5iaW5kKHRva2VuRXhwYW5kZXIuZXhwYW5kLCB0b2tlbkV4cGFuZGVyKSxcbiAgICAgIF8ubWFwKHQgPT4gdGVybUV4cGFuZGVyLmV4cGFuZCh0KSlcbiAgICApKHN0eGwpO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/enforester.js b/dist/enforester.js index cbb36991..15310e67 100644 --- a/dist/enforester.js +++ b/dist/enforester.js @@ -33,775 +33,995 @@ var _macroContext2 = _interopRequireDefault(_macroContext); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const Just_41 = _ramdaFantasy.Maybe.Just; -const Nothing_42 = _ramdaFantasy.Maybe.Nothing; -const EXPR_LOOP_OPERATOR_43 = {}; -const EXPR_LOOP_NO_CHANGE_44 = {}; -const EXPR_LOOP_EXPANSION_45 = {}; -class Enforester_46 { - constructor(stxl_47, prev_48, context_49) { +const Just = _ramdaFantasy.Maybe.Just; +const Nothing = _ramdaFantasy.Maybe.Nothing; + +const EXPR_LOOP_OPERATOR = {}; +const EXPR_LOOP_NO_CHANGE = {}; +const EXPR_LOOP_EXPANSION = {}; + +class Enforester { + constructor(stxl, prev, context) { this.done = false; - (0, _errors.assert)(_immutable.List.isList(stxl_47), "expecting a list of terms to enforest"); - (0, _errors.assert)(_immutable.List.isList(prev_48), "expecting a list of terms to enforest"); - (0, _errors.assert)(context_49, "expecting a context to enforest"); + (0, _errors.assert)(_immutable.List.isList(stxl), "expecting a list of terms to enforest"); + (0, _errors.assert)(_immutable.List.isList(prev), "expecting a list of terms to enforest"); + (0, _errors.assert)(context, "expecting a context to enforest"); this.term = null; - this.rest = stxl_47; - this.prev = prev_48; - this.context = context_49; + + this.rest = stxl; + this.prev = prev; + + this.context = context; } + peek() { - let n_50 = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + let n = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - return this.rest.get(n_50); + return this.rest.get(n); } + advance() { - let ret_51 = this.rest.first(); + let ret = this.rest.first(); this.rest = this.rest.rest(); - return ret_51; + return ret; } + + /* + enforest works over: + prev - a list of the previously enforest Terms + term - the current term being enforested (initially null) + rest - remaining Terms to enforest + */ enforest() { - let type_52 = arguments.length <= 0 || arguments[0] === undefined ? "Module" : arguments[0]; + let type = arguments.length <= 0 || arguments[0] === undefined ? "Module" : arguments[0]; + // initialize the term this.term = null; + if (this.rest.size === 0) { this.done = true; return this.term; } + if (this.isEOF(this.peek())) { this.term = new _terms2.default("EOF", {}); this.advance(); return this.term; } - let result_53; - if (type_52 === "expression") { - result_53 = this.enforestExpressionLoop(); + + let result; + if (type === "expression") { + result = this.enforestExpressionLoop(); } else { - result_53 = this.enforestModule(); + result = this.enforestModule(); } + if (this.rest.size === 0) { this.done = true; } - return result_53; + return result; } + enforestModule() { return this.enforestBody(); } + enforestBody() { return this.enforestModuleItem(); } + enforestModuleItem() { - let lookahead_54 = this.peek(); - if (this.isKeyword(lookahead_54, "import")) { + let lookahead = this.peek(); + if (this.isKeyword(lookahead, 'import')) { this.advance(); return this.enforestImportDeclaration(); - } else if (this.isKeyword(lookahead_54, "export")) { + } else if (this.isKeyword(lookahead, 'export')) { this.advance(); return this.enforestExportDeclaration(); - } else if (this.isIdentifier(lookahead_54, "#")) { + } else if (this.isIdentifier(lookahead, '#')) { return this.enforestLanguagePragma(); } return this.enforestStatement(); } + enforestLanguagePragma() { - this.matchIdentifier("#"); - this.matchIdentifier("lang"); - let path_55 = this.matchStringLiteral(); + this.matchIdentifier('#'); + this.matchIdentifier('lang'); + let path = this.matchStringLiteral(); this.consumeSemicolon(); - return new _terms2.default("Pragma", { kind: "lang", items: _immutable.List.of(path_55) }); + return new _terms2.default('Pragma', { + kind: 'lang', + items: _immutable.List.of(path) + }); } + enforestExportDeclaration() { - let lookahead_56 = this.peek(); - if (this.isPunctuator(lookahead_56, "*")) { + let lookahead = this.peek(); + if (this.isPunctuator(lookahead, '*')) { this.advance(); let moduleSpecifier = this.enforestFromClause(); - return new _terms2.default("ExportAllFrom", { moduleSpecifier: moduleSpecifier }); - } else if (this.isBraces(lookahead_56)) { + return new _terms2.default('ExportAllFrom', { moduleSpecifier: moduleSpecifier }); + } else if (this.isBraces(lookahead)) { let namedExports = this.enforestExportClause(); let moduleSpecifier = null; - if (this.isIdentifier(this.peek(), "from")) { + if (this.isIdentifier(this.peek(), 'from')) { moduleSpecifier = this.enforestFromClause(); } - return new _terms2.default("ExportFrom", { namedExports: namedExports, moduleSpecifier: moduleSpecifier }); - } else if (this.isKeyword(lookahead_56, "class")) { - return new _terms2.default("Export", { declaration: this.enforestClass({ isExpr: false }) }); - } else if (this.isFnDeclTransform(lookahead_56)) { - return new _terms2.default("Export", { declaration: this.enforestFunction({ isExpr: false, inDefault: false }) }); - } else if (this.isKeyword(lookahead_56, "default")) { + return new _terms2.default('ExportFrom', { namedExports: namedExports, moduleSpecifier: moduleSpecifier }); + } else if (this.isKeyword(lookahead, 'class')) { + return new _terms2.default('Export', { + declaration: this.enforestClass({ isExpr: false }) + }); + } else if (this.isFnDeclTransform(lookahead)) { + return new _terms2.default('Export', { + declaration: this.enforestFunction({ isExpr: false, inDefault: false }) + }); + } else if (this.isKeyword(lookahead, 'default')) { this.advance(); if (this.isFnDeclTransform(this.peek())) { - return new _terms2.default("ExportDefault", { body: this.enforestFunction({ isExpr: false, inDefault: true }) }); - } else if (this.isKeyword(this.peek(), "class")) { - return new _terms2.default("ExportDefault", { body: this.enforestClass({ isExpr: false, inDefault: true }) }); + return new _terms2.default('ExportDefault', { + body: this.enforestFunction({ isExpr: false, inDefault: true }) + }); + } else if (this.isKeyword(this.peek(), 'class')) { + return new _terms2.default('ExportDefault', { + body: this.enforestClass({ isExpr: false, inDefault: true }) + }); } else { let body = this.enforestExpressionLoop(); this.consumeSemicolon(); - return new _terms2.default("ExportDefault", { body: body }); + return new _terms2.default('ExportDefault', { body: body }); } - } else if (this.isVarDeclTransform(lookahead_56) || this.isLetDeclTransform(lookahead_56) || this.isConstDeclTransform(lookahead_56) || this.isSyntaxrecDeclTransform(lookahead_56) || this.isSyntaxDeclTransform(lookahead_56)) { - return new _terms2.default("Export", { declaration: this.enforestVariableDeclaration() }); + } else if (this.isVarDeclTransform(lookahead) || this.isLetDeclTransform(lookahead) || this.isConstDeclTransform(lookahead) || this.isSyntaxrecDeclTransform(lookahead) || this.isSyntaxDeclTransform(lookahead)) { + return new _terms2.default('Export', { + declaration: this.enforestVariableDeclaration() + }); } - throw this.createError(lookahead_56, "unexpected syntax"); + throw this.createError(lookahead, 'unexpected syntax'); } + enforestExportClause() { - let enf_57 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - let result_58 = []; - while (enf_57.rest.size !== 0) { - result_58.push(enf_57.enforestExportSpecifier()); - enf_57.consumeComma(); + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + let result = []; + while (enf.rest.size !== 0) { + result.push(enf.enforestExportSpecifier()); + enf.consumeComma(); } - return (0, _immutable.List)(result_58); + return (0, _immutable.List)(result); } + enforestExportSpecifier() { - let name_59 = this.enforestIdentifier(); - if (this.isIdentifier(this.peek(), "as")) { + let name = this.enforestIdentifier(); + if (this.isIdentifier(this.peek(), 'as')) { this.advance(); let exportedName = this.enforestIdentifier(); - return new _terms2.default("ExportSpecifier", { name: name_59, exportedName: exportedName }); + return new _terms2.default('ExportSpecifier', { name: name, exportedName: exportedName }); } - return new _terms2.default("ExportSpecifier", { name: null, exportedName: name_59 }); + return new _terms2.default('ExportSpecifier', { + name: null, + exportedName: name + }); } + enforestImportDeclaration() { - let lookahead_60 = this.peek(); - let defaultBinding_61 = null; - let namedImports_62 = (0, _immutable.List)(); - let forSyntax_63 = false; - if (this.isStringLiteral(lookahead_60)) { + let lookahead = this.peek(); + let defaultBinding = null; + let namedImports = (0, _immutable.List)(); + let forSyntax = false; + + if (this.isStringLiteral(lookahead)) { let moduleSpecifier = this.advance(); this.consumeSemicolon(); - return new _terms2.default("Import", { defaultBinding: defaultBinding_61, namedImports: namedImports_62, moduleSpecifier: moduleSpecifier }); + return new _terms2.default('Import', { + defaultBinding: defaultBinding, + namedImports: namedImports, + moduleSpecifier: moduleSpecifier, + forSyntax: forSyntax + }); } - if (this.isIdentifier(lookahead_60) || this.isKeyword(lookahead_60)) { - defaultBinding_61 = this.enforestBindingIdentifier(); - if (!this.isPunctuator(this.peek(), ",")) { + + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead)) { + defaultBinding = this.enforestBindingIdentifier(); + if (!this.isPunctuator(this.peek(), ',')) { let moduleSpecifier = this.enforestFromClause(); - if (this.isKeyword(this.peek(), "for") && this.isIdentifier(this.peek(1), "syntax")) { + if (this.isKeyword(this.peek(), 'for') && this.isIdentifier(this.peek(1), 'syntax')) { this.advance(); this.advance(); - forSyntax_63 = true; + forSyntax = true; } - return new _terms2.default("Import", { defaultBinding: defaultBinding_61, moduleSpecifier: moduleSpecifier, namedImports: (0, _immutable.List)(), forSyntax: forSyntax_63 }); + + return new _terms2.default('Import', { + defaultBinding: defaultBinding, moduleSpecifier: moduleSpecifier, + namedImports: (0, _immutable.List)(), + forSyntax: forSyntax + }); } } this.consumeComma(); - lookahead_60 = this.peek(); - if (this.isBraces(lookahead_60)) { + lookahead = this.peek(); + if (this.isBraces(lookahead)) { let imports = this.enforestNamedImports(); let fromClause = this.enforestFromClause(); - if (this.isKeyword(this.peek(), "for") && this.isIdentifier(this.peek(1), "syntax")) { + if (this.isKeyword(this.peek(), 'for') && this.isIdentifier(this.peek(1), 'syntax')) { this.advance(); this.advance(); - forSyntax_63 = true; + forSyntax = true; } - return new _terms2.default("Import", { defaultBinding: defaultBinding_61, forSyntax: forSyntax_63, namedImports: imports, moduleSpecifier: fromClause }); - } else if (this.isPunctuator(lookahead_60, "*")) { + + return new _terms2.default("Import", { + defaultBinding: defaultBinding, + forSyntax: forSyntax, + namedImports: imports, + moduleSpecifier: fromClause + + }); + } else if (this.isPunctuator(lookahead, '*')) { let namespaceBinding = this.enforestNamespaceBinding(); let moduleSpecifier = this.enforestFromClause(); - if (this.isKeyword(this.peek(), "for") && this.isIdentifier(this.peek(1), "syntax")) { + if (this.isKeyword(this.peek(), 'for') && this.isIdentifier(this.peek(1), 'syntax')) { this.advance(); this.advance(); - forSyntax_63 = true; + forSyntax = true; } - return new _terms2.default("ImportNamespace", { defaultBinding: defaultBinding_61, forSyntax: forSyntax_63, namespaceBinding: namespaceBinding, moduleSpecifier: moduleSpecifier }); + return new _terms2.default('ImportNamespace', { + defaultBinding: defaultBinding, forSyntax: forSyntax, namespaceBinding: namespaceBinding, moduleSpecifier: moduleSpecifier + }); } - throw this.createError(lookahead_60, "unexpected syntax"); + throw this.createError(lookahead, 'unexpected syntax'); } + enforestNamespaceBinding() { - this.matchPunctuator("*"); - this.matchIdentifier("as"); + this.matchPunctuator('*'); + this.matchIdentifier('as'); return this.enforestBindingIdentifier(); } + enforestNamedImports() { - let enf_64 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - let result_65 = []; - while (enf_64.rest.size !== 0) { - result_65.push(enf_64.enforestImportSpecifiers()); - enf_64.consumeComma(); + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + let result = []; + while (enf.rest.size !== 0) { + result.push(enf.enforestImportSpecifiers()); + enf.consumeComma(); } - return (0, _immutable.List)(result_65); + return (0, _immutable.List)(result); } + enforestImportSpecifiers() { - let lookahead_66 = this.peek(); - let name_67; - if (this.isIdentifier(lookahead_66) || this.isKeyword(lookahead_66)) { - name_67 = this.advance(); - if (!this.isIdentifier(this.peek(), "as")) { - return new _terms2.default("ImportSpecifier", { name: null, binding: new _terms2.default("BindingIdentifier", { name: name_67 }) }); + let lookahead = this.peek(); + let name; + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead)) { + name = this.advance(); + if (!this.isIdentifier(this.peek(), 'as')) { + return new _terms2.default('ImportSpecifier', { + name: null, + binding: new _terms2.default('BindingIdentifier', { + name: name + }) + }); } else { - this.matchIdentifier("as"); + this.matchIdentifier('as'); } } else { - throw this.createError(lookahead_66, "unexpected token in import specifier"); + throw this.createError(lookahead, 'unexpected token in import specifier'); } - return new _terms2.default("ImportSpecifier", { name: name_67, binding: this.enforestBindingIdentifier() }); + return new _terms2.default('ImportSpecifier', { + name: name, binding: this.enforestBindingIdentifier() + }); } + enforestFromClause() { - this.matchIdentifier("from"); - let lookahead_68 = this.matchStringLiteral(); + this.matchIdentifier('from'); + let lookahead = this.matchStringLiteral(); this.consumeSemicolon(); - return lookahead_68; + return lookahead; } + enforestStatementListItem() { - let lookahead_69 = this.peek(); - if (this.isFnDeclTransform(lookahead_69)) { + let lookahead = this.peek(); + + if (this.isFnDeclTransform(lookahead)) { return this.enforestFunctionDeclaration({ isExpr: false }); - } else if (this.isKeyword(lookahead_69, "class")) { + } else if (this.isKeyword(lookahead, 'class')) { return this.enforestClass({ isExpr: false }); } else { return this.enforestStatement(); } } + enforestStatement() { - let lookahead_70 = this.peek(); - if (this.term === null && this.isCompiletimeTransform(lookahead_70)) { + let lookahead = this.peek(); + + if (this.term === null && this.isCompiletimeTransform(lookahead)) { this.expandMacro(); - lookahead_70 = this.peek(); + lookahead = this.peek(); } - if (this.term === null && this.isTerm(lookahead_70)) { + + if (this.term === null && this.isTerm(lookahead)) { + // TODO: check that this is actually an statement return this.advance(); } - if (this.term === null && this.isBraces(lookahead_70)) { + + if (this.term === null && this.isBraces(lookahead)) { return this.enforestBlockStatement(); } - if (this.term === null && this.isWhileTransform(lookahead_70)) { + + if (this.term === null && this.isWhileTransform(lookahead)) { return this.enforestWhileStatement(); } - if (this.term === null && this.isIfTransform(lookahead_70)) { + + if (this.term === null && this.isIfTransform(lookahead)) { return this.enforestIfStatement(); } - if (this.term === null && this.isForTransform(lookahead_70)) { + if (this.term === null && this.isForTransform(lookahead)) { return this.enforestForStatement(); } - if (this.term === null && this.isSwitchTransform(lookahead_70)) { + if (this.term === null && this.isSwitchTransform(lookahead)) { return this.enforestSwitchStatement(); } - if (this.term === null && this.isBreakTransform(lookahead_70)) { + if (this.term === null && this.isBreakTransform(lookahead)) { return this.enforestBreakStatement(); } - if (this.term === null && this.isContinueTransform(lookahead_70)) { + if (this.term === null && this.isContinueTransform(lookahead)) { return this.enforestContinueStatement(); } - if (this.term === null && this.isDoTransform(lookahead_70)) { + if (this.term === null && this.isDoTransform(lookahead)) { return this.enforestDoStatement(); } - if (this.term === null && this.isDebuggerTransform(lookahead_70)) { + if (this.term === null && this.isDebuggerTransform(lookahead)) { return this.enforestDebuggerStatement(); } - if (this.term === null && this.isWithTransform(lookahead_70)) { + if (this.term === null && this.isWithTransform(lookahead)) { return this.enforestWithStatement(); } - if (this.term === null && this.isTryTransform(lookahead_70)) { + if (this.term === null && this.isTryTransform(lookahead)) { return this.enforestTryStatement(); } - if (this.term === null && this.isThrowTransform(lookahead_70)) { + if (this.term === null && this.isThrowTransform(lookahead)) { return this.enforestThrowStatement(); } - if (this.term === null && this.isKeyword(lookahead_70, "class")) { + + // TODO: put somewhere else + if (this.term === null && this.isKeyword(lookahead, "class")) { return this.enforestClass({ isExpr: false }); } - if (this.term === null && this.isFnDeclTransform(lookahead_70)) { + + if (this.term === null && this.isFnDeclTransform(lookahead)) { return this.enforestFunctionDeclaration(); } - if (this.term === null && this.isIdentifier(lookahead_70) && this.isPunctuator(this.peek(1), ":")) { + + if (this.term === null && this.isIdentifier(lookahead) && this.isPunctuator(this.peek(1), ':')) { return this.enforestLabeledStatement(); } - if (this.term === null && (this.isVarDeclTransform(lookahead_70) || this.isLetDeclTransform(lookahead_70) || this.isConstDeclTransform(lookahead_70) || this.isSyntaxrecDeclTransform(lookahead_70) || this.isSyntaxDeclTransform(lookahead_70))) { - let stmt = new _terms2.default("VariableDeclarationStatement", { declaration: this.enforestVariableDeclaration() }); + + if (this.term === null && (this.isVarDeclTransform(lookahead) || this.isLetDeclTransform(lookahead) || this.isConstDeclTransform(lookahead) || this.isSyntaxrecDeclTransform(lookahead) || this.isSyntaxDeclTransform(lookahead))) { + let stmt = new _terms2.default('VariableDeclarationStatement', { + declaration: this.enforestVariableDeclaration() + }); this.consumeSemicolon(); return stmt; } - if (this.term === null && this.isReturnStmtTransform(lookahead_70)) { + + if (this.term === null && this.isReturnStmtTransform(lookahead)) { return this.enforestReturnStatement(); } - if (this.term === null && this.isPunctuator(lookahead_70, ";")) { + + if (this.term === null && this.isPunctuator(lookahead, ";")) { this.advance(); return new _terms2.default("EmptyStatement", {}); } + return this.enforestExpressionStatement(); } + enforestLabeledStatement() { - let label_71 = this.matchIdentifier(); - let punc_72 = this.matchPunctuator(":"); - let stmt_73 = this.enforestStatement(); - return new _terms2.default("LabeledStatement", { label: label_71, body: stmt_73 }); + let label = this.matchIdentifier(); + this.matchPunctuator(':'); + let stmt = this.enforestStatement(); + + return new _terms2.default('LabeledStatement', { + label: label, + body: stmt + }); } + enforestBreakStatement() { - this.matchKeyword("break"); - let lookahead_74 = this.peek(); - let label_75 = null; - if (this.rest.size === 0 || this.isPunctuator(lookahead_74, ";")) { + this.matchKeyword('break'); + let lookahead = this.peek(); + let label = null; + if (this.rest.size === 0 || this.isPunctuator(lookahead, ';')) { this.consumeSemicolon(); - return new _terms2.default("BreakStatement", { label: label_75 }); + return new _terms2.default('BreakStatement', { label: label }); } - if (this.isIdentifier(lookahead_74) || this.isKeyword(lookahead_74, "yield") || this.isKeyword(lookahead_74, "let")) { - label_75 = this.enforestIdentifier(); + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'yield') || this.isKeyword(lookahead, 'let')) { + label = this.enforestIdentifier(); } this.consumeSemicolon(); - return new _terms2.default("BreakStatement", { label: label_75 }); + + return new _terms2.default('BreakStatement', { label: label }); } + enforestTryStatement() { - this.matchKeyword("try"); - let body_76 = this.enforestBlock(); - if (this.isKeyword(this.peek(), "catch")) { + this.matchKeyword('try'); + let body = this.enforestBlock(); + if (this.isKeyword(this.peek(), 'catch')) { let catchClause = this.enforestCatchClause(); - if (this.isKeyword(this.peek(), "finally")) { + if (this.isKeyword(this.peek(), 'finally')) { this.advance(); let finalizer = this.enforestBlock(); - return new _terms2.default("TryFinallyStatement", { body: body_76, catchClause: catchClause, finalizer: finalizer }); + return new _terms2.default('TryFinallyStatement', { + body: body, catchClause: catchClause, finalizer: finalizer + }); } - return new _terms2.default("TryCatchStatement", { body: body_76, catchClause: catchClause }); + return new _terms2.default('TryCatchStatement', { body: body, catchClause: catchClause }); } - if (this.isKeyword(this.peek(), "finally")) { + if (this.isKeyword(this.peek(), 'finally')) { this.advance(); let finalizer = this.enforestBlock(); - return new _terms2.default("TryFinallyStatement", { body: body_76, catchClause: null, finalizer: finalizer }); + return new _terms2.default('TryFinallyStatement', { body: body, catchClause: null, finalizer: finalizer }); } - throw this.createError(this.peek(), "try with no catch or finally"); + throw this.createError(this.peek(), 'try with no catch or finally'); } + enforestCatchClause() { - this.matchKeyword("catch"); - let bindingParens_77 = this.matchParens(); - let enf_78 = new Enforester_46(bindingParens_77, (0, _immutable.List)(), this.context); - let binding_79 = enf_78.enforestBindingTarget(); - let body_80 = this.enforestBlock(); - return new _terms2.default("CatchClause", { binding: binding_79, body: body_80 }); + this.matchKeyword('catch'); + let bindingParens = this.matchParens(); + let enf = new Enforester(bindingParens, (0, _immutable.List)(), this.context); + let binding = enf.enforestBindingTarget(); + let body = this.enforestBlock(); + return new _terms2.default('CatchClause', { binding: binding, body: body }); } + enforestThrowStatement() { - this.matchKeyword("throw"); - let expression_81 = this.enforestExpression(); + this.matchKeyword('throw'); + let expression = this.enforestExpression(); this.consumeSemicolon(); - return new _terms2.default("ThrowStatement", { expression: expression_81 }); + return new _terms2.default('ThrowStatement', { expression: expression }); } + enforestWithStatement() { - this.matchKeyword("with"); - let objParens_82 = this.matchParens(); - let enf_83 = new Enforester_46(objParens_82, (0, _immutable.List)(), this.context); - let object_84 = enf_83.enforestExpression(); - let body_85 = this.enforestStatement(); - return new _terms2.default("WithStatement", { object: object_84, body: body_85 }); + this.matchKeyword('with'); + let objParens = this.matchParens(); + let enf = new Enforester(objParens, (0, _immutable.List)(), this.context); + let object = enf.enforestExpression(); + let body = this.enforestStatement(); + return new _terms2.default('WithStatement', { object: object, body: body }); } + enforestDebuggerStatement() { - this.matchKeyword("debugger"); - return new _terms2.default("DebuggerStatement", {}); + this.matchKeyword('debugger'); + + return new _terms2.default('DebuggerStatement', {}); } + enforestDoStatement() { - this.matchKeyword("do"); - let body_86 = this.enforestStatement(); - this.matchKeyword("while"); - let testBody_87 = this.matchParens(); - let enf_88 = new Enforester_46(testBody_87, (0, _immutable.List)(), this.context); - let test_89 = enf_88.enforestExpression(); + this.matchKeyword('do'); + let body = this.enforestStatement(); + this.matchKeyword('while'); + let testBody = this.matchParens(); + let enf = new Enforester(testBody, (0, _immutable.List)(), this.context); + let test = enf.enforestExpression(); this.consumeSemicolon(); - return new _terms2.default("DoWhileStatement", { body: body_86, test: test_89 }); + return new _terms2.default('DoWhileStatement', { body: body, test: test }); } + enforestContinueStatement() { - let kwd_90 = this.matchKeyword("continue"); - let lookahead_91 = this.peek(); - let label_92 = null; - if (this.rest.size === 0 || this.isPunctuator(lookahead_91, ";")) { + let kwd = this.matchKeyword('continue'); + let lookahead = this.peek(); + let label = null; + if (this.rest.size === 0 || this.isPunctuator(lookahead, ';')) { this.consumeSemicolon(); - return new _terms2.default("ContinueStatement", { label: label_92 }); + return new _terms2.default('ContinueStatement', { label: label }); } - if (this.lineNumberEq(kwd_90, lookahead_91) && (this.isIdentifier(lookahead_91) || this.isKeyword(lookahead_91, "yield") || this.isKeyword(lookahead_91, "let"))) { - label_92 = this.enforestIdentifier(); + if (this.lineNumberEq(kwd, lookahead) && (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'yield') || this.isKeyword(lookahead, 'let'))) { + label = this.enforestIdentifier(); } this.consumeSemicolon(); - return new _terms2.default("ContinueStatement", { label: label_92 }); + + return new _terms2.default('ContinueStatement', { label: label }); } + enforestSwitchStatement() { - this.matchKeyword("switch"); - let cond_93 = this.matchParens(); - let enf_94 = new Enforester_46(cond_93, (0, _immutable.List)(), this.context); - let discriminant_95 = enf_94.enforestExpression(); - let body_96 = this.matchCurlies(); - if (body_96.size === 0) { - return new _terms2.default("SwitchStatement", { discriminant: discriminant_95, cases: (0, _immutable.List)() }); - } - enf_94 = new Enforester_46(body_96, (0, _immutable.List)(), this.context); - let cases_97 = enf_94.enforestSwitchCases(); - let lookahead_98 = enf_94.peek(); - if (enf_94.isKeyword(lookahead_98, "default")) { - let defaultCase = enf_94.enforestSwitchDefault(); - let postDefaultCases = enf_94.enforestSwitchCases(); - return new _terms2.default("SwitchStatementWithDefault", { discriminant: discriminant_95, preDefaultCases: cases_97, defaultCase: defaultCase, postDefaultCases: postDefaultCases }); - } - return new _terms2.default("SwitchStatement", { discriminant: discriminant_95, cases: cases_97 }); + this.matchKeyword('switch'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let discriminant = enf.enforestExpression(); + let body = this.matchCurlies(); + + if (body.size === 0) { + return new _terms2.default('SwitchStatement', { + discriminant: discriminant, + cases: (0, _immutable.List)() + }); + } + enf = new Enforester(body, (0, _immutable.List)(), this.context); + let cases = enf.enforestSwitchCases(); + let lookahead = enf.peek(); + if (enf.isKeyword(lookahead, 'default')) { + let defaultCase = enf.enforestSwitchDefault(); + let postDefaultCases = enf.enforestSwitchCases(); + return new _terms2.default('SwitchStatementWithDefault', { + discriminant: discriminant, + preDefaultCases: cases, + defaultCase: defaultCase, + postDefaultCases: postDefaultCases + }); + } + return new _terms2.default('SwitchStatement', { discriminant: discriminant, cases: cases }); } + enforestSwitchCases() { - let cases_99 = []; - while (!(this.rest.size === 0 || this.isKeyword(this.peek(), "default"))) { - cases_99.push(this.enforestSwitchCase()); + let cases = []; + while (!(this.rest.size === 0 || this.isKeyword(this.peek(), 'default'))) { + cases.push(this.enforestSwitchCase()); } - return (0, _immutable.List)(cases_99); + return (0, _immutable.List)(cases); } + enforestSwitchCase() { - this.matchKeyword("case"); - return new _terms2.default("SwitchCase", { test: this.enforestExpression(), consequent: this.enforestSwitchCaseBody() }); + this.matchKeyword('case'); + return new _terms2.default('SwitchCase', { + test: this.enforestExpression(), + consequent: this.enforestSwitchCaseBody() + }); } + enforestSwitchCaseBody() { - this.matchPunctuator(":"); + this.matchPunctuator(':'); return this.enforestStatementListInSwitchCaseBody(); } + enforestStatementListInSwitchCaseBody() { - let result_100 = []; - while (!(this.rest.size === 0 || this.isKeyword(this.peek(), "default") || this.isKeyword(this.peek(), "case"))) { - result_100.push(this.enforestStatementListItem()); + let result = []; + while (!(this.rest.size === 0 || this.isKeyword(this.peek(), 'default') || this.isKeyword(this.peek(), 'case'))) { + result.push(this.enforestStatementListItem()); } - return (0, _immutable.List)(result_100); + return (0, _immutable.List)(result); } + enforestSwitchDefault() { - this.matchKeyword("default"); - return new _terms2.default("SwitchDefault", { consequent: this.enforestSwitchCaseBody() }); + this.matchKeyword('default'); + return new _terms2.default('SwitchDefault', { + consequent: this.enforestSwitchCaseBody() + }); } + enforestForStatement() { - this.matchKeyword("for"); - let cond_101 = this.matchParens(); - let enf_102 = new Enforester_46(cond_101, (0, _immutable.List)(), this.context); - let lookahead_103, test_104, init_105, right_106, type_107, left_108, update_109; - if (enf_102.isPunctuator(enf_102.peek(), ";")) { - enf_102.advance(); - if (!enf_102.isPunctuator(enf_102.peek(), ";")) { - test_104 = enf_102.enforestExpression(); + this.matchKeyword('for'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let lookahead, test, init, right, type, left, update; + + // case where init is null + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); + if (!enf.isPunctuator(enf.peek(), ';')) { + test = enf.enforestExpression(); } - enf_102.matchPunctuator(";"); - if (enf_102.rest.size !== 0) { - right_106 = enf_102.enforestExpression(); + enf.matchPunctuator(';'); + if (enf.rest.size !== 0) { + right = enf.enforestExpression(); } - return new _terms2.default("ForStatement", { init: null, test: test_104, update: right_106, body: this.enforestStatement() }); + return new _terms2.default('ForStatement', { + init: null, + test: test, + update: right, + body: this.enforestStatement() + }); + // case where init is not null } else { - lookahead_103 = enf_102.peek(); - if (enf_102.isVarDeclTransform(lookahead_103) || enf_102.isLetDeclTransform(lookahead_103) || enf_102.isConstDeclTransform(lookahead_103)) { - init_105 = enf_102.enforestVariableDeclaration(); - lookahead_103 = enf_102.peek(); - if (this.isKeyword(lookahead_103, "in") || this.isIdentifier(lookahead_103, "of")) { - if (this.isKeyword(lookahead_103, "in")) { - enf_102.advance(); - right_106 = enf_102.enforestExpression(); - type_107 = "ForInStatement"; - } else if (this.isIdentifier(lookahead_103, "of")) { - enf_102.advance(); - right_106 = enf_102.enforestExpression(); - type_107 = "ForOfStatement"; + // testing + lookahead = enf.peek(); + if (enf.isVarDeclTransform(lookahead) || enf.isLetDeclTransform(lookahead) || enf.isConstDeclTransform(lookahead)) { + init = enf.enforestVariableDeclaration(); + lookahead = enf.peek(); + if (this.isKeyword(lookahead, 'in') || this.isIdentifier(lookahead, 'of')) { + if (this.isKeyword(lookahead, 'in')) { + enf.advance(); + right = enf.enforestExpression(); + type = 'ForInStatement'; + } else if (this.isIdentifier(lookahead, 'of')) { + enf.advance(); + right = enf.enforestExpression(); + type = 'ForOfStatement'; } - return new _terms2.default(type_107, { left: init_105, right: right_106, body: this.enforestStatement() }); + return new _terms2.default(type, { + left: init, right: right, body: this.enforestStatement() + }); } - enf_102.matchPunctuator(";"); - if (enf_102.isPunctuator(enf_102.peek(), ";")) { - enf_102.advance(); - test_104 = null; + enf.matchPunctuator(';'); + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); + test = null; } else { - test_104 = enf_102.enforestExpression(); - enf_102.matchPunctuator(";"); + test = enf.enforestExpression(); + enf.matchPunctuator(';'); } - update_109 = enf_102.enforestExpression(); + update = enf.enforestExpression(); } else { - if (this.isKeyword(enf_102.peek(1), "in") || this.isIdentifier(enf_102.peek(1), "of")) { - left_108 = enf_102.enforestBindingIdentifier(); - let kind = enf_102.advance(); - if (this.isKeyword(kind, "in")) { - type_107 = "ForInStatement"; + if (this.isKeyword(enf.peek(1), 'in') || this.isIdentifier(enf.peek(1), 'of')) { + left = enf.enforestBindingIdentifier(); + let kind = enf.advance(); + if (this.isKeyword(kind, 'in')) { + type = 'ForInStatement'; } else { - type_107 = "ForOfStatement"; + type = 'ForOfStatement'; } - right_106 = enf_102.enforestExpression(); - return new _terms2.default(type_107, { left: left_108, right: right_106, body: this.enforestStatement() }); + right = enf.enforestExpression(); + return new _terms2.default(type, { + left: left, right: right, body: this.enforestStatement() + }); } - init_105 = enf_102.enforestExpression(); - enf_102.matchPunctuator(";"); - if (enf_102.isPunctuator(enf_102.peek(), ";")) { - enf_102.advance(); - test_104 = null; + init = enf.enforestExpression(); + enf.matchPunctuator(';'); + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); + test = null; } else { - test_104 = enf_102.enforestExpression(); - enf_102.matchPunctuator(";"); + test = enf.enforestExpression(); + enf.matchPunctuator(';'); } - update_109 = enf_102.enforestExpression(); + update = enf.enforestExpression(); } - return new _terms2.default("ForStatement", { init: init_105, test: test_104, update: update_109, body: this.enforestStatement() }); + return new _terms2.default('ForStatement', { init: init, test: test, update: update, body: this.enforestStatement() }); } } + enforestIfStatement() { - this.matchKeyword("if"); - let cond_110 = this.matchParens(); - let enf_111 = new Enforester_46(cond_110, (0, _immutable.List)(), this.context); - let lookahead_112 = enf_111.peek(); - let test_113 = enf_111.enforestExpression(); - if (test_113 === null) { - throw enf_111.createError(lookahead_112, "expecting an expression"); - } - let consequent_114 = this.enforestStatement(); - let alternate_115 = null; - if (this.isKeyword(this.peek(), "else")) { + this.matchKeyword('if'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let lookahead = enf.peek(); + let test = enf.enforestExpression(); + if (test === null) { + throw enf.createError(lookahead, 'expecting an expression'); + } + let consequent = this.enforestStatement(); + let alternate = null; + if (this.isKeyword(this.peek(), 'else')) { this.advance(); - alternate_115 = this.enforestStatement(); + alternate = this.enforestStatement(); } - return new _terms2.default("IfStatement", { test: test_113, consequent: consequent_114, alternate: alternate_115 }); + return new _terms2.default('IfStatement', { test: test, consequent: consequent, alternate: alternate }); } + enforestWhileStatement() { - this.matchKeyword("while"); - let cond_116 = this.matchParens(); - let enf_117 = new Enforester_46(cond_116, (0, _immutable.List)(), this.context); - let lookahead_118 = enf_117.peek(); - let test_119 = enf_117.enforestExpression(); - if (test_119 === null) { - throw enf_117.createError(lookahead_118, "expecting an expression"); + this.matchKeyword('while'); + let cond = this.matchParens(); + let enf = new Enforester(cond, (0, _immutable.List)(), this.context); + let lookahead = enf.peek(); + let test = enf.enforestExpression(); + if (test === null) { + throw enf.createError(lookahead, 'expecting an expression'); } - let body_120 = this.enforestStatement(); - return new _terms2.default("WhileStatement", { test: test_119, body: body_120 }); + let body = this.enforestStatement(); + + return new _terms2.default('WhileStatement', { test: test, body: body }); } + enforestBlockStatement() { - return new _terms2.default("BlockStatement", { block: this.enforestBlock() }); + return new _terms2.default('BlockStatement', { + block: this.enforestBlock() + }); } + enforestBlock() { - return new _terms2.default("Block", { statements: this.matchCurlies() }); + return new _terms2.default('Block', { + statements: this.matchCurlies() + }); } + enforestClass(_ref) { let isExpr = _ref.isExpr; let inDefault = _ref.inDefault; - let kw_121 = this.advance(); - let name_122 = null, - supr_123 = null; - let type_124 = isExpr ? "ClassExpression" : "ClassDeclaration"; + let kw = this.advance(); + let name = null, + supr = null; + let type = isExpr ? 'ClassExpression' : 'ClassDeclaration'; + if (this.isIdentifier(this.peek())) { - name_122 = this.enforestBindingIdentifier(); + name = this.enforestBindingIdentifier(); } else if (!isExpr) { if (inDefault) { - name_122 = new _terms2.default("BindingIdentifier", { name: _syntax2.default.fromIdentifier("_default", kw_121) }); + name = new _terms2.default('BindingIdentifier', { + name: _syntax2.default.fromIdentifier('_default', kw) + }); } else { - throw this.createError(this.peek(), "unexpected syntax"); + throw this.createError(this.peek(), 'unexpected syntax'); } } - if (this.isKeyword(this.peek(), "extends")) { + + if (this.isKeyword(this.peek(), 'extends')) { this.advance(); - supr_123 = this.enforestExpressionLoop(); + supr = this.enforestExpressionLoop(); } - let elements_125 = []; - let enf_126 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - while (enf_126.rest.size !== 0) { - if (enf_126.isPunctuator(enf_126.peek(), ";")) { - enf_126.advance(); + + let elements = []; + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + while (enf.rest.size !== 0) { + if (enf.isPunctuator(enf.peek(), ';')) { + enf.advance(); continue; } + let isStatic = false; - var _enf_126$enforestMeth = enf_126.enforestMethodDefinition(); + var _enf$enforestMethodDe = enf.enforestMethodDefinition(); - let methodOrKey = _enf_126$enforestMeth.methodOrKey; - let kind = _enf_126$enforestMeth.kind; + let methodOrKey = _enf$enforestMethodDe.methodOrKey; + let kind = _enf$enforestMethodDe.kind; - if (kind === "identifier" && methodOrKey.value.val() === "static") { + if (kind === 'identifier' && methodOrKey.value.val() === 'static') { isStatic = true; - var _enf_126$enforestMeth2 = enf_126.enforestMethodDefinition(); + var _enf$enforestMethodDe2 = enf.enforestMethodDefinition(); - methodOrKey = _enf_126$enforestMeth2.methodOrKey; - kind = _enf_126$enforestMeth2.kind; + methodOrKey = _enf$enforestMethodDe2.methodOrKey; + kind = _enf$enforestMethodDe2.kind; } - if (kind === "method") { - elements_125.push(new _terms2.default("ClassElement", { isStatic: isStatic, method: methodOrKey })); + if (kind === 'method') { + elements.push(new _terms2.default('ClassElement', { isStatic: isStatic, method: methodOrKey })); } else { - throw this.createError(enf_126.peek(), "Only methods are allowed in classes"); + throw this.createError(enf.peek(), "Only methods are allowed in classes"); } } - return new _terms2.default(type_124, { name: name_122, super: supr_123, elements: (0, _immutable.List)(elements_125) }); + + return new _terms2.default(type, { + name: name, super: supr, + elements: (0, _immutable.List)(elements) + }); } + enforestBindingTarget() { var _ref2 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; let allowPunctuator = _ref2.allowPunctuator; - let lookahead_127 = this.peek(); - if (this.isIdentifier(lookahead_127) || this.isKeyword(lookahead_127) || allowPunctuator && this.isPunctuator(lookahead_127)) { + let lookahead = this.peek(); + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead) || allowPunctuator && this.isPunctuator(lookahead)) { return this.enforestBindingIdentifier({ allowPunctuator: allowPunctuator }); - } else if (this.isBrackets(lookahead_127)) { + } else if (this.isBrackets(lookahead)) { return this.enforestArrayBinding(); - } else if (this.isBraces(lookahead_127)) { + } else if (this.isBraces(lookahead)) { return this.enforestObjectBinding(); } - (0, _errors.assert)(false, "not implemented yet"); + (0, _errors.assert)(false, 'not implemented yet'); } + enforestObjectBinding() { - let enf_128 = new Enforester_46(this.matchCurlies(), (0, _immutable.List)(), this.context); - let properties_129 = []; - while (enf_128.rest.size !== 0) { - properties_129.push(enf_128.enforestBindingProperty()); - enf_128.consumeComma(); + let enf = new Enforester(this.matchCurlies(), (0, _immutable.List)(), this.context); + let properties = []; + while (enf.rest.size !== 0) { + properties.push(enf.enforestBindingProperty()); + enf.consumeComma(); } - return new _terms2.default("ObjectBinding", { properties: (0, _immutable.List)(properties_129) }); + + return new _terms2.default('ObjectBinding', { + properties: (0, _immutable.List)(properties) + }); } + enforestBindingProperty() { - let lookahead_130 = this.peek(); + let lookahead = this.peek(); var _enforestPropertyName = this.enforestPropertyName(); let name = _enforestPropertyName.name; let binding = _enforestPropertyName.binding; - if (this.isIdentifier(lookahead_130) || this.isKeyword(lookahead_130, "let") || this.isKeyword(lookahead_130, "yield")) { - if (!this.isPunctuator(this.peek(), ":")) { + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'let') || this.isKeyword(lookahead, 'yield')) { + if (!this.isPunctuator(this.peek(), ':')) { let defaultValue = null; if (this.isAssign(this.peek())) { this.advance(); let expr = this.enforestExpressionLoop(); defaultValue = expr; } - return new _terms2.default("BindingPropertyIdentifier", { binding: binding, init: defaultValue }); + return new _terms2.default('BindingPropertyIdentifier', { + binding: binding, init: defaultValue + }); } } - this.matchPunctuator(":"); + this.matchPunctuator(':'); binding = this.enforestBindingElement(); - return new _terms2.default("BindingPropertyProperty", { name: name, binding: binding }); + return new _terms2.default('BindingPropertyProperty', { + name: name, binding: binding + }); } + enforestArrayBinding() { - let bracket_131 = this.matchSquares(); - let enf_132 = new Enforester_46(bracket_131, (0, _immutable.List)(), this.context); - let elements_133 = [], - restElement_134 = null; - while (enf_132.rest.size !== 0) { + let bracket = this.matchSquares(); + let enf = new Enforester(bracket, (0, _immutable.List)(), this.context); + let elements = [], + restElement = null; + while (enf.rest.size !== 0) { let el; - if (enf_132.isPunctuator(enf_132.peek(), ",")) { - enf_132.consumeComma(); + if (enf.isPunctuator(enf.peek(), ',')) { + enf.consumeComma(); el = null; } else { - if (enf_132.isPunctuator(enf_132.peek(), "...")) { - enf_132.advance(); - restElement_134 = enf_132.enforestBindingTarget(); + if (enf.isPunctuator(enf.peek(), '...')) { + enf.advance(); + restElement = enf.enforestBindingTarget(); break; } else { - el = enf_132.enforestBindingElement(); + el = enf.enforestBindingElement(); } - enf_132.consumeComma(); + enf.consumeComma(); } - elements_133.push(el); + elements.push(el); } - return new _terms2.default("ArrayBinding", { elements: (0, _immutable.List)(elements_133), restElement: restElement_134 }); + return new _terms2.default('ArrayBinding', { + elements: (0, _immutable.List)(elements), + restElement: restElement + }); } + enforestBindingElement() { - let binding_135 = this.enforestBindingTarget(); + let binding = this.enforestBindingTarget(); + if (this.isAssign(this.peek())) { this.advance(); let init = this.enforestExpressionLoop(); - binding_135 = new _terms2.default("BindingWithDefault", { binding: binding_135, init: init }); + binding = new _terms2.default('BindingWithDefault', { binding: binding, init: init }); } - return binding_135; + return binding; } + enforestBindingIdentifier() { var _ref3 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; let allowPunctuator = _ref3.allowPunctuator; - let name_136; + let name; if (allowPunctuator && this.isPunctuator(this.peek())) { - name_136 = this.enforestPunctuator(); + name = this.enforestPunctuator(); } else { - name_136 = this.enforestIdentifier(); + name = this.enforestIdentifier(); } - return new _terms2.default("BindingIdentifier", { name: name_136 }); + return new _terms2.default("BindingIdentifier", { name: name }); } + enforestPunctuator() { - let lookahead_137 = this.peek(); - if (this.isPunctuator(lookahead_137)) { + let lookahead = this.peek(); + if (this.isPunctuator(lookahead)) { return this.advance(); } - throw this.createError(lookahead_137, "expecting a punctuator"); + throw this.createError(lookahead, "expecting a punctuator"); } + enforestIdentifier() { - let lookahead_138 = this.peek(); - if (this.isIdentifier(lookahead_138) || this.isKeyword(lookahead_138)) { + let lookahead = this.peek(); + if (this.isIdentifier(lookahead) || this.isKeyword(lookahead)) { return this.advance(); } - throw this.createError(lookahead_138, "expecting an identifier"); + throw this.createError(lookahead, "expecting an identifier"); } + enforestReturnStatement() { - let kw_139 = this.advance(); - let lookahead_140 = this.peek(); - if (this.rest.size === 0 || lookahead_140 && !this.lineNumberEq(kw_139, lookahead_140)) { - return new _terms2.default("ReturnStatement", { expression: null }); + let kw = this.advance(); + let lookahead = this.peek(); + + // short circuit for the empty expression case + if (this.rest.size === 0 || lookahead && !this.lineNumberEq(kw, lookahead)) { + return new _terms2.default("ReturnStatement", { + expression: null + }); } - let term_141 = null; - if (!this.isPunctuator(lookahead_140, ";")) { - term_141 = this.enforestExpression(); - (0, _errors.expect)(term_141 != null, "Expecting an expression to follow return keyword", lookahead_140, this.rest); + + let term = null; + if (!this.isPunctuator(lookahead, ';')) { + term = this.enforestExpression(); + (0, _errors.expect)(term != null, "Expecting an expression to follow return keyword", lookahead, this.rest); } + this.consumeSemicolon(); - return new _terms2.default("ReturnStatement", { expression: term_141 }); + return new _terms2.default("ReturnStatement", { + expression: term + }); } + enforestVariableDeclaration() { - let kind_142; - let lookahead_143 = this.advance(); - let kindSyn_144 = lookahead_143; - let phase_145 = this.context.phase; - if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.VariableDeclTransform) { - kind_142 = "var"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.LetDeclTransform) { - kind_142 = "let"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.ConstDeclTransform) { - kind_142 = "const"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.SyntaxDeclTransform) { - kind_142 = "syntax"; - } else if (kindSyn_144 && this.context.env.get(kindSyn_144.resolve(phase_145)) === _transforms.SyntaxrecDeclTransform) { - kind_142 = "syntaxrec"; - } - let decls_146 = (0, _immutable.List)(); + let kind; + let lookahead = this.advance(); + let kindSyn = lookahead; + let phase = this.context.phase; + + if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.VariableDeclTransform) { + kind = "var"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.LetDeclTransform) { + kind = "let"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.ConstDeclTransform) { + kind = "const"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.SyntaxDeclTransform) { + kind = "syntax"; + } else if (kindSyn && this.context.env.get(kindSyn.resolve(phase)) === _transforms.SyntaxrecDeclTransform) { + kind = "syntaxrec"; + } + + let decls = (0, _immutable.List)(); + while (true) { - let term = this.enforestVariableDeclarator({ isSyntax: kind_142 === "syntax" || kind_142 === "syntaxrec" }); - let lookahead_143 = this.peek(); - decls_146 = decls_146.concat(term); - if (this.isPunctuator(lookahead_143, ",")) { + let term = this.enforestVariableDeclarator({ isSyntax: kind === "syntax" || kind === 'syntaxrec' }); + let lookahead = this.peek(); + decls = decls.concat(term); + + if (this.isPunctuator(lookahead, ",")) { this.advance(); } else { break; } } - return new _terms2.default("VariableDeclaration", { kind: kind_142, declarators: decls_146 }); + + return new _terms2.default('VariableDeclaration', { + kind: kind, + declarators: decls + }); } + enforestVariableDeclarator(_ref4) { let isSyntax = _ref4.isSyntax; - let id_147 = this.enforestBindingTarget({ allowPunctuator: isSyntax }); - let lookahead_148 = this.peek(); - let init_149, rest_150; - if (this.isPunctuator(lookahead_148, "=")) { + let id = this.enforestBindingTarget({ allowPunctuator: isSyntax }); + let lookahead = this.peek(); + + let init; + if (this.isPunctuator(lookahead, '=')) { this.advance(); - let enf = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); - init_149 = enf.enforest("expression"); + let enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); + init = enf.enforest("expression"); this.rest = enf.rest; } else { - init_149 = null; + init = null; } - return new _terms2.default("VariableDeclarator", { binding: id_147, init: init_149 }); + return new _terms2.default("VariableDeclarator", { + binding: id, + init: init + }); } + enforestExpressionStatement() { - let start_151 = this.rest.get(0); - let expr_152 = this.enforestExpression(); - if (expr_152 === null) { - throw this.createError(start_151, "not a valid expression"); + let start = this.rest.get(0); + let expr = this.enforestExpression(); + if (expr === null) { + throw this.createError(start, "not a valid expression"); } this.consumeSemicolon(); - return new _terms2.default("ExpressionStatement", { expression: expr_152 }); + + return new _terms2.default("ExpressionStatement", { + expression: expr + }); } + enforestExpression() { - let left_153 = this.enforestExpressionLoop(); - let lookahead_154 = this.peek(); - if (this.isPunctuator(lookahead_154, ",")) { + let left = this.enforestExpressionLoop(); + let lookahead = this.peek(); + if (this.isPunctuator(lookahead, ',')) { while (this.rest.size !== 0) { - if (!this.isPunctuator(this.peek(), ",")) { + if (!this.isPunctuator(this.peek(), ',')) { break; } let operator = this.advance(); let right = this.enforestExpressionLoop(); - left_153 = new _terms2.default("BinaryExpression", { left: left_153, operator: operator, right: right }); + left = new _terms2.default('BinaryExpression', { left: left, operator: operator, right: right }); } } this.term = null; - return left_153; + return left; } + enforestExpressionLoop() { this.term = null; - this.opCtx = { prec: 0, combine: x_155 => x_155, stack: (0, _immutable.List)() }; + this.opCtx = { + prec: 0, + combine: x => x, + stack: (0, _immutable.List)() + }; + do { let term = this.enforestAssignmentExpression(); - if (term === EXPR_LOOP_NO_CHANGE_44 && this.opCtx.stack.size > 0) { + // no change means we've done as much enforesting as possible + // if nothing changed, maybe we just need to pop the expr stack + if (term === EXPR_LOOP_NO_CHANGE && this.opCtx.stack.size > 0) { this.term = this.opCtx.combine(this.term); var _opCtx$stack$last = this.opCtx.stack.last(); @@ -812,399 +1032,571 @@ class Enforester_46 { this.opCtx.prec = prec; this.opCtx.combine = combine; this.opCtx.stack = this.opCtx.stack.pop(); - } else if (term === EXPR_LOOP_NO_CHANGE_44) { + } else if (term === EXPR_LOOP_NO_CHANGE) { break; - } else if (term === EXPR_LOOP_OPERATOR_43 || term === EXPR_LOOP_EXPANSION_45) { + } else if (term === EXPR_LOOP_OPERATOR || term === EXPR_LOOP_EXPANSION) { + // operator means an opCtx was pushed on the stack this.term = null; } else { this.term = term; } - } while (true); + } while (true); // get a fixpoint return this.term; } + enforestAssignmentExpression() { - let lookahead_156 = this.peek(); - if (this.term === null && this.isCompiletimeTransform(lookahead_156)) { + let lookahead = this.peek(); + + if (this.term === null && this.isCompiletimeTransform(lookahead)) { this.expandMacro(); - lookahead_156 = this.peek(); + lookahead = this.peek(); } - if (this.term === null && this.isTerm(lookahead_156)) { + + if (this.term === null && this.isTerm(lookahead)) { + // TODO: check that this is actually an expression return this.advance(); } - if (this.term === null && this.isKeyword(lookahead_156, "yield")) { + + if (this.term === null && this.isKeyword(lookahead, 'yield')) { return this.enforestYieldExpression(); } - if (this.term === null && this.isKeyword(lookahead_156, "class")) { + + if (this.term === null && this.isKeyword(lookahead, 'class')) { return this.enforestClass({ isExpr: true }); } - if (this.term === null && (this.isIdentifier(lookahead_156) || this.isParens(lookahead_156)) && this.isPunctuator(this.peek(1), "=>") && this.lineNumberEq(lookahead_156, this.peek(1))) { + if (this.term === null && (this.isIdentifier(lookahead) || this.isParens(lookahead)) && this.isPunctuator(this.peek(1), '=>') && this.lineNumberEq(lookahead, this.peek(1))) { return this.enforestArrowExpression(); } - if (this.term === null && this.isSyntaxTemplate(lookahead_156)) { + + if (this.term === null && this.isSyntaxTemplate(lookahead)) { return this.enforestSyntaxTemplate(); } - if (this.term === null && this.isSyntaxQuoteTransform(lookahead_156)) { + // syntaxQuote ` ... ` + if (this.term === null && this.isSyntaxQuoteTransform(lookahead)) { return this.enforestSyntaxQuote(); } - if (this.term === null && this.isParens(lookahead_156)) { - return new _terms2.default("ParenthesizedExpression", { inner: this.advance().inner() }); + + // ($x:expr) + if (this.term === null && this.isParens(lookahead)) { + return new _terms2.default("ParenthesizedExpression", { + inner: this.advance().inner() + }); } - if (this.term === null && (this.isKeyword(lookahead_156, "this") || this.isIdentifier(lookahead_156) || this.isKeyword(lookahead_156, "let") || this.isKeyword(lookahead_156, "yield") || this.isNumericLiteral(lookahead_156) || this.isStringLiteral(lookahead_156) || this.isTemplate(lookahead_156) || this.isBooleanLiteral(lookahead_156) || this.isNullLiteral(lookahead_156) || this.isRegularExpression(lookahead_156) || this.isFnDeclTransform(lookahead_156) || this.isBraces(lookahead_156) || this.isBrackets(lookahead_156))) { + + if (this.term === null && (this.isKeyword(lookahead, "this") || this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'let') || this.isKeyword(lookahead, 'yield') || this.isNumericLiteral(lookahead) || this.isStringLiteral(lookahead) || this.isTemplate(lookahead) || this.isBooleanLiteral(lookahead) || this.isNullLiteral(lookahead) || this.isRegularExpression(lookahead) || this.isFnDeclTransform(lookahead) || this.isBraces(lookahead) || this.isBrackets(lookahead))) { return this.enforestPrimaryExpression(); } - if (this.term === null && this.isOperator(lookahead_156)) { + + // prefix unary + if (this.term === null && this.isOperator(lookahead)) { return this.enforestUnaryExpression(); } - if (this.term === null && this.isVarBindingTransform(lookahead_156)) { - let id = this.getFromCompiletimeEnvironment(lookahead_156).id; - if (id !== lookahead_156) { + + if (this.term === null && this.isVarBindingTransform(lookahead)) { + let id = this.getFromCompiletimeEnvironment(lookahead).id; + if (id !== lookahead) { this.advance(); this.rest = _immutable.List.of(id).concat(this.rest); - return EXPR_LOOP_EXPANSION_45; + return EXPR_LOOP_EXPANSION; } } - if (this.term === null && (this.isNewTransform(lookahead_156) || this.isKeyword(lookahead_156, "super")) || this.term && (this.isPunctuator(lookahead_156, ".") && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1))) || this.isBrackets(lookahead_156) || this.isParens(lookahead_156))) { + + if (this.term === null && (this.isNewTransform(lookahead) || this.isKeyword(lookahead, 'super')) || + // and then check the cases where the term part of p is something... + this.term && ( + // $x:expr . $prop:ident + this.isPunctuator(lookahead, '.') && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1))) || + // $x:expr [ $b:expr ] + this.isBrackets(lookahead) || + // $x:expr (...) + this.isParens(lookahead))) { return this.enforestLeftHandSideExpression({ allowCall: true }); } - if (this.term && this.isTemplate(lookahead_156)) { + + // $x:id `...` + if (this.term && this.isTemplate(lookahead)) { return this.enforestTemplateLiteral(); } - if (this.term && this.isUpdateOperator(lookahead_156)) { + + // postfix unary + if (this.term && this.isUpdateOperator(lookahead)) { return this.enforestUpdateExpression(); } - if (this.term && this.isOperator(lookahead_156)) { + + // $l:expr $op:binaryOperator $r:expr + if (this.term && this.isOperator(lookahead)) { return this.enforestBinaryExpression(); } - if (this.term && this.isAssign(lookahead_156)) { + + // $x:expr = $init:expr + if (this.term && this.isAssign(lookahead)) { let binding = this.transformDestructuring(this.term); let op = this.advance(); - let enf = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); + + let enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); let init = enf.enforest("expression"); this.rest = enf.rest; - if (op.val() === "=") { - return new _terms2.default("AssignmentExpression", { binding: binding, expression: init }); + + if (op.val() === '=') { + return new _terms2.default('AssignmentExpression', { + binding: binding, + expression: init + }); } else { - return new _terms2.default("CompoundAssignmentExpression", { binding: binding, operator: op.val(), expression: init }); + return new _terms2.default('CompoundAssignmentExpression', { + binding: binding, + operator: op.val(), + expression: init + }); } } - if (this.term && this.isPunctuator(lookahead_156, "?")) { + + if (this.term && this.isPunctuator(lookahead, '?')) { return this.enforestConditionalExpression(); } - return EXPR_LOOP_NO_CHANGE_44; + + return EXPR_LOOP_NO_CHANGE; } + enforestPrimaryExpression() { - let lookahead_157 = this.peek(); - if (this.term === null && this.isKeyword(lookahead_157, "this")) { + let lookahead = this.peek(); + // $x:ThisExpression + if (this.term === null && this.isKeyword(lookahead, "this")) { return this.enforestThisExpression(); } - if (this.term === null && (this.isIdentifier(lookahead_157) || this.isKeyword(lookahead_157, "let") || this.isKeyword(lookahead_157, "yield"))) { + // $x:ident + if (this.term === null && (this.isIdentifier(lookahead) || this.isKeyword(lookahead, 'let') || this.isKeyword(lookahead, 'yield'))) { return this.enforestIdentifierExpression(); } - if (this.term === null && this.isNumericLiteral(lookahead_157)) { + if (this.term === null && this.isNumericLiteral(lookahead)) { return this.enforestNumericLiteral(); } - if (this.term === null && this.isStringLiteral(lookahead_157)) { + if (this.term === null && this.isStringLiteral(lookahead)) { return this.enforestStringLiteral(); } - if (this.term === null && this.isTemplate(lookahead_157)) { + if (this.term === null && this.isTemplate(lookahead)) { return this.enforestTemplateLiteral(); } - if (this.term === null && this.isBooleanLiteral(lookahead_157)) { + if (this.term === null && this.isBooleanLiteral(lookahead)) { return this.enforestBooleanLiteral(); } - if (this.term === null && this.isNullLiteral(lookahead_157)) { + if (this.term === null && this.isNullLiteral(lookahead)) { return this.enforestNullLiteral(); } - if (this.term === null && this.isRegularExpression(lookahead_157)) { + if (this.term === null && this.isRegularExpression(lookahead)) { return this.enforestRegularExpressionLiteral(); } - if (this.term === null && this.isFnDeclTransform(lookahead_157)) { + // $x:FunctionExpression + if (this.term === null && this.isFnDeclTransform(lookahead)) { return this.enforestFunctionExpression(); } - if (this.term === null && this.isBraces(lookahead_157)) { + // { $p:prop (,) ... } + if (this.term === null && this.isBraces(lookahead)) { return this.enforestObjectExpression(); } - if (this.term === null && this.isBrackets(lookahead_157)) { + // [$x:expr (,) ...] + if (this.term === null && this.isBrackets(lookahead)) { return this.enforestArrayExpression(); } - (0, _errors.assert)(false, "Not a primary expression"); + (0, _errors.assert)(false, 'Not a primary expression'); } + enforestLeftHandSideExpression(_ref5) { let allowCall = _ref5.allowCall; - let lookahead_158 = this.peek(); - if (this.isKeyword(lookahead_158, "super")) { + let lookahead = this.peek(); + + if (this.isKeyword(lookahead, 'super')) { this.advance(); - this.term = new _terms2.default("Super", {}); - } else if (this.isNewTransform(lookahead_158)) { + this.term = new _terms2.default('Super', {}); + } else if (this.isNewTransform(lookahead)) { this.term = this.enforestNewExpression(); } + while (true) { - lookahead_158 = this.peek(); - if (this.isParens(lookahead_158)) { + lookahead = this.peek(); + if (this.isParens(lookahead)) { if (!allowCall) { - if (this.term && (0, _terms.isIdentifierExpression)(this.term)) { + // we're dealing with a new expression + if (this.term && ((0, _terms.isIdentifierExpression)(this.term) || (0, _terms.isStaticMemberExpression)(this.term) || (0, _terms.isComputedMemberExpression)(this.term))) { return this.term; } this.term = this.enforestExpressionLoop(); } else { this.term = this.enforestCallExpression(); } - } else if (this.isBrackets(lookahead_158)) { - this.term = allowCall ? this.enforestComputedMemberExpression() : this.enforestExpressionLoop(); - } else if (this.isPunctuator(lookahead_158, ".") && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1)))) { + } else if (this.isBrackets(lookahead)) { + this.term = this.term ? this.enforestComputedMemberExpression() : this.enforestPrimaryExpression(); + } else if (this.isPunctuator(lookahead, '.') && (this.isIdentifier(this.peek(1)) || this.isKeyword(this.peek(1)))) { this.term = this.enforestStaticMemberExpression(); - } else if (this.isTemplate(lookahead_158)) { + } else if (this.isTemplate(lookahead)) { this.term = this.enforestTemplateLiteral(); - } else if (this.isBraces(lookahead_158)) { + } else if (this.isBraces(lookahead)) { this.term = this.enforestPrimaryExpression(); - } else if (this.isIdentifier(lookahead_158)) { - this.term = new _terms2.default("IdentifierExpression", { name: this.enforestIdentifier() }); + } else if (this.isIdentifier(lookahead)) { + this.term = new _terms2.default('IdentifierExpression', { name: this.enforestIdentifier() }); } else { break; } } return this.term; } + enforestBooleanLiteral() { - return new _terms2.default("LiteralBooleanExpression", { value: this.advance() }); + return new _terms2.default("LiteralBooleanExpression", { + value: this.advance() + }); } + enforestTemplateLiteral() { - return new _terms2.default("TemplateExpression", { tag: this.term, elements: this.enforestTemplateElements() }); + return new _terms2.default('TemplateExpression', { + tag: this.term, + elements: this.enforestTemplateElements() + }); } + enforestStringLiteral() { - return new _terms2.default("LiteralStringExpression", { value: this.advance() }); + return new _terms2.default("LiteralStringExpression", { + value: this.advance() + }); } + enforestNumericLiteral() { - let num_159 = this.advance(); - if (num_159.val() === 1 / 0) { - return new _terms2.default("LiteralInfinityExpression", {}); + let num = this.advance(); + if (num.val() === 1 / 0) { + return new _terms2.default('LiteralInfinityExpression', {}); } - return new _terms2.default("LiteralNumericExpression", { value: num_159 }); + return new _terms2.default("LiteralNumericExpression", { + value: num + }); } + enforestIdentifierExpression() { - return new _terms2.default("IdentifierExpression", { name: this.advance() }); + return new _terms2.default("IdentifierExpression", { + name: this.advance() + }); } + enforestRegularExpressionLiteral() { - let reStx_160 = this.advance(); - let lastSlash_161 = reStx_160.token.value.lastIndexOf("/"); - let pattern_162 = reStx_160.token.value.slice(1, lastSlash_161); - let flags_163 = reStx_160.token.value.slice(lastSlash_161 + 1); - return new _terms2.default("LiteralRegExpExpression", { pattern: pattern_162, flags: flags_163 }); + let reStx = this.advance(); + + let lastSlash = reStx.token.value.lastIndexOf("/"); + let pattern = reStx.token.value.slice(1, lastSlash); + let flags = reStx.token.value.slice(lastSlash + 1); + return new _terms2.default("LiteralRegExpExpression", { + pattern: pattern, flags: flags + }); } + enforestNullLiteral() { this.advance(); return new _terms2.default("LiteralNullExpression", {}); } + enforestThisExpression() { - return new _terms2.default("ThisExpression", { stx: this.advance() }); + return new _terms2.default("ThisExpression", { + stx: this.advance() + }); } + enforestArgumentList() { - let result_164 = []; + let result = []; while (this.rest.size > 0) { let arg; - if (this.isPunctuator(this.peek(), "...")) { + if (this.isPunctuator(this.peek(), '...')) { this.advance(); - arg = new _terms2.default("SpreadElement", { expression: this.enforestExpressionLoop() }); + arg = new _terms2.default('SpreadElement', { + expression: this.enforestExpressionLoop() + }); } else { arg = this.enforestExpressionLoop(); } if (this.rest.size > 0) { - this.matchPunctuator(","); + this.matchPunctuator(','); } - result_164.push(arg); + result.push(arg); } - return (0, _immutable.List)(result_164); + return (0, _immutable.List)(result); } + enforestNewExpression() { - this.matchKeyword("new"); - if (this.isPunctuator(this.peek(), ".") && this.isIdentifier(this.peek(1), "target")) { + this.matchKeyword('new'); + if (this.isPunctuator(this.peek(), '.') && this.isIdentifier(this.peek(1), 'target')) { this.advance(); this.advance(); - return new _terms2.default("NewTargetExpression", {}); + return new _terms2.default('NewTargetExpression', {}); } - let callee_165 = this.enforestLeftHandSideExpression({ allowCall: false }); - let args_166; + + let callee = this.enforestLeftHandSideExpression({ allowCall: false }); + let args; if (this.isParens(this.peek())) { - args_166 = this.matchParens(); + args = this.matchParens(); } else { - args_166 = (0, _immutable.List)(); + args = (0, _immutable.List)(); } - return new _terms2.default("NewExpression", { callee: callee_165, arguments: args_166 }); + return new _terms2.default('NewExpression', { + callee: callee, + arguments: args + }); } + enforestComputedMemberExpression() { - let enf_167 = new Enforester_46(this.matchSquares(), (0, _immutable.List)(), this.context); - return new _terms2.default("ComputedMemberExpression", { object: this.term, expression: enf_167.enforestExpression() }); - } - transformDestructuring(term_168) { - switch (term_168.type) { - case "IdentifierExpression": - return new _terms2.default("BindingIdentifier", { name: term_168.name }); - case "ParenthesizedExpression": - if (term_168.inner.size === 1 && this.isIdentifier(term_168.inner.get(0))) { - return new _terms2.default("BindingIdentifier", { name: term_168.inner.get(0) }); + let enf = new Enforester(this.matchSquares(), (0, _immutable.List)(), this.context); + return new _terms2.default('ComputedMemberExpression', { + object: this.term, + expression: enf.enforestExpression() + }); + } + + transformDestructuring(term) { + switch (term.type) { + case 'IdentifierExpression': + return new _terms2.default('BindingIdentifier', { name: term.name }); + + case 'ParenthesizedExpression': + if (term.inner.size === 1 && this.isIdentifier(term.inner.get(0))) { + return new _terms2.default('BindingIdentifier', { name: term.inner.get(0) }); } - case "DataProperty": - return new _terms2.default("BindingPropertyProperty", { name: term_168.name, binding: this.transformDestructuringWithDefault(term_168.expression) }); - case "ShorthandProperty": - return new _terms2.default("BindingPropertyIdentifier", { binding: new _terms2.default("BindingIdentifier", { name: term_168.name }), init: null }); - case "ObjectExpression": - return new _terms2.default("ObjectBinding", { properties: term_168.properties.map(t_169 => this.transformDestructuring(t_169)) }); - case "ArrayExpression": - let last = term_168.elements.last(); - if (last != null && last.type === "SpreadElement") { - return new _terms2.default("ArrayBinding", { elements: term_168.elements.slice(0, -1).map(t_170 => t_170 && this.transformDestructuringWithDefault(t_170)), restElement: this.transformDestructuringWithDefault(last.expression) }); - } else { - return new _terms2.default("ArrayBinding", { elements: term_168.elements.map(t_171 => t_171 && this.transformDestructuringWithDefault(t_171)), restElement: null }); + return term; + case 'DataProperty': + return new _terms2.default('BindingPropertyProperty', { + name: term.name, + binding: this.transformDestructuringWithDefault(term.expression) + }); + case 'ShorthandProperty': + return new _terms2.default('BindingPropertyIdentifier', { + binding: new _terms2.default('BindingIdentifier', { name: term.name }), + init: null + }); + case 'ObjectExpression': + return new _terms2.default('ObjectBinding', { + properties: term.properties.map(t => this.transformDestructuring(t)) + }); + case 'ArrayExpression': + { + let last = term.elements.last(); + if (last != null && last.type === 'SpreadElement') { + return new _terms2.default('ArrayBinding', { + elements: term.elements.slice(0, -1).map(t => t && this.transformDestructuringWithDefault(t)), + restElement: this.transformDestructuringWithDefault(last.expression) + }); + } else { + return new _terms2.default('ArrayBinding', { + elements: term.elements.map(t => t && this.transformDestructuringWithDefault(t)), + restElement: null + }); + } } - return new _terms2.default("ArrayBinding", { elements: term_168.elements.map(t_172 => t_172 && this.transformDestructuring(t_172)), restElement: null }); - case "StaticPropertyName": - return new _terms2.default("BindingIdentifier", { name: term_168.value }); - case "ComputedMemberExpression": - case "StaticMemberExpression": - case "ArrayBinding": - case "BindingIdentifier": - case "BindingPropertyIdentifier": - case "BindingPropertyProperty": - case "BindingWithDefault": - case "ObjectBinding": - return term_168; - } - (0, _errors.assert)(false, "not implemented yet for " + term_168.type); - } - transformDestructuringWithDefault(term_173) { - switch (term_173.type) { + case 'StaticPropertyName': + return new _terms2.default('BindingIdentifier', { + name: term.value + }); + case 'ComputedMemberExpression': + case 'StaticMemberExpression': + case 'ArrayBinding': + case 'BindingIdentifier': + case 'BindingPropertyIdentifier': + case 'BindingPropertyProperty': + case 'BindingWithDefault': + case 'ObjectBinding': + return term; + } + (0, _errors.assert)(false, 'not implemented yet for ' + term.type); + } + + transformDestructuringWithDefault(term) { + switch (term.type) { case "AssignmentExpression": - return new _terms2.default("BindingWithDefault", { binding: this.transformDestructuring(term_173.binding), init: term_173.expression }); + return new _terms2.default('BindingWithDefault', { + binding: this.transformDestructuring(term.binding), + init: term.expression + }); } - return this.transformDestructuring(term_173); + return this.transformDestructuring(term); } + enforestCallExpression() { - let paren_174 = this.advance(); - return new _terms2.default("CallExpression", { callee: this.term, arguments: paren_174.inner() }); + let paren = this.advance(); + return new _terms2.default("CallExpression", { + callee: this.term, + arguments: paren.inner() + }); } + enforestArrowExpression() { - let enf_175; + let enf; if (this.isIdentifier(this.peek())) { - enf_175 = new Enforester_46(_immutable.List.of(this.advance()), (0, _immutable.List)(), this.context); + enf = new Enforester(_immutable.List.of(this.advance()), (0, _immutable.List)(), this.context); } else { let p = this.matchParens(); - enf_175 = new Enforester_46(p, (0, _immutable.List)(), this.context); + enf = new Enforester(p, (0, _immutable.List)(), this.context); } - let params_176 = enf_175.enforestFormalParameters(); - this.matchPunctuator("=>"); - let body_177; + let params = enf.enforestFormalParameters(); + this.matchPunctuator('=>'); + + let body; if (this.isBraces(this.peek())) { - body_177 = this.matchCurlies(); + body = this.matchCurlies(); } else { - enf_175 = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); - body_177 = enf_175.enforestExpressionLoop(); - this.rest = enf_175.rest; + enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); + body = enf.enforestExpressionLoop(); + this.rest = enf.rest; } - return new _terms2.default("ArrowExpression", { params: params_176, body: body_177 }); + return new _terms2.default('ArrowExpression', { params: params, body: body }); } + enforestYieldExpression() { - let kwd_178 = this.matchKeyword("yield"); - let lookahead_179 = this.peek(); - if (this.rest.size === 0 || lookahead_179 && !this.lineNumberEq(kwd_178, lookahead_179)) { - return new _terms2.default("YieldExpression", { expression: null }); + let kwd = this.matchKeyword('yield'); + let lookahead = this.peek(); + + if (this.rest.size === 0 || lookahead && !this.lineNumberEq(kwd, lookahead)) { + return new _terms2.default('YieldExpression', { + expression: null + }); } else { let isGenerator = false; - if (this.isPunctuator(this.peek(), "*")) { + if (this.isPunctuator(this.peek(), '*')) { isGenerator = true; this.advance(); } let expr = this.enforestExpression(); - let type = isGenerator ? "YieldGeneratorExpression" : "YieldExpression"; - return new _terms2.default(type, { expression: expr }); + let type = isGenerator ? 'YieldGeneratorExpression' : 'YieldExpression'; + return new _terms2.default(type, { + expression: expr + }); } } + enforestSyntaxTemplate() { - return new _terms2.default("SyntaxTemplate", { template: this.advance() }); + return new _terms2.default('SyntaxTemplate', { + template: this.advance() + }); } + enforestSyntaxQuote() { - let name_180 = this.advance(); - return new _terms2.default("SyntaxQuote", { name: name_180, template: new _terms2.default("TemplateExpression", { tag: new _terms2.default("IdentifierExpression", { name: name_180 }), elements: this.enforestTemplateElements() }) }); + let name = this.advance(); + return new _terms2.default('SyntaxQuote', { + name: name, + template: new _terms2.default('TemplateExpression', { + tag: new _terms2.default('IdentifierExpression', { + name: name + }), + elements: this.enforestTemplateElements() + }) + }); } + enforestStaticMemberExpression() { - let object_181 = this.term; - let dot_182 = this.advance(); - let property_183 = this.advance(); - return new _terms2.default("StaticMemberExpression", { object: object_181, property: property_183 }); + let object = this.term; + this.advance(); + let property = this.advance(); + + return new _terms2.default("StaticMemberExpression", { + object: object, + property: property + }); } + enforestArrayExpression() { - let arr_184 = this.advance(); - let elements_185 = []; - let enf_186 = new Enforester_46(arr_184.inner(), (0, _immutable.List)(), this.context); - while (enf_186.rest.size > 0) { - let lookahead = enf_186.peek(); - if (enf_186.isPunctuator(lookahead, ",")) { - enf_186.advance(); - elements_185.push(null); - } else if (enf_186.isPunctuator(lookahead, "...")) { - enf_186.advance(); - let expression = enf_186.enforestExpressionLoop(); + let arr = this.advance(); + + let elements = []; + + let enf = new Enforester(arr.inner(), (0, _immutable.List)(), this.context); + + while (enf.rest.size > 0) { + let lookahead = enf.peek(); + if (enf.isPunctuator(lookahead, ",")) { + enf.advance(); + elements.push(null); + } else if (enf.isPunctuator(lookahead, '...')) { + enf.advance(); + let expression = enf.enforestExpressionLoop(); if (expression == null) { - throw enf_186.createError(lookahead, "expecting expression"); + throw enf.createError(lookahead, 'expecting expression'); } - elements_185.push(new _terms2.default("SpreadElement", { expression: expression })); + elements.push(new _terms2.default('SpreadElement', { expression: expression })); } else { - let term = enf_186.enforestExpressionLoop(); + let term = enf.enforestExpressionLoop(); if (term == null) { - throw enf_186.createError(lookahead, "expected expression"); + throw enf.createError(lookahead, "expected expression"); } - elements_185.push(term); - enf_186.consumeComma(); + elements.push(term); + enf.consumeComma(); } } - return new _terms2.default("ArrayExpression", { elements: (0, _immutable.List)(elements_185) }); + + return new _terms2.default("ArrayExpression", { + elements: (0, _immutable.List)(elements) + }); } + enforestObjectExpression() { - let obj_187 = this.advance(); - let properties_188 = (0, _immutable.List)(); - let enf_189 = new Enforester_46(obj_187.inner(), (0, _immutable.List)(), this.context); - let lastProp_190 = null; - while (enf_189.rest.size > 0) { - let prop = enf_189.enforestPropertyDefinition(); - enf_189.consumeComma(); - properties_188 = properties_188.concat(prop); - if (lastProp_190 === prop) { - throw enf_189.createError(prop, "invalid syntax in object"); + let obj = this.advance(); + + let properties = (0, _immutable.List)(); + + let enf = new Enforester(obj.inner(), (0, _immutable.List)(), this.context); + + let lastProp = null; + while (enf.rest.size > 0) { + let prop = enf.enforestPropertyDefinition(); + enf.consumeComma(); + properties = properties.concat(prop); + + if (lastProp === prop) { + throw enf.createError(prop, "invalid syntax in object"); } - lastProp_190 = prop; + lastProp = prop; } - return new _terms2.default("ObjectExpression", { properties: properties_188 }); + + return new _terms2.default("ObjectExpression", { + properties: properties + }); } + enforestPropertyDefinition() { var _enforestMethodDefini = this.enforestMethodDefinition(); let methodOrKey = _enforestMethodDefini.methodOrKey; let kind = _enforestMethodDefini.kind; + switch (kind) { - case "method": + case 'method': return methodOrKey; - case "identifier": + case 'identifier': if (this.isAssign(this.peek())) { this.advance(); let init = this.enforestExpressionLoop(); - return new _terms2.default("BindingPropertyIdentifier", { init: init, binding: this.transformDestructuring(methodOrKey) }); - } else if (!this.isPunctuator(this.peek(), ":")) { - return new _terms2.default("ShorthandProperty", { name: methodOrKey.value }); + return new _terms2.default('BindingPropertyIdentifier', { + init: init, binding: this.transformDestructuring(methodOrKey) + }); + } else if (!this.isPunctuator(this.peek(), ':')) { + return new _terms2.default('ShorthandProperty', { + name: methodOrKey.value + }); } } - this.matchPunctuator(":"); - let expr_191 = this.enforestExpressionLoop(); - return new _terms2.default("DataProperty", { name: methodOrKey, expression: expr_191 }); + + this.matchPunctuator(':'); + let expr = this.enforestExpressionLoop(); + + return new _terms2.default("DataProperty", { + name: methodOrKey, + expression: expr + }); } + enforestMethodDefinition() { - let lookahead_192 = this.peek(); - let isGenerator_193 = false; - if (this.isPunctuator(lookahead_192, "*")) { - isGenerator_193 = true; + let lookahead = this.peek(); + let isGenerator = false; + if (this.isPunctuator(lookahead, '*')) { + isGenerator = true; this.advance(); } - if (this.isIdentifier(lookahead_192, "get") && this.isPropertyName(this.peek(1))) { + + if (this.isIdentifier(lookahead, 'get') && this.isPropertyName(this.peek(1))) { this.advance(); var _enforestPropertyName2 = this.enforestPropertyName(); @@ -1213,18 +1605,24 @@ class Enforester_46 { this.matchParens(); let body = this.matchCurlies(); - return { methodOrKey: new _terms2.default("Getter", { name: name, body: body }), kind: "method" }; - } else if (this.isIdentifier(lookahead_192, "set") && this.isPropertyName(this.peek(1))) { + return { + methodOrKey: new _terms2.default('Getter', { name: name, body: body }), + kind: 'method' + }; + } else if (this.isIdentifier(lookahead, 'set') && this.isPropertyName(this.peek(1))) { this.advance(); var _enforestPropertyName3 = this.enforestPropertyName(); let name = _enforestPropertyName3.name; - let enf = new Enforester_46(this.matchParens(), (0, _immutable.List)(), this.context); + let enf = new Enforester(this.matchParens(), (0, _immutable.List)(), this.context); let param = enf.enforestBindingElement(); let body = this.matchCurlies(); - return { methodOrKey: new _terms2.default("Setter", { name: name, param: param, body: body }), kind: "method" }; + return { + methodOrKey: new _terms2.default('Setter', { name: name, param: param, body: body }), + kind: 'method' + }; } var _enforestPropertyName4 = this.enforestPropertyName(); @@ -1233,135 +1631,214 @@ class Enforester_46 { if (this.isParens(this.peek())) { let params = this.matchParens(); - let enf = new Enforester_46(params, (0, _immutable.List)(), this.context); + let enf = new Enforester(params, (0, _immutable.List)(), this.context); let formalParams = enf.enforestFormalParameters(); + let body = this.matchCurlies(); - return { methodOrKey: new _terms2.default("Method", { isGenerator: isGenerator_193, name: name, params: formalParams, body: body }), kind: "method" }; + return { + methodOrKey: new _terms2.default('Method', { + isGenerator: isGenerator, + name: name, params: formalParams, body: body + }), + kind: 'method' + }; } - return { methodOrKey: name, kind: this.isIdentifier(lookahead_192) || this.isKeyword(lookahead_192) ? "identifier" : "property" }; + return { + methodOrKey: name, + kind: this.isIdentifier(lookahead) || this.isKeyword(lookahead) ? 'identifier' : 'property' + }; } + enforestPropertyName() { - let lookahead_194 = this.peek(); - if (this.isStringLiteral(lookahead_194) || this.isNumericLiteral(lookahead_194)) { - return { name: new _terms2.default("StaticPropertyName", { value: this.advance() }), binding: null }; - } else if (this.isBrackets(lookahead_194)) { - let enf = new Enforester_46(this.matchSquares(), (0, _immutable.List)(), this.context); + let lookahead = this.peek(); + + if (this.isStringLiteral(lookahead) || this.isNumericLiteral(lookahead)) { + return { + name: new _terms2.default('StaticPropertyName', { + value: this.advance() + }), + binding: null + }; + } else if (this.isBrackets(lookahead)) { + let enf = new Enforester(this.matchSquares(), (0, _immutable.List)(), this.context); let expr = enf.enforestExpressionLoop(); - return { name: new _terms2.default("ComputedPropertyName", { expression: expr }), binding: null }; + return { + name: new _terms2.default('ComputedPropertyName', { + expression: expr + }), + binding: null + }; } - let name_195 = this.advance(); - return { name: new _terms2.default("StaticPropertyName", { value: name_195 }), binding: new _terms2.default("BindingIdentifier", { name: name_195 }) }; + let name = this.advance(); + return { + name: new _terms2.default('StaticPropertyName', { value: name }), + binding: new _terms2.default('BindingIdentifier', { name: name }) + }; } + enforestFunction(_ref6) { let isExpr = _ref6.isExpr; let inDefault = _ref6.inDefault; - let allowGenerator = _ref6.allowGenerator; - - let name_196 = null, - params_197, - body_198, - rest_199; - let isGenerator_200 = false; - let fnKeyword_201 = this.advance(); - let lookahead_202 = this.peek(); - let type_203 = isExpr ? "FunctionExpression" : "FunctionDeclaration"; - if (this.isPunctuator(lookahead_202, "*")) { - isGenerator_200 = true; + + let name = null, + params, + body; + let isGenerator = false; + // eat the function keyword + let fnKeyword = this.advance(); + let lookahead = this.peek(); + let type = isExpr ? 'FunctionExpression' : 'FunctionDeclaration'; + + if (this.isPunctuator(lookahead, "*")) { + isGenerator = true; this.advance(); - lookahead_202 = this.peek(); + lookahead = this.peek(); } - if (!this.isParens(lookahead_202)) { - name_196 = this.enforestBindingIdentifier(); + + if (!this.isParens(lookahead)) { + name = this.enforestBindingIdentifier(); } else if (inDefault) { - name_196 = new _terms2.default("BindingIdentifier", { name: _syntax2.default.fromIdentifier("*default*", fnKeyword_201) }); + name = new _terms2.default('BindingIdentifier', { + name: _syntax2.default.fromIdentifier('*default*', fnKeyword) + }); } - params_197 = this.matchParens(); - body_198 = this.matchCurlies(); - let enf_204 = new Enforester_46(params_197, (0, _immutable.List)(), this.context); - let formalParams_205 = enf_204.enforestFormalParameters(); - return new _terms2.default(type_203, { name: name_196, isGenerator: isGenerator_200, params: formalParams_205, body: body_198 }); + + params = this.matchParens(); + + body = this.matchCurlies(); + + let enf = new Enforester(params, (0, _immutable.List)(), this.context); + let formalParams = enf.enforestFormalParameters(); + + return new _terms2.default(type, { + name: name, + isGenerator: isGenerator, + params: formalParams, + body: body + }); } + enforestFunctionExpression() { - let name_206 = null, - params_207, - body_208, - rest_209; - let isGenerator_210 = false; + let name = null, + params, + body; + let isGenerator = false; + // eat the function keyword this.advance(); - let lookahead_211 = this.peek(); - if (this.isPunctuator(lookahead_211, "*")) { - isGenerator_210 = true; + let lookahead = this.peek(); + + if (this.isPunctuator(lookahead, "*")) { + isGenerator = true; this.advance(); - lookahead_211 = this.peek(); + lookahead = this.peek(); } - if (!this.isParens(lookahead_211)) { - name_206 = this.enforestBindingIdentifier(); + + if (!this.isParens(lookahead)) { + name = this.enforestBindingIdentifier(); } - params_207 = this.matchParens(); - body_208 = this.matchCurlies(); - let enf_212 = new Enforester_46(params_207, (0, _immutable.List)(), this.context); - let formalParams_213 = enf_212.enforestFormalParameters(); - return new _terms2.default("FunctionExpression", { name: name_206, isGenerator: isGenerator_210, params: formalParams_213, body: body_208 }); + + params = this.matchParens(); + body = this.matchCurlies(); + + let enf = new Enforester(params, (0, _immutable.List)(), this.context); + let formalParams = enf.enforestFormalParameters(); + + return new _terms2.default("FunctionExpression", { + name: name, + isGenerator: isGenerator, + params: formalParams, + body: body + }); } + enforestFunctionDeclaration() { - let name_214, params_215, body_216, rest_217; - let isGenerator_218 = false; + let name, params, body; + let isGenerator = false; + // eat the function keyword this.advance(); - let lookahead_219 = this.peek(); - if (this.isPunctuator(lookahead_219, "*")) { - isGenerator_218 = true; + let lookahead = this.peek(); + + if (this.isPunctuator(lookahead, "*")) { + isGenerator = true; this.advance(); } - name_214 = this.enforestBindingIdentifier(); - params_215 = this.matchParens(); - body_216 = this.matchCurlies(); - let enf_220 = new Enforester_46(params_215, (0, _immutable.List)(), this.context); - let formalParams_221 = enf_220.enforestFormalParameters(); - return new _terms2.default("FunctionDeclaration", { name: name_214, isGenerator: isGenerator_218, params: formalParams_221, body: body_216 }); + + name = this.enforestBindingIdentifier(); + + params = this.matchParens(); + body = this.matchCurlies(); + + let enf = new Enforester(params, (0, _immutable.List)(), this.context); + let formalParams = enf.enforestFormalParameters(); + + return new _terms2.default("FunctionDeclaration", { + name: name, + isGenerator: isGenerator, + params: formalParams, + body: body + }); } + enforestFormalParameters() { - let items_222 = []; - let rest_223 = null; + let items = []; + let rest = null; while (this.rest.size !== 0) { let lookahead = this.peek(); - if (this.isPunctuator(lookahead, "...")) { - this.matchPunctuator("..."); - rest_223 = this.enforestBindingIdentifier(); + if (this.isPunctuator(lookahead, '...')) { + this.matchPunctuator('...'); + rest = this.enforestBindingIdentifier(); break; } - items_222.push(this.enforestParam()); + items.push(this.enforestParam()); this.consumeComma(); } - return new _terms2.default("FormalParameters", { items: (0, _immutable.List)(items_222), rest: rest_223 }); + return new _terms2.default("FormalParameters", { + items: (0, _immutable.List)(items), rest: rest + }); } + enforestParam() { return this.enforestBindingElement(); } + enforestUpdateExpression() { - let operator_224 = this.matchUnaryOperator(); - return new _terms2.default("UpdateExpression", { isPrefix: false, operator: operator_224.val(), operand: this.transformDestructuring(this.term) }); + let operator = this.matchUnaryOperator(); + + return new _terms2.default('UpdateExpression', { + isPrefix: false, + operator: operator.val(), + operand: this.transformDestructuring(this.term) + }); } + enforestUnaryExpression() { - let operator_225 = this.matchUnaryOperator(); - this.opCtx.stack = this.opCtx.stack.push({ prec: this.opCtx.prec, combine: this.opCtx.combine }); + let operator = this.matchUnaryOperator(); + this.opCtx.stack = this.opCtx.stack.push({ + prec: this.opCtx.prec, + combine: this.opCtx.combine + }); + // TODO: all builtins are 14, custom operators will change this this.opCtx.prec = 14; - this.opCtx.combine = rightTerm_226 => { - let type_227, term_228, isPrefix_229; - if (operator_225.val() === "++" || operator_225.val() === "--") { - type_227 = "UpdateExpression"; - term_228 = this.transformDestructuring(rightTerm_226); - isPrefix_229 = true; + this.opCtx.combine = rightTerm => { + if (operator.val() === '++' || operator.val() === '--') { + return new _terms2.default('UpdateExpression', { + operator: operator.val(), + operand: this.transformDestructuring(rightTerm), + isPrefix: true + }); } else { - type_227 = "UnaryExpression"; - isPrefix_229 = undefined; - term_228 = rightTerm_226; + return new _terms2.default('UnaryExpression', { + operator: operator.val(), + operand: rightTerm + }); } - return new _terms2.default(type_227, { operator: operator_225.val(), operand: term_228, isPrefix: isPrefix_229 }); }; - return EXPR_LOOP_OPERATOR_43; + return EXPR_LOOP_OPERATOR; } + enforestConditionalExpression() { - let test_230 = this.opCtx.combine(this.term); + // first, pop the operator stack + let test = this.opCtx.combine(this.term); if (this.opCtx.stack.size > 0) { var _opCtx$stack$last2 = this.opCtx.stack.last(); @@ -1372,31 +1849,45 @@ class Enforester_46 { this.opCtx.prec = prec; this.opCtx.combine = combine; } - this.matchPunctuator("?"); - let enf_231 = new Enforester_46(this.rest, (0, _immutable.List)(), this.context); - let consequent_232 = enf_231.enforestExpressionLoop(); - enf_231.matchPunctuator(":"); - enf_231 = new Enforester_46(enf_231.rest, (0, _immutable.List)(), this.context); - let alternate_233 = enf_231.enforestExpressionLoop(); - this.rest = enf_231.rest; - return new _terms2.default("ConditionalExpression", { test: test_230, consequent: consequent_232, alternate: alternate_233 }); + + this.matchPunctuator('?'); + let enf = new Enforester(this.rest, (0, _immutable.List)(), this.context); + let consequent = enf.enforestExpressionLoop(); + enf.matchPunctuator(':'); + enf = new Enforester(enf.rest, (0, _immutable.List)(), this.context); + let alternate = enf.enforestExpressionLoop(); + this.rest = enf.rest; + return new _terms2.default('ConditionalExpression', { + test: test, consequent: consequent, alternate: alternate + }); } + enforestBinaryExpression() { - let leftTerm_234 = this.term; - let opStx_235 = this.peek(); - let op_236 = opStx_235.val(); - let opPrec_237 = (0, _operators.getOperatorPrec)(op_236); - let opAssoc_238 = (0, _operators.getOperatorAssoc)(op_236); - if ((0, _operators.operatorLt)(this.opCtx.prec, opPrec_237, opAssoc_238)) { - this.opCtx.stack = this.opCtx.stack.push({ prec: this.opCtx.prec, combine: this.opCtx.combine }); - this.opCtx.prec = opPrec_237; - this.opCtx.combine = rightTerm_239 => { - return new _terms2.default("BinaryExpression", { left: leftTerm_234, operator: opStx_235, right: rightTerm_239 }); + + let leftTerm = this.term; + let opStx = this.peek(); + let op = opStx.val(); + let opPrec = (0, _operators.getOperatorPrec)(op); + let opAssoc = (0, _operators.getOperatorAssoc)(op); + + if ((0, _operators.operatorLt)(this.opCtx.prec, opPrec, opAssoc)) { + this.opCtx.stack = this.opCtx.stack.push({ + prec: this.opCtx.prec, + combine: this.opCtx.combine + }); + this.opCtx.prec = opPrec; + this.opCtx.combine = rightTerm => { + return new _terms2.default("BinaryExpression", { + left: leftTerm, + operator: opStx, + right: rightTerm + }); }; this.advance(); - return EXPR_LOOP_OPERATOR_43; + return EXPR_LOOP_OPERATOR; } else { - let term = this.opCtx.combine(leftTerm_234); + let term = this.opCtx.combine(leftTerm); + // this.rest does not change var _opCtx$stack$last3 = this.opCtx.stack.last(); @@ -1409,324 +1900,395 @@ class Enforester_46 { return term; } } + enforestTemplateElements() { - let lookahead_240 = this.matchTemplate(); - let elements_241 = lookahead_240.token.items.map(it_242 => { - if (this.isDelimiter(it_242)) { - let enf = new Enforester_46(it_242.inner(), (0, _immutable.List)(), this.context); + let lookahead = this.matchTemplate(); + let elements = lookahead.token.items.map(it => { + if (this.isDelimiter(it)) { + let enf = new Enforester(it.inner(), (0, _immutable.List)(), this.context); return enf.enforest("expression"); } - return new _terms2.default("TemplateElement", { rawValue: it_242.slice.text }); + return new _terms2.default('TemplateElement', { + rawValue: it.slice.text + }); }); - return elements_241; + return elements; } + expandMacro() { - let lookahead_243 = this.peek(); - while (this.isCompiletimeTransform(lookahead_243)) { + let lookahead = this.peek(); + while (this.isCompiletimeTransform(lookahead)) { let name = this.advance(); + let syntaxTransform = this.getFromCompiletimeEnvironment(name); if (syntaxTransform == null || typeof syntaxTransform.value !== "function") { throw this.createError(name, "the macro name was not bound to a value that could be invoked"); } let useSiteScope = (0, _scope.freshScope)("u"); let introducedScope = (0, _scope.freshScope)("i"); + // TODO: needs to be a list of scopes I think this.context.useScope = useSiteScope; + let ctx = new _macroContext2.default(this, name, this.context, useSiteScope, introducedScope); + let result = (0, _loadSyntax.sanitizeReplacementValues)(syntaxTransform.value.call(null, ctx)); if (!_immutable.List.isList(result)) { throw this.createError(name, "macro must return a list but got: " + result); } - result = result.map(stx_244 => { - if (!(stx_244 && typeof stx_244.addScope === "function")) { - throw this.createError(name, "macro must return syntax objects or terms but got: " + stx_244); + result = result.map(stx => { + if (!(stx && typeof stx.addScope === 'function')) { + throw this.createError(name, 'macro must return syntax objects or terms but got: ' + stx); } - return stx_244.addScope(introducedScope, this.context.bindings, _syntax.ALL_PHASES, { flip: true }); + return stx.addScope(introducedScope, this.context.bindings, _syntax.ALL_PHASES, { flip: true }); }); + this.rest = result.concat(ctx._rest(this)); - lookahead_243 = this.peek(); + lookahead = this.peek(); } } + consumeSemicolon() { - let lookahead_245 = this.peek(); - if (lookahead_245 && this.isPunctuator(lookahead_245, ";")) { + let lookahead = this.peek(); + + if (lookahead && this.isPunctuator(lookahead, ";")) { this.advance(); } } + consumeComma() { - let lookahead_246 = this.peek(); - if (lookahead_246 && this.isPunctuator(lookahead_246, ",")) { + let lookahead = this.peek(); + + if (lookahead && this.isPunctuator(lookahead, ',')) { this.advance(); } } - safeCheck(obj_247, type_248) { - let val_249 = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - return obj_247 && (typeof obj_247.match === "function" ? obj_247.match(type_248, val_249) : false); + safeCheck(obj, type) { + let val = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; + + return obj && (typeof obj.match === 'function' ? obj.match(type, val) : false); } - isTerm(term_250) { - return term_250 && term_250 instanceof _terms2.default; + + isTerm(term) { + return term && term instanceof _terms2.default; } - isEOF(obj_251) { - return this.safeCheck(obj_251, "eof"); + + isEOF(obj) { + return this.safeCheck(obj, 'eof'); } - isIdentifier(obj_252) { - let val_253 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_252, "identifier", val_253); + isIdentifier(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'identifier', val); } - isPropertyName(obj_254) { - return this.isIdentifier(obj_254) || this.isKeyword(obj_254) || this.isNumericLiteral(obj_254) || this.isStringLiteral(obj_254) || this.isBrackets(obj_254); + + isPropertyName(obj) { + return this.isIdentifier(obj) || this.isKeyword(obj) || this.isNumericLiteral(obj) || this.isStringLiteral(obj) || this.isBrackets(obj); } - isNumericLiteral(obj_255) { - let val_256 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_255, "number", val_256); + isNumericLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'number', val); } - isStringLiteral(obj_257) { - let val_258 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_257, "string", val_258); + isStringLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'string', val); } - isTemplate(obj_259) { - let val_260 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_259, "template", val_260); + isTemplate(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'template', val); } - isSyntaxTemplate(obj_261) { - return this.safeCheck(obj_261, "syntaxTemplate"); + + isSyntaxTemplate(obj) { + return this.safeCheck(obj, 'syntaxTemplate'); } - isBooleanLiteral(obj_262) { - let val_263 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_262, "boolean", val_263); + isBooleanLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'boolean', val); } - isNullLiteral(obj_264) { - let val_265 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_264, "null", val_265); + isNullLiteral(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'null', val); } - isRegularExpression(obj_266) { - let val_267 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_266, "regularExpression", val_267); + isRegularExpression(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'regularExpression', val); } - isDelimiter(obj_268) { - return this.safeCheck(obj_268, "delimiter"); + + isDelimiter(obj) { + return this.safeCheck(obj, 'delimiter'); } - isParens(obj_269) { - return this.safeCheck(obj_269, "parens"); + + isParens(obj) { + return this.safeCheck(obj, 'parens'); } - isBraces(obj_270) { - return this.safeCheck(obj_270, "braces"); + + isBraces(obj) { + return this.safeCheck(obj, 'braces'); } - isBrackets(obj_271) { - return this.safeCheck(obj_271, "brackets"); + + isBrackets(obj) { + return this.safeCheck(obj, 'brackets'); } - isAssign(obj_272) { - let val_273 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_272, "assign", val_273); + isAssign(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'assign', val); } - isKeyword(obj_274) { - let val_275 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_274, "keyword", val_275); + isKeyword(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'keyword', val); } - isPunctuator(obj_276) { - let val_277 = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - return this.safeCheck(obj_276, "punctuator", val_277); + isPunctuator(obj) { + let val = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + return this.safeCheck(obj, 'punctuator', val); } - isOperator(obj_278) { - return (this.safeCheck(obj_278, "punctuator") || this.safeCheck(obj_278, "identifier") || this.safeCheck(obj_278, "keyword")) && (0, _operators.isOperator)(obj_278); + + isOperator(obj) { + return (this.safeCheck(obj, 'punctuator') || this.safeCheck(obj, 'identifier') || this.safeCheck(obj, 'keyword')) && (0, _operators.isOperator)(obj); } - isUpdateOperator(obj_279) { - return this.safeCheck(obj_279, "punctuator", "++") || this.safeCheck(obj_279, "punctuator", "--"); + + isUpdateOperator(obj) { + return this.safeCheck(obj, 'punctuator', '++') || this.safeCheck(obj, 'punctuator', '--'); } - safeResolve(obj_280, phase_281) { - return obj_280 && typeof obj_280.resolve === "function" ? Just_41(obj_280.resolve(phase_281)) : Nothing_42(); + + safeResolve(obj, phase) { + return obj && typeof obj.resolve === 'function' ? Just(obj.resolve(phase)) : Nothing(); } - isTransform(obj_282, trans_283) { - return this.safeResolve(obj_282, this.context.phase).map(name_284 => this.context.env.get(name_284) === trans_283 || this.context.store.get(name_284) === trans_283).getOrElse(false); + + isTransform(obj, trans) { + return this.safeResolve(obj, this.context.phase).map(name => this.context.env.get(name) === trans || this.context.store.get(name) === trans).getOrElse(false); } - isTransformInstance(obj_285, trans_286) { - return this.safeResolve(obj_285, this.context.phase).map(name_287 => this.context.env.get(name_287) instanceof trans_286 || this.context.store.get(name_287) instanceof trans_286).getOrElse(false); + + isTransformInstance(obj, trans) { + return this.safeResolve(obj, this.context.phase).map(name => this.context.env.get(name) instanceof trans || this.context.store.get(name) instanceof trans).getOrElse(false); } - isFnDeclTransform(obj_288) { - return this.isTransform(obj_288, _transforms.FunctionDeclTransform); + + isFnDeclTransform(obj) { + return this.isTransform(obj, _transforms.FunctionDeclTransform); } - isVarDeclTransform(obj_289) { - return this.isTransform(obj_289, _transforms.VariableDeclTransform); + + isVarDeclTransform(obj) { + return this.isTransform(obj, _transforms.VariableDeclTransform); } - isLetDeclTransform(obj_290) { - return this.isTransform(obj_290, _transforms.LetDeclTransform); + + isLetDeclTransform(obj) { + return this.isTransform(obj, _transforms.LetDeclTransform); } - isConstDeclTransform(obj_291) { - return this.isTransform(obj_291, _transforms.ConstDeclTransform); + + isConstDeclTransform(obj) { + return this.isTransform(obj, _transforms.ConstDeclTransform); } - isSyntaxDeclTransform(obj_292) { - return this.isTransform(obj_292, _transforms.SyntaxDeclTransform); + + isSyntaxDeclTransform(obj) { + return this.isTransform(obj, _transforms.SyntaxDeclTransform); } - isSyntaxrecDeclTransform(obj_293) { - return this.isTransform(obj_293, _transforms.SyntaxrecDeclTransform); + + isSyntaxrecDeclTransform(obj) { + return this.isTransform(obj, _transforms.SyntaxrecDeclTransform); } - isSyntaxQuoteTransform(obj_294) { - return this.isTransform(obj_294, _transforms.SyntaxQuoteTransform); + + isSyntaxQuoteTransform(obj) { + return this.isTransform(obj, _transforms.SyntaxQuoteTransform); } - isReturnStmtTransform(obj_295) { - return this.isTransform(obj_295, _transforms.ReturnStatementTransform); + + isReturnStmtTransform(obj) { + return this.isTransform(obj, _transforms.ReturnStatementTransform); } - isWhileTransform(obj_296) { - return this.isTransform(obj_296, _transforms.WhileTransform); + + isWhileTransform(obj) { + return this.isTransform(obj, _transforms.WhileTransform); } - isForTransform(obj_297) { - return this.isTransform(obj_297, _transforms.ForTransform); + + isForTransform(obj) { + return this.isTransform(obj, _transforms.ForTransform); } - isSwitchTransform(obj_298) { - return this.isTransform(obj_298, _transforms.SwitchTransform); + + isSwitchTransform(obj) { + return this.isTransform(obj, _transforms.SwitchTransform); } - isBreakTransform(obj_299) { - return this.isTransform(obj_299, _transforms.BreakTransform); + + isBreakTransform(obj) { + return this.isTransform(obj, _transforms.BreakTransform); } - isContinueTransform(obj_300) { - return this.isTransform(obj_300, _transforms.ContinueTransform); + + isContinueTransform(obj) { + return this.isTransform(obj, _transforms.ContinueTransform); } - isDoTransform(obj_301) { - return this.isTransform(obj_301, _transforms.DoTransform); + + isDoTransform(obj) { + return this.isTransform(obj, _transforms.DoTransform); } - isDebuggerTransform(obj_302) { - return this.isTransform(obj_302, _transforms.DebuggerTransform); + + isDebuggerTransform(obj) { + return this.isTransform(obj, _transforms.DebuggerTransform); } - isWithTransform(obj_303) { - return this.isTransform(obj_303, _transforms.WithTransform); + + isWithTransform(obj) { + return this.isTransform(obj, _transforms.WithTransform); } - isTryTransform(obj_304) { - return this.isTransform(obj_304, _transforms.TryTransform); + + isTryTransform(obj) { + return this.isTransform(obj, _transforms.TryTransform); } - isThrowTransform(obj_305) { - return this.isTransform(obj_305, _transforms.ThrowTransform); + + isThrowTransform(obj) { + return this.isTransform(obj, _transforms.ThrowTransform); } - isIfTransform(obj_306) { - return this.isTransform(obj_306, _transforms.IfTransform); + + isIfTransform(obj) { + return this.isTransform(obj, _transforms.IfTransform); } - isNewTransform(obj_307) { - return this.isTransform(obj_307, _transforms.NewTransform); + + isNewTransform(obj) { + return this.isTransform(obj, _transforms.NewTransform); } - isCompiletimeTransform(obj_308) { - return this.isTransformInstance(obj_308, _transforms.CompiletimeTransform); + + isCompiletimeTransform(obj) { + return this.isTransformInstance(obj, _transforms.CompiletimeTransform); } - isVarBindingTransform(obj_309) { - return this.isTransformInstance(obj_309, _transforms.VarBindingTransform); + + isVarBindingTransform(obj) { + return this.isTransformInstance(obj, _transforms.VarBindingTransform); } - getFromCompiletimeEnvironment(term_310) { - if (this.context.env.has(term_310.resolve(this.context.phase))) { - return this.context.env.get(term_310.resolve(this.context.phase)); + + getFromCompiletimeEnvironment(term) { + if (this.context.env.has(term.resolve(this.context.phase))) { + return this.context.env.get(term.resolve(this.context.phase)); } - return this.context.store.get(term_310.resolve(this.context.phase)); + return this.context.store.get(term.resolve(this.context.phase)); } - lineNumberEq(a_311, b_312) { - if (!(a_311 && b_312)) { + + lineNumberEq(a, b) { + if (!(a && b)) { return false; } - return a_311.lineNumber() === b_312.lineNumber(); + return a.lineNumber() === b.lineNumber(); } - matchIdentifier(val_313) { - let lookahead_314 = this.advance(); - if (this.isIdentifier(lookahead_314)) { - return lookahead_314; + + matchIdentifier(val) { + let lookahead = this.advance(); + if (this.isIdentifier(lookahead, val)) { + return lookahead; } - throw this.createError(lookahead_314, "expecting an identifier"); + throw this.createError(lookahead, "expecting an identifier"); } - matchKeyword(val_315) { - let lookahead_316 = this.advance(); - if (this.isKeyword(lookahead_316, val_315)) { - return lookahead_316; + + matchKeyword(val) { + let lookahead = this.advance(); + if (this.isKeyword(lookahead, val)) { + return lookahead; } - throw this.createError(lookahead_316, "expecting " + val_315); + throw this.createError(lookahead, 'expecting ' + val); } + matchLiteral() { - let lookahead_317 = this.advance(); - if (this.isNumericLiteral(lookahead_317) || this.isStringLiteral(lookahead_317) || this.isBooleanLiteral(lookahead_317) || this.isNullLiteral(lookahead_317) || this.isTemplate(lookahead_317) || this.isRegularExpression(lookahead_317)) { - return lookahead_317; + let lookahead = this.advance(); + if (this.isNumericLiteral(lookahead) || this.isStringLiteral(lookahead) || this.isBooleanLiteral(lookahead) || this.isNullLiteral(lookahead) || this.isTemplate(lookahead) || this.isRegularExpression(lookahead)) { + return lookahead; } - throw this.createError(lookahead_317, "expecting a literal"); + throw this.createError(lookahead, "expecting a literal"); } + matchStringLiteral() { - let lookahead_318 = this.advance(); - if (this.isStringLiteral(lookahead_318)) { - return lookahead_318; + let lookahead = this.advance(); + if (this.isStringLiteral(lookahead)) { + return lookahead; } - throw this.createError(lookahead_318, "expecting a string literal"); + throw this.createError(lookahead, 'expecting a string literal'); } + matchTemplate() { - let lookahead_319 = this.advance(); - if (this.isTemplate(lookahead_319)) { - return lookahead_319; + let lookahead = this.advance(); + if (this.isTemplate(lookahead)) { + return lookahead; } - throw this.createError(lookahead_319, "expecting a template literal"); + throw this.createError(lookahead, 'expecting a template literal'); } + matchParens() { - let lookahead_320 = this.advance(); - if (this.isParens(lookahead_320)) { - return lookahead_320.inner(); + let lookahead = this.advance(); + if (this.isParens(lookahead)) { + return lookahead.inner(); } - throw this.createError(lookahead_320, "expecting parens"); + throw this.createError(lookahead, "expecting parens"); } + matchCurlies() { - let lookahead_321 = this.advance(); - if (this.isBraces(lookahead_321)) { - return lookahead_321.inner(); + let lookahead = this.advance(); + if (this.isBraces(lookahead)) { + return lookahead.inner(); } - throw this.createError(lookahead_321, "expecting curly braces"); + throw this.createError(lookahead, "expecting curly braces"); } matchSquares() { - let lookahead_322 = this.advance(); - if (this.isBrackets(lookahead_322)) { - return lookahead_322.inner(); + let lookahead = this.advance(); + if (this.isBrackets(lookahead)) { + return lookahead.inner(); } - throw this.createError(lookahead_322, "expecting sqaure braces"); + throw this.createError(lookahead, "expecting sqaure braces"); } + matchUnaryOperator() { - let lookahead_323 = this.advance(); - if ((0, _operators.isUnaryOperator)(lookahead_323)) { - return lookahead_323; - } - throw this.createError(lookahead_323, "expecting a unary operator"); - } - matchPunctuator(val_324) { - let lookahead_325 = this.advance(); - if (this.isPunctuator(lookahead_325)) { - if (typeof val_324 !== "undefined") { - if (lookahead_325.val() === val_324) { - return lookahead_325; + let lookahead = this.advance(); + if ((0, _operators.isUnaryOperator)(lookahead)) { + return lookahead; + } + throw this.createError(lookahead, "expecting a unary operator"); + } + + matchPunctuator(val) { + let lookahead = this.advance(); + if (this.isPunctuator(lookahead)) { + if (typeof val !== 'undefined') { + if (lookahead.val() === val) { + return lookahead; } else { - throw this.createError(lookahead_325, "expecting a " + val_324 + " punctuator"); + throw this.createError(lookahead, "expecting a " + val + " punctuator"); } } - return lookahead_325; + return lookahead; } - throw this.createError(lookahead_325, "expecting a punctuator"); + throw this.createError(lookahead, "expecting a punctuator"); } - createError(stx_326, message_327) { - let ctx_328 = ""; - let offending_329 = stx_326; + + createError(stx, message) { + let ctx = ""; + let offending = stx; if (this.rest.size > 0) { - ctx_328 = this.rest.slice(0, 20).map(term_330 => { - if (this.isDelimiter(term_330)) { - return term_330.inner(); + ctx = this.rest.slice(0, 20).map(term => { + if (this.isDelimiter(term)) { + return term.inner(); } - return _immutable.List.of(term_330); - }).flatten().map(s_331 => { - if (s_331 === offending_329) { - return "__" + s_331.val() + "__"; + return _immutable.List.of(term); + }).flatten().map(s => { + if (s === offending) { + return "__" + s.val() + "__"; } - return s_331.val(); + return s.val(); }).join(" "); } else { - ctx_328 = offending_329.toString(); + ctx = offending.toString(); } - return new Error(message_327 + "\n" + ctx_328); + return new Error(message + "\n" + ctx); } } -exports.Enforester = Enforester_46; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2VuZm9yZXN0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBQ0EsTUFBTSxVQUFVLG9CQUFNLElBQXRCO0FBQ0EsTUFBTSxhQUFhLG9CQUFNLE9BQXpCO0FBQ0EsTUFBTSx3QkFBd0IsRUFBOUI7QUFDQSxNQUFNLHlCQUF5QixFQUEvQjtBQUNBLE1BQU0seUJBQXlCLEVBQS9CO0FBQ0EsTUFBTSxhQUFOLENBQW9CO0FBQ2xCLGNBQVksT0FBWixFQUFxQixPQUFyQixFQUE4QixVQUE5QixFQUEwQztBQUN4QyxTQUFLLElBQUwsR0FBWSxLQUFaO0FBQ0Esd0JBQU8sZ0JBQUssTUFBTCxDQUFZLE9BQVosQ0FBUCxFQUE2Qix1Q0FBN0I7QUFDQSx3QkFBTyxnQkFBSyxNQUFMLENBQVksT0FBWixDQUFQLEVBQTZCLHVDQUE3QjtBQUNBLHdCQUFPLFVBQVAsRUFBbUIsaUNBQW5CO0FBQ0EsU0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFNBQUssSUFBTCxHQUFZLE9BQVo7QUFDQSxTQUFLLElBQUwsR0FBWSxPQUFaO0FBQ0EsU0FBSyxPQUFMLEdBQWUsVUFBZjtBQUNEO0FBQ0QsU0FBZTtBQUFBLFFBQVYsSUFBVSx5REFBSCxDQUFHOztBQUNiLFdBQU8sS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLElBQWQsQ0FBUDtBQUNEO0FBQ0QsWUFBVTtBQUNSLFFBQUksU0FBUyxLQUFLLElBQUwsQ0FBVSxLQUFWLEVBQWI7QUFDQSxTQUFLLElBQUwsR0FBWSxLQUFLLElBQUwsQ0FBVSxJQUFWLEVBQVo7QUFDQSxXQUFPLE1BQVA7QUFDRDtBQUNELGFBQTZCO0FBQUEsUUFBcEIsT0FBb0IseURBQVYsUUFBVTs7QUFDM0IsU0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFFBQUksS0FBSyxJQUFMLENBQVUsSUFBVixLQUFtQixDQUF2QixFQUEwQjtBQUN4QixXQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBTyxLQUFLLElBQVo7QUFDRDtBQUNELFFBQUksS0FBSyxLQUFMLENBQVcsS0FBSyxJQUFMLEVBQVgsQ0FBSixFQUE2QjtBQUMzQixXQUFLLElBQUwsR0FBWSxvQkFBUyxLQUFULEVBQWdCLEVBQWhCLENBQVo7QUFDQSxXQUFLLE9BQUw7QUFDQSxhQUFPLEtBQUssSUFBWjtBQUNEO0FBQ0QsUUFBSSxTQUFKO0FBQ0EsUUFBSSxZQUFZLFlBQWhCLEVBQThCO0FBQzVCLGtCQUFZLEtBQUssc0JBQUwsRUFBWjtBQUNELEtBRkQsTUFFTztBQUNMLGtCQUFZLEtBQUssY0FBTCxFQUFaO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxDQUFVLElBQVYsS0FBbUIsQ0FBdkIsRUFBMEI7QUFDeEIsV0FBSyxJQUFMLEdBQVksSUFBWjtBQUNEO0FBQ0QsV0FBTyxTQUFQO0FBQ0Q7QUFDRCxtQkFBaUI7QUFDZixXQUFPLEtBQUssWUFBTCxFQUFQO0FBQ0Q7QUFDRCxpQkFBZTtBQUNiLFdBQU8sS0FBSyxrQkFBTCxFQUFQO0FBQ0Q7QUFDRCx1QkFBcUI7QUFDbkIsUUFBSSxlQUFlLEtBQUssSUFBTCxFQUFuQjtBQUNBLFFBQUksS0FBSyxTQUFMLENBQWUsWUFBZixFQUE2QixRQUE3QixDQUFKLEVBQTRDO0FBQzFDLFdBQUssT0FBTDtBQUNBLGFBQU8sS0FBSyx5QkFBTCxFQUFQO0FBQ0QsS0FIRCxNQUdPLElBQUksS0FBSyxTQUFMLENBQWUsWUFBZixFQUE2QixRQUE3QixDQUFKLEVBQTRDO0FBQ2pELFdBQUssT0FBTDtBQUNBLGFBQU8sS0FBSyx5QkFBTCxFQUFQO0FBQ0QsS0FITSxNQUdBLElBQUksS0FBSyxZQUFMLENBQWtCLFlBQWxCLEVBQWdDLEdBQWhDLENBQUosRUFBMEM7QUFDL0MsYUFBTyxLQUFLLHNCQUFMLEVBQVA7QUFDRDtBQUNELFdBQU8sS0FBSyxpQkFBTCxFQUFQO0FBQ0Q7QUFDRCwyQkFBeUI7QUFDdkIsU0FBSyxlQUFMLENBQXFCLEdBQXJCO0FBQ0EsU0FBSyxlQUFMLENBQXFCLE1BQXJCO0FBQ0EsUUFBSSxVQUFVLEtBQUssa0JBQUwsRUFBZDtBQUNBLFNBQUssZ0JBQUw7QUFDQSxXQUFPLG9CQUFTLFFBQVQsRUFBbUIsRUFBQyxNQUFNLE1BQVAsRUFBZSxPQUFPLGdCQUFLLEVBQUwsQ0FBUSxPQUFSLENBQXRCLEVBQW5CLENBQVA7QUFDRDtBQUNELDhCQUE0QjtBQUMxQixRQUFJLGVBQWUsS0FBSyxJQUFMLEVBQW5CO0FBQ0EsUUFBSSxLQUFLLFlBQUwsQ0FBa0IsWUFBbEIsRUFBZ0MsR0FBaEMsQ0FBSixFQUEwQztBQUN4QyxXQUFLLE9BQUw7QUFDQSxVQUFJLGtCQUFrQixLQUFLLGtCQUFMLEVBQXRCO0FBQ0EsYUFBTyxvQkFBUyxlQUFULEVBQTBCLEVBQUMsaUJBQWlCLGVBQWxCLEVBQTFCLENBQVA7QUFDRCxLQUpELE1BSU8sSUFBSSxLQUFLLFFBQUwsQ0FBYyxZQUFkLENBQUosRUFBaUM7QUFDdEMsVUFBSSxlQUFlLEtBQUssb0JBQUwsRUFBbkI7QUFDQSxVQUFJLGtCQUFrQixJQUF0QjtBQUNBLFVBQUksS0FBSyxZQUFMLENBQWtCLEtBQUssSUFBTCxFQUFsQixFQUErQixNQUEvQixDQUFKLEVBQTRDO0FBQzFDLDBCQUFrQixLQUFLLGtCQUFMLEVBQWxCO0FBQ0Q7QUFDRCxhQUFPLG9CQUFTLFlBQVQsRUFBdUIsRUFBQyxjQUFjLFlBQWYsRUFBNkIsaUJBQWlCLGVBQTlDLEVBQXZCLENBQVA7QUFDRCxLQVBNLE1BT0EsSUFBSSxLQUFLLFNBQUwsQ0FBZSxZQUFmLEVBQTZCLE9BQTdCLENBQUosRUFBMkM7QUFDaEQsYUFBTyxvQkFBUyxRQUFULEVBQW1CLEVBQUMsYUFBYSxLQUFLLGFBQUwsQ0FBbUIsRUFBQyxRQUFRLEtBQVQsRUFBbkIsQ0FBZCxFQUFuQixDQUFQO0FBQ0QsS0FGTSxNQUVBLElBQUksS0FBSyxpQkFBTCxDQUF1QixZQUF2QixDQUFKLEVBQTBDO0FBQy9DLGFBQU8sb0JBQVMsUUFBVCxFQUFtQixFQUFDLGFBQWEsS0FBSyxnQkFBTCxDQUFzQixFQUFDLFFBQVEsS0FBVCxFQUFnQixXQUFXLEtBQTNCLEVBQXRCLENBQWQsRUFBbkIsQ0FBUDtBQUNELEtBRk0sTUFFQSxJQUFJLEtBQUssU0FBTCxDQUFlLFlBQWYsRUFBNkIsU0FBN0IsQ0FBSixFQUE2QztBQUNsRCxXQUFLLE9BQUw7QUFDQSxVQUFJLEtBQUssaUJBQUwsQ0FBdUIsS0FBSyxJQUFMLEVBQXZCLENBQUosRUFBeUM7QUFDdkMsZUFBTyxvQkFBUyxlQUFULEVBQTBCLEVBQUMsTUFBTSxLQUFLLGdCQUFMLENBQXNCLEVBQUMsUUFBUSxLQUFULEVBQWdCLFdBQVcsSUFBM0IsRUFBdEIsQ0FBUCxFQUExQixDQUFQO0FBQ0QsT0FGRCxNQUVPLElBQUksS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsT0FBNUIsQ0FBSixFQUEwQztBQUMvQyxlQUFPLG9CQUFTLGVBQVQsRUFBMEIsRUFBQyxNQUFNLEtBQUssYUFBTCxDQUFtQixFQUFDLFFBQVEsS0FBVCxFQUFnQixXQUFXLElBQTNCLEVBQW5CLENBQVAsRUFBMUIsQ0FBUDtBQUNELE9BRk0sTUFFQTtBQUNMLFlBQUksT0FBTyxLQUFLLHNCQUFMLEVBQVg7QUFDQSxhQUFLLGdCQUFMO0FBQ0EsZUFBTyxvQkFBUyxlQUFULEVBQTBCLEVBQUMsTUFBTSxJQUFQLEVBQTFCLENBQVA7QUFDRDtBQUNGLEtBWE0sTUFXQSxJQUFJLEtBQUssa0JBQUwsQ0FBd0IsWUFBeEIsS0FBeUMsS0FBSyxrQkFBTCxDQUF3QixZQUF4QixDQUF6QyxJQUFrRixLQUFLLG9CQUFMLENBQTBCLFlBQTFCLENBQWxGLElBQTZILEtBQUssd0JBQUwsQ0FBOEIsWUFBOUIsQ0FBN0gsSUFBNEssS0FBSyxxQkFBTCxDQUEyQixZQUEzQixDQUFoTCxFQUEwTjtBQUMvTixhQUFPLG9CQUFTLFFBQVQsRUFBbUIsRUFBQyxhQUFhLEtBQUssMkJBQUwsRUFBZCxFQUFuQixDQUFQO0FBQ0Q7QUFDRCxVQUFNLEtBQUssV0FBTCxDQUFpQixZQUFqQixFQUErQixtQkFBL0IsQ0FBTjtBQUNEO0FBQ0QseUJBQXVCO0FBQ3JCLFFBQUksU0FBUyxJQUFJLGFBQUosQ0FBa0IsS0FBSyxZQUFMLEVBQWxCLEVBQXVDLHNCQUF2QyxFQUErQyxLQUFLLE9BQXBELENBQWI7QUFDQSxRQUFJLFlBQVksRUFBaEI7QUFDQSxXQUFPLE9BQU8sSUFBUCxDQUFZLElBQVosS0FBcUIsQ0FBNUIsRUFBK0I7QUFDN0IsZ0JBQVUsSUFBVixDQUFlLE9BQU8sdUJBQVAsRUFBZjtBQUNBLGFBQU8sWUFBUDtBQUNEO0FBQ0QsV0FBTyxxQkFBSyxTQUFMLENBQVA7QUFDRDtBQUNELDRCQUEwQjtBQUN4QixRQUFJLFVBQVUsS0FBSyxrQkFBTCxFQUFkO0FBQ0EsUUFBSSxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLEVBQWxCLEVBQStCLElBQS9CLENBQUosRUFBMEM7QUFDeEMsV0FBSyxPQUFMO0FBQ0EsVUFBSSxlQUFlLEtBQUssa0JBQUwsRUFBbkI7QUFDQSxhQUFPLG9CQUFTLGlCQUFULEVBQTRCLEVBQUMsTUFBTSxPQUFQLEVBQWdCLGNBQWMsWUFBOUIsRUFBNUIsQ0FBUDtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxpQkFBVCxFQUE0QixFQUFDLE1BQU0sSUFBUCxFQUFhLGNBQWMsT0FBM0IsRUFBNUIsQ0FBUDtBQUNEO0FBQ0QsOEJBQTRCO0FBQzFCLFFBQUksZUFBZSxLQUFLLElBQUwsRUFBbkI7QUFDQSxRQUFJLG9CQUFvQixJQUF4QjtBQUNBLFFBQUksa0JBQWtCLHNCQUF0QjtBQUNBLFFBQUksZUFBZSxLQUFuQjtBQUNBLFFBQUksS0FBSyxlQUFMLENBQXFCLFlBQXJCLENBQUosRUFBd0M7QUFDdEMsVUFBSSxrQkFBa0IsS0FBSyxPQUFMLEVBQXRCO0FBQ0EsV0FBSyxnQkFBTDtBQUNBLGFBQU8sb0JBQVMsUUFBVCxFQUFtQixFQUFDLGdCQUFnQixpQkFBakIsRUFBb0MsY0FBYyxlQUFsRCxFQUFtRSxpQkFBaUIsZUFBcEYsRUFBbkIsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLFlBQUwsQ0FBa0IsWUFBbEIsS0FBbUMsS0FBSyxTQUFMLENBQWUsWUFBZixDQUF2QyxFQUFxRTtBQUNuRSwwQkFBb0IsS0FBSyx5QkFBTCxFQUFwQjtBQUNBLFVBQUksQ0FBQyxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLEVBQWxCLEVBQStCLEdBQS9CLENBQUwsRUFBMEM7QUFDeEMsWUFBSSxrQkFBa0IsS0FBSyxrQkFBTCxFQUF0QjtBQUNBLFlBQUksS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsS0FBNUIsS0FBc0MsS0FBSyxZQUFMLENBQWtCLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBbEIsRUFBZ0MsUUFBaEMsQ0FBMUMsRUFBcUY7QUFDbkYsZUFBSyxPQUFMO0FBQ0EsZUFBSyxPQUFMO0FBQ0EseUJBQWUsSUFBZjtBQUNEO0FBQ0QsZUFBTyxvQkFBUyxRQUFULEVBQW1CLEVBQUMsZ0JBQWdCLGlCQUFqQixFQUFvQyxpQkFBaUIsZUFBckQsRUFBc0UsY0FBYyxzQkFBcEYsRUFBNEYsV0FBVyxZQUF2RyxFQUFuQixDQUFQO0FBQ0Q7QUFDRjtBQUNELFNBQUssWUFBTDtBQUNBLG1CQUFlLEtBQUssSUFBTCxFQUFmO0FBQ0EsUUFBSSxLQUFLLFFBQUwsQ0FBYyxZQUFkLENBQUosRUFBaUM7QUFDL0IsVUFBSSxVQUFVLEtBQUssb0JBQUwsRUFBZDtBQUNBLFVBQUksYUFBYSxLQUFLLGtCQUFMLEVBQWpCO0FBQ0EsVUFBSSxLQUFLLFNBQUwsQ0FBZSxLQUFLLElBQUwsRUFBZixFQUE0QixLQUE1QixLQUFzQyxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFsQixFQUFnQyxRQUFoQyxDQUExQyxFQUFxRjtBQUNuRixhQUFLLE9BQUw7QUFDQSxhQUFLLE9BQUw7QUFDQSx1QkFBZSxJQUFmO0FBQ0Q7QUFDRCxhQUFPLG9CQUFTLFFBQVQsRUFBbUIsRUFBQyxnQkFBZ0IsaUJBQWpCLEVBQW9DLFdBQVcsWUFBL0MsRUFBNkQsY0FBYyxPQUEzRSxFQUFvRixpQkFBaUIsVUFBckcsRUFBbkIsQ0FBUDtBQUNELEtBVEQsTUFTTyxJQUFJLEtBQUssWUFBTCxDQUFrQixZQUFsQixFQUFnQyxHQUFoQyxDQUFKLEVBQTBDO0FBQy9DLFVBQUksbUJBQW1CLEtBQUssd0JBQUwsRUFBdkI7QUFDQSxVQUFJLGtCQUFrQixLQUFLLGtCQUFMLEVBQXRCO0FBQ0EsVUFBSSxLQUFLLFNBQUwsQ0FBZSxLQUFLLElBQUwsRUFBZixFQUE0QixLQUE1QixLQUFzQyxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFsQixFQUFnQyxRQUFoQyxDQUExQyxFQUFxRjtBQUNuRixhQUFLLE9BQUw7QUFDQSxhQUFLLE9BQUw7QUFDQSx1QkFBZSxJQUFmO0FBQ0Q7QUFDRCxhQUFPLG9CQUFTLGlCQUFULEVBQTRCLEVBQUMsZ0JBQWdCLGlCQUFqQixFQUFvQyxXQUFXLFlBQS9DLEVBQTZELGtCQUFrQixnQkFBL0UsRUFBaUcsaUJBQWlCLGVBQWxILEVBQTVCLENBQVA7QUFDRDtBQUNELFVBQU0sS0FBSyxXQUFMLENBQWlCLFlBQWpCLEVBQStCLG1CQUEvQixDQUFOO0FBQ0Q7QUFDRCw2QkFBMkI7QUFDekIsU0FBSyxlQUFMLENBQXFCLEdBQXJCO0FBQ0EsU0FBSyxlQUFMLENBQXFCLElBQXJCO0FBQ0EsV0FBTyxLQUFLLHlCQUFMLEVBQVA7QUFDRDtBQUNELHlCQUF1QjtBQUNyQixRQUFJLFNBQVMsSUFBSSxhQUFKLENBQWtCLEtBQUssWUFBTCxFQUFsQixFQUF1QyxzQkFBdkMsRUFBK0MsS0FBSyxPQUFwRCxDQUFiO0FBQ0EsUUFBSSxZQUFZLEVBQWhCO0FBQ0EsV0FBTyxPQUFPLElBQVAsQ0FBWSxJQUFaLEtBQXFCLENBQTVCLEVBQStCO0FBQzdCLGdCQUFVLElBQVYsQ0FBZSxPQUFPLHdCQUFQLEVBQWY7QUFDQSxhQUFPLFlBQVA7QUFDRDtBQUNELFdBQU8scUJBQUssU0FBTCxDQUFQO0FBQ0Q7QUFDRCw2QkFBMkI7QUFDekIsUUFBSSxlQUFlLEtBQUssSUFBTCxFQUFuQjtBQUNBLFFBQUksT0FBSjtBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLFlBQWxCLEtBQW1DLEtBQUssU0FBTCxDQUFlLFlBQWYsQ0FBdkMsRUFBcUU7QUFDbkUsZ0JBQVUsS0FBSyxPQUFMLEVBQVY7QUFDQSxVQUFJLENBQUMsS0FBSyxZQUFMLENBQWtCLEtBQUssSUFBTCxFQUFsQixFQUErQixJQUEvQixDQUFMLEVBQTJDO0FBQ3pDLGVBQU8sb0JBQVMsaUJBQVQsRUFBNEIsRUFBQyxNQUFNLElBQVAsRUFBYSxTQUFTLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsTUFBTSxPQUFQLEVBQTlCLENBQXRCLEVBQTVCLENBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxhQUFLLGVBQUwsQ0FBcUIsSUFBckI7QUFDRDtBQUNGLEtBUEQsTUFPTztBQUNMLFlBQU0sS0FBSyxXQUFMLENBQWlCLFlBQWpCLEVBQStCLHNDQUEvQixDQUFOO0FBQ0Q7QUFDRCxXQUFPLG9CQUFTLGlCQUFULEVBQTRCLEVBQUMsTUFBTSxPQUFQLEVBQWdCLFNBQVMsS0FBSyx5QkFBTCxFQUF6QixFQUE1QixDQUFQO0FBQ0Q7QUFDRCx1QkFBcUI7QUFDbkIsU0FBSyxlQUFMLENBQXFCLE1BQXJCO0FBQ0EsUUFBSSxlQUFlLEtBQUssa0JBQUwsRUFBbkI7QUFDQSxTQUFLLGdCQUFMO0FBQ0EsV0FBTyxZQUFQO0FBQ0Q7QUFDRCw4QkFBNEI7QUFDMUIsUUFBSSxlQUFlLEtBQUssSUFBTCxFQUFuQjtBQUNBLFFBQUksS0FBSyxpQkFBTCxDQUF1QixZQUF2QixDQUFKLEVBQTBDO0FBQ3hDLGFBQU8sS0FBSywyQkFBTCxDQUFpQyxFQUFDLFFBQVEsS0FBVCxFQUFqQyxDQUFQO0FBQ0QsS0FGRCxNQUVPLElBQUksS0FBSyxTQUFMLENBQWUsWUFBZixFQUE2QixPQUE3QixDQUFKLEVBQTJDO0FBQ2hELGFBQU8sS0FBSyxhQUFMLENBQW1CLEVBQUMsUUFBUSxLQUFULEVBQW5CLENBQVA7QUFDRCxLQUZNLE1BRUE7QUFDTCxhQUFPLEtBQUssaUJBQUwsRUFBUDtBQUNEO0FBQ0Y7QUFDRCxzQkFBb0I7QUFDbEIsUUFBSSxlQUFlLEtBQUssSUFBTCxFQUFuQjtBQUNBLFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLHNCQUFMLENBQTRCLFlBQTVCLENBQTFCLEVBQXFFO0FBQ25FLFdBQUssV0FBTDtBQUNBLHFCQUFlLEtBQUssSUFBTCxFQUFmO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxNQUFMLENBQVksWUFBWixDQUExQixFQUFxRDtBQUNuRCxhQUFPLEtBQUssT0FBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxRQUFMLENBQWMsWUFBZCxDQUExQixFQUF1RDtBQUNyRCxhQUFPLEtBQUssc0JBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssZ0JBQUwsQ0FBc0IsWUFBdEIsQ0FBMUIsRUFBK0Q7QUFDN0QsYUFBTyxLQUFLLHNCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLGFBQUwsQ0FBbUIsWUFBbkIsQ0FBMUIsRUFBNEQ7QUFDMUQsYUFBTyxLQUFLLG1CQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLGNBQUwsQ0FBb0IsWUFBcEIsQ0FBMUIsRUFBNkQ7QUFDM0QsYUFBTyxLQUFLLG9CQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLGlCQUFMLENBQXVCLFlBQXZCLENBQTFCLEVBQWdFO0FBQzlELGFBQU8sS0FBSyx1QkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxnQkFBTCxDQUFzQixZQUF0QixDQUExQixFQUErRDtBQUM3RCxhQUFPLEtBQUssc0JBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssbUJBQUwsQ0FBeUIsWUFBekIsQ0FBMUIsRUFBa0U7QUFDaEUsYUFBTyxLQUFLLHlCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLGFBQUwsQ0FBbUIsWUFBbkIsQ0FBMUIsRUFBNEQ7QUFDMUQsYUFBTyxLQUFLLG1CQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLG1CQUFMLENBQXlCLFlBQXpCLENBQTFCLEVBQWtFO0FBQ2hFLGFBQU8sS0FBSyx5QkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxlQUFMLENBQXFCLFlBQXJCLENBQTFCLEVBQThEO0FBQzVELGFBQU8sS0FBSyxxQkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxjQUFMLENBQW9CLFlBQXBCLENBQTFCLEVBQTZEO0FBQzNELGFBQU8sS0FBSyxvQkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxnQkFBTCxDQUFzQixZQUF0QixDQUExQixFQUErRDtBQUM3RCxhQUFPLEtBQUssc0JBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssU0FBTCxDQUFlLFlBQWYsRUFBNkIsT0FBN0IsQ0FBMUIsRUFBaUU7QUFDL0QsYUFBTyxLQUFLLGFBQUwsQ0FBbUIsRUFBQyxRQUFRLEtBQVQsRUFBbkIsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssaUJBQUwsQ0FBdUIsWUFBdkIsQ0FBMUIsRUFBZ0U7QUFDOUQsYUFBTyxLQUFLLDJCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLFlBQUwsQ0FBa0IsWUFBbEIsQ0FBdEIsSUFBeUQsS0FBSyxZQUFMLENBQWtCLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBbEIsRUFBZ0MsR0FBaEMsQ0FBN0QsRUFBbUc7QUFDakcsYUFBTyxLQUFLLHdCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxLQUF1QixLQUFLLGtCQUFMLENBQXdCLFlBQXhCLEtBQXlDLEtBQUssa0JBQUwsQ0FBd0IsWUFBeEIsQ0FBekMsSUFBa0YsS0FBSyxvQkFBTCxDQUEwQixZQUExQixDQUFsRixJQUE2SCxLQUFLLHdCQUFMLENBQThCLFlBQTlCLENBQTdILElBQTRLLEtBQUsscUJBQUwsQ0FBMkIsWUFBM0IsQ0FBbk0sQ0FBSixFQUFrUDtBQUNoUCxVQUFJLE9BQU8sb0JBQVMsOEJBQVQsRUFBeUMsRUFBQyxhQUFhLEtBQUssMkJBQUwsRUFBZCxFQUF6QyxDQUFYO0FBQ0EsV0FBSyxnQkFBTDtBQUNBLGFBQU8sSUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUsscUJBQUwsQ0FBMkIsWUFBM0IsQ0FBMUIsRUFBb0U7QUFDbEUsYUFBTyxLQUFLLHVCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLFlBQUwsQ0FBa0IsWUFBbEIsRUFBZ0MsR0FBaEMsQ0FBMUIsRUFBZ0U7QUFDOUQsV0FBSyxPQUFMO0FBQ0EsYUFBTyxvQkFBUyxnQkFBVCxFQUEyQixFQUEzQixDQUFQO0FBQ0Q7QUFDRCxXQUFPLEtBQUssMkJBQUwsRUFBUDtBQUNEO0FBQ0QsNkJBQTJCO0FBQ3pCLFFBQUksV0FBVyxLQUFLLGVBQUwsRUFBZjtBQUNBLFFBQUksVUFBVSxLQUFLLGVBQUwsQ0FBcUIsR0FBckIsQ0FBZDtBQUNBLFFBQUksVUFBVSxLQUFLLGlCQUFMLEVBQWQ7QUFDQSxXQUFPLG9CQUFTLGtCQUFULEVBQTZCLEVBQUMsT0FBTyxRQUFSLEVBQWtCLE1BQU0sT0FBeEIsRUFBN0IsQ0FBUDtBQUNEO0FBQ0QsMkJBQXlCO0FBQ3ZCLFNBQUssWUFBTCxDQUFrQixPQUFsQjtBQUNBLFFBQUksZUFBZSxLQUFLLElBQUwsRUFBbkI7QUFDQSxRQUFJLFdBQVcsSUFBZjtBQUNBLFFBQUksS0FBSyxJQUFMLENBQVUsSUFBVixLQUFtQixDQUFuQixJQUF3QixLQUFLLFlBQUwsQ0FBa0IsWUFBbEIsRUFBZ0MsR0FBaEMsQ0FBNUIsRUFBa0U7QUFDaEUsV0FBSyxnQkFBTDtBQUNBLGFBQU8sb0JBQVMsZ0JBQVQsRUFBMkIsRUFBQyxPQUFPLFFBQVIsRUFBM0IsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLFlBQUwsQ0FBa0IsWUFBbEIsS0FBbUMsS0FBSyxTQUFMLENBQWUsWUFBZixFQUE2QixPQUE3QixDQUFuQyxJQUE0RSxLQUFLLFNBQUwsQ0FBZSxZQUFmLEVBQTZCLEtBQTdCLENBQWhGLEVBQXFIO0FBQ25ILGlCQUFXLEtBQUssa0JBQUwsRUFBWDtBQUNEO0FBQ0QsU0FBSyxnQkFBTDtBQUNBLFdBQU8sb0JBQVMsZ0JBQVQsRUFBMkIsRUFBQyxPQUFPLFFBQVIsRUFBM0IsQ0FBUDtBQUNEO0FBQ0QseUJBQXVCO0FBQ3JCLFNBQUssWUFBTCxDQUFrQixLQUFsQjtBQUNBLFFBQUksVUFBVSxLQUFLLGFBQUwsRUFBZDtBQUNBLFFBQUksS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsT0FBNUIsQ0FBSixFQUEwQztBQUN4QyxVQUFJLGNBQWMsS0FBSyxtQkFBTCxFQUFsQjtBQUNBLFVBQUksS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsU0FBNUIsQ0FBSixFQUE0QztBQUMxQyxhQUFLLE9BQUw7QUFDQSxZQUFJLFlBQVksS0FBSyxhQUFMLEVBQWhCO0FBQ0EsZUFBTyxvQkFBUyxxQkFBVCxFQUFnQyxFQUFDLE1BQU0sT0FBUCxFQUFnQixhQUFhLFdBQTdCLEVBQTBDLFdBQVcsU0FBckQsRUFBaEMsQ0FBUDtBQUNEO0FBQ0QsYUFBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sT0FBUCxFQUFnQixhQUFhLFdBQTdCLEVBQTlCLENBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsU0FBNUIsQ0FBSixFQUE0QztBQUMxQyxXQUFLLE9BQUw7QUFDQSxVQUFJLFlBQVksS0FBSyxhQUFMLEVBQWhCO0FBQ0EsYUFBTyxvQkFBUyxxQkFBVCxFQUFnQyxFQUFDLE1BQU0sT0FBUCxFQUFnQixhQUFhLElBQTdCLEVBQW1DLFdBQVcsU0FBOUMsRUFBaEMsQ0FBUDtBQUNEO0FBQ0QsVUFBTSxLQUFLLFdBQUwsQ0FBaUIsS0FBSyxJQUFMLEVBQWpCLEVBQThCLDhCQUE5QixDQUFOO0FBQ0Q7QUFDRCx3QkFBc0I7QUFDcEIsU0FBSyxZQUFMLENBQWtCLE9BQWxCO0FBQ0EsUUFBSSxtQkFBbUIsS0FBSyxXQUFMLEVBQXZCO0FBQ0EsUUFBSSxTQUFTLElBQUksYUFBSixDQUFrQixnQkFBbEIsRUFBb0Msc0JBQXBDLEVBQTRDLEtBQUssT0FBakQsQ0FBYjtBQUNBLFFBQUksYUFBYSxPQUFPLHFCQUFQLEVBQWpCO0FBQ0EsUUFBSSxVQUFVLEtBQUssYUFBTCxFQUFkO0FBQ0EsV0FBTyxvQkFBUyxhQUFULEVBQXdCLEVBQUMsU0FBUyxVQUFWLEVBQXNCLE1BQU0sT0FBNUIsRUFBeEIsQ0FBUDtBQUNEO0FBQ0QsMkJBQXlCO0FBQ3ZCLFNBQUssWUFBTCxDQUFrQixPQUFsQjtBQUNBLFFBQUksZ0JBQWdCLEtBQUssa0JBQUwsRUFBcEI7QUFDQSxTQUFLLGdCQUFMO0FBQ0EsV0FBTyxvQkFBUyxnQkFBVCxFQUEyQixFQUFDLFlBQVksYUFBYixFQUEzQixDQUFQO0FBQ0Q7QUFDRCwwQkFBd0I7QUFDdEIsU0FBSyxZQUFMLENBQWtCLE1BQWxCO0FBQ0EsUUFBSSxlQUFlLEtBQUssV0FBTCxFQUFuQjtBQUNBLFFBQUksU0FBUyxJQUFJLGFBQUosQ0FBa0IsWUFBbEIsRUFBZ0Msc0JBQWhDLEVBQXdDLEtBQUssT0FBN0MsQ0FBYjtBQUNBLFFBQUksWUFBWSxPQUFPLGtCQUFQLEVBQWhCO0FBQ0EsUUFBSSxVQUFVLEtBQUssaUJBQUwsRUFBZDtBQUNBLFdBQU8sb0JBQVMsZUFBVCxFQUEwQixFQUFDLFFBQVEsU0FBVCxFQUFvQixNQUFNLE9BQTFCLEVBQTFCLENBQVA7QUFDRDtBQUNELDhCQUE0QjtBQUMxQixTQUFLLFlBQUwsQ0FBa0IsVUFBbEI7QUFDQSxXQUFPLG9CQUFTLG1CQUFULEVBQThCLEVBQTlCLENBQVA7QUFDRDtBQUNELHdCQUFzQjtBQUNwQixTQUFLLFlBQUwsQ0FBa0IsSUFBbEI7QUFDQSxRQUFJLFVBQVUsS0FBSyxpQkFBTCxFQUFkO0FBQ0EsU0FBSyxZQUFMLENBQWtCLE9BQWxCO0FBQ0EsUUFBSSxjQUFjLEtBQUssV0FBTCxFQUFsQjtBQUNBLFFBQUksU0FBUyxJQUFJLGFBQUosQ0FBa0IsV0FBbEIsRUFBK0Isc0JBQS9CLEVBQXVDLEtBQUssT0FBNUMsQ0FBYjtBQUNBLFFBQUksVUFBVSxPQUFPLGtCQUFQLEVBQWQ7QUFDQSxTQUFLLGdCQUFMO0FBQ0EsV0FBTyxvQkFBUyxrQkFBVCxFQUE2QixFQUFDLE1BQU0sT0FBUCxFQUFnQixNQUFNLE9BQXRCLEVBQTdCLENBQVA7QUFDRDtBQUNELDhCQUE0QjtBQUMxQixRQUFJLFNBQVMsS0FBSyxZQUFMLENBQWtCLFVBQWxCLENBQWI7QUFDQSxRQUFJLGVBQWUsS0FBSyxJQUFMLEVBQW5CO0FBQ0EsUUFBSSxXQUFXLElBQWY7QUFDQSxRQUFJLEtBQUssSUFBTCxDQUFVLElBQVYsS0FBbUIsQ0FBbkIsSUFBd0IsS0FBSyxZQUFMLENBQWtCLFlBQWxCLEVBQWdDLEdBQWhDLENBQTVCLEVBQWtFO0FBQ2hFLFdBQUssZ0JBQUw7QUFDQSxhQUFPLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsT0FBTyxRQUFSLEVBQTlCLENBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxZQUFMLENBQWtCLE1BQWxCLEVBQTBCLFlBQTFCLE1BQTRDLEtBQUssWUFBTCxDQUFrQixZQUFsQixLQUFtQyxLQUFLLFNBQUwsQ0FBZSxZQUFmLEVBQTZCLE9BQTdCLENBQW5DLElBQTRFLEtBQUssU0FBTCxDQUFlLFlBQWYsRUFBNkIsS0FBN0IsQ0FBeEgsQ0FBSixFQUFrSztBQUNoSyxpQkFBVyxLQUFLLGtCQUFMLEVBQVg7QUFDRDtBQUNELFNBQUssZ0JBQUw7QUFDQSxXQUFPLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsT0FBTyxRQUFSLEVBQTlCLENBQVA7QUFDRDtBQUNELDRCQUEwQjtBQUN4QixTQUFLLFlBQUwsQ0FBa0IsUUFBbEI7QUFDQSxRQUFJLFVBQVUsS0FBSyxXQUFMLEVBQWQ7QUFDQSxRQUFJLFNBQVMsSUFBSSxhQUFKLENBQWtCLE9BQWxCLEVBQTJCLHNCQUEzQixFQUFtQyxLQUFLLE9BQXhDLENBQWI7QUFDQSxRQUFJLGtCQUFrQixPQUFPLGtCQUFQLEVBQXRCO0FBQ0EsUUFBSSxVQUFVLEtBQUssWUFBTCxFQUFkO0FBQ0EsUUFBSSxRQUFRLElBQVIsS0FBaUIsQ0FBckIsRUFBd0I7QUFDdEIsYUFBTyxvQkFBUyxpQkFBVCxFQUE0QixFQUFDLGNBQWMsZUFBZixFQUFnQyxPQUFPLHNCQUF2QyxFQUE1QixDQUFQO0FBQ0Q7QUFDRCxhQUFTLElBQUksYUFBSixDQUFrQixPQUFsQixFQUEyQixzQkFBM0IsRUFBbUMsS0FBSyxPQUF4QyxDQUFUO0FBQ0EsUUFBSSxXQUFXLE9BQU8sbUJBQVAsRUFBZjtBQUNBLFFBQUksZUFBZSxPQUFPLElBQVAsRUFBbkI7QUFDQSxRQUFJLE9BQU8sU0FBUCxDQUFpQixZQUFqQixFQUErQixTQUEvQixDQUFKLEVBQStDO0FBQzdDLFVBQUksY0FBYyxPQUFPLHFCQUFQLEVBQWxCO0FBQ0EsVUFBSSxtQkFBbUIsT0FBTyxtQkFBUCxFQUF2QjtBQUNBLGFBQU8sb0JBQVMsNEJBQVQsRUFBdUMsRUFBQyxjQUFjLGVBQWYsRUFBZ0MsaUJBQWlCLFFBQWpELEVBQTJELGFBQWEsV0FBeEUsRUFBcUYsa0JBQWtCLGdCQUF2RyxFQUF2QyxDQUFQO0FBQ0Q7QUFDRCxXQUFPLG9CQUFTLGlCQUFULEVBQTRCLEVBQUMsY0FBYyxlQUFmLEVBQWdDLE9BQU8sUUFBdkMsRUFBNUIsQ0FBUDtBQUNEO0FBQ0Qsd0JBQXNCO0FBQ3BCLFFBQUksV0FBVyxFQUFmO0FBQ0EsV0FBTyxFQUFFLEtBQUssSUFBTCxDQUFVLElBQVYsS0FBbUIsQ0FBbkIsSUFBd0IsS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsU0FBNUIsQ0FBMUIsQ0FBUCxFQUEwRTtBQUN4RSxlQUFTLElBQVQsQ0FBYyxLQUFLLGtCQUFMLEVBQWQ7QUFDRDtBQUNELFdBQU8scUJBQUssUUFBTCxDQUFQO0FBQ0Q7QUFDRCx1QkFBcUI7QUFDbkIsU0FBSyxZQUFMLENBQWtCLE1BQWxCO0FBQ0EsV0FBTyxvQkFBUyxZQUFULEVBQXVCLEVBQUMsTUFBTSxLQUFLLGtCQUFMLEVBQVAsRUFBa0MsWUFBWSxLQUFLLHNCQUFMLEVBQTlDLEVBQXZCLENBQVA7QUFDRDtBQUNELDJCQUF5QjtBQUN2QixTQUFLLGVBQUwsQ0FBcUIsR0FBckI7QUFDQSxXQUFPLEtBQUsscUNBQUwsRUFBUDtBQUNEO0FBQ0QsMENBQXdDO0FBQ3RDLFFBQUksYUFBYSxFQUFqQjtBQUNBLFdBQU8sRUFBRSxLQUFLLElBQUwsQ0FBVSxJQUFWLEtBQW1CLENBQW5CLElBQXdCLEtBQUssU0FBTCxDQUFlLEtBQUssSUFBTCxFQUFmLEVBQTRCLFNBQTVCLENBQXhCLElBQWtFLEtBQUssU0FBTCxDQUFlLEtBQUssSUFBTCxFQUFmLEVBQTRCLE1BQTVCLENBQXBFLENBQVAsRUFBaUg7QUFDL0csaUJBQVcsSUFBWCxDQUFnQixLQUFLLHlCQUFMLEVBQWhCO0FBQ0Q7QUFDRCxXQUFPLHFCQUFLLFVBQUwsQ0FBUDtBQUNEO0FBQ0QsMEJBQXdCO0FBQ3RCLFNBQUssWUFBTCxDQUFrQixTQUFsQjtBQUNBLFdBQU8sb0JBQVMsZUFBVCxFQUEwQixFQUFDLFlBQVksS0FBSyxzQkFBTCxFQUFiLEVBQTFCLENBQVA7QUFDRDtBQUNELHlCQUF1QjtBQUNyQixTQUFLLFlBQUwsQ0FBa0IsS0FBbEI7QUFDQSxRQUFJLFdBQVcsS0FBSyxXQUFMLEVBQWY7QUFDQSxRQUFJLFVBQVUsSUFBSSxhQUFKLENBQWtCLFFBQWxCLEVBQTRCLHNCQUE1QixFQUFvQyxLQUFLLE9BQXpDLENBQWQ7QUFDQSxRQUFJLGFBQUosRUFBbUIsUUFBbkIsRUFBNkIsUUFBN0IsRUFBdUMsU0FBdkMsRUFBa0QsUUFBbEQsRUFBNEQsUUFBNUQsRUFBc0UsVUFBdEU7QUFDQSxRQUFJLFFBQVEsWUFBUixDQUFxQixRQUFRLElBQVIsRUFBckIsRUFBcUMsR0FBckMsQ0FBSixFQUErQztBQUM3QyxjQUFRLE9BQVI7QUFDQSxVQUFJLENBQUMsUUFBUSxZQUFSLENBQXFCLFFBQVEsSUFBUixFQUFyQixFQUFxQyxHQUFyQyxDQUFMLEVBQWdEO0FBQzlDLG1CQUFXLFFBQVEsa0JBQVIsRUFBWDtBQUNEO0FBQ0QsY0FBUSxlQUFSLENBQXdCLEdBQXhCO0FBQ0EsVUFBSSxRQUFRLElBQVIsQ0FBYSxJQUFiLEtBQXNCLENBQTFCLEVBQTZCO0FBQzNCLG9CQUFZLFFBQVEsa0JBQVIsRUFBWjtBQUNEO0FBQ0QsYUFBTyxvQkFBUyxjQUFULEVBQXlCLEVBQUMsTUFBTSxJQUFQLEVBQWEsTUFBTSxRQUFuQixFQUE2QixRQUFRLFNBQXJDLEVBQWdELE1BQU0sS0FBSyxpQkFBTCxFQUF0RCxFQUF6QixDQUFQO0FBQ0QsS0FWRCxNQVVPO0FBQ0wsc0JBQWdCLFFBQVEsSUFBUixFQUFoQjtBQUNBLFVBQUksUUFBUSxrQkFBUixDQUEyQixhQUEzQixLQUE2QyxRQUFRLGtCQUFSLENBQTJCLGFBQTNCLENBQTdDLElBQTBGLFFBQVEsb0JBQVIsQ0FBNkIsYUFBN0IsQ0FBOUYsRUFBMkk7QUFDekksbUJBQVcsUUFBUSwyQkFBUixFQUFYO0FBQ0Esd0JBQWdCLFFBQVEsSUFBUixFQUFoQjtBQUNBLFlBQUksS0FBSyxTQUFMLENBQWUsYUFBZixFQUE4QixJQUE5QixLQUF1QyxLQUFLLFlBQUwsQ0FBa0IsYUFBbEIsRUFBaUMsSUFBakMsQ0FBM0MsRUFBbUY7QUFDakYsY0FBSSxLQUFLLFNBQUwsQ0FBZSxhQUFmLEVBQThCLElBQTlCLENBQUosRUFBeUM7QUFDdkMsb0JBQVEsT0FBUjtBQUNBLHdCQUFZLFFBQVEsa0JBQVIsRUFBWjtBQUNBLHVCQUFXLGdCQUFYO0FBQ0QsV0FKRCxNQUlPLElBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLElBQWpDLENBQUosRUFBNEM7QUFDakQsb0JBQVEsT0FBUjtBQUNBLHdCQUFZLFFBQVEsa0JBQVIsRUFBWjtBQUNBLHVCQUFXLGdCQUFYO0FBQ0Q7QUFDRCxpQkFBTyxvQkFBUyxRQUFULEVBQW1CLEVBQUMsTUFBTSxRQUFQLEVBQWlCLE9BQU8sU0FBeEIsRUFBbUMsTUFBTSxLQUFLLGlCQUFMLEVBQXpDLEVBQW5CLENBQVA7QUFDRDtBQUNELGdCQUFRLGVBQVIsQ0FBd0IsR0FBeEI7QUFDQSxZQUFJLFFBQVEsWUFBUixDQUFxQixRQUFRLElBQVIsRUFBckIsRUFBcUMsR0FBckMsQ0FBSixFQUErQztBQUM3QyxrQkFBUSxPQUFSO0FBQ0EscUJBQVcsSUFBWDtBQUNELFNBSEQsTUFHTztBQUNMLHFCQUFXLFFBQVEsa0JBQVIsRUFBWDtBQUNBLGtCQUFRLGVBQVIsQ0FBd0IsR0FBeEI7QUFDRDtBQUNELHFCQUFhLFFBQVEsa0JBQVIsRUFBYjtBQUNELE9BeEJELE1Bd0JPO0FBQ0wsWUFBSSxLQUFLLFNBQUwsQ0FBZSxRQUFRLElBQVIsQ0FBYSxDQUFiLENBQWYsRUFBZ0MsSUFBaEMsS0FBeUMsS0FBSyxZQUFMLENBQWtCLFFBQVEsSUFBUixDQUFhLENBQWIsQ0FBbEIsRUFBbUMsSUFBbkMsQ0FBN0MsRUFBdUY7QUFDckYscUJBQVcsUUFBUSx5QkFBUixFQUFYO0FBQ0EsY0FBSSxPQUFPLFFBQVEsT0FBUixFQUFYO0FBQ0EsY0FBSSxLQUFLLFNBQUwsQ0FBZSxJQUFmLEVBQXFCLElBQXJCLENBQUosRUFBZ0M7QUFDOUIsdUJBQVcsZ0JBQVg7QUFDRCxXQUZELE1BRU87QUFDTCx1QkFBVyxnQkFBWDtBQUNEO0FBQ0Qsc0JBQVksUUFBUSxrQkFBUixFQUFaO0FBQ0EsaUJBQU8sb0JBQVMsUUFBVCxFQUFtQixFQUFDLE1BQU0sUUFBUCxFQUFpQixPQUFPLFNBQXhCLEVBQW1DLE1BQU0sS0FBSyxpQkFBTCxFQUF6QyxFQUFuQixDQUFQO0FBQ0Q7QUFDRCxtQkFBVyxRQUFRLGtCQUFSLEVBQVg7QUFDQSxnQkFBUSxlQUFSLENBQXdCLEdBQXhCO0FBQ0EsWUFBSSxRQUFRLFlBQVIsQ0FBcUIsUUFBUSxJQUFSLEVBQXJCLEVBQXFDLEdBQXJDLENBQUosRUFBK0M7QUFDN0Msa0JBQVEsT0FBUjtBQUNBLHFCQUFXLElBQVg7QUFDRCxTQUhELE1BR087QUFDTCxxQkFBVyxRQUFRLGtCQUFSLEVBQVg7QUFDQSxrQkFBUSxlQUFSLENBQXdCLEdBQXhCO0FBQ0Q7QUFDRCxxQkFBYSxRQUFRLGtCQUFSLEVBQWI7QUFDRDtBQUNELGFBQU8sb0JBQVMsY0FBVCxFQUF5QixFQUFDLE1BQU0sUUFBUCxFQUFpQixNQUFNLFFBQXZCLEVBQWlDLFFBQVEsVUFBekMsRUFBcUQsTUFBTSxLQUFLLGlCQUFMLEVBQTNELEVBQXpCLENBQVA7QUFDRDtBQUNGO0FBQ0Qsd0JBQXNCO0FBQ3BCLFNBQUssWUFBTCxDQUFrQixJQUFsQjtBQUNBLFFBQUksV0FBVyxLQUFLLFdBQUwsRUFBZjtBQUNBLFFBQUksVUFBVSxJQUFJLGFBQUosQ0FBa0IsUUFBbEIsRUFBNEIsc0JBQTVCLEVBQW9DLEtBQUssT0FBekMsQ0FBZDtBQUNBLFFBQUksZ0JBQWdCLFFBQVEsSUFBUixFQUFwQjtBQUNBLFFBQUksV0FBVyxRQUFRLGtCQUFSLEVBQWY7QUFDQSxRQUFJLGFBQWEsSUFBakIsRUFBdUI7QUFDckIsWUFBTSxRQUFRLFdBQVIsQ0FBb0IsYUFBcEIsRUFBbUMseUJBQW5DLENBQU47QUFDRDtBQUNELFFBQUksaUJBQWlCLEtBQUssaUJBQUwsRUFBckI7QUFDQSxRQUFJLGdCQUFnQixJQUFwQjtBQUNBLFFBQUksS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsTUFBNUIsQ0FBSixFQUF5QztBQUN2QyxXQUFLLE9BQUw7QUFDQSxzQkFBZ0IsS0FBSyxpQkFBTCxFQUFoQjtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxhQUFULEVBQXdCLEVBQUMsTUFBTSxRQUFQLEVBQWlCLFlBQVksY0FBN0IsRUFBNkMsV0FBVyxhQUF4RCxFQUF4QixDQUFQO0FBQ0Q7QUFDRCwyQkFBeUI7QUFDdkIsU0FBSyxZQUFMLENBQWtCLE9BQWxCO0FBQ0EsUUFBSSxXQUFXLEtBQUssV0FBTCxFQUFmO0FBQ0EsUUFBSSxVQUFVLElBQUksYUFBSixDQUFrQixRQUFsQixFQUE0QixzQkFBNUIsRUFBb0MsS0FBSyxPQUF6QyxDQUFkO0FBQ0EsUUFBSSxnQkFBZ0IsUUFBUSxJQUFSLEVBQXBCO0FBQ0EsUUFBSSxXQUFXLFFBQVEsa0JBQVIsRUFBZjtBQUNBLFFBQUksYUFBYSxJQUFqQixFQUF1QjtBQUNyQixZQUFNLFFBQVEsV0FBUixDQUFvQixhQUFwQixFQUFtQyx5QkFBbkMsQ0FBTjtBQUNEO0FBQ0QsUUFBSSxXQUFXLEtBQUssaUJBQUwsRUFBZjtBQUNBLFdBQU8sb0JBQVMsZ0JBQVQsRUFBMkIsRUFBQyxNQUFNLFFBQVAsRUFBaUIsTUFBTSxRQUF2QixFQUEzQixDQUFQO0FBQ0Q7QUFDRCwyQkFBeUI7QUFDdkIsV0FBTyxvQkFBUyxnQkFBVCxFQUEyQixFQUFDLE9BQU8sS0FBSyxhQUFMLEVBQVIsRUFBM0IsQ0FBUDtBQUNEO0FBQ0Qsa0JBQWdCO0FBQ2QsV0FBTyxvQkFBUyxPQUFULEVBQWtCLEVBQUMsWUFBWSxLQUFLLFlBQUwsRUFBYixFQUFsQixDQUFQO0FBQ0Q7QUFDRCxzQkFBbUM7QUFBQSxRQUFwQixNQUFvQixRQUFwQixNQUFvQjtBQUFBLFFBQVosU0FBWSxRQUFaLFNBQVk7O0FBQ2pDLFFBQUksU0FBUyxLQUFLLE9BQUwsRUFBYjtBQUNBLFFBQUksV0FBVyxJQUFmO0FBQUEsUUFBcUIsV0FBVyxJQUFoQztBQUNBLFFBQUksV0FBVyxTQUFTLGlCQUFULEdBQTZCLGtCQUE1QztBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLEtBQUssSUFBTCxFQUFsQixDQUFKLEVBQW9DO0FBQ2xDLGlCQUFXLEtBQUsseUJBQUwsRUFBWDtBQUNELEtBRkQsTUFFTyxJQUFJLENBQUMsTUFBTCxFQUFhO0FBQ2xCLFVBQUksU0FBSixFQUFlO0FBQ2IsbUJBQVcsb0JBQVMsbUJBQVQsRUFBOEIsRUFBQyxNQUFNLGlCQUFPLGNBQVAsQ0FBc0IsVUFBdEIsRUFBa0MsTUFBbEMsQ0FBUCxFQUE5QixDQUFYO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsY0FBTSxLQUFLLFdBQUwsQ0FBaUIsS0FBSyxJQUFMLEVBQWpCLEVBQThCLG1CQUE5QixDQUFOO0FBQ0Q7QUFDRjtBQUNELFFBQUksS0FBSyxTQUFMLENBQWUsS0FBSyxJQUFMLEVBQWYsRUFBNEIsU0FBNUIsQ0FBSixFQUE0QztBQUMxQyxXQUFLLE9BQUw7QUFDQSxpQkFBVyxLQUFLLHNCQUFMLEVBQVg7QUFDRDtBQUNELFFBQUksZUFBZSxFQUFuQjtBQUNBLFFBQUksVUFBVSxJQUFJLGFBQUosQ0FBa0IsS0FBSyxZQUFMLEVBQWxCLEVBQXVDLHNCQUF2QyxFQUErQyxLQUFLLE9BQXBELENBQWQ7QUFDQSxXQUFPLFFBQVEsSUFBUixDQUFhLElBQWIsS0FBc0IsQ0FBN0IsRUFBZ0M7QUFDOUIsVUFBSSxRQUFRLFlBQVIsQ0FBcUIsUUFBUSxJQUFSLEVBQXJCLEVBQXFDLEdBQXJDLENBQUosRUFBK0M7QUFDN0MsZ0JBQVEsT0FBUjtBQUNBO0FBQ0Q7QUFDRCxVQUFJLFdBQVcsS0FBZjs7QUFMOEIsa0NBTUosUUFBUSx3QkFBUixFQU5JOztBQUFBLFVBTXpCLFdBTnlCLHlCQU16QixXQU55QjtBQUFBLFVBTVosSUFOWSx5QkFNWixJQU5ZOztBQU85QixVQUFJLFNBQVMsWUFBVCxJQUF5QixZQUFZLEtBQVosQ0FBa0IsR0FBbEIsT0FBNEIsUUFBekQsRUFBbUU7QUFDakUsbUJBQVcsSUFBWDs7QUFEaUUscUNBRTFDLFFBQVEsd0JBQVIsRUFGMEM7O0FBRS9ELG1CQUYrRCwwQkFFL0QsV0FGK0Q7QUFFbEQsWUFGa0QsMEJBRWxELElBRmtEO0FBR2xFO0FBQ0QsVUFBSSxTQUFTLFFBQWIsRUFBdUI7QUFDckIscUJBQWEsSUFBYixDQUFrQixvQkFBUyxjQUFULEVBQXlCLEVBQUMsVUFBVSxRQUFYLEVBQXFCLFFBQVEsV0FBN0IsRUFBekIsQ0FBbEI7QUFDRCxPQUZELE1BRU87QUFDTCxjQUFNLEtBQUssV0FBTCxDQUFpQixRQUFRLElBQVIsRUFBakIsRUFBaUMscUNBQWpDLENBQU47QUFDRDtBQUNGO0FBQ0QsV0FBTyxvQkFBUyxRQUFULEVBQW1CLEVBQUMsTUFBTSxRQUFQLEVBQWlCLE9BQU8sUUFBeEIsRUFBa0MsVUFBVSxxQkFBSyxZQUFMLENBQTVDLEVBQW5CLENBQVA7QUFDRDtBQUNELDBCQUE4QztBQUFBLHNFQUFKLEVBQUk7O0FBQUEsUUFBdkIsZUFBdUIsU0FBdkIsZUFBdUI7O0FBQzVDLFFBQUksZ0JBQWdCLEtBQUssSUFBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEtBQW9DLEtBQUssU0FBTCxDQUFlLGFBQWYsQ0FBcEMsSUFBcUUsbUJBQW1CLEtBQUssWUFBTCxDQUFrQixhQUFsQixDQUE1RixFQUE4SDtBQUM1SCxhQUFPLEtBQUsseUJBQUwsQ0FBK0IsRUFBQyxpQkFBaUIsZUFBbEIsRUFBL0IsQ0FBUDtBQUNELEtBRkQsTUFFTyxJQUFJLEtBQUssVUFBTCxDQUFnQixhQUFoQixDQUFKLEVBQW9DO0FBQ3pDLGFBQU8sS0FBSyxvQkFBTCxFQUFQO0FBQ0QsS0FGTSxNQUVBLElBQUksS0FBSyxRQUFMLENBQWMsYUFBZCxDQUFKLEVBQWtDO0FBQ3ZDLGFBQU8sS0FBSyxxQkFBTCxFQUFQO0FBQ0Q7QUFDRCx3QkFBTyxLQUFQLEVBQWMscUJBQWQ7QUFDRDtBQUNELDBCQUF3QjtBQUN0QixRQUFJLFVBQVUsSUFBSSxhQUFKLENBQWtCLEtBQUssWUFBTCxFQUFsQixFQUF1QyxzQkFBdkMsRUFBK0MsS0FBSyxPQUFwRCxDQUFkO0FBQ0EsUUFBSSxpQkFBaUIsRUFBckI7QUFDQSxXQUFPLFFBQVEsSUFBUixDQUFhLElBQWIsS0FBc0IsQ0FBN0IsRUFBZ0M7QUFDOUIscUJBQWUsSUFBZixDQUFvQixRQUFRLHVCQUFSLEVBQXBCO0FBQ0EsY0FBUSxZQUFSO0FBQ0Q7QUFDRCxXQUFPLG9CQUFTLGVBQVQsRUFBMEIsRUFBQyxZQUFZLHFCQUFLLGNBQUwsQ0FBYixFQUExQixDQUFQO0FBQ0Q7QUFDRCw0QkFBMEI7QUFDeEIsUUFBSSxnQkFBZ0IsS0FBSyxJQUFMLEVBQXBCOztBQUR3QixnQ0FFRixLQUFLLG9CQUFMLEVBRkU7O0FBQUEsUUFFbkIsSUFGbUIseUJBRW5CLElBRm1CO0FBQUEsUUFFYixPQUZhLHlCQUViLE9BRmE7O0FBR3hCLFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEtBQW9DLEtBQUssU0FBTCxDQUFlLGFBQWYsRUFBOEIsS0FBOUIsQ0FBcEMsSUFBNEUsS0FBSyxTQUFMLENBQWUsYUFBZixFQUE4QixPQUE5QixDQUFoRixFQUF3SDtBQUN0SCxVQUFJLENBQUMsS0FBSyxZQUFMLENBQWtCLEtBQUssSUFBTCxFQUFsQixFQUErQixHQUEvQixDQUFMLEVBQTBDO0FBQ3hDLFlBQUksZUFBZSxJQUFuQjtBQUNBLFlBQUksS0FBSyxRQUFMLENBQWMsS0FBSyxJQUFMLEVBQWQsQ0FBSixFQUFnQztBQUM5QixlQUFLLE9BQUw7QUFDQSxjQUFJLE9BQU8sS0FBSyxzQkFBTCxFQUFYO0FBQ0EseUJBQWUsSUFBZjtBQUNEO0FBQ0QsZUFBTyxvQkFBUywyQkFBVCxFQUFzQyxFQUFDLFNBQVMsT0FBVixFQUFtQixNQUFNLFlBQXpCLEVBQXRDLENBQVA7QUFDRDtBQUNGO0FBQ0QsU0FBSyxlQUFMLENBQXFCLEdBQXJCO0FBQ0EsY0FBVSxLQUFLLHNCQUFMLEVBQVY7QUFDQSxXQUFPLG9CQUFTLHlCQUFULEVBQW9DLEVBQUMsTUFBTSxJQUFQLEVBQWEsU0FBUyxPQUF0QixFQUFwQyxDQUFQO0FBQ0Q7QUFDRCx5QkFBdUI7QUFDckIsUUFBSSxjQUFjLEtBQUssWUFBTCxFQUFsQjtBQUNBLFFBQUksVUFBVSxJQUFJLGFBQUosQ0FBa0IsV0FBbEIsRUFBK0Isc0JBQS9CLEVBQXVDLEtBQUssT0FBNUMsQ0FBZDtBQUNBLFFBQUksZUFBZSxFQUFuQjtBQUFBLFFBQXVCLGtCQUFrQixJQUF6QztBQUNBLFdBQU8sUUFBUSxJQUFSLENBQWEsSUFBYixLQUFzQixDQUE3QixFQUFnQztBQUM5QixVQUFJLEVBQUo7QUFDQSxVQUFJLFFBQVEsWUFBUixDQUFxQixRQUFRLElBQVIsRUFBckIsRUFBcUMsR0FBckMsQ0FBSixFQUErQztBQUM3QyxnQkFBUSxZQUFSO0FBQ0EsYUFBSyxJQUFMO0FBQ0QsT0FIRCxNQUdPO0FBQ0wsWUFBSSxRQUFRLFlBQVIsQ0FBcUIsUUFBUSxJQUFSLEVBQXJCLEVBQXFDLEtBQXJDLENBQUosRUFBaUQ7QUFDL0Msa0JBQVEsT0FBUjtBQUNBLDRCQUFrQixRQUFRLHFCQUFSLEVBQWxCO0FBQ0E7QUFDRCxTQUpELE1BSU87QUFDTCxlQUFLLFFBQVEsc0JBQVIsRUFBTDtBQUNEO0FBQ0QsZ0JBQVEsWUFBUjtBQUNEO0FBQ0QsbUJBQWEsSUFBYixDQUFrQixFQUFsQjtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxjQUFULEVBQXlCLEVBQUMsVUFBVSxxQkFBSyxZQUFMLENBQVgsRUFBK0IsYUFBYSxlQUE1QyxFQUF6QixDQUFQO0FBQ0Q7QUFDRCwyQkFBeUI7QUFDdkIsUUFBSSxjQUFjLEtBQUsscUJBQUwsRUFBbEI7QUFDQSxRQUFJLEtBQUssUUFBTCxDQUFjLEtBQUssSUFBTCxFQUFkLENBQUosRUFBZ0M7QUFDOUIsV0FBSyxPQUFMO0FBQ0EsVUFBSSxPQUFPLEtBQUssc0JBQUwsRUFBWDtBQUNBLG9CQUFjLG9CQUFTLG9CQUFULEVBQStCLEVBQUMsU0FBUyxXQUFWLEVBQXVCLE1BQU0sSUFBN0IsRUFBL0IsQ0FBZDtBQUNEO0FBQ0QsV0FBTyxXQUFQO0FBQ0Q7QUFDRCw4QkFBa0Q7QUFBQSxzRUFBSixFQUFJOztBQUFBLFFBQXZCLGVBQXVCLFNBQXZCLGVBQXVCOztBQUNoRCxRQUFJLFFBQUo7QUFDQSxRQUFJLG1CQUFtQixLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLEVBQWxCLENBQXZCLEVBQXVEO0FBQ3JELGlCQUFXLEtBQUssa0JBQUwsRUFBWDtBQUNELEtBRkQsTUFFTztBQUNMLGlCQUFXLEtBQUssa0JBQUwsRUFBWDtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sUUFBUCxFQUE5QixDQUFQO0FBQ0Q7QUFDRCx1QkFBcUI7QUFDbkIsUUFBSSxnQkFBZ0IsS0FBSyxJQUFMLEVBQXBCO0FBQ0EsUUFBSSxLQUFLLFlBQUwsQ0FBa0IsYUFBbEIsQ0FBSixFQUFzQztBQUNwQyxhQUFPLEtBQUssT0FBTCxFQUFQO0FBQ0Q7QUFDRCxVQUFNLEtBQUssV0FBTCxDQUFpQixhQUFqQixFQUFnQyx3QkFBaEMsQ0FBTjtBQUNEO0FBQ0QsdUJBQXFCO0FBQ25CLFFBQUksZ0JBQWdCLEtBQUssSUFBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEtBQW9DLEtBQUssU0FBTCxDQUFlLGFBQWYsQ0FBeEMsRUFBdUU7QUFDckUsYUFBTyxLQUFLLE9BQUwsRUFBUDtBQUNEO0FBQ0QsVUFBTSxLQUFLLFdBQUwsQ0FBaUIsYUFBakIsRUFBZ0MseUJBQWhDLENBQU47QUFDRDtBQUNELDRCQUEwQjtBQUN4QixRQUFJLFNBQVMsS0FBSyxPQUFMLEVBQWI7QUFDQSxRQUFJLGdCQUFnQixLQUFLLElBQUwsRUFBcEI7QUFDQSxRQUFJLEtBQUssSUFBTCxDQUFVLElBQVYsS0FBbUIsQ0FBbkIsSUFBd0IsaUJBQWlCLENBQUMsS0FBSyxZQUFMLENBQWtCLE1BQWxCLEVBQTBCLGFBQTFCLENBQTlDLEVBQXdGO0FBQ3RGLGFBQU8sb0JBQVMsaUJBQVQsRUFBNEIsRUFBQyxZQUFZLElBQWIsRUFBNUIsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxXQUFXLElBQWY7QUFDQSxRQUFJLENBQUMsS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEdBQWpDLENBQUwsRUFBNEM7QUFDMUMsaUJBQVcsS0FBSyxrQkFBTCxFQUFYO0FBQ0EsMEJBQU8sWUFBWSxJQUFuQixFQUF5QixrREFBekIsRUFBNkUsYUFBN0UsRUFBNEYsS0FBSyxJQUFqRztBQUNEO0FBQ0QsU0FBSyxnQkFBTDtBQUNBLFdBQU8sb0JBQVMsaUJBQVQsRUFBNEIsRUFBQyxZQUFZLFFBQWIsRUFBNUIsQ0FBUDtBQUNEO0FBQ0QsZ0NBQThCO0FBQzVCLFFBQUksUUFBSjtBQUNBLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksY0FBYyxhQUFsQjtBQUNBLFFBQUksWUFBWSxLQUFLLE9BQUwsQ0FBYSxLQUE3QjtBQUNBLFFBQUksZUFBZSxLQUFLLE9BQUwsQ0FBYSxHQUFiLENBQWlCLEdBQWpCLENBQXFCLFlBQVksT0FBWixDQUFvQixTQUFwQixDQUFyQix1Q0FBbkIsRUFBbUc7QUFDakcsaUJBQVcsS0FBWDtBQUNELEtBRkQsTUFFTyxJQUFJLGVBQWUsS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixZQUFZLE9BQVosQ0FBb0IsU0FBcEIsQ0FBckIsa0NBQW5CLEVBQThGO0FBQ25HLGlCQUFXLEtBQVg7QUFDRCxLQUZNLE1BRUEsSUFBSSxlQUFlLEtBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsWUFBWSxPQUFaLENBQW9CLFNBQXBCLENBQXJCLG9DQUFuQixFQUFnRztBQUNyRyxpQkFBVyxPQUFYO0FBQ0QsS0FGTSxNQUVBLElBQUksZUFBZSxLQUFLLE9BQUwsQ0FBYSxHQUFiLENBQWlCLEdBQWpCLENBQXFCLFlBQVksT0FBWixDQUFvQixTQUFwQixDQUFyQixxQ0FBbkIsRUFBaUc7QUFDdEcsaUJBQVcsUUFBWDtBQUNELEtBRk0sTUFFQSxJQUFJLGVBQWUsS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixZQUFZLE9BQVosQ0FBb0IsU0FBcEIsQ0FBckIsd0NBQW5CLEVBQW9HO0FBQ3pHLGlCQUFXLFdBQVg7QUFDRDtBQUNELFFBQUksWUFBWSxzQkFBaEI7QUFDQSxXQUFPLElBQVAsRUFBYTtBQUNYLFVBQUksT0FBTyxLQUFLLDBCQUFMLENBQWdDLEVBQUMsVUFBVSxhQUFhLFFBQWIsSUFBeUIsYUFBYSxXQUFqRCxFQUFoQyxDQUFYO0FBQ0EsVUFBSSxnQkFBZ0IsS0FBSyxJQUFMLEVBQXBCO0FBQ0Esa0JBQVksVUFBVSxNQUFWLENBQWlCLElBQWpCLENBQVo7QUFDQSxVQUFJLEtBQUssWUFBTCxDQUFrQixhQUFsQixFQUFpQyxHQUFqQyxDQUFKLEVBQTJDO0FBQ3pDLGFBQUssT0FBTDtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0Q7QUFDRjtBQUNELFdBQU8sb0JBQVMscUJBQVQsRUFBZ0MsRUFBQyxNQUFNLFFBQVAsRUFBaUIsYUFBYSxTQUE5QixFQUFoQyxDQUFQO0FBQ0Q7QUFDRCxvQ0FBdUM7QUFBQSxRQUFYLFFBQVcsU0FBWCxRQUFXOztBQUNyQyxRQUFJLFNBQVMsS0FBSyxxQkFBTCxDQUEyQixFQUFDLGlCQUFpQixRQUFsQixFQUEzQixDQUFiO0FBQ0EsUUFBSSxnQkFBZ0IsS0FBSyxJQUFMLEVBQXBCO0FBQ0EsUUFBSSxRQUFKLEVBQWMsUUFBZDtBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEdBQWpDLENBQUosRUFBMkM7QUFDekMsV0FBSyxPQUFMO0FBQ0EsVUFBSSxNQUFNLElBQUksYUFBSixDQUFrQixLQUFLLElBQXZCLEVBQTZCLHNCQUE3QixFQUFxQyxLQUFLLE9BQTFDLENBQVY7QUFDQSxpQkFBVyxJQUFJLFFBQUosQ0FBYSxZQUFiLENBQVg7QUFDQSxXQUFLLElBQUwsR0FBWSxJQUFJLElBQWhCO0FBQ0QsS0FMRCxNQUtPO0FBQ0wsaUJBQVcsSUFBWDtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxvQkFBVCxFQUErQixFQUFDLFNBQVMsTUFBVixFQUFrQixNQUFNLFFBQXhCLEVBQS9CLENBQVA7QUFDRDtBQUNELGdDQUE4QjtBQUM1QixRQUFJLFlBQVksS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLENBQWQsQ0FBaEI7QUFDQSxRQUFJLFdBQVcsS0FBSyxrQkFBTCxFQUFmO0FBQ0EsUUFBSSxhQUFhLElBQWpCLEVBQXVCO0FBQ3JCLFlBQU0sS0FBSyxXQUFMLENBQWlCLFNBQWpCLEVBQTRCLHdCQUE1QixDQUFOO0FBQ0Q7QUFDRCxTQUFLLGdCQUFMO0FBQ0EsV0FBTyxvQkFBUyxxQkFBVCxFQUFnQyxFQUFDLFlBQVksUUFBYixFQUFoQyxDQUFQO0FBQ0Q7QUFDRCx1QkFBcUI7QUFDbkIsUUFBSSxXQUFXLEtBQUssc0JBQUwsRUFBZjtBQUNBLFFBQUksZ0JBQWdCLEtBQUssSUFBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEdBQWpDLENBQUosRUFBMkM7QUFDekMsYUFBTyxLQUFLLElBQUwsQ0FBVSxJQUFWLEtBQW1CLENBQTFCLEVBQTZCO0FBQzNCLFlBQUksQ0FBQyxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLEVBQWxCLEVBQStCLEdBQS9CLENBQUwsRUFBMEM7QUFDeEM7QUFDRDtBQUNELFlBQUksV0FBVyxLQUFLLE9BQUwsRUFBZjtBQUNBLFlBQUksUUFBUSxLQUFLLHNCQUFMLEVBQVo7QUFDQSxtQkFBVyxvQkFBUyxrQkFBVCxFQUE2QixFQUFDLE1BQU0sUUFBUCxFQUFpQixVQUFVLFFBQTNCLEVBQXFDLE9BQU8sS0FBNUMsRUFBN0IsQ0FBWDtBQUNEO0FBQ0Y7QUFDRCxTQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsV0FBTyxRQUFQO0FBQ0Q7QUFDRCwyQkFBeUI7QUFDdkIsU0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFNBQUssS0FBTCxHQUFhLEVBQUMsTUFBTSxDQUFQLEVBQVUsU0FBUyxTQUFTLEtBQTVCLEVBQW1DLE9BQU8sc0JBQTFDLEVBQWI7QUFDQSxPQUFHO0FBQ0QsVUFBSSxPQUFPLEtBQUssNEJBQUwsRUFBWDtBQUNBLFVBQUksU0FBUyxzQkFBVCxJQUFtQyxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLElBQWpCLEdBQXdCLENBQS9ELEVBQWtFO0FBQ2hFLGFBQUssSUFBTCxHQUFZLEtBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsS0FBSyxJQUF4QixDQUFaOztBQURnRSxnQ0FFMUMsS0FBSyxLQUFMLENBQVcsS0FBWCxDQUFpQixJQUFqQixFQUYwQzs7QUFBQSxZQUUzRCxJQUYyRCxxQkFFM0QsSUFGMkQ7QUFBQSxZQUVyRCxPQUZxRCxxQkFFckQsT0FGcUQ7O0FBR2hFLGFBQUssS0FBTCxDQUFXLElBQVgsR0FBa0IsSUFBbEI7QUFDQSxhQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLE9BQXJCO0FBQ0EsYUFBSyxLQUFMLENBQVcsS0FBWCxHQUFtQixLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLEdBQWpCLEVBQW5CO0FBQ0QsT0FORCxNQU1PLElBQUksU0FBUyxzQkFBYixFQUFxQztBQUMxQztBQUNELE9BRk0sTUFFQSxJQUFJLFNBQVMscUJBQVQsSUFBa0MsU0FBUyxzQkFBL0MsRUFBdUU7QUFDNUUsYUFBSyxJQUFMLEdBQVksSUFBWjtBQUNELE9BRk0sTUFFQTtBQUNMLGFBQUssSUFBTCxHQUFZLElBQVo7QUFDRDtBQUNGLEtBZkQsUUFlUyxJQWZUO0FBZ0JBLFdBQU8sS0FBSyxJQUFaO0FBQ0Q7QUFDRCxpQ0FBK0I7QUFDN0IsUUFBSSxnQkFBZ0IsS0FBSyxJQUFMLEVBQXBCO0FBQ0EsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssc0JBQUwsQ0FBNEIsYUFBNUIsQ0FBMUIsRUFBc0U7QUFDcEUsV0FBSyxXQUFMO0FBQ0Esc0JBQWdCLEtBQUssSUFBTCxFQUFoQjtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssTUFBTCxDQUFZLGFBQVosQ0FBMUIsRUFBc0Q7QUFDcEQsYUFBTyxLQUFLLE9BQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssU0FBTCxDQUFlLGFBQWYsRUFBOEIsT0FBOUIsQ0FBMUIsRUFBa0U7QUFDaEUsYUFBTyxLQUFLLHVCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLFNBQUwsQ0FBZSxhQUFmLEVBQThCLE9BQTlCLENBQTFCLEVBQWtFO0FBQ2hFLGFBQU8sS0FBSyxhQUFMLENBQW1CLEVBQUMsUUFBUSxJQUFULEVBQW5CLENBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxLQUF1QixLQUFLLFlBQUwsQ0FBa0IsYUFBbEIsS0FBb0MsS0FBSyxRQUFMLENBQWMsYUFBZCxDQUEzRCxLQUE0RixLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFsQixFQUFnQyxJQUFoQyxDQUE1RixJQUFxSSxLQUFLLFlBQUwsQ0FBa0IsYUFBbEIsRUFBaUMsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFqQyxDQUF6SSxFQUF5TDtBQUN2TCxhQUFPLEtBQUssdUJBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssZ0JBQUwsQ0FBc0IsYUFBdEIsQ0FBMUIsRUFBZ0U7QUFDOUQsYUFBTyxLQUFLLHNCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLHNCQUFMLENBQTRCLGFBQTVCLENBQTFCLEVBQXNFO0FBQ3BFLGFBQU8sS0FBSyxtQkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxRQUFMLENBQWMsYUFBZCxDQUExQixFQUF3RDtBQUN0RCxhQUFPLG9CQUFTLHlCQUFULEVBQW9DLEVBQUMsT0FBTyxLQUFLLE9BQUwsR0FBZSxLQUFmLEVBQVIsRUFBcEMsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLEtBQXVCLEtBQUssU0FBTCxDQUFlLGFBQWYsRUFBOEIsTUFBOUIsS0FBeUMsS0FBSyxZQUFMLENBQWtCLGFBQWxCLENBQXpDLElBQTZFLEtBQUssU0FBTCxDQUFlLGFBQWYsRUFBOEIsS0FBOUIsQ0FBN0UsSUFBcUgsS0FBSyxTQUFMLENBQWUsYUFBZixFQUE4QixPQUE5QixDQUFySCxJQUErSixLQUFLLGdCQUFMLENBQXNCLGFBQXRCLENBQS9KLElBQXVNLEtBQUssZUFBTCxDQUFxQixhQUFyQixDQUF2TSxJQUE4TyxLQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsQ0FBOU8sSUFBZ1IsS0FBSyxnQkFBTCxDQUFzQixhQUF0QixDQUFoUixJQUF3VCxLQUFLLGFBQUwsQ0FBbUIsYUFBbkIsQ0FBeFQsSUFBNlYsS0FBSyxtQkFBTCxDQUF5QixhQUF6QixDQUE3VixJQUF3WSxLQUFLLGlCQUFMLENBQXVCLGFBQXZCLENBQXhZLElBQWliLEtBQUssUUFBTCxDQUFjLGFBQWQsQ0FBamIsSUFBaWQsS0FBSyxVQUFMLENBQWdCLGFBQWhCLENBQXhlLENBQUosRUFBNmdCO0FBQzNnQixhQUFPLEtBQUsseUJBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssVUFBTCxDQUFnQixhQUFoQixDQUExQixFQUEwRDtBQUN4RCxhQUFPLEtBQUssdUJBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUsscUJBQUwsQ0FBMkIsYUFBM0IsQ0FBMUIsRUFBcUU7QUFDbkUsVUFBSSxLQUFLLEtBQUssNkJBQUwsQ0FBbUMsYUFBbkMsRUFBa0QsRUFBM0Q7QUFDQSxVQUFJLE9BQU8sYUFBWCxFQUEwQjtBQUN4QixhQUFLLE9BQUw7QUFDQSxhQUFLLElBQUwsR0FBWSxnQkFBSyxFQUFMLENBQVEsRUFBUixFQUFZLE1BQVosQ0FBbUIsS0FBSyxJQUF4QixDQUFaO0FBQ0EsZUFBTyxzQkFBUDtBQUNEO0FBQ0Y7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsS0FBdUIsS0FBSyxjQUFMLENBQW9CLGFBQXBCLEtBQXNDLEtBQUssU0FBTCxDQUFlLGFBQWYsRUFBOEIsT0FBOUIsQ0FBN0QsS0FBd0csS0FBSyxJQUFMLEtBQWMsS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEdBQWpDLE1BQTBDLEtBQUssWUFBTCxDQUFrQixLQUFLLElBQUwsQ0FBVSxDQUFWLENBQWxCLEtBQW1DLEtBQUssU0FBTCxDQUFlLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBZixDQUE3RSxLQUE4RyxLQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsQ0FBOUcsSUFBZ0osS0FBSyxRQUFMLENBQWMsYUFBZCxDQUE5SixDQUE1RyxFQUF5UztBQUN2UyxhQUFPLEtBQUssOEJBQUwsQ0FBb0MsRUFBQyxXQUFXLElBQVosRUFBcEMsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsSUFBYSxLQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsQ0FBakIsRUFBaUQ7QUFDL0MsYUFBTyxLQUFLLHVCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLElBQWEsS0FBSyxnQkFBTCxDQUFzQixhQUF0QixDQUFqQixFQUF1RDtBQUNyRCxhQUFPLEtBQUssd0JBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsSUFBYSxLQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsQ0FBakIsRUFBaUQ7QUFDL0MsYUFBTyxLQUFLLHdCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLElBQWEsS0FBSyxRQUFMLENBQWMsYUFBZCxDQUFqQixFQUErQztBQUM3QyxVQUFJLFVBQVUsS0FBSyxzQkFBTCxDQUE0QixLQUFLLElBQWpDLENBQWQ7QUFDQSxVQUFJLEtBQUssS0FBSyxPQUFMLEVBQVQ7QUFDQSxVQUFJLE1BQU0sSUFBSSxhQUFKLENBQWtCLEtBQUssSUFBdkIsRUFBNkIsc0JBQTdCLEVBQXFDLEtBQUssT0FBMUMsQ0FBVjtBQUNBLFVBQUksT0FBTyxJQUFJLFFBQUosQ0FBYSxZQUFiLENBQVg7QUFDQSxXQUFLLElBQUwsR0FBWSxJQUFJLElBQWhCO0FBQ0EsVUFBSSxHQUFHLEdBQUgsT0FBYSxHQUFqQixFQUFzQjtBQUNwQixlQUFPLG9CQUFTLHNCQUFULEVBQWlDLEVBQUMsU0FBUyxPQUFWLEVBQW1CLFlBQVksSUFBL0IsRUFBakMsQ0FBUDtBQUNELE9BRkQsTUFFTztBQUNMLGVBQU8sb0JBQVMsOEJBQVQsRUFBeUMsRUFBQyxTQUFTLE9BQVYsRUFBbUIsVUFBVSxHQUFHLEdBQUgsRUFBN0IsRUFBdUMsWUFBWSxJQUFuRCxFQUF6QyxDQUFQO0FBQ0Q7QUFDRjtBQUNELFFBQUksS0FBSyxJQUFMLElBQWEsS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEdBQWpDLENBQWpCLEVBQXdEO0FBQ3RELGFBQU8sS0FBSyw2QkFBTCxFQUFQO0FBQ0Q7QUFDRCxXQUFPLHNCQUFQO0FBQ0Q7QUFDRCw4QkFBNEI7QUFDMUIsUUFBSSxnQkFBZ0IsS0FBSyxJQUFMLEVBQXBCO0FBQ0EsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssU0FBTCxDQUFlLGFBQWYsRUFBOEIsTUFBOUIsQ0FBMUIsRUFBaUU7QUFDL0QsYUFBTyxLQUFLLHNCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxLQUF1QixLQUFLLFlBQUwsQ0FBa0IsYUFBbEIsS0FBb0MsS0FBSyxTQUFMLENBQWUsYUFBZixFQUE4QixLQUE5QixDQUFwQyxJQUE0RSxLQUFLLFNBQUwsQ0FBZSxhQUFmLEVBQThCLE9BQTlCLENBQW5HLENBQUosRUFBZ0o7QUFDOUksYUFBTyxLQUFLLDRCQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLGdCQUFMLENBQXNCLGFBQXRCLENBQTFCLEVBQWdFO0FBQzlELGFBQU8sS0FBSyxzQkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxlQUFMLENBQXFCLGFBQXJCLENBQTFCLEVBQStEO0FBQzdELGFBQU8sS0FBSyxxQkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxVQUFMLENBQWdCLGFBQWhCLENBQTFCLEVBQTBEO0FBQ3hELGFBQU8sS0FBSyx1QkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxnQkFBTCxDQUFzQixhQUF0QixDQUExQixFQUFnRTtBQUM5RCxhQUFPLEtBQUssc0JBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssYUFBTCxDQUFtQixhQUFuQixDQUExQixFQUE2RDtBQUMzRCxhQUFPLEtBQUssbUJBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssbUJBQUwsQ0FBeUIsYUFBekIsQ0FBMUIsRUFBbUU7QUFDakUsYUFBTyxLQUFLLGdDQUFMLEVBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxJQUFMLEtBQWMsSUFBZCxJQUFzQixLQUFLLGlCQUFMLENBQXVCLGFBQXZCLENBQTFCLEVBQWlFO0FBQy9ELGFBQU8sS0FBSywwQkFBTCxFQUFQO0FBQ0Q7QUFDRCxRQUFJLEtBQUssSUFBTCxLQUFjLElBQWQsSUFBc0IsS0FBSyxRQUFMLENBQWMsYUFBZCxDQUExQixFQUF3RDtBQUN0RCxhQUFPLEtBQUssd0JBQUwsRUFBUDtBQUNEO0FBQ0QsUUFBSSxLQUFLLElBQUwsS0FBYyxJQUFkLElBQXNCLEtBQUssVUFBTCxDQUFnQixhQUFoQixDQUExQixFQUEwRDtBQUN4RCxhQUFPLEtBQUssdUJBQUwsRUFBUDtBQUNEO0FBQ0Qsd0JBQU8sS0FBUCxFQUFjLDBCQUFkO0FBQ0Q7QUFDRCx3Q0FBNEM7QUFBQSxRQUFaLFNBQVksU0FBWixTQUFZOztBQUMxQyxRQUFJLGdCQUFnQixLQUFLLElBQUwsRUFBcEI7QUFDQSxRQUFJLEtBQUssU0FBTCxDQUFlLGFBQWYsRUFBOEIsT0FBOUIsQ0FBSixFQUE0QztBQUMxQyxXQUFLLE9BQUw7QUFDQSxXQUFLLElBQUwsR0FBWSxvQkFBUyxPQUFULEVBQWtCLEVBQWxCLENBQVo7QUFDRCxLQUhELE1BR08sSUFBSSxLQUFLLGNBQUwsQ0FBb0IsYUFBcEIsQ0FBSixFQUF3QztBQUM3QyxXQUFLLElBQUwsR0FBWSxLQUFLLHFCQUFMLEVBQVo7QUFDRDtBQUNELFdBQU8sSUFBUCxFQUFhO0FBQ1gsc0JBQWdCLEtBQUssSUFBTCxFQUFoQjtBQUNBLFVBQUksS0FBSyxRQUFMLENBQWMsYUFBZCxDQUFKLEVBQWtDO0FBQ2hDLFlBQUksQ0FBQyxTQUFMLEVBQWdCO0FBQ2QsY0FBSSxLQUFLLElBQUwsSUFBYSxtQ0FBdUIsS0FBSyxJQUE1QixDQUFqQixFQUFvRDtBQUNsRCxtQkFBTyxLQUFLLElBQVo7QUFDRDtBQUNELGVBQUssSUFBTCxHQUFZLEtBQUssc0JBQUwsRUFBWjtBQUNELFNBTEQsTUFLTztBQUNMLGVBQUssSUFBTCxHQUFZLEtBQUssc0JBQUwsRUFBWjtBQUNEO0FBQ0YsT0FURCxNQVNPLElBQUksS0FBSyxVQUFMLENBQWdCLGFBQWhCLENBQUosRUFBb0M7QUFDekMsYUFBSyxJQUFMLEdBQVksWUFBWSxLQUFLLGdDQUFMLEVBQVosR0FBc0QsS0FBSyxzQkFBTCxFQUFsRTtBQUNELE9BRk0sTUFFQSxJQUFJLEtBQUssWUFBTCxDQUFrQixhQUFsQixFQUFpQyxHQUFqQyxNQUEwQyxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFsQixLQUFtQyxLQUFLLFNBQUwsQ0FBZSxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQWYsQ0FBN0UsQ0FBSixFQUFnSDtBQUNySCxhQUFLLElBQUwsR0FBWSxLQUFLLDhCQUFMLEVBQVo7QUFDRCxPQUZNLE1BRUEsSUFBSSxLQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsQ0FBSixFQUFvQztBQUN6QyxhQUFLLElBQUwsR0FBWSxLQUFLLHVCQUFMLEVBQVo7QUFDRCxPQUZNLE1BRUEsSUFBSSxLQUFLLFFBQUwsQ0FBYyxhQUFkLENBQUosRUFBa0M7QUFDdkMsYUFBSyxJQUFMLEdBQVksS0FBSyx5QkFBTCxFQUFaO0FBQ0QsT0FGTSxNQUVBLElBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLENBQUosRUFBc0M7QUFDM0MsYUFBSyxJQUFMLEdBQVksb0JBQVMsc0JBQVQsRUFBaUMsRUFBQyxNQUFNLEtBQUssa0JBQUwsRUFBUCxFQUFqQyxDQUFaO0FBQ0QsT0FGTSxNQUVBO0FBQ0w7QUFDRDtBQUNGO0FBQ0QsV0FBTyxLQUFLLElBQVo7QUFDRDtBQUNELDJCQUF5QjtBQUN2QixXQUFPLG9CQUFTLDBCQUFULEVBQXFDLEVBQUMsT0FBTyxLQUFLLE9BQUwsRUFBUixFQUFyQyxDQUFQO0FBQ0Q7QUFDRCw0QkFBMEI7QUFDeEIsV0FBTyxvQkFBUyxvQkFBVCxFQUErQixFQUFDLEtBQUssS0FBSyxJQUFYLEVBQWlCLFVBQVUsS0FBSyx3QkFBTCxFQUEzQixFQUEvQixDQUFQO0FBQ0Q7QUFDRCwwQkFBd0I7QUFDdEIsV0FBTyxvQkFBUyx5QkFBVCxFQUFvQyxFQUFDLE9BQU8sS0FBSyxPQUFMLEVBQVIsRUFBcEMsQ0FBUDtBQUNEO0FBQ0QsMkJBQXlCO0FBQ3ZCLFFBQUksVUFBVSxLQUFLLE9BQUwsRUFBZDtBQUNBLFFBQUksUUFBUSxHQUFSLE9BQWtCLElBQUksQ0FBMUIsRUFBNkI7QUFDM0IsYUFBTyxvQkFBUywyQkFBVCxFQUFzQyxFQUF0QyxDQUFQO0FBQ0Q7QUFDRCxXQUFPLG9CQUFTLDBCQUFULEVBQXFDLEVBQUMsT0FBTyxPQUFSLEVBQXJDLENBQVA7QUFDRDtBQUNELGlDQUErQjtBQUM3QixXQUFPLG9CQUFTLHNCQUFULEVBQWlDLEVBQUMsTUFBTSxLQUFLLE9BQUwsRUFBUCxFQUFqQyxDQUFQO0FBQ0Q7QUFDRCxxQ0FBbUM7QUFDakMsUUFBSSxZQUFZLEtBQUssT0FBTCxFQUFoQjtBQUNBLFFBQUksZ0JBQWdCLFVBQVUsS0FBVixDQUFnQixLQUFoQixDQUFzQixXQUF0QixDQUFrQyxHQUFsQyxDQUFwQjtBQUNBLFFBQUksY0FBYyxVQUFVLEtBQVYsQ0FBZ0IsS0FBaEIsQ0FBc0IsS0FBdEIsQ0FBNEIsQ0FBNUIsRUFBK0IsYUFBL0IsQ0FBbEI7QUFDQSxRQUFJLFlBQVksVUFBVSxLQUFWLENBQWdCLEtBQWhCLENBQXNCLEtBQXRCLENBQTRCLGdCQUFnQixDQUE1QyxDQUFoQjtBQUNBLFdBQU8sb0JBQVMseUJBQVQsRUFBb0MsRUFBQyxTQUFTLFdBQVYsRUFBdUIsT0FBTyxTQUE5QixFQUFwQyxDQUFQO0FBQ0Q7QUFDRCx3QkFBc0I7QUFDcEIsU0FBSyxPQUFMO0FBQ0EsV0FBTyxvQkFBUyx1QkFBVCxFQUFrQyxFQUFsQyxDQUFQO0FBQ0Q7QUFDRCwyQkFBeUI7QUFDdkIsV0FBTyxvQkFBUyxnQkFBVCxFQUEyQixFQUFDLEtBQUssS0FBSyxPQUFMLEVBQU4sRUFBM0IsQ0FBUDtBQUNEO0FBQ0QseUJBQXVCO0FBQ3JCLFFBQUksYUFBYSxFQUFqQjtBQUNBLFdBQU8sS0FBSyxJQUFMLENBQVUsSUFBVixHQUFpQixDQUF4QixFQUEyQjtBQUN6QixVQUFJLEdBQUo7QUFDQSxVQUFJLEtBQUssWUFBTCxDQUFrQixLQUFLLElBQUwsRUFBbEIsRUFBK0IsS0FBL0IsQ0FBSixFQUEyQztBQUN6QyxhQUFLLE9BQUw7QUFDQSxjQUFNLG9CQUFTLGVBQVQsRUFBMEIsRUFBQyxZQUFZLEtBQUssc0JBQUwsRUFBYixFQUExQixDQUFOO0FBQ0QsT0FIRCxNQUdPO0FBQ0wsY0FBTSxLQUFLLHNCQUFMLEVBQU47QUFDRDtBQUNELFVBQUksS0FBSyxJQUFMLENBQVUsSUFBVixHQUFpQixDQUFyQixFQUF3QjtBQUN0QixhQUFLLGVBQUwsQ0FBcUIsR0FBckI7QUFDRDtBQUNELGlCQUFXLElBQVgsQ0FBZ0IsR0FBaEI7QUFDRDtBQUNELFdBQU8scUJBQUssVUFBTCxDQUFQO0FBQ0Q7QUFDRCwwQkFBd0I7QUFDdEIsU0FBSyxZQUFMLENBQWtCLEtBQWxCO0FBQ0EsUUFBSSxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLEVBQWxCLEVBQStCLEdBQS9CLEtBQXVDLEtBQUssWUFBTCxDQUFrQixLQUFLLElBQUwsQ0FBVSxDQUFWLENBQWxCLEVBQWdDLFFBQWhDLENBQTNDLEVBQXNGO0FBQ3BGLFdBQUssT0FBTDtBQUNBLFdBQUssT0FBTDtBQUNBLGFBQU8sb0JBQVMscUJBQVQsRUFBZ0MsRUFBaEMsQ0FBUDtBQUNEO0FBQ0QsUUFBSSxhQUFhLEtBQUssOEJBQUwsQ0FBb0MsRUFBQyxXQUFXLEtBQVosRUFBcEMsQ0FBakI7QUFDQSxRQUFJLFFBQUo7QUFDQSxRQUFJLEtBQUssUUFBTCxDQUFjLEtBQUssSUFBTCxFQUFkLENBQUosRUFBZ0M7QUFDOUIsaUJBQVcsS0FBSyxXQUFMLEVBQVg7QUFDRCxLQUZELE1BRU87QUFDTCxpQkFBVyxzQkFBWDtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxlQUFULEVBQTBCLEVBQUMsUUFBUSxVQUFULEVBQXFCLFdBQVcsUUFBaEMsRUFBMUIsQ0FBUDtBQUNEO0FBQ0QscUNBQW1DO0FBQ2pDLFFBQUksVUFBVSxJQUFJLGFBQUosQ0FBa0IsS0FBSyxZQUFMLEVBQWxCLEVBQXVDLHNCQUF2QyxFQUErQyxLQUFLLE9BQXBELENBQWQ7QUFDQSxXQUFPLG9CQUFTLDBCQUFULEVBQXFDLEVBQUMsUUFBUSxLQUFLLElBQWQsRUFBb0IsWUFBWSxRQUFRLGtCQUFSLEVBQWhDLEVBQXJDLENBQVA7QUFDRDtBQUNELHlCQUF1QixRQUF2QixFQUFpQztBQUMvQixZQUFRLFNBQVMsSUFBakI7QUFDRSxXQUFLLHNCQUFMO0FBQ0UsZUFBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sU0FBUyxJQUFoQixFQUE5QixDQUFQO0FBQ0YsV0FBSyx5QkFBTDtBQUNFLFlBQUksU0FBUyxLQUFULENBQWUsSUFBZixLQUF3QixDQUF4QixJQUE2QixLQUFLLFlBQUwsQ0FBa0IsU0FBUyxLQUFULENBQWUsR0FBZixDQUFtQixDQUFuQixDQUFsQixDQUFqQyxFQUEyRTtBQUN6RSxpQkFBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sU0FBUyxLQUFULENBQWUsR0FBZixDQUFtQixDQUFuQixDQUFQLEVBQTlCLENBQVA7QUFDRDtBQUNILFdBQUssY0FBTDtBQUNFLGVBQU8sb0JBQVMseUJBQVQsRUFBb0MsRUFBQyxNQUFNLFNBQVMsSUFBaEIsRUFBc0IsU0FBUyxLQUFLLGlDQUFMLENBQXVDLFNBQVMsVUFBaEQsQ0FBL0IsRUFBcEMsQ0FBUDtBQUNGLFdBQUssbUJBQUw7QUFDRSxlQUFPLG9CQUFTLDJCQUFULEVBQXNDLEVBQUMsU0FBUyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sU0FBUyxJQUFoQixFQUE5QixDQUFWLEVBQWdFLE1BQU0sSUFBdEUsRUFBdEMsQ0FBUDtBQUNGLFdBQUssa0JBQUw7QUFDRSxlQUFPLG9CQUFTLGVBQVQsRUFBMEIsRUFBQyxZQUFZLFNBQVMsVUFBVCxDQUFvQixHQUFwQixDQUF3QixTQUFTLEtBQUssc0JBQUwsQ0FBNEIsS0FBNUIsQ0FBakMsQ0FBYixFQUExQixDQUFQO0FBQ0YsV0FBSyxpQkFBTDtBQUNFLFlBQUksT0FBTyxTQUFTLFFBQVQsQ0FBa0IsSUFBbEIsRUFBWDtBQUNBLFlBQUksUUFBUSxJQUFSLElBQWdCLEtBQUssSUFBTCxLQUFjLGVBQWxDLEVBQW1EO0FBQ2pELGlCQUFPLG9CQUFTLGNBQVQsRUFBeUIsRUFBQyxVQUFVLFNBQVMsUUFBVCxDQUFrQixLQUFsQixDQUF3QixDQUF4QixFQUEyQixDQUFDLENBQTVCLEVBQStCLEdBQS9CLENBQW1DLFNBQVMsU0FBUyxLQUFLLGlDQUFMLENBQXVDLEtBQXZDLENBQXJELENBQVgsRUFBZ0gsYUFBYSxLQUFLLGlDQUFMLENBQXVDLEtBQUssVUFBNUMsQ0FBN0gsRUFBekIsQ0FBUDtBQUNELFNBRkQsTUFFTztBQUNMLGlCQUFPLG9CQUFTLGNBQVQsRUFBeUIsRUFBQyxVQUFVLFNBQVMsUUFBVCxDQUFrQixHQUFsQixDQUFzQixTQUFTLFNBQVMsS0FBSyxpQ0FBTCxDQUF1QyxLQUF2QyxDQUF4QyxDQUFYLEVBQW1HLGFBQWEsSUFBaEgsRUFBekIsQ0FBUDtBQUNEO0FBQ0QsZUFBTyxvQkFBUyxjQUFULEVBQXlCLEVBQUMsVUFBVSxTQUFTLFFBQVQsQ0FBa0IsR0FBbEIsQ0FBc0IsU0FBUyxTQUFTLEtBQUssc0JBQUwsQ0FBNEIsS0FBNUIsQ0FBeEMsQ0FBWCxFQUF3RixhQUFhLElBQXJHLEVBQXpCLENBQVA7QUFDRixXQUFLLG9CQUFMO0FBQ0UsZUFBTyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sU0FBUyxLQUFoQixFQUE5QixDQUFQO0FBQ0YsV0FBSywwQkFBTDtBQUNBLFdBQUssd0JBQUw7QUFDQSxXQUFLLGNBQUw7QUFDQSxXQUFLLG1CQUFMO0FBQ0EsV0FBSywyQkFBTDtBQUNBLFdBQUsseUJBQUw7QUFDQSxXQUFLLG9CQUFMO0FBQ0EsV0FBSyxlQUFMO0FBQ0UsZUFBTyxRQUFQO0FBL0JKO0FBaUNBLHdCQUFPLEtBQVAsRUFBYyw2QkFBNkIsU0FBUyxJQUFwRDtBQUNEO0FBQ0Qsb0NBQWtDLFFBQWxDLEVBQTRDO0FBQzFDLFlBQVEsU0FBUyxJQUFqQjtBQUNFLFdBQUssc0JBQUw7QUFDRSxlQUFPLG9CQUFTLG9CQUFULEVBQStCLEVBQUMsU0FBUyxLQUFLLHNCQUFMLENBQTRCLFNBQVMsT0FBckMsQ0FBVixFQUF5RCxNQUFNLFNBQVMsVUFBeEUsRUFBL0IsQ0FBUDtBQUZKO0FBSUEsV0FBTyxLQUFLLHNCQUFMLENBQTRCLFFBQTVCLENBQVA7QUFDRDtBQUNELDJCQUF5QjtBQUN2QixRQUFJLFlBQVksS0FBSyxPQUFMLEVBQWhCO0FBQ0EsV0FBTyxvQkFBUyxnQkFBVCxFQUEyQixFQUFDLFFBQVEsS0FBSyxJQUFkLEVBQW9CLFdBQVcsVUFBVSxLQUFWLEVBQS9CLEVBQTNCLENBQVA7QUFDRDtBQUNELDRCQUEwQjtBQUN4QixRQUFJLE9BQUo7QUFDQSxRQUFJLEtBQUssWUFBTCxDQUFrQixLQUFLLElBQUwsRUFBbEIsQ0FBSixFQUFvQztBQUNsQyxnQkFBVSxJQUFJLGFBQUosQ0FBa0IsZ0JBQUssRUFBTCxDQUFRLEtBQUssT0FBTCxFQUFSLENBQWxCLEVBQTJDLHNCQUEzQyxFQUFtRCxLQUFLLE9BQXhELENBQVY7QUFDRCxLQUZELE1BRU87QUFDTCxVQUFJLElBQUksS0FBSyxXQUFMLEVBQVI7QUFDQSxnQkFBVSxJQUFJLGFBQUosQ0FBa0IsQ0FBbEIsRUFBcUIsc0JBQXJCLEVBQTZCLEtBQUssT0FBbEMsQ0FBVjtBQUNEO0FBQ0QsUUFBSSxhQUFhLFFBQVEsd0JBQVIsRUFBakI7QUFDQSxTQUFLLGVBQUwsQ0FBcUIsSUFBckI7QUFDQSxRQUFJLFFBQUo7QUFDQSxRQUFJLEtBQUssUUFBTCxDQUFjLEtBQUssSUFBTCxFQUFkLENBQUosRUFBZ0M7QUFDOUIsaUJBQVcsS0FBSyxZQUFMLEVBQVg7QUFDRCxLQUZELE1BRU87QUFDTCxnQkFBVSxJQUFJLGFBQUosQ0FBa0IsS0FBSyxJQUF2QixFQUE2QixzQkFBN0IsRUFBcUMsS0FBSyxPQUExQyxDQUFWO0FBQ0EsaUJBQVcsUUFBUSxzQkFBUixFQUFYO0FBQ0EsV0FBSyxJQUFMLEdBQVksUUFBUSxJQUFwQjtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxpQkFBVCxFQUE0QixFQUFDLFFBQVEsVUFBVCxFQUFxQixNQUFNLFFBQTNCLEVBQTVCLENBQVA7QUFDRDtBQUNELDRCQUEwQjtBQUN4QixRQUFJLFVBQVUsS0FBSyxZQUFMLENBQWtCLE9BQWxCLENBQWQ7QUFDQSxRQUFJLGdCQUFnQixLQUFLLElBQUwsRUFBcEI7QUFDQSxRQUFJLEtBQUssSUFBTCxDQUFVLElBQVYsS0FBbUIsQ0FBbkIsSUFBd0IsaUJBQWlCLENBQUMsS0FBSyxZQUFMLENBQWtCLE9BQWxCLEVBQTJCLGFBQTNCLENBQTlDLEVBQXlGO0FBQ3ZGLGFBQU8sb0JBQVMsaUJBQVQsRUFBNEIsRUFBQyxZQUFZLElBQWIsRUFBNUIsQ0FBUDtBQUNELEtBRkQsTUFFTztBQUNMLFVBQUksY0FBYyxLQUFsQjtBQUNBLFVBQUksS0FBSyxZQUFMLENBQWtCLEtBQUssSUFBTCxFQUFsQixFQUErQixHQUEvQixDQUFKLEVBQXlDO0FBQ3ZDLHNCQUFjLElBQWQ7QUFDQSxhQUFLLE9BQUw7QUFDRDtBQUNELFVBQUksT0FBTyxLQUFLLGtCQUFMLEVBQVg7QUFDQSxVQUFJLE9BQU8sY0FBYywwQkFBZCxHQUEyQyxpQkFBdEQ7QUFDQSxhQUFPLG9CQUFTLElBQVQsRUFBZSxFQUFDLFlBQVksSUFBYixFQUFmLENBQVA7QUFDRDtBQUNGO0FBQ0QsMkJBQXlCO0FBQ3ZCLFdBQU8sb0JBQVMsZ0JBQVQsRUFBMkIsRUFBQyxVQUFVLEtBQUssT0FBTCxFQUFYLEVBQTNCLENBQVA7QUFDRDtBQUNELHdCQUFzQjtBQUNwQixRQUFJLFdBQVcsS0FBSyxPQUFMLEVBQWY7QUFDQSxXQUFPLG9CQUFTLGFBQVQsRUFBd0IsRUFBQyxNQUFNLFFBQVAsRUFBaUIsVUFBVSxvQkFBUyxvQkFBVCxFQUErQixFQUFDLEtBQUssb0JBQVMsc0JBQVQsRUFBaUMsRUFBQyxNQUFNLFFBQVAsRUFBakMsQ0FBTixFQUEwRCxVQUFVLEtBQUssd0JBQUwsRUFBcEUsRUFBL0IsQ0FBM0IsRUFBeEIsQ0FBUDtBQUNEO0FBQ0QsbUNBQWlDO0FBQy9CLFFBQUksYUFBYSxLQUFLLElBQXRCO0FBQ0EsUUFBSSxVQUFVLEtBQUssT0FBTCxFQUFkO0FBQ0EsUUFBSSxlQUFlLEtBQUssT0FBTCxFQUFuQjtBQUNBLFdBQU8sb0JBQVMsd0JBQVQsRUFBbUMsRUFBQyxRQUFRLFVBQVQsRUFBcUIsVUFBVSxZQUEvQixFQUFuQyxDQUFQO0FBQ0Q7QUFDRCw0QkFBMEI7QUFDeEIsUUFBSSxVQUFVLEtBQUssT0FBTCxFQUFkO0FBQ0EsUUFBSSxlQUFlLEVBQW5CO0FBQ0EsUUFBSSxVQUFVLElBQUksYUFBSixDQUFrQixRQUFRLEtBQVIsRUFBbEIsRUFBbUMsc0JBQW5DLEVBQTJDLEtBQUssT0FBaEQsQ0FBZDtBQUNBLFdBQU8sUUFBUSxJQUFSLENBQWEsSUFBYixHQUFvQixDQUEzQixFQUE4QjtBQUM1QixVQUFJLFlBQVksUUFBUSxJQUFSLEVBQWhCO0FBQ0EsVUFBSSxRQUFRLFlBQVIsQ0FBcUIsU0FBckIsRUFBZ0MsR0FBaEMsQ0FBSixFQUEwQztBQUN4QyxnQkFBUSxPQUFSO0FBQ0EscUJBQWEsSUFBYixDQUFrQixJQUFsQjtBQUNELE9BSEQsTUFHTyxJQUFJLFFBQVEsWUFBUixDQUFxQixTQUFyQixFQUFnQyxLQUFoQyxDQUFKLEVBQTRDO0FBQ2pELGdCQUFRLE9BQVI7QUFDQSxZQUFJLGFBQWEsUUFBUSxzQkFBUixFQUFqQjtBQUNBLFlBQUksY0FBYyxJQUFsQixFQUF3QjtBQUN0QixnQkFBTSxRQUFRLFdBQVIsQ0FBb0IsU0FBcEIsRUFBK0Isc0JBQS9CLENBQU47QUFDRDtBQUNELHFCQUFhLElBQWIsQ0FBa0Isb0JBQVMsZUFBVCxFQUEwQixFQUFDLFlBQVksVUFBYixFQUExQixDQUFsQjtBQUNELE9BUE0sTUFPQTtBQUNMLFlBQUksT0FBTyxRQUFRLHNCQUFSLEVBQVg7QUFDQSxZQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixnQkFBTSxRQUFRLFdBQVIsQ0FBb0IsU0FBcEIsRUFBK0IscUJBQS9CLENBQU47QUFDRDtBQUNELHFCQUFhLElBQWIsQ0FBa0IsSUFBbEI7QUFDQSxnQkFBUSxZQUFSO0FBQ0Q7QUFDRjtBQUNELFdBQU8sb0JBQVMsaUJBQVQsRUFBNEIsRUFBQyxVQUFVLHFCQUFLLFlBQUwsQ0FBWCxFQUE1QixDQUFQO0FBQ0Q7QUFDRCw2QkFBMkI7QUFDekIsUUFBSSxVQUFVLEtBQUssT0FBTCxFQUFkO0FBQ0EsUUFBSSxpQkFBaUIsc0JBQXJCO0FBQ0EsUUFBSSxVQUFVLElBQUksYUFBSixDQUFrQixRQUFRLEtBQVIsRUFBbEIsRUFBbUMsc0JBQW5DLEVBQTJDLEtBQUssT0FBaEQsQ0FBZDtBQUNBLFFBQUksZUFBZSxJQUFuQjtBQUNBLFdBQU8sUUFBUSxJQUFSLENBQWEsSUFBYixHQUFvQixDQUEzQixFQUE4QjtBQUM1QixVQUFJLE9BQU8sUUFBUSwwQkFBUixFQUFYO0FBQ0EsY0FBUSxZQUFSO0FBQ0EsdUJBQWlCLGVBQWUsTUFBZixDQUFzQixJQUF0QixDQUFqQjtBQUNBLFVBQUksaUJBQWlCLElBQXJCLEVBQTJCO0FBQ3pCLGNBQU0sUUFBUSxXQUFSLENBQW9CLElBQXBCLEVBQTBCLDBCQUExQixDQUFOO0FBQ0Q7QUFDRCxxQkFBZSxJQUFmO0FBQ0Q7QUFDRCxXQUFPLG9CQUFTLGtCQUFULEVBQTZCLEVBQUMsWUFBWSxjQUFiLEVBQTdCLENBQVA7QUFDRDtBQUNELCtCQUE2QjtBQUFBLGdDQUNELEtBQUssd0JBQUwsRUFEQzs7QUFBQSxRQUN0QixXQURzQix5QkFDdEIsV0FEc0I7QUFBQSxRQUNULElBRFMseUJBQ1QsSUFEUzs7QUFFM0IsWUFBUSxJQUFSO0FBQ0UsV0FBSyxRQUFMO0FBQ0UsZUFBTyxXQUFQO0FBQ0YsV0FBSyxZQUFMO0FBQ0UsWUFBSSxLQUFLLFFBQUwsQ0FBYyxLQUFLLElBQUwsRUFBZCxDQUFKLEVBQWdDO0FBQzlCLGVBQUssT0FBTDtBQUNBLGNBQUksT0FBTyxLQUFLLHNCQUFMLEVBQVg7QUFDQSxpQkFBTyxvQkFBUywyQkFBVCxFQUFzQyxFQUFDLE1BQU0sSUFBUCxFQUFhLFNBQVMsS0FBSyxzQkFBTCxDQUE0QixXQUE1QixDQUF0QixFQUF0QyxDQUFQO0FBQ0QsU0FKRCxNQUlPLElBQUksQ0FBQyxLQUFLLFlBQUwsQ0FBa0IsS0FBSyxJQUFMLEVBQWxCLEVBQStCLEdBQS9CLENBQUwsRUFBMEM7QUFDL0MsaUJBQU8sb0JBQVMsbUJBQVQsRUFBOEIsRUFBQyxNQUFNLFlBQVksS0FBbkIsRUFBOUIsQ0FBUDtBQUNEO0FBVkw7QUFZQSxTQUFLLGVBQUwsQ0FBcUIsR0FBckI7QUFDQSxRQUFJLFdBQVcsS0FBSyxzQkFBTCxFQUFmO0FBQ0EsV0FBTyxvQkFBUyxjQUFULEVBQXlCLEVBQUMsTUFBTSxXQUFQLEVBQW9CLFlBQVksUUFBaEMsRUFBekIsQ0FBUDtBQUNEO0FBQ0QsNkJBQTJCO0FBQ3pCLFFBQUksZ0JBQWdCLEtBQUssSUFBTCxFQUFwQjtBQUNBLFFBQUksa0JBQWtCLEtBQXRCO0FBQ0EsUUFBSSxLQUFLLFlBQUwsQ0FBa0IsYUFBbEIsRUFBaUMsR0FBakMsQ0FBSixFQUEyQztBQUN6Qyx3QkFBa0IsSUFBbEI7QUFDQSxXQUFLLE9BQUw7QUFDRDtBQUNELFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEtBQWpDLEtBQTJDLEtBQUssY0FBTCxDQUFvQixLQUFLLElBQUwsQ0FBVSxDQUFWLENBQXBCLENBQS9DLEVBQWtGO0FBQ2hGLFdBQUssT0FBTDs7QUFEZ0YsbUNBRW5FLEtBQUssb0JBQUwsRUFGbUU7O0FBQUEsVUFFM0UsSUFGMkUsMEJBRTNFLElBRjJFOztBQUdoRixXQUFLLFdBQUw7QUFDQSxVQUFJLE9BQU8sS0FBSyxZQUFMLEVBQVg7QUFDQSxhQUFPLEVBQUMsYUFBYSxvQkFBUyxRQUFULEVBQW1CLEVBQUMsTUFBTSxJQUFQLEVBQWEsTUFBTSxJQUFuQixFQUFuQixDQUFkLEVBQTRELE1BQU0sUUFBbEUsRUFBUDtBQUNELEtBTkQsTUFNTyxJQUFJLEtBQUssWUFBTCxDQUFrQixhQUFsQixFQUFpQyxLQUFqQyxLQUEyQyxLQUFLLGNBQUwsQ0FBb0IsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFwQixDQUEvQyxFQUFrRjtBQUN2RixXQUFLLE9BQUw7O0FBRHVGLG1DQUUxRSxLQUFLLG9CQUFMLEVBRjBFOztBQUFBLFVBRWxGLElBRmtGLDBCQUVsRixJQUZrRjs7QUFHdkYsVUFBSSxNQUFNLElBQUksYUFBSixDQUFrQixLQUFLLFdBQUwsRUFBbEIsRUFBc0Msc0JBQXRDLEVBQThDLEtBQUssT0FBbkQsQ0FBVjtBQUNBLFVBQUksUUFBUSxJQUFJLHNCQUFKLEVBQVo7QUFDQSxVQUFJLE9BQU8sS0FBSyxZQUFMLEVBQVg7QUFDQSxhQUFPLEVBQUMsYUFBYSxvQkFBUyxRQUFULEVBQW1CLEVBQUMsTUFBTSxJQUFQLEVBQWEsT0FBTyxLQUFwQixFQUEyQixNQUFNLElBQWpDLEVBQW5CLENBQWQsRUFBMEUsTUFBTSxRQUFoRixFQUFQO0FBQ0Q7O0FBcEJ3QixpQ0FxQlosS0FBSyxvQkFBTCxFQXJCWTs7QUFBQSxRQXFCcEIsSUFyQm9CLDBCQXFCcEIsSUFyQm9COztBQXNCekIsUUFBSSxLQUFLLFFBQUwsQ0FBYyxLQUFLLElBQUwsRUFBZCxDQUFKLEVBQWdDO0FBQzlCLFVBQUksU0FBUyxLQUFLLFdBQUwsRUFBYjtBQUNBLFVBQUksTUFBTSxJQUFJLGFBQUosQ0FBa0IsTUFBbEIsRUFBMEIsc0JBQTFCLEVBQWtDLEtBQUssT0FBdkMsQ0FBVjtBQUNBLFVBQUksZUFBZSxJQUFJLHdCQUFKLEVBQW5CO0FBQ0EsVUFBSSxPQUFPLEtBQUssWUFBTCxFQUFYO0FBQ0EsYUFBTyxFQUFDLGFBQWEsb0JBQVMsUUFBVCxFQUFtQixFQUFDLGFBQWEsZUFBZCxFQUErQixNQUFNLElBQXJDLEVBQTJDLFFBQVEsWUFBbkQsRUFBaUUsTUFBTSxJQUF2RSxFQUFuQixDQUFkLEVBQWdILE1BQU0sUUFBdEgsRUFBUDtBQUNEO0FBQ0QsV0FBTyxFQUFDLGFBQWEsSUFBZCxFQUFvQixNQUFNLEtBQUssWUFBTCxDQUFrQixhQUFsQixLQUFvQyxLQUFLLFNBQUwsQ0FBZSxhQUFmLENBQXBDLEdBQW9FLFlBQXBFLEdBQW1GLFVBQTdHLEVBQVA7QUFDRDtBQUNELHlCQUF1QjtBQUNyQixRQUFJLGdCQUFnQixLQUFLLElBQUwsRUFBcEI7QUFDQSxRQUFJLEtBQUssZUFBTCxDQUFxQixhQUFyQixLQUF1QyxLQUFLLGdCQUFMLENBQXNCLGFBQXRCLENBQTNDLEVBQWlGO0FBQy9FLGFBQU8sRUFBQyxNQUFNLG9CQUFTLG9CQUFULEVBQStCLEVBQUMsT0FBTyxLQUFLLE9BQUwsRUFBUixFQUEvQixDQUFQLEVBQWdFLFNBQVMsSUFBekUsRUFBUDtBQUNELEtBRkQsTUFFTyxJQUFJLEtBQUssVUFBTCxDQUFnQixhQUFoQixDQUFKLEVBQW9DO0FBQ3pDLFVBQUksTUFBTSxJQUFJLGFBQUosQ0FBa0IsS0FBSyxZQUFMLEVBQWxCLEVBQXVDLHNCQUF2QyxFQUErQyxLQUFLLE9BQXBELENBQVY7QUFDQSxVQUFJLE9BQU8sSUFBSSxzQkFBSixFQUFYO0FBQ0EsYUFBTyxFQUFDLE1BQU0sb0JBQVMsc0JBQVQsRUFBaUMsRUFBQyxZQUFZLElBQWIsRUFBakMsQ0FBUCxFQUE2RCxTQUFTLElBQXRFLEVBQVA7QUFDRDtBQUNELFFBQUksV0FBVyxLQUFLLE9BQUwsRUFBZjtBQUNBLFdBQU8sRUFBQyxNQUFNLG9CQUFTLG9CQUFULEVBQStCLEVBQUMsT0FBTyxRQUFSLEVBQS9CLENBQVAsRUFBMEQsU0FBUyxvQkFBUyxtQkFBVCxFQUE4QixFQUFDLE1BQU0sUUFBUCxFQUE5QixDQUFuRSxFQUFQO0FBQ0Q7QUFDRCwwQkFBc0Q7QUFBQSxRQUFwQyxNQUFvQyxTQUFwQyxNQUFvQztBQUFBLFFBQTVCLFNBQTRCLFNBQTVCLFNBQTRCO0FBQUEsUUFBakIsY0FBaUIsU0FBakIsY0FBaUI7O0FBQ3BELFFBQUksV0FBVyxJQUFmO0FBQUEsUUFBcUIsVUFBckI7QUFBQSxRQUFpQyxRQUFqQztBQUFBLFFBQTJDLFFBQTNDO0FBQ0EsUUFBSSxrQkFBa0IsS0FBdEI7QUFDQSxRQUFJLGdCQUFnQixLQUFLLE9BQUwsRUFBcEI7QUFDQSxRQUFJLGdCQUFnQixLQUFLLElBQUwsRUFBcEI7QUFDQSxRQUFJLFdBQVcsU0FBUyxvQkFBVCxHQUFnQyxxQkFBL0M7QUFDQSxRQUFJLEtBQUssWUFBTCxDQUFrQixhQUFsQixFQUFpQyxHQUFqQyxDQUFKLEVBQTJDO0FBQ3pDLHdCQUFrQixJQUFsQjtBQUNBLFdBQUssT0FBTDtBQUNBLHNCQUFnQixLQUFLLElBQUwsRUFBaEI7QUFDRDtBQUNELFFBQUksQ0FBQyxLQUFLLFFBQUwsQ0FBYyxhQUFkLENBQUwsRUFBbUM7QUFDakMsaUJBQVcsS0FBSyx5QkFBTCxFQUFYO0FBQ0QsS0FGRCxNQUVPLElBQUksU0FBSixFQUFlO0FBQ3BCLGlCQUFXLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsTUFBTSxpQkFBTyxjQUFQLENBQXNCLFdBQXRCLEVBQW1DLGFBQW5DLENBQVAsRUFBOUIsQ0FBWDtBQUNEO0FBQ0QsaUJBQWEsS0FBSyxXQUFMLEVBQWI7QUFDQSxlQUFXLEtBQUssWUFBTCxFQUFYO0FBQ0EsUUFBSSxVQUFVLElBQUksYUFBSixDQUFrQixVQUFsQixFQUE4QixzQkFBOUIsRUFBc0MsS0FBSyxPQUEzQyxDQUFkO0FBQ0EsUUFBSSxtQkFBbUIsUUFBUSx3QkFBUixFQUF2QjtBQUNBLFdBQU8sb0JBQVMsUUFBVCxFQUFtQixFQUFDLE1BQU0sUUFBUCxFQUFpQixhQUFhLGVBQTlCLEVBQStDLFFBQVEsZ0JBQXZELEVBQXlFLE1BQU0sUUFBL0UsRUFBbkIsQ0FBUDtBQUNEO0FBQ0QsK0JBQTZCO0FBQzNCLFFBQUksV0FBVyxJQUFmO0FBQUEsUUFBcUIsVUFBckI7QUFBQSxRQUFpQyxRQUFqQztBQUFBLFFBQTJDLFFBQTNDO0FBQ0EsUUFBSSxrQkFBa0IsS0FBdEI7QUFDQSxTQUFLLE9BQUw7QUFDQSxRQUFJLGdCQUFnQixLQUFLLElBQUwsRUFBcEI7QUFDQSxRQUFJLEtBQUssWUFBTCxDQUFrQixhQUFsQixFQUFpQyxHQUFqQyxDQUFKLEVBQTJDO0FBQ3pDLHdCQUFrQixJQUFsQjtBQUNBLFdBQUssT0FBTDtBQUNBLHNCQUFnQixLQUFLLElBQUwsRUFBaEI7QUFDRDtBQUNELFFBQUksQ0FBQyxLQUFLLFFBQUwsQ0FBYyxhQUFkLENBQUwsRUFBbUM7QUFDakMsaUJBQVcsS0FBSyx5QkFBTCxFQUFYO0FBQ0Q7QUFDRCxpQkFBYSxLQUFLLFdBQUwsRUFBYjtBQUNBLGVBQVcsS0FBSyxZQUFMLEVBQVg7QUFDQSxRQUFJLFVBQVUsSUFBSSxhQUFKLENBQWtCLFVBQWxCLEVBQThCLHNCQUE5QixFQUFzQyxLQUFLLE9BQTNDLENBQWQ7QUFDQSxRQUFJLG1CQUFtQixRQUFRLHdCQUFSLEVBQXZCO0FBQ0EsV0FBTyxvQkFBUyxvQkFBVCxFQUErQixFQUFDLE1BQU0sUUFBUCxFQUFpQixhQUFhLGVBQTlCLEVBQStDLFFBQVEsZ0JBQXZELEVBQXlFLE1BQU0sUUFBL0UsRUFBL0IsQ0FBUDtBQUNEO0FBQ0QsZ0NBQThCO0FBQzVCLFFBQUksUUFBSixFQUFjLFVBQWQsRUFBMEIsUUFBMUIsRUFBb0MsUUFBcEM7QUFDQSxRQUFJLGtCQUFrQixLQUF0QjtBQUNBLFNBQUssT0FBTDtBQUNBLFFBQUksZ0JBQWdCLEtBQUssSUFBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEdBQWpDLENBQUosRUFBMkM7QUFDekMsd0JBQWtCLElBQWxCO0FBQ0EsV0FBSyxPQUFMO0FBQ0Q7QUFDRCxlQUFXLEtBQUsseUJBQUwsRUFBWDtBQUNBLGlCQUFhLEtBQUssV0FBTCxFQUFiO0FBQ0EsZUFBVyxLQUFLLFlBQUwsRUFBWDtBQUNBLFFBQUksVUFBVSxJQUFJLGFBQUosQ0FBa0IsVUFBbEIsRUFBOEIsc0JBQTlCLEVBQXNDLEtBQUssT0FBM0MsQ0FBZDtBQUNBLFFBQUksbUJBQW1CLFFBQVEsd0JBQVIsRUFBdkI7QUFDQSxXQUFPLG9CQUFTLHFCQUFULEVBQWdDLEVBQUMsTUFBTSxRQUFQLEVBQWlCLGFBQWEsZUFBOUIsRUFBK0MsUUFBUSxnQkFBdkQsRUFBeUUsTUFBTSxRQUEvRSxFQUFoQyxDQUFQO0FBQ0Q7QUFDRCw2QkFBMkI7QUFDekIsUUFBSSxZQUFZLEVBQWhCO0FBQ0EsUUFBSSxXQUFXLElBQWY7QUFDQSxXQUFPLEtBQUssSUFBTCxDQUFVLElBQVYsS0FBbUIsQ0FBMUIsRUFBNkI7QUFDM0IsVUFBSSxZQUFZLEtBQUssSUFBTCxFQUFoQjtBQUNBLFVBQUksS0FBSyxZQUFMLENBQWtCLFNBQWxCLEVBQTZCLEtBQTdCLENBQUosRUFBeUM7QUFDdkMsYUFBSyxlQUFMLENBQXFCLEtBQXJCO0FBQ0EsbUJBQVcsS0FBSyx5QkFBTCxFQUFYO0FBQ0E7QUFDRDtBQUNELGdCQUFVLElBQVYsQ0FBZSxLQUFLLGFBQUwsRUFBZjtBQUNBLFdBQUssWUFBTDtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxrQkFBVCxFQUE2QixFQUFDLE9BQU8scUJBQUssU0FBTCxDQUFSLEVBQXlCLE1BQU0sUUFBL0IsRUFBN0IsQ0FBUDtBQUNEO0FBQ0Qsa0JBQWdCO0FBQ2QsV0FBTyxLQUFLLHNCQUFMLEVBQVA7QUFDRDtBQUNELDZCQUEyQjtBQUN6QixRQUFJLGVBQWUsS0FBSyxrQkFBTCxFQUFuQjtBQUNBLFdBQU8sb0JBQVMsa0JBQVQsRUFBNkIsRUFBQyxVQUFVLEtBQVgsRUFBa0IsVUFBVSxhQUFhLEdBQWIsRUFBNUIsRUFBZ0QsU0FBUyxLQUFLLHNCQUFMLENBQTRCLEtBQUssSUFBakMsQ0FBekQsRUFBN0IsQ0FBUDtBQUNEO0FBQ0QsNEJBQTBCO0FBQ3hCLFFBQUksZUFBZSxLQUFLLGtCQUFMLEVBQW5CO0FBQ0EsU0FBSyxLQUFMLENBQVcsS0FBWCxHQUFtQixLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLElBQWpCLENBQXNCLEVBQUMsTUFBTSxLQUFLLEtBQUwsQ0FBVyxJQUFsQixFQUF3QixTQUFTLEtBQUssS0FBTCxDQUFXLE9BQTVDLEVBQXRCLENBQW5CO0FBQ0EsU0FBSyxLQUFMLENBQVcsSUFBWCxHQUFrQixFQUFsQjtBQUNBLFNBQUssS0FBTCxDQUFXLE9BQVgsR0FBcUIsaUJBQWlCO0FBQ3BDLFVBQUksUUFBSixFQUFjLFFBQWQsRUFBd0IsWUFBeEI7QUFDQSxVQUFJLGFBQWEsR0FBYixPQUF1QixJQUF2QixJQUErQixhQUFhLEdBQWIsT0FBdUIsSUFBMUQsRUFBZ0U7QUFDOUQsbUJBQVcsa0JBQVg7QUFDQSxtQkFBVyxLQUFLLHNCQUFMLENBQTRCLGFBQTVCLENBQVg7QUFDQSx1QkFBZSxJQUFmO0FBQ0QsT0FKRCxNQUlPO0FBQ0wsbUJBQVcsaUJBQVg7QUFDQSx1QkFBZSxTQUFmO0FBQ0EsbUJBQVcsYUFBWDtBQUNEO0FBQ0QsYUFBTyxvQkFBUyxRQUFULEVBQW1CLEVBQUMsVUFBVSxhQUFhLEdBQWIsRUFBWCxFQUErQixTQUFTLFFBQXhDLEVBQWtELFVBQVUsWUFBNUQsRUFBbkIsQ0FBUDtBQUNELEtBWkQ7QUFhQSxXQUFPLHFCQUFQO0FBQ0Q7QUFDRCxrQ0FBZ0M7QUFDOUIsUUFBSSxXQUFXLEtBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsS0FBSyxJQUF4QixDQUFmO0FBQ0EsUUFBSSxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLElBQWpCLEdBQXdCLENBQTVCLEVBQStCO0FBQUEsK0JBQ1AsS0FBSyxLQUFMLENBQVcsS0FBWCxDQUFpQixJQUFqQixFQURPOztBQUFBLFVBQ3hCLElBRHdCLHNCQUN4QixJQUR3QjtBQUFBLFVBQ2xCLE9BRGtCLHNCQUNsQixPQURrQjs7QUFFN0IsV0FBSyxLQUFMLENBQVcsS0FBWCxHQUFtQixLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLEdBQWpCLEVBQW5CO0FBQ0EsV0FBSyxLQUFMLENBQVcsSUFBWCxHQUFrQixJQUFsQjtBQUNBLFdBQUssS0FBTCxDQUFXLE9BQVgsR0FBcUIsT0FBckI7QUFDRDtBQUNELFNBQUssZUFBTCxDQUFxQixHQUFyQjtBQUNBLFFBQUksVUFBVSxJQUFJLGFBQUosQ0FBa0IsS0FBSyxJQUF2QixFQUE2QixzQkFBN0IsRUFBcUMsS0FBSyxPQUExQyxDQUFkO0FBQ0EsUUFBSSxpQkFBaUIsUUFBUSxzQkFBUixFQUFyQjtBQUNBLFlBQVEsZUFBUixDQUF3QixHQUF4QjtBQUNBLGNBQVUsSUFBSSxhQUFKLENBQWtCLFFBQVEsSUFBMUIsRUFBZ0Msc0JBQWhDLEVBQXdDLEtBQUssT0FBN0MsQ0FBVjtBQUNBLFFBQUksZ0JBQWdCLFFBQVEsc0JBQVIsRUFBcEI7QUFDQSxTQUFLLElBQUwsR0FBWSxRQUFRLElBQXBCO0FBQ0EsV0FBTyxvQkFBUyx1QkFBVCxFQUFrQyxFQUFDLE1BQU0sUUFBUCxFQUFpQixZQUFZLGNBQTdCLEVBQTZDLFdBQVcsYUFBeEQsRUFBbEMsQ0FBUDtBQUNEO0FBQ0QsNkJBQTJCO0FBQ3pCLFFBQUksZUFBZSxLQUFLLElBQXhCO0FBQ0EsUUFBSSxZQUFZLEtBQUssSUFBTCxFQUFoQjtBQUNBLFFBQUksU0FBUyxVQUFVLEdBQVYsRUFBYjtBQUNBLFFBQUksYUFBYSxnQ0FBZ0IsTUFBaEIsQ0FBakI7QUFDQSxRQUFJLGNBQWMsaUNBQWlCLE1BQWpCLENBQWxCO0FBQ0EsUUFBSSwyQkFBVyxLQUFLLEtBQUwsQ0FBVyxJQUF0QixFQUE0QixVQUE1QixFQUF3QyxXQUF4QyxDQUFKLEVBQTBEO0FBQ3hELFdBQUssS0FBTCxDQUFXLEtBQVgsR0FBbUIsS0FBSyxLQUFMLENBQVcsS0FBWCxDQUFpQixJQUFqQixDQUFzQixFQUFDLE1BQU0sS0FBSyxLQUFMLENBQVcsSUFBbEIsRUFBd0IsU0FBUyxLQUFLLEtBQUwsQ0FBVyxPQUE1QyxFQUF0QixDQUFuQjtBQUNBLFdBQUssS0FBTCxDQUFXLElBQVgsR0FBa0IsVUFBbEI7QUFDQSxXQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLGlCQUFpQjtBQUNwQyxlQUFPLG9CQUFTLGtCQUFULEVBQTZCLEVBQUMsTUFBTSxZQUFQLEVBQXFCLFVBQVUsU0FBL0IsRUFBMEMsT0FBTyxhQUFqRCxFQUE3QixDQUFQO0FBQ0QsT0FGRDtBQUdBLFdBQUssT0FBTDtBQUNBLGFBQU8scUJBQVA7QUFDRCxLQVJELE1BUU87QUFDTCxVQUFJLE9BQU8sS0FBSyxLQUFMLENBQVcsT0FBWCxDQUFtQixZQUFuQixDQUFYOztBQURLLCtCQUVpQixLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLElBQWpCLEVBRmpCOztBQUFBLFVBRUEsSUFGQSxzQkFFQSxJQUZBO0FBQUEsVUFFTSxPQUZOLHNCQUVNLE9BRk47O0FBR0wsV0FBSyxLQUFMLENBQVcsS0FBWCxHQUFtQixLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLEdBQWpCLEVBQW5CO0FBQ0EsV0FBSyxLQUFMLENBQVcsSUFBWCxHQUFrQixJQUFsQjtBQUNBLFdBQUssS0FBTCxDQUFXLE9BQVgsR0FBcUIsT0FBckI7QUFDQSxhQUFPLElBQVA7QUFDRDtBQUNGO0FBQ0QsNkJBQTJCO0FBQ3pCLFFBQUksZ0JBQWdCLEtBQUssYUFBTCxFQUFwQjtBQUNBLFFBQUksZUFBZSxjQUFjLEtBQWQsQ0FBb0IsS0FBcEIsQ0FBMEIsR0FBMUIsQ0FBOEIsVUFBVTtBQUN6RCxVQUFJLEtBQUssV0FBTCxDQUFpQixNQUFqQixDQUFKLEVBQThCO0FBQzVCLFlBQUksTUFBTSxJQUFJLGFBQUosQ0FBa0IsT0FBTyxLQUFQLEVBQWxCLEVBQWtDLHNCQUFsQyxFQUEwQyxLQUFLLE9BQS9DLENBQVY7QUFDQSxlQUFPLElBQUksUUFBSixDQUFhLFlBQWIsQ0FBUDtBQUNEO0FBQ0QsYUFBTyxvQkFBUyxpQkFBVCxFQUE0QixFQUFDLFVBQVUsT0FBTyxLQUFQLENBQWEsSUFBeEIsRUFBNUIsQ0FBUDtBQUNELEtBTmtCLENBQW5CO0FBT0EsV0FBTyxZQUFQO0FBQ0Q7QUFDRCxnQkFBYztBQUNaLFFBQUksZ0JBQWdCLEtBQUssSUFBTCxFQUFwQjtBQUNBLFdBQU8sS0FBSyxzQkFBTCxDQUE0QixhQUE1QixDQUFQLEVBQW1EO0FBQ2pELFVBQUksT0FBTyxLQUFLLE9BQUwsRUFBWDtBQUNBLFVBQUksa0JBQWtCLEtBQUssNkJBQUwsQ0FBbUMsSUFBbkMsQ0FBdEI7QUFDQSxVQUFJLG1CQUFtQixJQUFuQixJQUEyQixPQUFPLGdCQUFnQixLQUF2QixLQUFpQyxVQUFoRSxFQUE0RTtBQUMxRSxjQUFNLEtBQUssV0FBTCxDQUFpQixJQUFqQixFQUF1QiwrREFBdkIsQ0FBTjtBQUNEO0FBQ0QsVUFBSSxlQUFlLHVCQUFXLEdBQVgsQ0FBbkI7QUFDQSxVQUFJLGtCQUFrQix1QkFBVyxHQUFYLENBQXRCO0FBQ0EsV0FBSyxPQUFMLENBQWEsUUFBYixHQUF3QixZQUF4QjtBQUNBLFVBQUksTUFBTSwyQkFBaUIsSUFBakIsRUFBdUIsSUFBdkIsRUFBNkIsS0FBSyxPQUFsQyxFQUEyQyxZQUEzQyxFQUF5RCxlQUF6RCxDQUFWO0FBQ0EsVUFBSSxTQUFTLDJDQUEwQixnQkFBZ0IsS0FBaEIsQ0FBc0IsSUFBdEIsQ0FBMkIsSUFBM0IsRUFBaUMsR0FBakMsQ0FBMUIsQ0FBYjtBQUNBLFVBQUksQ0FBQyxnQkFBSyxNQUFMLENBQVksTUFBWixDQUFMLEVBQTBCO0FBQ3hCLGNBQU0sS0FBSyxXQUFMLENBQWlCLElBQWpCLEVBQXVCLHVDQUF1QyxNQUE5RCxDQUFOO0FBQ0Q7QUFDRCxlQUFTLE9BQU8sR0FBUCxDQUFXLFdBQVc7QUFDN0IsWUFBSSxFQUFFLFdBQVcsT0FBTyxRQUFRLFFBQWYsS0FBNEIsVUFBekMsQ0FBSixFQUEwRDtBQUN4RCxnQkFBTSxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsRUFBdUIsd0RBQXdELE9BQS9FLENBQU47QUFDRDtBQUNELGVBQU8sUUFBUSxRQUFSLENBQWlCLGVBQWpCLEVBQWtDLEtBQUssT0FBTCxDQUFhLFFBQS9DLHNCQUFxRSxFQUFDLE1BQU0sSUFBUCxFQUFyRSxDQUFQO0FBQ0QsT0FMUSxDQUFUO0FBTUEsV0FBSyxJQUFMLEdBQVksT0FBTyxNQUFQLENBQWMsSUFBSSxLQUFKLENBQVUsSUFBVixDQUFkLENBQVo7QUFDQSxzQkFBZ0IsS0FBSyxJQUFMLEVBQWhCO0FBQ0Q7QUFDRjtBQUNELHFCQUFtQjtBQUNqQixRQUFJLGdCQUFnQixLQUFLLElBQUwsRUFBcEI7QUFDQSxRQUFJLGlCQUFpQixLQUFLLFlBQUwsQ0FBa0IsYUFBbEIsRUFBaUMsR0FBakMsQ0FBckIsRUFBNEQ7QUFDMUQsV0FBSyxPQUFMO0FBQ0Q7QUFDRjtBQUNELGlCQUFlO0FBQ2IsUUFBSSxnQkFBZ0IsS0FBSyxJQUFMLEVBQXBCO0FBQ0EsUUFBSSxpQkFBaUIsS0FBSyxZQUFMLENBQWtCLGFBQWxCLEVBQWlDLEdBQWpDLENBQXJCLEVBQTREO0FBQzFELFdBQUssT0FBTDtBQUNEO0FBQ0Y7QUFDRCxZQUFVLE9BQVYsRUFBbUIsUUFBbkIsRUFBNkM7QUFBQSxRQUFoQixPQUFnQix5REFBTixJQUFNOztBQUMzQyxXQUFPLFlBQVksT0FBTyxRQUFRLEtBQWYsS0FBeUIsVUFBekIsR0FBc0MsUUFBUSxLQUFSLENBQWMsUUFBZCxFQUF3QixPQUF4QixDQUF0QyxHQUF5RSxLQUFyRixDQUFQO0FBQ0Q7QUFDRCxTQUFPLFFBQVAsRUFBaUI7QUFDZixXQUFPLFlBQVksbUNBQW5CO0FBQ0Q7QUFDRCxRQUFNLE9BQU4sRUFBZTtBQUNiLFdBQU8sS0FBSyxTQUFMLENBQWUsT0FBZixFQUF3QixLQUF4QixDQUFQO0FBQ0Q7QUFDRCxlQUFhLE9BQWIsRUFBc0M7QUFBQSxRQUFoQixPQUFnQix5REFBTixJQUFNOztBQUNwQyxXQUFPLEtBQUssU0FBTCxDQUFlLE9BQWYsRUFBd0IsWUFBeEIsRUFBc0MsT0FBdEMsQ0FBUDtBQUNEO0FBQ0QsaUJBQWUsT0FBZixFQUF3QjtBQUN0QixXQUFPLEtBQUssWUFBTCxDQUFrQixPQUFsQixLQUE4QixLQUFLLFNBQUwsQ0FBZSxPQUFmLENBQTlCLElBQXlELEtBQUssZ0JBQUwsQ0FBc0IsT0FBdEIsQ0FBekQsSUFBMkYsS0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQTNGLElBQTRILEtBQUssVUFBTCxDQUFnQixPQUFoQixDQUFuSTtBQUNEO0FBQ0QsbUJBQWlCLE9BQWpCLEVBQTBDO0FBQUEsUUFBaEIsT0FBZ0IseURBQU4sSUFBTTs7QUFDeEMsV0FBTyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFFBQXhCLEVBQWtDLE9BQWxDLENBQVA7QUFDRDtBQUNELGtCQUFnQixPQUFoQixFQUF5QztBQUFBLFFBQWhCLE9BQWdCLHlEQUFOLElBQU07O0FBQ3ZDLFdBQU8sS0FBSyxTQUFMLENBQWUsT0FBZixFQUF3QixRQUF4QixFQUFrQyxPQUFsQyxDQUFQO0FBQ0Q7QUFDRCxhQUFXLE9BQVgsRUFBb0M7QUFBQSxRQUFoQixPQUFnQix5REFBTixJQUFNOztBQUNsQyxXQUFPLEtBQUssU0FBTCxDQUFlLE9BQWYsRUFBd0IsVUFBeEIsRUFBb0MsT0FBcEMsQ0FBUDtBQUNEO0FBQ0QsbUJBQWlCLE9BQWpCLEVBQTBCO0FBQ3hCLFdBQU8sS0FBSyxTQUFMLENBQWUsT0FBZixFQUF3QixnQkFBeEIsQ0FBUDtBQUNEO0FBQ0QsbUJBQWlCLE9BQWpCLEVBQTBDO0FBQUEsUUFBaEIsT0FBZ0IseURBQU4sSUFBTTs7QUFDeEMsV0FBTyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFNBQXhCLEVBQW1DLE9BQW5DLENBQVA7QUFDRDtBQUNELGdCQUFjLE9BQWQsRUFBdUM7QUFBQSxRQUFoQixPQUFnQix5REFBTixJQUFNOztBQUNyQyxXQUFPLEtBQUssU0FBTCxDQUFlLE9BQWYsRUFBd0IsTUFBeEIsRUFBZ0MsT0FBaEMsQ0FBUDtBQUNEO0FBQ0Qsc0JBQW9CLE9BQXBCLEVBQTZDO0FBQUEsUUFBaEIsT0FBZ0IseURBQU4sSUFBTTs7QUFDM0MsV0FBTyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLG1CQUF4QixFQUE2QyxPQUE3QyxDQUFQO0FBQ0Q7QUFDRCxjQUFZLE9BQVosRUFBcUI7QUFDbkIsV0FBTyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFdBQXhCLENBQVA7QUFDRDtBQUNELFdBQVMsT0FBVCxFQUFrQjtBQUNoQixXQUFPLEtBQUssU0FBTCxDQUFlLE9BQWYsRUFBd0IsUUFBeEIsQ0FBUDtBQUNEO0FBQ0QsV0FBUyxPQUFULEVBQWtCO0FBQ2hCLFdBQU8sS0FBSyxTQUFMLENBQWUsT0FBZixFQUF3QixRQUF4QixDQUFQO0FBQ0Q7QUFDRCxhQUFXLE9BQVgsRUFBb0I7QUFDbEIsV0FBTyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFVBQXhCLENBQVA7QUFDRDtBQUNELFdBQVMsT0FBVCxFQUFrQztBQUFBLFFBQWhCLE9BQWdCLHlEQUFOLElBQU07O0FBQ2hDLFdBQU8sS0FBSyxTQUFMLENBQWUsT0FBZixFQUF3QixRQUF4QixFQUFrQyxPQUFsQyxDQUFQO0FBQ0Q7QUFDRCxZQUFVLE9BQVYsRUFBbUM7QUFBQSxRQUFoQixPQUFnQix5REFBTixJQUFNOztBQUNqQyxXQUFPLEtBQUssU0FBTCxDQUFlLE9BQWYsRUFBd0IsU0FBeEIsRUFBbUMsT0FBbkMsQ0FBUDtBQUNEO0FBQ0QsZUFBYSxPQUFiLEVBQXNDO0FBQUEsUUFBaEIsT0FBZ0IseURBQU4sSUFBTTs7QUFDcEMsV0FBTyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFlBQXhCLEVBQXNDLE9BQXRDLENBQVA7QUFDRDtBQUNELGFBQVcsT0FBWCxFQUFvQjtBQUNsQixXQUFPLENBQUMsS0FBSyxTQUFMLENBQWUsT0FBZixFQUF3QixZQUF4QixLQUF5QyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFlBQXhCLENBQXpDLElBQWtGLEtBQUssU0FBTCxDQUFlLE9BQWYsRUFBd0IsU0FBeEIsQ0FBbkYsS0FBMEgsMkJBQVcsT0FBWCxDQUFqSTtBQUNEO0FBQ0QsbUJBQWlCLE9BQWpCLEVBQTBCO0FBQ3hCLFdBQU8sS0FBSyxTQUFMLENBQWUsT0FBZixFQUF3QixZQUF4QixFQUFzQyxJQUF0QyxLQUErQyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFlBQXhCLEVBQXNDLElBQXRDLENBQXREO0FBQ0Q7QUFDRCxjQUFZLE9BQVosRUFBcUIsU0FBckIsRUFBZ0M7QUFDOUIsV0FBTyxXQUFXLE9BQU8sUUFBUSxPQUFmLEtBQTJCLFVBQXRDLEdBQW1ELFFBQVEsUUFBUSxPQUFSLENBQWdCLFNBQWhCLENBQVIsQ0FBbkQsR0FBeUYsWUFBaEc7QUFDRDtBQUNELGNBQVksT0FBWixFQUFxQixTQUFyQixFQUFnQztBQUM5QixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQixFQUEwQixLQUFLLE9BQUwsQ0FBYSxLQUF2QyxFQUE4QyxHQUE5QyxDQUFrRCxZQUFZLEtBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsUUFBckIsTUFBbUMsU0FBbkMsSUFBZ0QsS0FBSyxPQUFMLENBQWEsS0FBYixDQUFtQixHQUFuQixDQUF1QixRQUF2QixNQUFxQyxTQUFuSixFQUE4SixTQUE5SixDQUF3SyxLQUF4SyxDQUFQO0FBQ0Q7QUFDRCxzQkFBb0IsT0FBcEIsRUFBNkIsU0FBN0IsRUFBd0M7QUFDdEMsV0FBTyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsRUFBMEIsS0FBSyxPQUFMLENBQWEsS0FBdkMsRUFBOEMsR0FBOUMsQ0FBa0QsWUFBWSxLQUFLLE9BQUwsQ0FBYSxHQUFiLENBQWlCLEdBQWpCLENBQXFCLFFBQXJCLGFBQTBDLFNBQTFDLElBQXVELEtBQUssT0FBTCxDQUFhLEtBQWIsQ0FBbUIsR0FBbkIsQ0FBdUIsUUFBdkIsYUFBNEMsU0FBakssRUFBNEssU0FBNUssQ0FBc0wsS0FBdEwsQ0FBUDtBQUNEO0FBQ0Qsb0JBQWtCLE9BQWxCLEVBQTJCO0FBQ3pCLFdBQU8sS0FBSyxXQUFMLENBQWlCLE9BQWpCLG9DQUFQO0FBQ0Q7QUFDRCxxQkFBbUIsT0FBbkIsRUFBNEI7QUFDMUIsV0FBTyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsb0NBQVA7QUFDRDtBQUNELHFCQUFtQixPQUFuQixFQUE0QjtBQUMxQixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQiwrQkFBUDtBQUNEO0FBQ0QsdUJBQXFCLE9BQXJCLEVBQThCO0FBQzVCLFdBQU8sS0FBSyxXQUFMLENBQWlCLE9BQWpCLGlDQUFQO0FBQ0Q7QUFDRCx3QkFBc0IsT0FBdEIsRUFBK0I7QUFDN0IsV0FBTyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsa0NBQVA7QUFDRDtBQUNELDJCQUF5QixPQUF6QixFQUFrQztBQUNoQyxXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQixxQ0FBUDtBQUNEO0FBQ0QseUJBQXVCLE9BQXZCLEVBQWdDO0FBQzlCLFdBQU8sS0FBSyxXQUFMLENBQWlCLE9BQWpCLG1DQUFQO0FBQ0Q7QUFDRCx3QkFBc0IsT0FBdEIsRUFBK0I7QUFDN0IsV0FBTyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsdUNBQVA7QUFDRDtBQUNELG1CQUFpQixPQUFqQixFQUEwQjtBQUN4QixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQiw2QkFBUDtBQUNEO0FBQ0QsaUJBQWUsT0FBZixFQUF3QjtBQUN0QixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQiwyQkFBUDtBQUNEO0FBQ0Qsb0JBQWtCLE9BQWxCLEVBQTJCO0FBQ3pCLFdBQU8sS0FBSyxXQUFMLENBQWlCLE9BQWpCLDhCQUFQO0FBQ0Q7QUFDRCxtQkFBaUIsT0FBakIsRUFBMEI7QUFDeEIsV0FBTyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsNkJBQVA7QUFDRDtBQUNELHNCQUFvQixPQUFwQixFQUE2QjtBQUMzQixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQixnQ0FBUDtBQUNEO0FBQ0QsZ0JBQWMsT0FBZCxFQUF1QjtBQUNyQixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQiwwQkFBUDtBQUNEO0FBQ0Qsc0JBQW9CLE9BQXBCLEVBQTZCO0FBQzNCLFdBQU8sS0FBSyxXQUFMLENBQWlCLE9BQWpCLGdDQUFQO0FBQ0Q7QUFDRCxrQkFBZ0IsT0FBaEIsRUFBeUI7QUFDdkIsV0FBTyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsNEJBQVA7QUFDRDtBQUNELGlCQUFlLE9BQWYsRUFBd0I7QUFDdEIsV0FBTyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsMkJBQVA7QUFDRDtBQUNELG1CQUFpQixPQUFqQixFQUEwQjtBQUN4QixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQiw2QkFBUDtBQUNEO0FBQ0QsZ0JBQWMsT0FBZCxFQUF1QjtBQUNyQixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQiwwQkFBUDtBQUNEO0FBQ0QsaUJBQWUsT0FBZixFQUF3QjtBQUN0QixXQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQiwyQkFBUDtBQUNEO0FBQ0QseUJBQXVCLE9BQXZCLEVBQWdDO0FBQzlCLFdBQU8sS0FBSyxtQkFBTCxDQUF5QixPQUF6QixtQ0FBUDtBQUNEO0FBQ0Qsd0JBQXNCLE9BQXRCLEVBQStCO0FBQzdCLFdBQU8sS0FBSyxtQkFBTCxDQUF5QixPQUF6QixrQ0FBUDtBQUNEO0FBQ0QsZ0NBQThCLFFBQTlCLEVBQXdDO0FBQ3RDLFFBQUksS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixTQUFTLE9BQVQsQ0FBaUIsS0FBSyxPQUFMLENBQWEsS0FBOUIsQ0FBckIsQ0FBSixFQUFnRTtBQUM5RCxhQUFPLEtBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsU0FBUyxPQUFULENBQWlCLEtBQUssT0FBTCxDQUFhLEtBQTlCLENBQXJCLENBQVA7QUFDRDtBQUNELFdBQU8sS0FBSyxPQUFMLENBQWEsS0FBYixDQUFtQixHQUFuQixDQUF1QixTQUFTLE9BQVQsQ0FBaUIsS0FBSyxPQUFMLENBQWEsS0FBOUIsQ0FBdkIsQ0FBUDtBQUNEO0FBQ0QsZUFBYSxLQUFiLEVBQW9CLEtBQXBCLEVBQTJCO0FBQ3pCLFFBQUksRUFBRSxTQUFTLEtBQVgsQ0FBSixFQUF1QjtBQUNyQixhQUFPLEtBQVA7QUFDRDtBQUNELFdBQU8sTUFBTSxVQUFOLE9BQXVCLE1BQU0sVUFBTixFQUE5QjtBQUNEO0FBQ0Qsa0JBQWdCLE9BQWhCLEVBQXlCO0FBQ3ZCLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxZQUFMLENBQWtCLGFBQWxCLENBQUosRUFBc0M7QUFDcEMsYUFBTyxhQUFQO0FBQ0Q7QUFDRCxVQUFNLEtBQUssV0FBTCxDQUFpQixhQUFqQixFQUFnQyx5QkFBaEMsQ0FBTjtBQUNEO0FBQ0QsZUFBYSxPQUFiLEVBQXNCO0FBQ3BCLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxTQUFMLENBQWUsYUFBZixFQUE4QixPQUE5QixDQUFKLEVBQTRDO0FBQzFDLGFBQU8sYUFBUDtBQUNEO0FBQ0QsVUFBTSxLQUFLLFdBQUwsQ0FBaUIsYUFBakIsRUFBZ0MsZUFBZSxPQUEvQyxDQUFOO0FBQ0Q7QUFDRCxpQkFBZTtBQUNiLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxnQkFBTCxDQUFzQixhQUF0QixLQUF3QyxLQUFLLGVBQUwsQ0FBcUIsYUFBckIsQ0FBeEMsSUFBK0UsS0FBSyxnQkFBTCxDQUFzQixhQUF0QixDQUEvRSxJQUF1SCxLQUFLLGFBQUwsQ0FBbUIsYUFBbkIsQ0FBdkgsSUFBNEosS0FBSyxVQUFMLENBQWdCLGFBQWhCLENBQTVKLElBQThMLEtBQUssbUJBQUwsQ0FBeUIsYUFBekIsQ0FBbE0sRUFBMk87QUFDek8sYUFBTyxhQUFQO0FBQ0Q7QUFDRCxVQUFNLEtBQUssV0FBTCxDQUFpQixhQUFqQixFQUFnQyxxQkFBaEMsQ0FBTjtBQUNEO0FBQ0QsdUJBQXFCO0FBQ25CLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxlQUFMLENBQXFCLGFBQXJCLENBQUosRUFBeUM7QUFDdkMsYUFBTyxhQUFQO0FBQ0Q7QUFDRCxVQUFNLEtBQUssV0FBTCxDQUFpQixhQUFqQixFQUFnQyw0QkFBaEMsQ0FBTjtBQUNEO0FBQ0Qsa0JBQWdCO0FBQ2QsUUFBSSxnQkFBZ0IsS0FBSyxPQUFMLEVBQXBCO0FBQ0EsUUFBSSxLQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsQ0FBSixFQUFvQztBQUNsQyxhQUFPLGFBQVA7QUFDRDtBQUNELFVBQU0sS0FBSyxXQUFMLENBQWlCLGFBQWpCLEVBQWdDLDhCQUFoQyxDQUFOO0FBQ0Q7QUFDRCxnQkFBYztBQUNaLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxRQUFMLENBQWMsYUFBZCxDQUFKLEVBQWtDO0FBQ2hDLGFBQU8sY0FBYyxLQUFkLEVBQVA7QUFDRDtBQUNELFVBQU0sS0FBSyxXQUFMLENBQWlCLGFBQWpCLEVBQWdDLGtCQUFoQyxDQUFOO0FBQ0Q7QUFDRCxpQkFBZTtBQUNiLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxRQUFMLENBQWMsYUFBZCxDQUFKLEVBQWtDO0FBQ2hDLGFBQU8sY0FBYyxLQUFkLEVBQVA7QUFDRDtBQUNELFVBQU0sS0FBSyxXQUFMLENBQWlCLGFBQWpCLEVBQWdDLHdCQUFoQyxDQUFOO0FBQ0Q7QUFDRCxpQkFBZTtBQUNiLFFBQUksZ0JBQWdCLEtBQUssT0FBTCxFQUFwQjtBQUNBLFFBQUksS0FBSyxVQUFMLENBQWdCLGFBQWhCLENBQUosRUFBb0M7QUFDbEMsYUFBTyxjQUFjLEtBQWQsRUFBUDtBQUNEO0FBQ0QsVUFBTSxLQUFLLFdBQUwsQ0FBaUIsYUFBakIsRUFBZ0MseUJBQWhDLENBQU47QUFDRDtBQUNELHVCQUFxQjtBQUNuQixRQUFJLGdCQUFnQixLQUFLLE9BQUwsRUFBcEI7QUFDQSxRQUFJLGdDQUFnQixhQUFoQixDQUFKLEVBQW9DO0FBQ2xDLGFBQU8sYUFBUDtBQUNEO0FBQ0QsVUFBTSxLQUFLLFdBQUwsQ0FBaUIsYUFBakIsRUFBZ0MsNEJBQWhDLENBQU47QUFDRDtBQUNELGtCQUFnQixPQUFoQixFQUF5QjtBQUN2QixRQUFJLGdCQUFnQixLQUFLLE9BQUwsRUFBcEI7QUFDQSxRQUFJLEtBQUssWUFBTCxDQUFrQixhQUFsQixDQUFKLEVBQXNDO0FBQ3BDLFVBQUksT0FBTyxPQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDLFlBQUksY0FBYyxHQUFkLE9BQXdCLE9BQTVCLEVBQXFDO0FBQ25DLGlCQUFPLGFBQVA7QUFDRCxTQUZELE1BRU87QUFDTCxnQkFBTSxLQUFLLFdBQUwsQ0FBaUIsYUFBakIsRUFBZ0MsaUJBQWlCLE9BQWpCLEdBQTJCLGFBQTNELENBQU47QUFDRDtBQUNGO0FBQ0QsYUFBTyxhQUFQO0FBQ0Q7QUFDRCxVQUFNLEtBQUssV0FBTCxDQUFpQixhQUFqQixFQUFnQyx3QkFBaEMsQ0FBTjtBQUNEO0FBQ0QsY0FBWSxPQUFaLEVBQXFCLFdBQXJCLEVBQWtDO0FBQ2hDLFFBQUksVUFBVSxFQUFkO0FBQ0EsUUFBSSxnQkFBZ0IsT0FBcEI7QUFDQSxRQUFJLEtBQUssSUFBTCxDQUFVLElBQVYsR0FBaUIsQ0FBckIsRUFBd0I7QUFDdEIsZ0JBQVUsS0FBSyxJQUFMLENBQVUsS0FBVixDQUFnQixDQUFoQixFQUFtQixFQUFuQixFQUF1QixHQUF2QixDQUEyQixZQUFZO0FBQy9DLFlBQUksS0FBSyxXQUFMLENBQWlCLFFBQWpCLENBQUosRUFBZ0M7QUFDOUIsaUJBQU8sU0FBUyxLQUFULEVBQVA7QUFDRDtBQUNELGVBQU8sZ0JBQUssRUFBTCxDQUFRLFFBQVIsQ0FBUDtBQUNELE9BTFMsRUFLUCxPQUxPLEdBS0csR0FMSCxDQUtPLFNBQVM7QUFDeEIsWUFBSSxVQUFVLGFBQWQsRUFBNkI7QUFDM0IsaUJBQU8sT0FBTyxNQUFNLEdBQU4sRUFBUCxHQUFxQixJQUE1QjtBQUNEO0FBQ0QsZUFBTyxNQUFNLEdBQU4sRUFBUDtBQUNELE9BVlMsRUFVUCxJQVZPLENBVUYsR0FWRSxDQUFWO0FBV0QsS0FaRCxNQVlPO0FBQ0wsZ0JBQVUsY0FBYyxRQUFkLEVBQVY7QUFDRDtBQUNELFdBQU8sSUFBSSxLQUFKLENBQVUsY0FBYyxJQUFkLEdBQXFCLE9BQS9CLENBQVA7QUFDRDtBQXZqRGlCO1FBeWpESyxVLEdBQWpCLGEiLCJmaWxlIjoiZW5mb3Jlc3Rlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtLCB7aXNJZGVudGlmaWVyRXhwcmVzc2lvbn0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7TWF5YmV9IGZyb20gXCJyYW1kYS1mYW50YXN5XCI7XG5pbXBvcnQge0Z1bmN0aW9uRGVjbFRyYW5zZm9ybSwgVmFyaWFibGVEZWNsVHJhbnNmb3JtLCBOZXdUcmFuc2Zvcm0sIExldERlY2xUcmFuc2Zvcm0sIENvbnN0RGVjbFRyYW5zZm9ybSwgU3ludGF4RGVjbFRyYW5zZm9ybSwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSwgU3ludGF4UXVvdGVUcmFuc2Zvcm0sIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSwgV2hpbGVUcmFuc2Zvcm0sIElmVHJhbnNmb3JtLCBGb3JUcmFuc2Zvcm0sIFN3aXRjaFRyYW5zZm9ybSwgQnJlYWtUcmFuc2Zvcm0sIENvbnRpbnVlVHJhbnNmb3JtLCBEb1RyYW5zZm9ybSwgRGVidWdnZXJUcmFuc2Zvcm0sIFdpdGhUcmFuc2Zvcm0sIFRyeVRyYW5zZm9ybSwgVGhyb3dUcmFuc2Zvcm0sIENvbXBpbGV0aW1lVHJhbnNmb3JtLCBWYXJCaW5kaW5nVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm1zXCI7XG5pbXBvcnQge0xpc3R9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCB7ZXhwZWN0LCBhc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtpc09wZXJhdG9yLCBpc1VuYXJ5T3BlcmF0b3IsIGdldE9wZXJhdG9yQXNzb2MsIGdldE9wZXJhdG9yUHJlYywgb3BlcmF0b3JMdH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgU3ludGF4LCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge2ZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQge3Nhbml0aXplUmVwbGFjZW1lbnRWYWx1ZXN9IGZyb20gXCIuL2xvYWQtc3ludGF4XCI7XG5pbXBvcnQgTWFjcm9Db250ZXh0IGZyb20gXCIuL21hY3JvLWNvbnRleHRcIjtcbmNvbnN0IEp1c3RfNDEgPSBNYXliZS5KdXN0O1xuY29uc3QgTm90aGluZ180MiA9IE1heWJlLk5vdGhpbmc7XG5jb25zdCBFWFBSX0xPT1BfT1BFUkFUT1JfNDMgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9OT19DSEFOR0VfNDQgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9FWFBBTlNJT05fNDUgPSB7fTtcbmNsYXNzIEVuZm9yZXN0ZXJfNDYge1xuICBjb25zdHJ1Y3RvcihzdHhsXzQ3LCBwcmV2XzQ4LCBjb250ZXh0XzQ5KSB7XG4gICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHN0eGxfNDcpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHByZXZfNDgpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KGNvbnRleHRfNDksIFwiZXhwZWN0aW5nIGEgY29udGV4dCB0byBlbmZvcmVzdFwiKTtcbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuICAgIHRoaXMucmVzdCA9IHN0eGxfNDc7XG4gICAgdGhpcy5wcmV2ID0gcHJldl80ODtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XzQ5O1xuICB9XG4gIHBlZWsobl81MCA9IDApIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0LmdldChuXzUwKTtcbiAgfVxuICBhZHZhbmNlKCkge1xuICAgIGxldCByZXRfNTEgPSB0aGlzLnJlc3QuZmlyc3QoKTtcbiAgICB0aGlzLnJlc3QgPSB0aGlzLnJlc3QucmVzdCgpO1xuICAgIHJldHVybiByZXRfNTE7XG4gIH1cbiAgZW5mb3Jlc3QodHlwZV81MiA9IFwiTW9kdWxlXCIpIHtcbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnRlcm07XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRU9GKHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy50ZXJtID0gbmV3IFRlcm0oXCJFT0ZcIiwge30pO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdGhpcy50ZXJtO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0XzUzO1xuICAgIGlmICh0eXBlXzUyID09PSBcImV4cHJlc3Npb25cIikge1xuICAgICAgcmVzdWx0XzUzID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdF81MyA9IHRoaXMuZW5mb3Jlc3RNb2R1bGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XzUzO1xuICB9XG4gIGVuZm9yZXN0TW9kdWxlKCkge1xuICAgIHJldHVybiB0aGlzLmVuZm9yZXN0Qm9keSgpO1xuICB9XG4gIGVuZm9yZXN0Qm9keSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdE1vZHVsZUl0ZW0oKTtcbiAgfVxuICBlbmZvcmVzdE1vZHVsZUl0ZW0oKSB7XG4gICAgbGV0IGxvb2thaGVhZF81NCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfNTQsIFwiaW1wb3J0XCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SW1wb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF81NCwgXCJleHBvcnRcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RFeHBvcnREZWNsYXJhdGlvbigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzU0LCBcIiNcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TGFuZ3VhZ2VQcmFnbWEoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgfVxuICBlbmZvcmVzdExhbmd1YWdlUHJhZ21hKCkge1xuICAgIHRoaXMubWF0Y2hJZGVudGlmaWVyKFwiI1wiKTtcbiAgICB0aGlzLm1hdGNoSWRlbnRpZmllcihcImxhbmdcIik7XG4gICAgbGV0IHBhdGhfNTUgPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlByYWdtYVwiLCB7a2luZDogXCJsYW5nXCIsIGl0ZW1zOiBMaXN0Lm9mKHBhdGhfNTUpfSk7XG4gIH1cbiAgZW5mb3Jlc3RFeHBvcnREZWNsYXJhdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzU2ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF81NiwgXCIqXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSB0aGlzLmVuZm9yZXN0RnJvbUNsYXVzZSgpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0QWxsRnJvbVwiLCB7bW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXJ9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzU2KSkge1xuICAgICAgbGV0IG5hbWVkRXhwb3J0cyA9IHRoaXMuZW5mb3Jlc3RFeHBvcnRDbGF1c2UoKTtcbiAgICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCBcImZyb21cIikpIHtcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5lbmZvcmVzdEZyb21DbGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydEZyb21cIiwge25hbWVkRXhwb3J0czogbmFtZWRFeHBvcnRzLCBtb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcn0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzU2LCBcImNsYXNzXCIpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0Q2xhc3Moe2lzRXhwcjogZmFsc2V9KX0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0ZuRGVjbFRyYW5zZm9ybShsb29rYWhlYWRfNTYpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwcjogZmFsc2UsIGluRGVmYXVsdDogZmFsc2V9KX0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzU2LCBcImRlZmF1bHRcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0odGhpcy5wZWVrKCkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydERlZmF1bHRcIiwge2JvZHk6IHRoaXMuZW5mb3Jlc3RGdW5jdGlvbih7aXNFeHByOiBmYWxzZSwgaW5EZWZhdWx0OiB0cnVlfSl9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksIFwiY2xhc3NcIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0RGVmYXVsdFwiLCB7Ym9keTogdGhpcy5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IGZhbHNlLCBpbkRlZmF1bHQ6IHRydWV9KX0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGJvZHkgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydERlZmF1bHRcIiwge2JvZHk6IGJvZHl9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNWYXJEZWNsVHJhbnNmb3JtKGxvb2thaGVhZF81NikgfHwgdGhpcy5pc0xldERlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzU2KSB8fCB0aGlzLmlzQ29uc3REZWNsVHJhbnNmb3JtKGxvb2thaGVhZF81NikgfHwgdGhpcy5pc1N5bnRheHJlY0RlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzU2KSB8fCB0aGlzLmlzU3ludGF4RGVjbFRyYW5zZm9ybShsb29rYWhlYWRfNTYpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzU2LCBcInVuZXhwZWN0ZWQgc3ludGF4XCIpO1xuICB9XG4gIGVuZm9yZXN0RXhwb3J0Q2xhdXNlKCkge1xuICAgIGxldCBlbmZfNTcgPSBuZXcgRW5mb3Jlc3Rlcl80Nih0aGlzLm1hdGNoQ3VybGllcygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IHJlc3VsdF81OCA9IFtdO1xuICAgIHdoaWxlIChlbmZfNTcucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICByZXN1bHRfNTgucHVzaChlbmZfNTcuZW5mb3Jlc3RFeHBvcnRTcGVjaWZpZXIoKSk7XG4gICAgICBlbmZfNTcuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdF81OCk7XG4gIH1cbiAgZW5mb3Jlc3RFeHBvcnRTcGVjaWZpZXIoKSB7XG4gICAgbGV0IG5hbWVfNTkgPSB0aGlzLmVuZm9yZXN0SWRlbnRpZmllcigpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoKSwgXCJhc1wiKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgZXhwb3J0ZWROYW1lID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIkV4cG9ydFNwZWNpZmllclwiLCB7bmFtZTogbmFtZV81OSwgZXhwb3J0ZWROYW1lOiBleHBvcnRlZE5hbWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0U3BlY2lmaWVyXCIsIHtuYW1lOiBudWxsLCBleHBvcnRlZE5hbWU6IG5hbWVfNTl9KTtcbiAgfVxuICBlbmZvcmVzdEltcG9ydERlY2xhcmF0aW9uKCkge1xuICAgIGxldCBsb29rYWhlYWRfNjAgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgZGVmYXVsdEJpbmRpbmdfNjEgPSBudWxsO1xuICAgIGxldCBuYW1lZEltcG9ydHNfNjIgPSBMaXN0KCk7XG4gICAgbGV0IGZvclN5bnRheF82MyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWRfNjApKSB7XG4gICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFwiLCB7ZGVmYXVsdEJpbmRpbmc6IGRlZmF1bHRCaW5kaW5nXzYxLCBuYW1lZEltcG9ydHM6IG5hbWVkSW1wb3J0c182MiwgbW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXJ9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF82MCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzYwKSkge1xuICAgICAgZGVmYXVsdEJpbmRpbmdfNjEgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiLFwiKSkge1xuICAgICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5lbmZvcmVzdEZyb21DbGF1c2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImZvclwiKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksIFwic3ludGF4XCIpKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgZm9yU3ludGF4XzYzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnRcIiwge2RlZmF1bHRCaW5kaW5nOiBkZWZhdWx0QmluZGluZ182MSwgbW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsIG5hbWVkSW1wb3J0czogTGlzdCgpLCBmb3JTeW50YXg6IGZvclN5bnRheF82M30pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnN1bWVDb21tYSgpO1xuICAgIGxvb2thaGVhZF82MCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZF82MCkpIHtcbiAgICAgIGxldCBpbXBvcnRzID0gdGhpcy5lbmZvcmVzdE5hbWVkSW1wb3J0cygpO1xuICAgICAgbGV0IGZyb21DbGF1c2UgPSB0aGlzLmVuZm9yZXN0RnJvbUNsYXVzZSgpO1xuICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImZvclwiKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksIFwic3ludGF4XCIpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgZm9yU3ludGF4XzYzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFwiLCB7ZGVmYXVsdEJpbmRpbmc6IGRlZmF1bHRCaW5kaW5nXzYxLCBmb3JTeW50YXg6IGZvclN5bnRheF82MywgbmFtZWRJbXBvcnRzOiBpbXBvcnRzLCBtb2R1bGVTcGVjaWZpZXI6IGZyb21DbGF1c2V9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF82MCwgXCIqXCIpKSB7XG4gICAgICBsZXQgbmFtZXNwYWNlQmluZGluZyA9IHRoaXMuZW5mb3Jlc3ROYW1lc3BhY2VCaW5kaW5nKCk7XG4gICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5lbmZvcmVzdEZyb21DbGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJmb3JcIikgJiYgdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKDEpLCBcInN5bnRheFwiKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGZvclN5bnRheF82MyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnROYW1lc3BhY2VcIiwge2RlZmF1bHRCaW5kaW5nOiBkZWZhdWx0QmluZGluZ182MSwgZm9yU3ludGF4OiBmb3JTeW50YXhfNjMsIG5hbWVzcGFjZUJpbmRpbmc6IG5hbWVzcGFjZUJpbmRpbmcsIG1vZHVsZVNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzYwLCBcInVuZXhwZWN0ZWQgc3ludGF4XCIpO1xuICB9XG4gIGVuZm9yZXN0TmFtZXNwYWNlQmluZGluZygpIHtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIipcIik7XG4gICAgdGhpcy5tYXRjaElkZW50aWZpZXIoXCJhc1wiKTtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gIH1cbiAgZW5mb3Jlc3ROYW1lZEltcG9ydHMoKSB7XG4gICAgbGV0IGVuZl82NCA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgcmVzdWx0XzY1ID0gW107XG4gICAgd2hpbGUgKGVuZl82NC5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIHJlc3VsdF82NS5wdXNoKGVuZl82NC5lbmZvcmVzdEltcG9ydFNwZWNpZmllcnMoKSk7XG4gICAgICBlbmZfNjQuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdF82NSk7XG4gIH1cbiAgZW5mb3Jlc3RJbXBvcnRTcGVjaWZpZXJzKCkge1xuICAgIGxldCBsb29rYWhlYWRfNjYgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgbmFtZV82NztcbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzY2KSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfNjYpKSB7XG4gICAgICBuYW1lXzY3ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICBpZiAoIXRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCBcImFzXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFNwZWNpZmllclwiLCB7bmFtZTogbnVsbCwgYmluZGluZzogbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogbmFtZV82N30pfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hdGNoSWRlbnRpZmllcihcImFzXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZF82NiwgXCJ1bmV4cGVjdGVkIHRva2VuIGluIGltcG9ydCBzcGVjaWZpZXJcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkltcG9ydFNwZWNpZmllclwiLCB7bmFtZTogbmFtZV82NywgYmluZGluZzogdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCl9KTtcbiAgfVxuICBlbmZvcmVzdEZyb21DbGF1c2UoKSB7XG4gICAgdGhpcy5tYXRjaElkZW50aWZpZXIoXCJmcm9tXCIpO1xuICAgIGxldCBsb29rYWhlYWRfNjggPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBsb29rYWhlYWRfNjg7XG4gIH1cbiAgZW5mb3Jlc3RTdGF0ZW1lbnRMaXN0SXRlbSgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzY5ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzY5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RGdW5jdGlvbkRlY2xhcmF0aW9uKHtpc0V4cHI6IGZhbHNlfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfNjksIFwiY2xhc3NcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0Q2xhc3Moe2lzRXhwcjogZmFsc2V9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICB9XG4gIH1cbiAgZW5mb3Jlc3RTdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGxvb2thaGVhZF83MCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0NvbXBpbGV0aW1lVHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kTWFjcm8oKTtcbiAgICAgIGxvb2thaGVhZF83MCA9IHRoaXMucGVlaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUZXJtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJhY2VzKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmxvY2tTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzV2hpbGVUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RXaGlsZVN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNJZlRyYW5zZm9ybShsb29rYWhlYWRfNzApKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdElmU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0ZvclRyYW5zZm9ybShsb29rYWhlYWRfNzApKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEZvclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNTd2l0Y2hUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTd2l0Y2hTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJlYWtUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCcmVha1N0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNDb250aW51ZVRyYW5zZm9ybShsb29rYWhlYWRfNzApKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0RvVHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RG9TdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRGVidWdnZXJUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3REZWJ1Z2dlclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNXaXRoVHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0V2l0aFN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUcnlUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUcnlTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVGhyb3dUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUaHJvd1N0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF83MCwgXCJjbGFzc1wiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RDbGFzcyh7aXNFeHByOiBmYWxzZX0pO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzcwKSAmJiB0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoMSksIFwiOlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMYWJlbGVkU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgKHRoaXMuaXNWYXJEZWNsVHJhbnNmb3JtKGxvb2thaGVhZF83MCkgfHwgdGhpcy5pc0xldERlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSB8fCB0aGlzLmlzQ29uc3REZWNsVHJhbnNmb3JtKGxvb2thaGVhZF83MCkgfHwgdGhpcy5pc1N5bnRheHJlY0RlY2xUcmFuc2Zvcm0obG9va2FoZWFkXzcwKSB8fCB0aGlzLmlzU3ludGF4RGVjbFRyYW5zZm9ybShsb29rYWhlYWRfNzApKSkge1xuICAgICAgbGV0IHN0bXQgPSBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpfSk7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBzdG10O1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNSZXR1cm5TdG10VHJhbnNmb3JtKGxvb2thaGVhZF83MCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0UmV0dXJuU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzcwLCBcIjtcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRW1wdHlTdGF0ZW1lbnRcIiwge30pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25TdGF0ZW1lbnQoKTtcbiAgfVxuICBlbmZvcmVzdExhYmVsZWRTdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGxhYmVsXzcxID0gdGhpcy5tYXRjaElkZW50aWZpZXIoKTtcbiAgICBsZXQgcHVuY183MiA9IHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiOlwiKTtcbiAgICBsZXQgc3RtdF83MyA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMYWJlbGVkU3RhdGVtZW50XCIsIHtsYWJlbDogbGFiZWxfNzEsIGJvZHk6IHN0bXRfNzN9KTtcbiAgfVxuICBlbmZvcmVzdEJyZWFrU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwiYnJlYWtcIik7XG4gICAgbGV0IGxvb2thaGVhZF83NCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBsYWJlbF83NSA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwIHx8IHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF83NCwgXCI7XCIpKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIkJyZWFrU3RhdGVtZW50XCIsIHtsYWJlbDogbGFiZWxfNzV9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF83NCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzc0LCBcInlpZWxkXCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF83NCwgXCJsZXRcIikpIHtcbiAgICAgIGxhYmVsXzc1ID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQnJlYWtTdGF0ZW1lbnRcIiwge2xhYmVsOiBsYWJlbF83NX0pO1xuICB9XG4gIGVuZm9yZXN0VHJ5U3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwidHJ5XCIpO1xuICAgIGxldCBib2R5Xzc2ID0gdGhpcy5lbmZvcmVzdEJsb2NrKCk7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImNhdGNoXCIpKSB7XG4gICAgICBsZXQgY2F0Y2hDbGF1c2UgPSB0aGlzLmVuZm9yZXN0Q2F0Y2hDbGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJmaW5hbGx5XCIpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBsZXQgZmluYWxpemVyID0gdGhpcy5lbmZvcmVzdEJsb2NrKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIlRyeUZpbmFsbHlTdGF0ZW1lbnRcIiwge2JvZHk6IGJvZHlfNzYsIGNhdGNoQ2xhdXNlOiBjYXRjaENsYXVzZSwgZmluYWxpemVyOiBmaW5hbGl6ZXJ9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIlRyeUNhdGNoU3RhdGVtZW50XCIsIHtib2R5OiBib2R5Xzc2LCBjYXRjaENsYXVzZTogY2F0Y2hDbGF1c2V9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImZpbmFsbHlcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IGZpbmFsaXplciA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiVHJ5RmluYWxseVN0YXRlbWVudFwiLCB7Ym9keTogYm9keV83NiwgY2F0Y2hDbGF1c2U6IG51bGwsIGZpbmFsaXplcjogZmluYWxpemVyfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IodGhpcy5wZWVrKCksIFwidHJ5IHdpdGggbm8gY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgfVxuICBlbmZvcmVzdENhdGNoQ2xhdXNlKCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwiY2F0Y2hcIik7XG4gICAgbGV0IGJpbmRpbmdQYXJlbnNfNzcgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgbGV0IGVuZl83OCA9IG5ldyBFbmZvcmVzdGVyXzQ2KGJpbmRpbmdQYXJlbnNfNzcsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYmluZGluZ183OSA9IGVuZl83OC5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoKTtcbiAgICBsZXQgYm9keV84MCA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNhdGNoQ2xhdXNlXCIsIHtiaW5kaW5nOiBiaW5kaW5nXzc5LCBib2R5OiBib2R5XzgwfSk7XG4gIH1cbiAgZW5mb3Jlc3RUaHJvd1N0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcInRocm93XCIpO1xuICAgIGxldCBleHByZXNzaW9uXzgxID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUaHJvd1N0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogZXhwcmVzc2lvbl84MX0pO1xuICB9XG4gIGVuZm9yZXN0V2l0aFN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcIndpdGhcIik7XG4gICAgbGV0IG9ialBhcmVuc184MiA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mXzgzID0gbmV3IEVuZm9yZXN0ZXJfNDYob2JqUGFyZW5zXzgyLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IG9iamVjdF84NCA9IGVuZl84My5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBsZXQgYm9keV84NSA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJXaXRoU3RhdGVtZW50XCIsIHtvYmplY3Q6IG9iamVjdF84NCwgYm9keTogYm9keV84NX0pO1xuICB9XG4gIGVuZm9yZXN0RGVidWdnZXJTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJkZWJ1Z2dlclwiKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEZWJ1Z2dlclN0YXRlbWVudFwiLCB7fSk7XG4gIH1cbiAgZW5mb3Jlc3REb1N0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcImRvXCIpO1xuICAgIGxldCBib2R5Xzg2ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwid2hpbGVcIik7XG4gICAgbGV0IHRlc3RCb2R5Xzg3ID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmZfODggPSBuZXcgRW5mb3Jlc3Rlcl80Nih0ZXN0Qm9keV84NywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCB0ZXN0Xzg5ID0gZW5mXzg4LmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkRvV2hpbGVTdGF0ZW1lbnRcIiwge2JvZHk6IGJvZHlfODYsIHRlc3Q6IHRlc3RfODl9KTtcbiAgfVxuICBlbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCkge1xuICAgIGxldCBrd2RfOTAgPSB0aGlzLm1hdGNoS2V5d29yZChcImNvbnRpbnVlXCIpO1xuICAgIGxldCBsb29rYWhlYWRfOTEgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgbGFiZWxfOTIgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWRfOTEsIFwiO1wiKSkge1xuICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJDb250aW51ZVN0YXRlbWVudFwiLCB7bGFiZWw6IGxhYmVsXzkyfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxpbmVOdW1iZXJFcShrd2RfOTAsIGxvb2thaGVhZF85MSkgJiYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF85MSkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzkxLCBcInlpZWxkXCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF85MSwgXCJsZXRcIikpKSB7XG4gICAgICBsYWJlbF85MiA9IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbnRpbnVlU3RhdGVtZW50XCIsIHtsYWJlbDogbGFiZWxfOTJ9KTtcbiAgfVxuICBlbmZvcmVzdFN3aXRjaFN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcInN3aXRjaFwiKTtcbiAgICBsZXQgY29uZF85MyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mXzk0ID0gbmV3IEVuZm9yZXN0ZXJfNDYoY29uZF85MywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBkaXNjcmltaW5hbnRfOTUgPSBlbmZfOTQuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgbGV0IGJvZHlfOTYgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIGlmIChib2R5Xzk2LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFwiLCB7ZGlzY3JpbWluYW50OiBkaXNjcmltaW5hbnRfOTUsIGNhc2VzOiBMaXN0KCl9KTtcbiAgICB9XG4gICAgZW5mXzk0ID0gbmV3IEVuZm9yZXN0ZXJfNDYoYm9keV85NiwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBjYXNlc185NyA9IGVuZl85NC5lbmZvcmVzdFN3aXRjaENhc2VzKCk7XG4gICAgbGV0IGxvb2thaGVhZF85OCA9IGVuZl85NC5wZWVrKCk7XG4gICAgaWYgKGVuZl85NC5pc0tleXdvcmQobG9va2FoZWFkXzk4LCBcImRlZmF1bHRcIikpIHtcbiAgICAgIGxldCBkZWZhdWx0Q2FzZSA9IGVuZl85NC5lbmZvcmVzdFN3aXRjaERlZmF1bHQoKTtcbiAgICAgIGxldCBwb3N0RGVmYXVsdENhc2VzID0gZW5mXzk0LmVuZm9yZXN0U3dpdGNoQ2FzZXMoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0XCIsIHtkaXNjcmltaW5hbnQ6IGRpc2NyaW1pbmFudF85NSwgcHJlRGVmYXVsdENhc2VzOiBjYXNlc185NywgZGVmYXVsdENhc2U6IGRlZmF1bHRDYXNlLCBwb3N0RGVmYXVsdENhc2VzOiBwb3N0RGVmYXVsdENhc2VzfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFwiLCB7ZGlzY3JpbWluYW50OiBkaXNjcmltaW5hbnRfOTUsIGNhc2VzOiBjYXNlc185N30pO1xuICB9XG4gIGVuZm9yZXN0U3dpdGNoQ2FzZXMoKSB7XG4gICAgbGV0IGNhc2VzXzk5ID0gW107XG4gICAgd2hpbGUgKCEodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksIFwiZGVmYXVsdFwiKSkpIHtcbiAgICAgIGNhc2VzXzk5LnB1c2godGhpcy5lbmZvcmVzdFN3aXRjaENhc2UoKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KGNhc2VzXzk5KTtcbiAgfVxuICBlbmZvcmVzdFN3aXRjaENhc2UoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJjYXNlXCIpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaENhc2VcIiwge3Rlc3Q6IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCksIGNvbnNlcXVlbnQ6IHRoaXMuZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpIHtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIjpcIik7XG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnRMaXN0SW5Td2l0Y2hDYXNlQm9keSgpO1xuICB9XG4gIGVuZm9yZXN0U3RhdGVtZW50TGlzdEluU3dpdGNoQ2FzZUJvZHkoKSB7XG4gICAgbGV0IHJlc3VsdF8xMDAgPSBbXTtcbiAgICB3aGlsZSAoISh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCB0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJkZWZhdWx0XCIpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImNhc2VcIikpKSB7XG4gICAgICByZXN1bHRfMTAwLnB1c2godGhpcy5lbmZvcmVzdFN0YXRlbWVudExpc3RJdGVtKCkpO1xuICAgIH1cbiAgICByZXR1cm4gTGlzdChyZXN1bHRfMTAwKTtcbiAgfVxuICBlbmZvcmVzdFN3aXRjaERlZmF1bHQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJkZWZhdWx0XCIpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaERlZmF1bHRcIiwge2NvbnNlcXVlbnQ6IHRoaXMuZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RGb3JTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJmb3JcIik7XG4gICAgbGV0IGNvbmRfMTAxID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmZfMTAyID0gbmV3IEVuZm9yZXN0ZXJfNDYoY29uZF8xMDEsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkXzEwMywgdGVzdF8xMDQsIGluaXRfMTA1LCByaWdodF8xMDYsIHR5cGVfMTA3LCBsZWZ0XzEwOCwgdXBkYXRlXzEwOTtcbiAgICBpZiAoZW5mXzEwMi5pc1B1bmN0dWF0b3IoZW5mXzEwMi5wZWVrKCksIFwiO1wiKSkge1xuICAgICAgZW5mXzEwMi5hZHZhbmNlKCk7XG4gICAgICBpZiAoIWVuZl8xMDIuaXNQdW5jdHVhdG9yKGVuZl8xMDIucGVlaygpLCBcIjtcIikpIHtcbiAgICAgICAgdGVzdF8xMDQgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgfVxuICAgICAgZW5mXzEwMi5tYXRjaFB1bmN0dWF0b3IoXCI7XCIpO1xuICAgICAgaWYgKGVuZl8xMDIucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICAgIHJpZ2h0XzEwNiA9IGVuZl8xMDIuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJGb3JTdGF0ZW1lbnRcIiwge2luaXQ6IG51bGwsIHRlc3Q6IHRlc3RfMTA0LCB1cGRhdGU6IHJpZ2h0XzEwNiwgYm9keTogdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvb2thaGVhZF8xMDMgPSBlbmZfMTAyLnBlZWsoKTtcbiAgICAgIGlmIChlbmZfMTAyLmlzVmFyRGVjbFRyYW5zZm9ybShsb29rYWhlYWRfMTAzKSB8fCBlbmZfMTAyLmlzTGV0RGVjbFRyYW5zZm9ybShsb29rYWhlYWRfMTAzKSB8fCBlbmZfMTAyLmlzQ29uc3REZWNsVHJhbnNmb3JtKGxvb2thaGVhZF8xMDMpKSB7XG4gICAgICAgIGluaXRfMTA1ID0gZW5mXzEwMi5lbmZvcmVzdFZhcmlhYmxlRGVjbGFyYXRpb24oKTtcbiAgICAgICAgbG9va2FoZWFkXzEwMyA9IGVuZl8xMDIucGVlaygpO1xuICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzEwMywgXCJpblwiKSB8fCB0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTAzLCBcIm9mXCIpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xMDMsIFwiaW5cIikpIHtcbiAgICAgICAgICAgIGVuZl8xMDIuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmlnaHRfMTA2ID0gZW5mXzEwMi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIHR5cGVfMTA3ID0gXCJGb3JJblN0YXRlbWVudFwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzEwMywgXCJvZlwiKSkge1xuICAgICAgICAgICAgZW5mXzEwMi5hZHZhbmNlKCk7XG4gICAgICAgICAgICByaWdodF8xMDYgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgdHlwZV8xMDcgPSBcIkZvck9mU3RhdGVtZW50XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzEwNywge2xlZnQ6IGluaXRfMTA1LCByaWdodDogcmlnaHRfMTA2LCBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCl9KTtcbiAgICAgICAgfVxuICAgICAgICBlbmZfMTAyLm1hdGNoUHVuY3R1YXRvcihcIjtcIik7XG4gICAgICAgIGlmIChlbmZfMTAyLmlzUHVuY3R1YXRvcihlbmZfMTAyLnBlZWsoKSwgXCI7XCIpKSB7XG4gICAgICAgICAgZW5mXzEwMi5hZHZhbmNlKCk7XG4gICAgICAgICAgdGVzdF8xMDQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlc3RfMTA0ID0gZW5mXzEwMi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICBlbmZfMTAyLm1hdGNoUHVuY3R1YXRvcihcIjtcIik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlXzEwOSA9IGVuZl8xMDIuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQoZW5mXzEwMi5wZWVrKDEpLCBcImluXCIpIHx8IHRoaXMuaXNJZGVudGlmaWVyKGVuZl8xMDIucGVlaygxKSwgXCJvZlwiKSkge1xuICAgICAgICAgIGxlZnRfMTA4ID0gZW5mXzEwMi5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgICAgICAgbGV0IGtpbmQgPSBlbmZfMTAyLmFkdmFuY2UoKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQoa2luZCwgXCJpblwiKSkge1xuICAgICAgICAgICAgdHlwZV8xMDcgPSBcIkZvckluU3RhdGVtZW50XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGVfMTA3ID0gXCJGb3JPZlN0YXRlbWVudFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByaWdodF8xMDYgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzEwNywge2xlZnQ6IGxlZnRfMTA4LCByaWdodDogcmlnaHRfMTA2LCBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCl9KTtcbiAgICAgICAgfVxuICAgICAgICBpbml0XzEwNSA9IGVuZl8xMDIuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgIGVuZl8xMDIubWF0Y2hQdW5jdHVhdG9yKFwiO1wiKTtcbiAgICAgICAgaWYgKGVuZl8xMDIuaXNQdW5jdHVhdG9yKGVuZl8xMDIucGVlaygpLCBcIjtcIikpIHtcbiAgICAgICAgICBlbmZfMTAyLmFkdmFuY2UoKTtcbiAgICAgICAgICB0ZXN0XzEwNCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVzdF8xMDQgPSBlbmZfMTAyLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgIGVuZl8xMDIubWF0Y2hQdW5jdHVhdG9yKFwiO1wiKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVfMTA5ID0gZW5mXzEwMi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIkZvclN0YXRlbWVudFwiLCB7aW5pdDogaW5pdF8xMDUsIHRlc3Q6IHRlc3RfMTA0LCB1cGRhdGU6IHVwZGF0ZV8xMDksIGJvZHk6IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKX0pO1xuICAgIH1cbiAgfVxuICBlbmZvcmVzdElmU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKFwiaWZcIik7XG4gICAgbGV0IGNvbmRfMTEwID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmZfMTExID0gbmV3IEVuZm9yZXN0ZXJfNDYoY29uZF8xMTAsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkXzExMiA9IGVuZl8xMTEucGVlaygpO1xuICAgIGxldCB0ZXN0XzExMyA9IGVuZl8xMTEuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgaWYgKHRlc3RfMTEzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBlbmZfMTExLmNyZWF0ZUVycm9yKGxvb2thaGVhZF8xMTIsIFwiZXhwZWN0aW5nIGFuIGV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIGxldCBjb25zZXF1ZW50XzExNCA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICBsZXQgYWx0ZXJuYXRlXzExNSA9IG51bGw7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCBcImVsc2VcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgYWx0ZXJuYXRlXzExNSA9IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSWZTdGF0ZW1lbnRcIiwge3Rlc3Q6IHRlc3RfMTEzLCBjb25zZXF1ZW50OiBjb25zZXF1ZW50XzExNCwgYWx0ZXJuYXRlOiBhbHRlcm5hdGVfMTE1fSk7XG4gIH1cbiAgZW5mb3Jlc3RXaGlsZVN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZChcIndoaWxlXCIpO1xuICAgIGxldCBjb25kXzExNiA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mXzExNyA9IG5ldyBFbmZvcmVzdGVyXzQ2KGNvbmRfMTE2LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGxvb2thaGVhZF8xMTggPSBlbmZfMTE3LnBlZWsoKTtcbiAgICBsZXQgdGVzdF8xMTkgPSBlbmZfMTE3LmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGlmICh0ZXN0XzExOSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgZW5mXzExNy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMTE4LCBcImV4cGVjdGluZyBhbiBleHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICBsZXQgYm9keV8xMjAgPSB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiV2hpbGVTdGF0ZW1lbnRcIiwge3Rlc3Q6IHRlc3RfMTE5LCBib2R5OiBib2R5XzEyMH0pO1xuICB9XG4gIGVuZm9yZXN0QmxvY2tTdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmxvY2tTdGF0ZW1lbnRcIiwge2Jsb2NrOiB0aGlzLmVuZm9yZXN0QmxvY2soKX0pO1xuICB9XG4gIGVuZm9yZXN0QmxvY2soKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmxvY2tcIiwge3N0YXRlbWVudHM6IHRoaXMubWF0Y2hDdXJsaWVzKCl9KTtcbiAgfVxuICBlbmZvcmVzdENsYXNzKHtpc0V4cHIsIGluRGVmYXVsdH0pIHtcbiAgICBsZXQga3dfMTIxID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IG5hbWVfMTIyID0gbnVsbCwgc3Vwcl8xMjMgPSBudWxsO1xuICAgIGxldCB0eXBlXzEyNCA9IGlzRXhwciA/IFwiQ2xhc3NFeHByZXNzaW9uXCIgOiBcIkNsYXNzRGVjbGFyYXRpb25cIjtcbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lXzEyMiA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICAgIH0gZWxzZSBpZiAoIWlzRXhwcikge1xuICAgICAgaWYgKGluRGVmYXVsdCkge1xuICAgICAgICBuYW1lXzEyMiA9IG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IFN5bnRheC5mcm9tSWRlbnRpZmllcihcIl9kZWZhdWx0XCIsIGt3XzEyMSl9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IodGhpcy5wZWVrKCksIFwidW5leHBlY3RlZCBzeW50YXhcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgXCJleHRlbmRzXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHN1cHJfMTIzID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfVxuICAgIGxldCBlbGVtZW50c18xMjUgPSBbXTtcbiAgICBsZXQgZW5mXzEyNiA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB3aGlsZSAoZW5mXzEyNi5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIGlmIChlbmZfMTI2LmlzUHVuY3R1YXRvcihlbmZfMTI2LnBlZWsoKSwgXCI7XCIpKSB7XG4gICAgICAgIGVuZl8xMjYuYWR2YW5jZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBpc1N0YXRpYyA9IGZhbHNlO1xuICAgICAgbGV0IHttZXRob2RPcktleSwga2luZH0gPSBlbmZfMTI2LmVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiaWRlbnRpZmllclwiICYmIG1ldGhvZE9yS2V5LnZhbHVlLnZhbCgpID09PSBcInN0YXRpY1wiKSB7XG4gICAgICAgIGlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgKHttZXRob2RPcktleSwga2luZH0gPSBlbmZfMTI2LmVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpKTtcbiAgICAgIH1cbiAgICAgIGlmIChraW5kID09PSBcIm1ldGhvZFwiKSB7XG4gICAgICAgIGVsZW1lbnRzXzEyNS5wdXNoKG5ldyBUZXJtKFwiQ2xhc3NFbGVtZW50XCIsIHtpc1N0YXRpYzogaXNTdGF0aWMsIG1ldGhvZDogbWV0aG9kT3JLZXl9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGVuZl8xMjYucGVlaygpLCBcIk9ubHkgbWV0aG9kcyBhcmUgYWxsb3dlZCBpbiBjbGFzc2VzXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZV8xMjQsIHtuYW1lOiBuYW1lXzEyMiwgc3VwZXI6IHN1cHJfMTIzLCBlbGVtZW50czogTGlzdChlbGVtZW50c18xMjUpfSk7XG4gIH1cbiAgZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KHthbGxvd1B1bmN0dWF0b3J9ID0ge30pIHtcbiAgICBsZXQgbG9va2FoZWFkXzEyNyA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTI3KSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTI3KSB8fCBhbGxvd1B1bmN0dWF0b3IgJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzEyNykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoe2FsbG93UHVuY3R1YXRvcjogYWxsb3dQdW5jdHVhdG9yfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2tldHMobG9va2FoZWFkXzEyNykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QXJyYXlCaW5kaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZF8xMjcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdE9iamVjdEJpbmRpbmcoKTtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCBcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIik7XG4gIH1cbiAgZW5mb3Jlc3RPYmplY3RCaW5kaW5nKCkge1xuICAgIGxldCBlbmZfMTI4ID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5tYXRjaEN1cmxpZXMoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBwcm9wZXJ0aWVzXzEyOSA9IFtdO1xuICAgIHdoaWxlIChlbmZfMTI4LnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgcHJvcGVydGllc18xMjkucHVzaChlbmZfMTI4LmVuZm9yZXN0QmluZGluZ1Byb3BlcnR5KCkpO1xuICAgICAgZW5mXzEyOC5jb25zdW1lQ29tbWEoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0QmluZGluZ1wiLCB7cHJvcGVydGllczogTGlzdChwcm9wZXJ0aWVzXzEyOSl9KTtcbiAgfVxuICBlbmZvcmVzdEJpbmRpbmdQcm9wZXJ0eSgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzEzMCA9IHRoaXMucGVlaygpO1xuICAgIGxldCB7bmFtZSwgYmluZGluZ30gPSB0aGlzLmVuZm9yZXN0UHJvcGVydHlOYW1lKCk7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF8xMzApIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xMzAsIFwibGV0XCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xMzAsIFwieWllbGRcIikpIHtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiOlwiKSkge1xuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNBc3NpZ24odGhpcy5wZWVrKCkpKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgbGV0IGV4cHIgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBleHByO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJcIiwge2JpbmRpbmc6IGJpbmRpbmcsIGluaXQ6IGRlZmF1bHRWYWx1ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIjpcIik7XG4gICAgYmluZGluZyA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XCIsIHtuYW1lOiBuYW1lLCBiaW5kaW5nOiBiaW5kaW5nfSk7XG4gIH1cbiAgZW5mb3Jlc3RBcnJheUJpbmRpbmcoKSB7XG4gICAgbGV0IGJyYWNrZXRfMTMxID0gdGhpcy5tYXRjaFNxdWFyZXMoKTtcbiAgICBsZXQgZW5mXzEzMiA9IG5ldyBFbmZvcmVzdGVyXzQ2KGJyYWNrZXRfMTMxLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGVsZW1lbnRzXzEzMyA9IFtdLCByZXN0RWxlbWVudF8xMzQgPSBudWxsO1xuICAgIHdoaWxlIChlbmZfMTMyLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgbGV0IGVsO1xuICAgICAgaWYgKGVuZl8xMzIuaXNQdW5jdHVhdG9yKGVuZl8xMzIucGVlaygpLCBcIixcIikpIHtcbiAgICAgICAgZW5mXzEzMi5jb25zdW1lQ29tbWEoKTtcbiAgICAgICAgZWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGVuZl8xMzIuaXNQdW5jdHVhdG9yKGVuZl8xMzIucGVlaygpLCBcIi4uLlwiKSkge1xuICAgICAgICAgIGVuZl8xMzIuYWR2YW5jZSgpO1xuICAgICAgICAgIHJlc3RFbGVtZW50XzEzNCA9IGVuZl8xMzIuZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwgPSBlbmZfMTMyLmVuZm9yZXN0QmluZGluZ0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbmZfMTMyLmNvbnN1bWVDb21tYSgpO1xuICAgICAgfVxuICAgICAgZWxlbWVudHNfMTMzLnB1c2goZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiBMaXN0KGVsZW1lbnRzXzEzMyksIHJlc3RFbGVtZW50OiByZXN0RWxlbWVudF8xMzR9KTtcbiAgfVxuICBlbmZvcmVzdEJpbmRpbmdFbGVtZW50KCkge1xuICAgIGxldCBiaW5kaW5nXzEzNSA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KCk7XG4gICAgaWYgKHRoaXMuaXNBc3NpZ24odGhpcy5wZWVrKCkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCBpbml0ID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICBiaW5kaW5nXzEzNSA9IG5ldyBUZXJtKFwiQmluZGluZ1dpdGhEZWZhdWx0XCIsIHtiaW5kaW5nOiBiaW5kaW5nXzEzNSwgaW5pdDogaW5pdH0pO1xuICAgIH1cbiAgICByZXR1cm4gYmluZGluZ18xMzU7XG4gIH1cbiAgZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcih7YWxsb3dQdW5jdHVhdG9yfSA9IHt9KSB7XG4gICAgbGV0IG5hbWVfMTM2O1xuICAgIGlmIChhbGxvd1B1bmN0dWF0b3IgJiYgdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lXzEzNiA9IHRoaXMuZW5mb3Jlc3RQdW5jdHVhdG9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVfMTM2ID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IG5hbWVfMTM2fSk7XG4gIH1cbiAgZW5mb3Jlc3RQdW5jdHVhdG9yKCkge1xuICAgIGxldCBsb29rYWhlYWRfMTM3ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xMzcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzEzNywgXCJleHBlY3RpbmcgYSBwdW5jdHVhdG9yXCIpO1xuICB9XG4gIGVuZm9yZXN0SWRlbnRpZmllcigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzEzOCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTM4KSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTM4KSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZF8xMzgsIFwiZXhwZWN0aW5nIGFuIGlkZW50aWZpZXJcIik7XG4gIH1cbiAgZW5mb3Jlc3RSZXR1cm5TdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGt3XzEzOSA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWRfMTQwID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwIHx8IGxvb2thaGVhZF8xNDAgJiYgIXRoaXMubGluZU51bWJlckVxKGt3XzEzOSwgbG9va2FoZWFkXzE0MCkpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogbnVsbH0pO1xuICAgIH1cbiAgICBsZXQgdGVybV8xNDEgPSBudWxsO1xuICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE0MCwgXCI7XCIpKSB7XG4gICAgICB0ZXJtXzE0MSA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICBleHBlY3QodGVybV8xNDEgIT0gbnVsbCwgXCJFeHBlY3RpbmcgYW4gZXhwcmVzc2lvbiB0byBmb2xsb3cgcmV0dXJuIGtleXdvcmRcIiwgbG9va2FoZWFkXzE0MCwgdGhpcy5yZXN0KTtcbiAgICB9XG4gICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiUmV0dXJuU3RhdGVtZW50XCIsIHtleHByZXNzaW9uOiB0ZXJtXzE0MX0pO1xuICB9XG4gIGVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpIHtcbiAgICBsZXQga2luZF8xNDI7XG4gICAgbGV0IGxvb2thaGVhZF8xNDMgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQga2luZFN5bl8xNDQgPSBsb29rYWhlYWRfMTQzO1xuICAgIGxldCBwaGFzZV8xNDUgPSB0aGlzLmNvbnRleHQucGhhc2U7XG4gICAgaWYgKGtpbmRTeW5fMTQ0ICYmIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW5fMTQ0LnJlc29sdmUocGhhc2VfMTQ1KSkgPT09IFZhcmlhYmxlRGVjbFRyYW5zZm9ybSkge1xuICAgICAga2luZF8xNDIgPSBcInZhclwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5bl8xNDQgJiYgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bl8xNDQucmVzb2x2ZShwaGFzZV8xNDUpKSA9PT0gTGV0RGVjbFRyYW5zZm9ybSkge1xuICAgICAga2luZF8xNDIgPSBcImxldFwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5bl8xNDQgJiYgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bl8xNDQucmVzb2x2ZShwaGFzZV8xNDUpKSA9PT0gQ29uc3REZWNsVHJhbnNmb3JtKSB7XG4gICAgICBraW5kXzE0MiA9IFwiY29uc3RcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW5fMTQ0ICYmIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW5fMTQ0LnJlc29sdmUocGhhc2VfMTQ1KSkgPT09IFN5bnRheERlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmRfMTQyID0gXCJzeW50YXhcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW5fMTQ0ICYmIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW5fMTQ0LnJlc29sdmUocGhhc2VfMTQ1KSkgPT09IFN5bnRheHJlY0RlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmRfMTQyID0gXCJzeW50YXhyZWNcIjtcbiAgICB9XG4gICAgbGV0IGRlY2xzXzE0NiA9IExpc3QoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdG9yKHtpc1N5bnRheDoga2luZF8xNDIgPT09IFwic3ludGF4XCIgfHwga2luZF8xNDIgPT09IFwic3ludGF4cmVjXCJ9KTtcbiAgICAgIGxldCBsb29rYWhlYWRfMTQzID0gdGhpcy5wZWVrKCk7XG4gICAgICBkZWNsc18xNDYgPSBkZWNsc18xNDYuY29uY2F0KHRlcm0pO1xuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xNDMsIFwiLFwiKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsIHtraW5kOiBraW5kXzE0MiwgZGVjbGFyYXRvcnM6IGRlY2xzXzE0Nn0pO1xuICB9XG4gIGVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdG9yKHtpc1N5bnRheH0pIHtcbiAgICBsZXQgaWRfMTQ3ID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoe2FsbG93UHVuY3R1YXRvcjogaXNTeW50YXh9KTtcbiAgICBsZXQgbG9va2FoZWFkXzE0OCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBpbml0XzE0OSwgcmVzdF8xNTA7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xNDgsIFwiPVwiKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5yZXN0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBpbml0XzE0OSA9IGVuZi5lbmZvcmVzdChcImV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdF8xNDkgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0b3JcIiwge2JpbmRpbmc6IGlkXzE0NywgaW5pdDogaW5pdF8xNDl9KTtcbiAgfVxuICBlbmZvcmVzdEV4cHJlc3Npb25TdGF0ZW1lbnQoKSB7XG4gICAgbGV0IHN0YXJ0XzE1MSA9IHRoaXMucmVzdC5nZXQoMCk7XG4gICAgbGV0IGV4cHJfMTUyID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAoZXhwcl8xNTIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3Ioc3RhcnRfMTUxLCBcIm5vdCBhIHZhbGlkIGV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge2V4cHJlc3Npb246IGV4cHJfMTUyfSk7XG4gIH1cbiAgZW5mb3Jlc3RFeHByZXNzaW9uKCkge1xuICAgIGxldCBsZWZ0XzE1MyA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgIGxldCBsb29rYWhlYWRfMTU0ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8xNTQsIFwiLFwiKSkge1xuICAgICAgd2hpbGUgKHRoaXMucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiLFwiKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRvciA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBsZXQgcmlnaHQgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgbGVmdF8xNTMgPSBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge2xlZnQ6IGxlZnRfMTUzLCBvcGVyYXRvcjogb3BlcmF0b3IsIHJpZ2h0OiByaWdodH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuICAgIHJldHVybiBsZWZ0XzE1MztcbiAgfVxuICBlbmZvcmVzdEV4cHJlc3Npb25Mb29wKCkge1xuICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgdGhpcy5vcEN0eCA9IHtwcmVjOiAwLCBjb21iaW5lOiB4XzE1NSA9PiB4XzE1NSwgc3RhY2s6IExpc3QoKX07XG4gICAgZG8ge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0QXNzaWdubWVudEV4cHJlc3Npb24oKTtcbiAgICAgIGlmICh0ZXJtID09PSBFWFBSX0xPT1BfTk9fQ0hBTkdFXzQ0ICYmIHRoaXMub3BDdHguc3RhY2suc2l6ZSA+IDApIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5vcEN0eC5jb21iaW5lKHRoaXMudGVybSk7XG4gICAgICAgIGxldCB7cHJlYywgY29tYmluZX0gPSB0aGlzLm9wQ3R4LnN0YWNrLmxhc3QoKTtcbiAgICAgICAgdGhpcy5vcEN0eC5wcmVjID0gcHJlYztcbiAgICAgICAgdGhpcy5vcEN0eC5jb21iaW5lID0gY29tYmluZTtcbiAgICAgICAgdGhpcy5vcEN0eC5zdGFjayA9IHRoaXMub3BDdHguc3RhY2sucG9wKCk7XG4gICAgICB9IGVsc2UgaWYgKHRlcm0gPT09IEVYUFJfTE9PUF9OT19DSEFOR0VfNDQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKHRlcm0gPT09IEVYUFJfTE9PUF9PUEVSQVRPUl80MyB8fCB0ZXJtID09PSBFWFBSX0xPT1BfRVhQQU5TSU9OXzQ1KSB7XG4gICAgICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cbiAgZW5mb3Jlc3RBc3NpZ25tZW50RXhwcmVzc2lvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzE1NiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0NvbXBpbGV0aW1lVHJhbnNmb3JtKGxvb2thaGVhZF8xNTYpKSB7XG4gICAgICB0aGlzLmV4cGFuZE1hY3JvKCk7XG4gICAgICBsb29rYWhlYWRfMTU2ID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1Rlcm0obG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTU2LCBcInlpZWxkXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFlpZWxkRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwiY2xhc3NcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0Q2xhc3Moe2lzRXhwcjogdHJ1ZX0pO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTYpKSAmJiB0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoMSksIFwiPT5cIikgJiYgdGhpcy5saW5lTnVtYmVyRXEobG9va2FoZWFkXzE1NiwgdGhpcy5wZWVrKDEpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzU3ludGF4VGVtcGxhdGUobG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4VGVtcGxhdGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzU3ludGF4UXVvdGVUcmFuc2Zvcm0obG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4UXVvdGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTYpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiLCB7aW5uZXI6IHRoaXMuYWR2YW5jZSgpLmlubmVyKCl9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzE1NiwgXCJ0aGlzXCIpIHx8IHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwibGV0XCIpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwieWllbGRcIikgfHwgdGhpcy5pc051bWVyaWNMaXRlcmFsKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzQm9vbGVhbkxpdGVyYWwobG9va2FoZWFkXzE1NikgfHwgdGhpcy5pc051bGxMaXRlcmFsKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNSZWd1bGFyRXhwcmVzc2lvbihsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzE1NikgfHwgdGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZF8xNTYpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RQcmltYXJ5RXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNPcGVyYXRvcihsb29rYWhlYWRfMTU2KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RVbmFyeUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVmFyQmluZGluZ1RyYW5zZm9ybShsb29rYWhlYWRfMTU2KSkge1xuICAgICAgbGV0IGlkID0gdGhpcy5nZXRGcm9tQ29tcGlsZXRpbWVFbnZpcm9ubWVudChsb29rYWhlYWRfMTU2KS5pZDtcbiAgICAgIGlmIChpZCAhPT0gbG9va2FoZWFkXzE1Nikge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5yZXN0ID0gTGlzdC5vZihpZCkuY29uY2F0KHRoaXMucmVzdCk7XG4gICAgICAgIHJldHVybiBFWFBSX0xPT1BfRVhQQU5TSU9OXzQ1O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmICh0aGlzLmlzTmV3VHJhbnNmb3JtKGxvb2thaGVhZF8xNTYpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8xNTYsIFwic3VwZXJcIikpIHx8IHRoaXMudGVybSAmJiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE1NiwgXCIuXCIpICYmICh0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSkpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygxKSkpIHx8IHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTU2KSB8fCB0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTYpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKHthbGxvd0NhbGw6IHRydWV9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSAmJiB0aGlzLmlzVGVtcGxhdGUobG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0VGVtcGxhdGVMaXRlcmFsKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gJiYgdGhpcy5pc1VwZGF0ZU9wZXJhdG9yKGxvb2thaGVhZF8xNTYpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFVwZGF0ZUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSAmJiB0aGlzLmlzT3BlcmF0b3IobG9va2FoZWFkXzE1NikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmluYXJ5RXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNBc3NpZ24obG9va2FoZWFkXzE1NikpIHtcbiAgICAgIGxldCBiaW5kaW5nID0gdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRoaXMudGVybSk7XG4gICAgICBsZXQgb3AgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcl80Nih0aGlzLnJlc3QsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICAgIGxldCBpbml0ID0gZW5mLmVuZm9yZXN0KFwiZXhwcmVzc2lvblwiKTtcbiAgICAgIHRoaXMucmVzdCA9IGVuZi5yZXN0O1xuICAgICAgaWYgKG9wLnZhbCgpID09PSBcIj1cIikge1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7YmluZGluZzogYmluZGluZywgZXhwcmVzc2lvbjogaW5pdH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7YmluZGluZzogYmluZGluZywgb3BlcmF0b3I6IG9wLnZhbCgpLCBleHByZXNzaW9uOiBpbml0fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE1NiwgXCI/XCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENvbmRpdGlvbmFsRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICByZXR1cm4gRVhQUl9MT09QX05PX0NIQU5HRV80NDtcbiAgfVxuICBlbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCkge1xuICAgIGxldCBsb29rYWhlYWRfMTU3ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTU3LCBcInRoaXNcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0VGhpc0V4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzE1NykgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzE1NywgXCJsZXRcIikgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkXzE1NywgXCJ5aWVsZFwiKSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SWRlbnRpZmllckV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkXzE1NykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TnVtZXJpY0xpdGVyYWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdHJpbmdMaXRlcmFsKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZF8xNTcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCb29sZWFuTGl0ZXJhbChsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCb29sZWFuTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNOdWxsTGl0ZXJhbChsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3ROdWxsTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNSZWd1bGFyRXhwcmVzc2lvbihsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZF8xNTcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEZ1bmN0aW9uRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzE1NykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0T2JqZWN0RXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTU3KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RBcnJheUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCBcIk5vdCBhIHByaW1hcnkgZXhwcmVzc2lvblwiKTtcbiAgfVxuICBlbmZvcmVzdExlZnRIYW5kU2lkZUV4cHJlc3Npb24oe2FsbG93Q2FsbH0pIHtcbiAgICBsZXQgbG9va2FoZWFkXzE1OCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTU4LCBcInN1cGVyXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKFwiU3VwZXJcIiwge30pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1RyYW5zZm9ybShsb29rYWhlYWRfMTU4KSkge1xuICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdE5ld0V4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGxvb2thaGVhZF8xNTggPSB0aGlzLnBlZWsoKTtcbiAgICAgIGlmICh0aGlzLmlzUGFyZW5zKGxvb2thaGVhZF8xNTgpKSB7XG4gICAgICAgIGlmICghYWxsb3dDYWxsKSB7XG4gICAgICAgICAgaWYgKHRoaXMudGVybSAmJiBpc0lkZW50aWZpZXJFeHByZXNzaW9uKHRoaXMudGVybSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlcm07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGVybSA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGVybSA9IHRoaXMuZW5mb3Jlc3RDYWxsRXhwcmVzc2lvbigpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTU4KSkge1xuICAgICAgICB0aGlzLnRlcm0gPSBhbGxvd0NhbGwgPyB0aGlzLmVuZm9yZXN0Q29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uKCkgOiB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE1OCwgXCIuXCIpICYmICh0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSkpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygxKSkpKSB7XG4gICAgICAgIHRoaXMudGVybSA9IHRoaXMuZW5mb3Jlc3RTdGF0aWNNZW1iZXJFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWRfMTU4KSkge1xuICAgICAgICB0aGlzLnRlcm0gPSB0aGlzLmVuZm9yZXN0VGVtcGxhdGVMaXRlcmFsKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzE1OCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZF8xNTgpKSB7XG4gICAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge25hbWU6IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCl9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXJtO1xuICB9XG4gIGVuZm9yZXN0Qm9vbGVhbkxpdGVyYWwoKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uXCIsIHt2YWx1ZTogdGhpcy5hZHZhbmNlKCl9KTtcbiAgfVxuICBlbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiwge3RhZzogdGhpcy50ZXJtLCBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKX0pO1xuICB9XG4gIGVuZm9yZXN0U3RyaW5nTGl0ZXJhbCgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMaXRlcmFsU3RyaW5nRXhwcmVzc2lvblwiLCB7dmFsdWU6IHRoaXMuYWR2YW5jZSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3ROdW1lcmljTGl0ZXJhbCgpIHtcbiAgICBsZXQgbnVtXzE1OSA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmIChudW1fMTU5LnZhbCgpID09PSAxIC8gMCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvblwiLCB7fSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwiLCB7dmFsdWU6IG51bV8xNTl9KTtcbiAgfVxuICBlbmZvcmVzdElkZW50aWZpZXJFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiB0aGlzLmFkdmFuY2UoKX0pO1xuICB9XG4gIGVuZm9yZXN0UmVndWxhckV4cHJlc3Npb25MaXRlcmFsKCkge1xuICAgIGxldCByZVN0eF8xNjAgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQgbGFzdFNsYXNoXzE2MSA9IHJlU3R4XzE2MC50b2tlbi52YWx1ZS5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgbGV0IHBhdHRlcm5fMTYyID0gcmVTdHhfMTYwLnRva2VuLnZhbHVlLnNsaWNlKDEsIGxhc3RTbGFzaF8xNjEpO1xuICAgIGxldCBmbGFnc18xNjMgPSByZVN0eF8xNjAudG9rZW4udmFsdWUuc2xpY2UobGFzdFNsYXNoXzE2MSArIDEpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxSZWdFeHBFeHByZXNzaW9uXCIsIHtwYXR0ZXJuOiBwYXR0ZXJuXzE2MiwgZmxhZ3M6IGZsYWdzXzE2M30pO1xuICB9XG4gIGVuZm9yZXN0TnVsbExpdGVyYWwoKSB7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbE51bGxFeHByZXNzaW9uXCIsIHt9KTtcbiAgfVxuICBlbmZvcmVzdFRoaXNFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlRoaXNFeHByZXNzaW9uXCIsIHtzdHg6IHRoaXMuYWR2YW5jZSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RBcmd1bWVudExpc3QoKSB7XG4gICAgbGV0IHJlc3VsdF8xNjQgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5yZXN0LnNpemUgPiAwKSB7XG4gICAgICBsZXQgYXJnO1xuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCBcIi4uLlwiKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgYXJnID0gbmV3IFRlcm0oXCJTcHJlYWRFbGVtZW50XCIsIHtleHByZXNzaW9uOiB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKX0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJnID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZXN0LnNpemUgPiAwKSB7XG4gICAgICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiLFwiKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdF8xNjQucHVzaChhcmcpO1xuICAgIH1cbiAgICByZXR1cm4gTGlzdChyZXN1bHRfMTY0KTtcbiAgfVxuICBlbmZvcmVzdE5ld0V4cHJlc3Npb24oKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoXCJuZXdcIik7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCBcIi5cIikgJiYgdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKDEpLCBcInRhcmdldFwiKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIk5ld1RhcmdldEV4cHJlc3Npb25cIiwge30pO1xuICAgIH1cbiAgICBsZXQgY2FsbGVlXzE2NSA9IHRoaXMuZW5mb3Jlc3RMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKHthbGxvd0NhbGw6IGZhbHNlfSk7XG4gICAgbGV0IGFyZ3NfMTY2O1xuICAgIGlmICh0aGlzLmlzUGFyZW5zKHRoaXMucGVlaygpKSkge1xuICAgICAgYXJnc18xNjYgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3NfMTY2ID0gTGlzdCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJOZXdFeHByZXNzaW9uXCIsIHtjYWxsZWU6IGNhbGxlZV8xNjUsIGFyZ3VtZW50czogYXJnc18xNjZ9KTtcbiAgfVxuICBlbmZvcmVzdENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgZW5mXzE2NyA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hTcXVhcmVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogdGhpcy50ZXJtLCBleHByZXNzaW9uOiBlbmZfMTY3LmVuZm9yZXN0RXhwcmVzc2lvbigpfSk7XG4gIH1cbiAgdHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0ZXJtXzE2OCkge1xuICAgIHN3aXRjaCAodGVybV8xNjgudHlwZSkge1xuICAgICAgY2FzZSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiB0ZXJtXzE2OC5uYW1lfSk7XG4gICAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICAgICAgaWYgKHRlcm1fMTY4LmlubmVyLnNpemUgPT09IDEgJiYgdGhpcy5pc0lkZW50aWZpZXIodGVybV8xNjguaW5uZXIuZ2V0KDApKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiB0ZXJtXzE2OC5pbm5lci5nZXQoMCl9KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcIkRhdGFQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eVwiLCB7bmFtZTogdGVybV8xNjgubmFtZSwgYmluZGluZzogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nV2l0aERlZmF1bHQodGVybV8xNjguZXhwcmVzc2lvbil9KTtcbiAgICAgIGNhc2UgXCJTaG9ydGhhbmRQcm9wZXJ0eVwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXCIsIHtiaW5kaW5nOiBuZXcgVGVybShcIkJpbmRpbmdJZGVudGlmaWVyXCIsIHtuYW1lOiB0ZXJtXzE2OC5uYW1lfSksIGluaXQ6IG51bGx9KTtcbiAgICAgIGNhc2UgXCJPYmplY3RFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEJpbmRpbmdcIiwge3Byb3BlcnRpZXM6IHRlcm1fMTY4LnByb3BlcnRpZXMubWFwKHRfMTY5ID0+IHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0XzE2OSkpfSk7XG4gICAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICAgIGxldCBsYXN0ID0gdGVybV8xNjguZWxlbWVudHMubGFzdCgpO1xuICAgICAgICBpZiAobGFzdCAhPSBudWxsICYmIGxhc3QudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiB0ZXJtXzE2OC5lbGVtZW50cy5zbGljZSgwLCAtMSkubWFwKHRfMTcwID0+IHRfMTcwICYmIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZ1dpdGhEZWZhdWx0KHRfMTcwKSksIHJlc3RFbGVtZW50OiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdChsYXN0LmV4cHJlc3Npb24pfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQXJyYXlCaW5kaW5nXCIsIHtlbGVtZW50czogdGVybV8xNjguZWxlbWVudHMubWFwKHRfMTcxID0+IHRfMTcxICYmIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZ1dpdGhEZWZhdWx0KHRfMTcxKSksIHJlc3RFbGVtZW50OiBudWxsfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQXJyYXlCaW5kaW5nXCIsIHtlbGVtZW50czogdGVybV8xNjguZWxlbWVudHMubWFwKHRfMTcyID0+IHRfMTcyICYmIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0XzE3MikpLCByZXN0RWxlbWVudDogbnVsbH0pO1xuICAgICAgY2FzZSBcIlN0YXRpY1Byb3BlcnR5TmFtZVwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogdGVybV8xNjgudmFsdWV9KTtcbiAgICAgIGNhc2UgXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQXJyYXlCaW5kaW5nXCI6XG4gICAgICBjYXNlIFwiQmluZGluZ0lkZW50aWZpZXJcIjpcbiAgICAgIGNhc2UgXCJCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXCI6XG4gICAgICBjYXNlIFwiQmluZGluZ1Byb3BlcnR5UHJvcGVydHlcIjpcbiAgICAgIGNhc2UgXCJCaW5kaW5nV2l0aERlZmF1bHRcIjpcbiAgICAgIGNhc2UgXCJPYmplY3RCaW5kaW5nXCI6XG4gICAgICAgIHJldHVybiB0ZXJtXzE2ODtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCBcIm5vdCBpbXBsZW1lbnRlZCB5ZXQgZm9yIFwiICsgdGVybV8xNjgudHlwZSk7XG4gIH1cbiAgdHJhbnNmb3JtRGVzdHJ1Y3R1cmluZ1dpdGhEZWZhdWx0KHRlcm1fMTczKSB7XG4gICAgc3dpdGNoICh0ZXJtXzE3My50eXBlKSB7XG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ1dpdGhEZWZhdWx0XCIsIHtiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodGVybV8xNzMuYmluZGluZyksIGluaXQ6IHRlcm1fMTczLmV4cHJlc3Npb259KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyh0ZXJtXzE3Myk7XG4gIH1cbiAgZW5mb3Jlc3RDYWxsRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgcGFyZW5fMTc0ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ2FsbEV4cHJlc3Npb25cIiwge2NhbGxlZTogdGhpcy50ZXJtLCBhcmd1bWVudHM6IHBhcmVuXzE3NC5pbm5lcigpfSk7XG4gIH1cbiAgZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKSB7XG4gICAgbGV0IGVuZl8xNzU7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpKSkge1xuICAgICAgZW5mXzE3NSA9IG5ldyBFbmZvcmVzdGVyXzQ2KExpc3Qub2YodGhpcy5hZHZhbmNlKCkpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgICAgZW5mXzE3NSA9IG5ldyBFbmZvcmVzdGVyXzQ2KHAsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG4gICAgbGV0IHBhcmFtc18xNzYgPSBlbmZfMTc1LmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiPT5cIik7XG4gICAgbGV0IGJvZHlfMTc3O1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKHRoaXMucGVlaygpKSkge1xuICAgICAgYm9keV8xNzcgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmZfMTc1ID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5yZXN0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBib2R5XzE3NyA9IGVuZl8xNzUuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgdGhpcy5yZXN0ID0gZW5mXzE3NS5yZXN0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJvd0V4cHJlc3Npb25cIiwge3BhcmFtczogcGFyYW1zXzE3NiwgYm9keTogYm9keV8xNzd9KTtcbiAgfVxuICBlbmZvcmVzdFlpZWxkRXhwcmVzc2lvbigpIHtcbiAgICBsZXQga3dkXzE3OCA9IHRoaXMubWF0Y2hLZXl3b3JkKFwieWllbGRcIik7XG4gICAgbGV0IGxvb2thaGVhZF8xNzkgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgbG9va2FoZWFkXzE3OSAmJiAhdGhpcy5saW5lTnVtYmVyRXEoa3dkXzE3OCwgbG9va2FoZWFkXzE3OSkpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybShcIllpZWxkRXhwcmVzc2lvblwiLCB7ZXhwcmVzc2lvbjogbnVsbH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaXNHZW5lcmF0b3IgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoKSwgXCIqXCIpKSB7XG4gICAgICAgIGlzR2VuZXJhdG9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgICBsZXQgZXhwciA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICBsZXQgdHlwZSA9IGlzR2VuZXJhdG9yID8gXCJZaWVsZEdlbmVyYXRvckV4cHJlc3Npb25cIiA6IFwiWWllbGRFeHByZXNzaW9uXCI7XG4gICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge2V4cHJlc3Npb246IGV4cHJ9KTtcbiAgICB9XG4gIH1cbiAgZW5mb3Jlc3RTeW50YXhUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTeW50YXhUZW1wbGF0ZVwiLCB7dGVtcGxhdGU6IHRoaXMuYWR2YW5jZSgpfSk7XG4gIH1cbiAgZW5mb3Jlc3RTeW50YXhRdW90ZSgpIHtcbiAgICBsZXQgbmFtZV8xODAgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTeW50YXhRdW90ZVwiLCB7bmFtZTogbmFtZV8xODAsIHRlbXBsYXRlOiBuZXcgVGVybShcIlRlbXBsYXRlRXhwcmVzc2lvblwiLCB7dGFnOiBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiBuYW1lXzE4MH0pLCBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKX0pfSk7XG4gIH1cbiAgZW5mb3Jlc3RTdGF0aWNNZW1iZXJFeHByZXNzaW9uKCkge1xuICAgIGxldCBvYmplY3RfMTgxID0gdGhpcy50ZXJtO1xuICAgIGxldCBkb3RfMTgyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IHByb3BlcnR5XzE4MyA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlN0YXRpY01lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogb2JqZWN0XzE4MSwgcHJvcGVydHk6IHByb3BlcnR5XzE4M30pO1xuICB9XG4gIGVuZm9yZXN0QXJyYXlFeHByZXNzaW9uKCkge1xuICAgIGxldCBhcnJfMTg0ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGVsZW1lbnRzXzE4NSA9IFtdO1xuICAgIGxldCBlbmZfMTg2ID0gbmV3IEVuZm9yZXN0ZXJfNDYoYXJyXzE4NC5pbm5lcigpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgd2hpbGUgKGVuZl8xODYucmVzdC5zaXplID4gMCkge1xuICAgICAgbGV0IGxvb2thaGVhZCA9IGVuZl8xODYucGVlaygpO1xuICAgICAgaWYgKGVuZl8xODYuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIsXCIpKSB7XG4gICAgICAgIGVuZl8xODYuYWR2YW5jZSgpO1xuICAgICAgICBlbGVtZW50c18xODUucHVzaChudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoZW5mXzE4Ni5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCBcIi4uLlwiKSkge1xuICAgICAgICBlbmZfMTg2LmFkdmFuY2UoKTtcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gPSBlbmZfMTg2LmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IGVuZl8xODYuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBleHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzXzE4NS5wdXNoKG5ldyBUZXJtKFwiU3ByZWFkRWxlbWVudFwiLCB7ZXhwcmVzc2lvbjogZXhwcmVzc2lvbn0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB0ZXJtID0gZW5mXzE4Ni5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIGlmICh0ZXJtID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBlbmZfMTg2LmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgXCJleHBlY3RlZCBleHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzXzE4NS5wdXNoKHRlcm0pO1xuICAgICAgICBlbmZfMTg2LmNvbnN1bWVDb21tYSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUV4cHJlc3Npb25cIiwge2VsZW1lbnRzOiBMaXN0KGVsZW1lbnRzXzE4NSl9KTtcbiAgfVxuICBlbmZvcmVzdE9iamVjdEV4cHJlc3Npb24oKSB7XG4gICAgbGV0IG9ial8xODcgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQgcHJvcGVydGllc18xODggPSBMaXN0KCk7XG4gICAgbGV0IGVuZl8xODkgPSBuZXcgRW5mb3Jlc3Rlcl80NihvYmpfMTg3LmlubmVyKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbGFzdFByb3BfMTkwID0gbnVsbDtcbiAgICB3aGlsZSAoZW5mXzE4OS5yZXN0LnNpemUgPiAwKSB7XG4gICAgICBsZXQgcHJvcCA9IGVuZl8xODkuZW5mb3Jlc3RQcm9wZXJ0eURlZmluaXRpb24oKTtcbiAgICAgIGVuZl8xODkuY29uc3VtZUNvbW1hKCk7XG4gICAgICBwcm9wZXJ0aWVzXzE4OCA9IHByb3BlcnRpZXNfMTg4LmNvbmNhdChwcm9wKTtcbiAgICAgIGlmIChsYXN0UHJvcF8xOTAgPT09IHByb3ApIHtcbiAgICAgICAgdGhyb3cgZW5mXzE4OS5jcmVhdGVFcnJvcihwcm9wLCBcImludmFsaWQgc3ludGF4IGluIG9iamVjdFwiKTtcbiAgICAgIH1cbiAgICAgIGxhc3RQcm9wXzE5MCA9IHByb3A7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEV4cHJlc3Npb25cIiwge3Byb3BlcnRpZXM6IHByb3BlcnRpZXNfMTg4fSk7XG4gIH1cbiAgZW5mb3Jlc3RQcm9wZXJ0eURlZmluaXRpb24oKSB7XG4gICAgbGV0IHttZXRob2RPcktleSwga2luZH0gPSB0aGlzLmVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBcIm1ldGhvZFwiOlxuICAgICAgICByZXR1cm4gbWV0aG9kT3JLZXk7XG4gICAgICBjYXNlIFwiaWRlbnRpZmllclwiOlxuICAgICAgICBpZiAodGhpcy5pc0Fzc2lnbih0aGlzLnBlZWsoKSkpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICBsZXQgaW5pdCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJcIiwge2luaXQ6IGluaXQsIGJpbmRpbmc6IHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyhtZXRob2RPcktleSl9KTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksIFwiOlwiKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybShcIlNob3J0aGFuZFByb3BlcnR5XCIsIHtuYW1lOiBtZXRob2RPcktleS52YWx1ZX0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiOlwiKTtcbiAgICBsZXQgZXhwcl8xOTEgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge25hbWU6IG1ldGhvZE9yS2V5LCBleHByZXNzaW9uOiBleHByXzE5MX0pO1xuICB9XG4gIGVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkXzE5MiA9IHRoaXMucGVlaygpO1xuICAgIGxldCBpc0dlbmVyYXRvcl8xOTMgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzE5MiwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvcl8xOTMgPSB0cnVlO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTkyLCBcImdldFwiKSAmJiB0aGlzLmlzUHJvcGVydHlOYW1lKHRoaXMucGVlaygxKSkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IHtuYW1lfSA9IHRoaXMuZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKTtcbiAgICAgIHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICAgIGxldCBib2R5ID0gdGhpcy5tYXRjaEN1cmxpZXMoKTtcbiAgICAgIHJldHVybiB7bWV0aG9kT3JLZXk6IG5ldyBUZXJtKFwiR2V0dGVyXCIsIHtuYW1lOiBuYW1lLCBib2R5OiBib2R5fSksIGtpbmQ6IFwibWV0aG9kXCJ9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkXzE5MiwgXCJzZXRcIikgJiYgdGhpcy5pc1Byb3BlcnR5TmFtZSh0aGlzLnBlZWsoMSkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCB7bmFtZX0gPSB0aGlzLmVuZm9yZXN0UHJvcGVydHlOYW1lKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXJfNDYodGhpcy5tYXRjaFBhcmVucygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgcGFyYW0gPSBlbmYuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHttZXRob2RPcktleTogbmV3IFRlcm0oXCJTZXR0ZXJcIiwge25hbWU6IG5hbWUsIHBhcmFtOiBwYXJhbSwgYm9keTogYm9keX0pLCBraW5kOiBcIm1ldGhvZFwifTtcbiAgICB9XG4gICAgbGV0IHtuYW1lfSA9IHRoaXMuZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAodGhpcy5pc1BhcmVucyh0aGlzLnBlZWsoKSkpIHtcbiAgICAgIGxldCBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXJfNDYocGFyYW1zLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgZm9ybWFsUGFyYW1zID0gZW5mLmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHttZXRob2RPcktleTogbmV3IFRlcm0oXCJNZXRob2RcIiwge2lzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcl8xOTMsIG5hbWU6IG5hbWUsIHBhcmFtczogZm9ybWFsUGFyYW1zLCBib2R5OiBib2R5fSksIGtpbmQ6IFwibWV0aG9kXCJ9O1xuICAgIH1cbiAgICByZXR1cm4ge21ldGhvZE9yS2V5OiBuYW1lLCBraW5kOiB0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMTkyKSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWRfMTkyKSA/IFwiaWRlbnRpZmllclwiIDogXCJwcm9wZXJ0eVwifTtcbiAgfVxuICBlbmZvcmVzdFByb3BlcnR5TmFtZSgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzE5NCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWRfMTk0KSB8fCB0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkXzE5NCkpIHtcbiAgICAgIHJldHVybiB7bmFtZTogbmV3IFRlcm0oXCJTdGF0aWNQcm9wZXJ0eU5hbWVcIiwge3ZhbHVlOiB0aGlzLmFkdmFuY2UoKX0pLCBiaW5kaW5nOiBudWxsfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWRfMTk0KSkge1xuICAgICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyXzQ2KHRoaXMubWF0Y2hTcXVhcmVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICAgIGxldCBleHByID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgIHJldHVybiB7bmFtZTogbmV3IFRlcm0oXCJDb21wdXRlZFByb3BlcnR5TmFtZVwiLCB7ZXhwcmVzc2lvbjogZXhwcn0pLCBiaW5kaW5nOiBudWxsfTtcbiAgICB9XG4gICAgbGV0IG5hbWVfMTk1ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHtuYW1lOiBuZXcgVGVybShcIlN0YXRpY1Byb3BlcnR5TmFtZVwiLCB7dmFsdWU6IG5hbWVfMTk1fSksIGJpbmRpbmc6IG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IG5hbWVfMTk1fSl9O1xuICB9XG4gIGVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwciwgaW5EZWZhdWx0LCBhbGxvd0dlbmVyYXRvcn0pIHtcbiAgICBsZXQgbmFtZV8xOTYgPSBudWxsLCBwYXJhbXNfMTk3LCBib2R5XzE5OCwgcmVzdF8xOTk7XG4gICAgbGV0IGlzR2VuZXJhdG9yXzIwMCA9IGZhbHNlO1xuICAgIGxldCBmbktleXdvcmRfMjAxID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZF8yMDIgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgdHlwZV8yMDMgPSBpc0V4cHIgPyBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIDogXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8yMDIsIFwiKlwiKSkge1xuICAgICAgaXNHZW5lcmF0b3JfMjAwID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbG9va2FoZWFkXzIwMiA9IHRoaXMucGVlaygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNQYXJlbnMobG9va2FoZWFkXzIwMikpIHtcbiAgICAgIG5hbWVfMTk2ID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfSBlbHNlIGlmIChpbkRlZmF1bHQpIHtcbiAgICAgIG5hbWVfMTk2ID0gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogU3ludGF4LmZyb21JZGVudGlmaWVyKFwiKmRlZmF1bHQqXCIsIGZuS2V5d29yZF8yMDEpfSk7XG4gICAgfVxuICAgIHBhcmFtc18xOTcgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgYm9keV8xOTggPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIGxldCBlbmZfMjA0ID0gbmV3IEVuZm9yZXN0ZXJfNDYocGFyYW1zXzE5NywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXNfMjA1ID0gZW5mXzIwNC5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZV8yMDMsIHtuYW1lOiBuYW1lXzE5NiwgaXNHZW5lcmF0b3I6IGlzR2VuZXJhdG9yXzIwMCwgcGFyYW1zOiBmb3JtYWxQYXJhbXNfMjA1LCBib2R5OiBib2R5XzE5OH0pO1xuICB9XG4gIGVuZm9yZXN0RnVuY3Rpb25FeHByZXNzaW9uKCkge1xuICAgIGxldCBuYW1lXzIwNiA9IG51bGwsIHBhcmFtc18yMDcsIGJvZHlfMjA4LCByZXN0XzIwOTtcbiAgICBsZXQgaXNHZW5lcmF0b3JfMjEwID0gZmFsc2U7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZF8yMTEgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzIxMSwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvcl8yMTAgPSB0cnVlO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsb29rYWhlYWRfMjExID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1BhcmVucyhsb29rYWhlYWRfMjExKSkge1xuICAgICAgbmFtZV8yMDYgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgcGFyYW1zXzIwNyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBib2R5XzIwOCA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG4gICAgbGV0IGVuZl8yMTIgPSBuZXcgRW5mb3Jlc3Rlcl80NihwYXJhbXNfMjA3LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGZvcm1hbFBhcmFtc18yMTMgPSBlbmZfMjEyLmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCB7bmFtZTogbmFtZV8yMDYsIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcl8yMTAsIHBhcmFtczogZm9ybWFsUGFyYW1zXzIxMywgYm9keTogYm9keV8yMDh9KTtcbiAgfVxuICBlbmZvcmVzdEZ1bmN0aW9uRGVjbGFyYXRpb24oKSB7XG4gICAgbGV0IG5hbWVfMjE0LCBwYXJhbXNfMjE1LCBib2R5XzIxNiwgcmVzdF8yMTc7XG4gICAgbGV0IGlzR2VuZXJhdG9yXzIxOCA9IGZhbHNlO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWRfMjE5ID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZF8yMTksIFwiKlwiKSkge1xuICAgICAgaXNHZW5lcmF0b3JfMjE4ID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICBuYW1lXzIxNCA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICAgIHBhcmFtc18yMTUgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgYm9keV8yMTYgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgIGxldCBlbmZfMjIwID0gbmV3IEVuZm9yZXN0ZXJfNDYocGFyYW1zXzIxNSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXNfMjIxID0gZW5mXzIyMC5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIsIHtuYW1lOiBuYW1lXzIxNCwgaXNHZW5lcmF0b3I6IGlzR2VuZXJhdG9yXzIxOCwgcGFyYW1zOiBmb3JtYWxQYXJhbXNfMjIxLCBib2R5OiBib2R5XzIxNn0pO1xuICB9XG4gIGVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpIHtcbiAgICBsZXQgaXRlbXNfMjIyID0gW107XG4gICAgbGV0IHJlc3RfMjIzID0gbnVsbDtcbiAgICB3aGlsZSAodGhpcy5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsIFwiLi4uXCIpKSB7XG4gICAgICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKFwiLi4uXCIpO1xuICAgICAgICByZXN0XzIyMyA9IHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGl0ZW1zXzIyMi5wdXNoKHRoaXMuZW5mb3Jlc3RQYXJhbSgpKTtcbiAgICAgIHRoaXMuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge2l0ZW1zOiBMaXN0KGl0ZW1zXzIyMiksIHJlc3Q6IHJlc3RfMjIzfSk7XG4gIH1cbiAgZW5mb3Jlc3RQYXJhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJpbmRpbmdFbGVtZW50KCk7XG4gIH1cbiAgZW5mb3Jlc3RVcGRhdGVFeHByZXNzaW9uKCkge1xuICAgIGxldCBvcGVyYXRvcl8yMjQgPSB0aGlzLm1hdGNoVW5hcnlPcGVyYXRvcigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlVwZGF0ZUV4cHJlc3Npb25cIiwge2lzUHJlZml4OiBmYWxzZSwgb3BlcmF0b3I6IG9wZXJhdG9yXzIyNC52YWwoKSwgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRoaXMudGVybSl9KTtcbiAgfVxuICBlbmZvcmVzdFVuYXJ5RXhwcmVzc2lvbigpIHtcbiAgICBsZXQgb3BlcmF0b3JfMjI1ID0gdGhpcy5tYXRjaFVuYXJ5T3BlcmF0b3IoKTtcbiAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wdXNoKHtwcmVjOiB0aGlzLm9wQ3R4LnByZWMsIGNvbWJpbmU6IHRoaXMub3BDdHguY29tYmluZX0pO1xuICAgIHRoaXMub3BDdHgucHJlYyA9IDE0O1xuICAgIHRoaXMub3BDdHguY29tYmluZSA9IHJpZ2h0VGVybV8yMjYgPT4ge1xuICAgICAgbGV0IHR5cGVfMjI3LCB0ZXJtXzIyOCwgaXNQcmVmaXhfMjI5O1xuICAgICAgaWYgKG9wZXJhdG9yXzIyNS52YWwoKSA9PT0gXCIrK1wiIHx8IG9wZXJhdG9yXzIyNS52YWwoKSA9PT0gXCItLVwiKSB7XG4gICAgICAgIHR5cGVfMjI3ID0gXCJVcGRhdGVFeHByZXNzaW9uXCI7XG4gICAgICAgIHRlcm1fMjI4ID0gdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHJpZ2h0VGVybV8yMjYpO1xuICAgICAgICBpc1ByZWZpeF8yMjkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZV8yMjcgPSBcIlVuYXJ5RXhwcmVzc2lvblwiO1xuICAgICAgICBpc1ByZWZpeF8yMjkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRlcm1fMjI4ID0gcmlnaHRUZXJtXzIyNjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzIyNywge29wZXJhdG9yOiBvcGVyYXRvcl8yMjUudmFsKCksIG9wZXJhbmQ6IHRlcm1fMjI4LCBpc1ByZWZpeDogaXNQcmVmaXhfMjI5fSk7XG4gICAgfTtcbiAgICByZXR1cm4gRVhQUl9MT09QX09QRVJBVE9SXzQzO1xuICB9XG4gIGVuZm9yZXN0Q29uZGl0aW9uYWxFeHByZXNzaW9uKCkge1xuICAgIGxldCB0ZXN0XzIzMCA9IHRoaXMub3BDdHguY29tYmluZSh0aGlzLnRlcm0pO1xuICAgIGlmICh0aGlzLm9wQ3R4LnN0YWNrLnNpemUgPiAwKSB7XG4gICAgICBsZXQge3ByZWMsIGNvbWJpbmV9ID0gdGhpcy5vcEN0eC5zdGFjay5sYXN0KCk7XG4gICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IHByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgIH1cbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcihcIj9cIik7XG4gICAgbGV0IGVuZl8yMzEgPSBuZXcgRW5mb3Jlc3Rlcl80Nih0aGlzLnJlc3QsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgY29uc2VxdWVudF8yMzIgPSBlbmZfMjMxLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICBlbmZfMjMxLm1hdGNoUHVuY3R1YXRvcihcIjpcIik7XG4gICAgZW5mXzIzMSA9IG5ldyBFbmZvcmVzdGVyXzQ2KGVuZl8yMzEucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBhbHRlcm5hdGVfMjMzID0gZW5mXzIzMS5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgdGhpcy5yZXN0ID0gZW5mXzIzMS5yZXN0O1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiLCB7dGVzdDogdGVzdF8yMzAsIGNvbnNlcXVlbnQ6IGNvbnNlcXVlbnRfMjMyLCBhbHRlcm5hdGU6IGFsdGVybmF0ZV8yMzN9KTtcbiAgfVxuICBlbmZvcmVzdEJpbmFyeUV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGxlZnRUZXJtXzIzNCA9IHRoaXMudGVybTtcbiAgICBsZXQgb3BTdHhfMjM1ID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IG9wXzIzNiA9IG9wU3R4XzIzNS52YWwoKTtcbiAgICBsZXQgb3BQcmVjXzIzNyA9IGdldE9wZXJhdG9yUHJlYyhvcF8yMzYpO1xuICAgIGxldCBvcEFzc29jXzIzOCA9IGdldE9wZXJhdG9yQXNzb2Mob3BfMjM2KTtcbiAgICBpZiAob3BlcmF0b3JMdCh0aGlzLm9wQ3R4LnByZWMsIG9wUHJlY18yMzcsIG9wQXNzb2NfMjM4KSkge1xuICAgICAgdGhpcy5vcEN0eC5zdGFjayA9IHRoaXMub3BDdHguc3RhY2sucHVzaCh7cHJlYzogdGhpcy5vcEN0eC5wcmVjLCBjb21iaW5lOiB0aGlzLm9wQ3R4LmNvbWJpbmV9KTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IG9wUHJlY18yMzc7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSByaWdodFRlcm1fMjM5ID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluYXJ5RXhwcmVzc2lvblwiLCB7bGVmdDogbGVmdFRlcm1fMjM0LCBvcGVyYXRvcjogb3BTdHhfMjM1LCByaWdodDogcmlnaHRUZXJtXzIzOX0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIEVYUFJfTE9PUF9PUEVSQVRPUl80MztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLm9wQ3R4LmNvbWJpbmUobGVmdFRlcm1fMjM0KTtcbiAgICAgIGxldCB7cHJlYywgY29tYmluZX0gPSB0aGlzLm9wQ3R4LnN0YWNrLmxhc3QoKTtcbiAgICAgIHRoaXMub3BDdHguc3RhY2sgPSB0aGlzLm9wQ3R4LnN0YWNrLnBvcCgpO1xuICAgICAgdGhpcy5vcEN0eC5wcmVjID0gcHJlYztcbiAgICAgIHRoaXMub3BDdHguY29tYmluZSA9IGNvbWJpbmU7XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gIH1cbiAgZW5mb3Jlc3RUZW1wbGF0ZUVsZW1lbnRzKCkge1xuICAgIGxldCBsb29rYWhlYWRfMjQwID0gdGhpcy5tYXRjaFRlbXBsYXRlKCk7XG4gICAgbGV0IGVsZW1lbnRzXzI0MSA9IGxvb2thaGVhZF8yNDAudG9rZW4uaXRlbXMubWFwKGl0XzI0MiA9PiB7XG4gICAgICBpZiAodGhpcy5pc0RlbGltaXRlcihpdF8yNDIpKSB7XG4gICAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcl80NihpdF8yNDIuaW5uZXIoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICByZXR1cm4gZW5mLmVuZm9yZXN0KFwiZXhwcmVzc2lvblwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybShcIlRlbXBsYXRlRWxlbWVudFwiLCB7cmF3VmFsdWU6IGl0XzI0Mi5zbGljZS50ZXh0fSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzXzI0MTtcbiAgfVxuICBleHBhbmRNYWNybygpIHtcbiAgICBsZXQgbG9va2FoZWFkXzI0MyA9IHRoaXMucGVlaygpO1xuICAgIHdoaWxlICh0aGlzLmlzQ29tcGlsZXRpbWVUcmFuc2Zvcm0obG9va2FoZWFkXzI0MykpIHtcbiAgICAgIGxldCBuYW1lID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgc3ludGF4VHJhbnNmb3JtID0gdGhpcy5nZXRGcm9tQ29tcGlsZXRpbWVFbnZpcm9ubWVudChuYW1lKTtcbiAgICAgIGlmIChzeW50YXhUcmFuc2Zvcm0gPT0gbnVsbCB8fCB0eXBlb2Ygc3ludGF4VHJhbnNmb3JtLnZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihuYW1lLCBcInRoZSBtYWNybyBuYW1lIHdhcyBub3QgYm91bmQgdG8gYSB2YWx1ZSB0aGF0IGNvdWxkIGJlIGludm9rZWRcIik7XG4gICAgICB9XG4gICAgICBsZXQgdXNlU2l0ZVNjb3BlID0gZnJlc2hTY29wZShcInVcIik7XG4gICAgICBsZXQgaW50cm9kdWNlZFNjb3BlID0gZnJlc2hTY29wZShcImlcIik7XG4gICAgICB0aGlzLmNvbnRleHQudXNlU2NvcGUgPSB1c2VTaXRlU2NvcGU7XG4gICAgICBsZXQgY3R4ID0gbmV3IE1hY3JvQ29udGV4dCh0aGlzLCBuYW1lLCB0aGlzLmNvbnRleHQsIHVzZVNpdGVTY29wZSwgaW50cm9kdWNlZFNjb3BlKTtcbiAgICAgIGxldCByZXN1bHQgPSBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKHN5bnRheFRyYW5zZm9ybS52YWx1ZS5jYWxsKG51bGwsIGN0eCkpO1xuICAgICAgaWYgKCFMaXN0LmlzTGlzdChyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSwgXCJtYWNybyBtdXN0IHJldHVybiBhIGxpc3QgYnV0IGdvdDogXCIgKyByZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChzdHhfMjQ0ID0+IHtcbiAgICAgICAgaWYgKCEoc3R4XzI0NCAmJiB0eXBlb2Ygc3R4XzI0NC5hZGRTY29wZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSwgXCJtYWNybyBtdXN0IHJldHVybiBzeW50YXggb2JqZWN0cyBvciB0ZXJtcyBidXQgZ290OiBcIiArIHN0eF8yNDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHhfMjQ0LmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTLCB7ZmxpcDogdHJ1ZX0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc3QgPSByZXN1bHQuY29uY2F0KGN0eC5fcmVzdCh0aGlzKSk7XG4gICAgICBsb29rYWhlYWRfMjQzID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICB9XG4gIGNvbnN1bWVTZW1pY29sb24oKSB7XG4gICAgbGV0IGxvb2thaGVhZF8yNDUgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAobG9va2FoZWFkXzI0NSAmJiB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWRfMjQ1LCBcIjtcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfVxuICBjb25zdW1lQ29tbWEoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8yNDYgPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAobG9va2FoZWFkXzI0NiAmJiB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWRfMjQ2LCBcIixcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfVxuICBzYWZlQ2hlY2sob2JqXzI0NywgdHlwZV8yNDgsIHZhbF8yNDkgPSBudWxsKSB7XG4gICAgcmV0dXJuIG9ial8yNDcgJiYgKHR5cGVvZiBvYmpfMjQ3Lm1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBvYmpfMjQ3Lm1hdGNoKHR5cGVfMjQ4LCB2YWxfMjQ5KSA6IGZhbHNlKTtcbiAgfVxuICBpc1Rlcm0odGVybV8yNTApIHtcbiAgICByZXR1cm4gdGVybV8yNTAgJiYgdGVybV8yNTAgaW5zdGFuY2VvZiBUZXJtO1xuICB9XG4gIGlzRU9GKG9ial8yNTEpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI1MSwgXCJlb2ZcIik7XG4gIH1cbiAgaXNJZGVudGlmaWVyKG9ial8yNTIsIHZhbF8yNTMgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9ial8yNTIsIFwiaWRlbnRpZmllclwiLCB2YWxfMjUzKTtcbiAgfVxuICBpc1Byb3BlcnR5TmFtZShvYmpfMjU0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJZGVudGlmaWVyKG9ial8yNTQpIHx8IHRoaXMuaXNLZXl3b3JkKG9ial8yNTQpIHx8IHRoaXMuaXNOdW1lcmljTGl0ZXJhbChvYmpfMjU0KSB8fCB0aGlzLmlzU3RyaW5nTGl0ZXJhbChvYmpfMjU0KSB8fCB0aGlzLmlzQnJhY2tldHMob2JqXzI1NCk7XG4gIH1cbiAgaXNOdW1lcmljTGl0ZXJhbChvYmpfMjU1LCB2YWxfMjU2ID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjU1LCBcIm51bWJlclwiLCB2YWxfMjU2KTtcbiAgfVxuICBpc1N0cmluZ0xpdGVyYWwob2JqXzI1NywgdmFsXzI1OCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI1NywgXCJzdHJpbmdcIiwgdmFsXzI1OCk7XG4gIH1cbiAgaXNUZW1wbGF0ZShvYmpfMjU5LCB2YWxfMjYwID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjU5LCBcInRlbXBsYXRlXCIsIHZhbF8yNjApO1xuICB9XG4gIGlzU3ludGF4VGVtcGxhdGUob2JqXzI2MSkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjYxLCBcInN5bnRheFRlbXBsYXRlXCIpO1xuICB9XG4gIGlzQm9vbGVhbkxpdGVyYWwob2JqXzI2MiwgdmFsXzI2MyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2MiwgXCJib29sZWFuXCIsIHZhbF8yNjMpO1xuICB9XG4gIGlzTnVsbExpdGVyYWwob2JqXzI2NCwgdmFsXzI2NSA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2NCwgXCJudWxsXCIsIHZhbF8yNjUpO1xuICB9XG4gIGlzUmVndWxhckV4cHJlc3Npb24ob2JqXzI2NiwgdmFsXzI2NyA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2NiwgXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWxfMjY3KTtcbiAgfVxuICBpc0RlbGltaXRlcihvYmpfMjY4KSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9ial8yNjgsIFwiZGVsaW1pdGVyXCIpO1xuICB9XG4gIGlzUGFyZW5zKG9ial8yNjkpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI2OSwgXCJwYXJlbnNcIik7XG4gIH1cbiAgaXNCcmFjZXMob2JqXzI3MCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjcwLCBcImJyYWNlc1wiKTtcbiAgfVxuICBpc0JyYWNrZXRzKG9ial8yNzEpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI3MSwgXCJicmFja2V0c1wiKTtcbiAgfVxuICBpc0Fzc2lnbihvYmpfMjcyLCB2YWxfMjczID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjcyLCBcImFzc2lnblwiLCB2YWxfMjczKTtcbiAgfVxuICBpc0tleXdvcmQob2JqXzI3NCwgdmFsXzI3NSA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI3NCwgXCJrZXl3b3JkXCIsIHZhbF8yNzUpO1xuICB9XG4gIGlzUHVuY3R1YXRvcihvYmpfMjc2LCB2YWxfMjc3ID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmpfMjc2LCBcInB1bmN0dWF0b3JcIiwgdmFsXzI3Nyk7XG4gIH1cbiAgaXNPcGVyYXRvcihvYmpfMjc4KSB7XG4gICAgcmV0dXJuICh0aGlzLnNhZmVDaGVjayhvYmpfMjc4LCBcInB1bmN0dWF0b3JcIikgfHwgdGhpcy5zYWZlQ2hlY2sob2JqXzI3OCwgXCJpZGVudGlmaWVyXCIpIHx8IHRoaXMuc2FmZUNoZWNrKG9ial8yNzgsIFwia2V5d29yZFwiKSkgJiYgaXNPcGVyYXRvcihvYmpfMjc4KTtcbiAgfVxuICBpc1VwZGF0ZU9wZXJhdG9yKG9ial8yNzkpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqXzI3OSwgXCJwdW5jdHVhdG9yXCIsIFwiKytcIikgfHwgdGhpcy5zYWZlQ2hlY2sob2JqXzI3OSwgXCJwdW5jdHVhdG9yXCIsIFwiLS1cIik7XG4gIH1cbiAgc2FmZVJlc29sdmUob2JqXzI4MCwgcGhhc2VfMjgxKSB7XG4gICAgcmV0dXJuIG9ial8yODAgJiYgdHlwZW9mIG9ial8yODAucmVzb2x2ZSA9PT0gXCJmdW5jdGlvblwiID8gSnVzdF80MShvYmpfMjgwLnJlc29sdmUocGhhc2VfMjgxKSkgOiBOb3RoaW5nXzQyKCk7XG4gIH1cbiAgaXNUcmFuc2Zvcm0ob2JqXzI4MiwgdHJhbnNfMjgzKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZVJlc29sdmUob2JqXzI4MiwgdGhpcy5jb250ZXh0LnBoYXNlKS5tYXAobmFtZV8yODQgPT4gdGhpcy5jb250ZXh0LmVudi5nZXQobmFtZV8yODQpID09PSB0cmFuc18yODMgfHwgdGhpcy5jb250ZXh0LnN0b3JlLmdldChuYW1lXzI4NCkgPT09IHRyYW5zXzI4MykuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuICBpc1RyYW5zZm9ybUluc3RhbmNlKG9ial8yODUsIHRyYW5zXzI4Nikge1xuICAgIHJldHVybiB0aGlzLnNhZmVSZXNvbHZlKG9ial8yODUsIHRoaXMuY29udGV4dC5waGFzZSkubWFwKG5hbWVfMjg3ID0+IHRoaXMuY29udGV4dC5lbnYuZ2V0KG5hbWVfMjg3KSBpbnN0YW5jZW9mIHRyYW5zXzI4NiB8fCB0aGlzLmNvbnRleHQuc3RvcmUuZ2V0KG5hbWVfMjg3KSBpbnN0YW5jZW9mIHRyYW5zXzI4NikuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuICBpc0ZuRGVjbFRyYW5zZm9ybShvYmpfMjg4KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI4OCwgRnVuY3Rpb25EZWNsVHJhbnNmb3JtKTtcbiAgfVxuICBpc1ZhckRlY2xUcmFuc2Zvcm0ob2JqXzI4OSkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yODksIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNMZXREZWNsVHJhbnNmb3JtKG9ial8yOTApIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmpfMjkwLCBMZXREZWNsVHJhbnNmb3JtKTtcbiAgfVxuICBpc0NvbnN0RGVjbFRyYW5zZm9ybShvYmpfMjkxKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5MSwgQ29uc3REZWNsVHJhbnNmb3JtKTtcbiAgfVxuICBpc1N5bnRheERlY2xUcmFuc2Zvcm0ob2JqXzI5Mikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yOTIsIFN5bnRheERlY2xUcmFuc2Zvcm0pO1xuICB9XG4gIGlzU3ludGF4cmVjRGVjbFRyYW5zZm9ybShvYmpfMjkzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5MywgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNTeW50YXhRdW90ZVRyYW5zZm9ybShvYmpfMjk0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5NCwgU3ludGF4UXVvdGVUcmFuc2Zvcm0pO1xuICB9XG4gIGlzUmV0dXJuU3RtdFRyYW5zZm9ybShvYmpfMjk1KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5NSwgUmV0dXJuU3RhdGVtZW50VHJhbnNmb3JtKTtcbiAgfVxuICBpc1doaWxlVHJhbnNmb3JtKG9ial8yOTYpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmpfMjk2LCBXaGlsZVRyYW5zZm9ybSk7XG4gIH1cbiAgaXNGb3JUcmFuc2Zvcm0ob2JqXzI5Nykge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yOTcsIEZvclRyYW5zZm9ybSk7XG4gIH1cbiAgaXNTd2l0Y2hUcmFuc2Zvcm0ob2JqXzI5OCkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8yOTgsIFN3aXRjaFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNCcmVha1RyYW5zZm9ybShvYmpfMjk5KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzI5OSwgQnJlYWtUcmFuc2Zvcm0pO1xuICB9XG4gIGlzQ29udGludWVUcmFuc2Zvcm0ob2JqXzMwMCkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8zMDAsIENvbnRpbnVlVHJhbnNmb3JtKTtcbiAgfVxuICBpc0RvVHJhbnNmb3JtKG9ial8zMDEpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmpfMzAxLCBEb1RyYW5zZm9ybSk7XG4gIH1cbiAgaXNEZWJ1Z2dlclRyYW5zZm9ybShvYmpfMzAyKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwMiwgRGVidWdnZXJUcmFuc2Zvcm0pO1xuICB9XG4gIGlzV2l0aFRyYW5zZm9ybShvYmpfMzAzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwMywgV2l0aFRyYW5zZm9ybSk7XG4gIH1cbiAgaXNUcnlUcmFuc2Zvcm0ob2JqXzMwNCkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8zMDQsIFRyeVRyYW5zZm9ybSk7XG4gIH1cbiAgaXNUaHJvd1RyYW5zZm9ybShvYmpfMzA1KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwNSwgVGhyb3dUcmFuc2Zvcm0pO1xuICB9XG4gIGlzSWZUcmFuc2Zvcm0ob2JqXzMwNikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9ial8zMDYsIElmVHJhbnNmb3JtKTtcbiAgfVxuICBpc05ld1RyYW5zZm9ybShvYmpfMzA3KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqXzMwNywgTmV3VHJhbnNmb3JtKTtcbiAgfVxuICBpc0NvbXBpbGV0aW1lVHJhbnNmb3JtKG9ial8zMDgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybUluc3RhbmNlKG9ial8zMDgsIENvbXBpbGV0aW1lVHJhbnNmb3JtKTtcbiAgfVxuICBpc1ZhckJpbmRpbmdUcmFuc2Zvcm0ob2JqXzMwOSkge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtSW5zdGFuY2Uob2JqXzMwOSwgVmFyQmluZGluZ1RyYW5zZm9ybSk7XG4gIH1cbiAgZ2V0RnJvbUNvbXBpbGV0aW1lRW52aXJvbm1lbnQodGVybV8zMTApIHtcbiAgICBpZiAodGhpcy5jb250ZXh0LmVudi5oYXModGVybV8zMTAucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5lbnYuZ2V0KHRlcm1fMzEwLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRleHQuc3RvcmUuZ2V0KHRlcm1fMzEwLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKSk7XG4gIH1cbiAgbGluZU51bWJlckVxKGFfMzExLCBiXzMxMikge1xuICAgIGlmICghKGFfMzExICYmIGJfMzEyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYV8zMTEubGluZU51bWJlcigpID09PSBiXzMxMi5saW5lTnVtYmVyKCk7XG4gIH1cbiAgbWF0Y2hJZGVudGlmaWVyKHZhbF8zMTMpIHtcbiAgICBsZXQgbG9va2FoZWFkXzMxNCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWRfMzE0KSkge1xuICAgICAgcmV0dXJuIGxvb2thaGVhZF8zMTQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMxNCwgXCJleHBlY3RpbmcgYW4gaWRlbnRpZmllclwiKTtcbiAgfVxuICBtYXRjaEtleXdvcmQodmFsXzMxNSkge1xuICAgIGxldCBsb29rYWhlYWRfMzE2ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZF8zMTYsIHZhbF8zMTUpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxNjtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE2LCBcImV4cGVjdGluZyBcIiArIHZhbF8zMTUpO1xuICB9XG4gIG1hdGNoTGl0ZXJhbCgpIHtcbiAgICBsZXQgbG9va2FoZWFkXzMxNyA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkXzMxNykgfHwgdGhpcy5pc1N0cmluZ0xpdGVyYWwobG9va2FoZWFkXzMxNykgfHwgdGhpcy5pc0Jvb2xlYW5MaXRlcmFsKGxvb2thaGVhZF8zMTcpIHx8IHRoaXMuaXNOdWxsTGl0ZXJhbChsb29rYWhlYWRfMzE3KSB8fCB0aGlzLmlzVGVtcGxhdGUobG9va2FoZWFkXzMxNykgfHwgdGhpcy5pc1JlZ3VsYXJFeHByZXNzaW9uKGxvb2thaGVhZF8zMTcpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxNztcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE3LCBcImV4cGVjdGluZyBhIGxpdGVyYWxcIik7XG4gIH1cbiAgbWF0Y2hTdHJpbmdMaXRlcmFsKCkge1xuICAgIGxldCBsb29rYWhlYWRfMzE4ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZF8zMTgpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxODtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE4LCBcImV4cGVjdGluZyBhIHN0cmluZyBsaXRlcmFsXCIpO1xuICB9XG4gIG1hdGNoVGVtcGxhdGUoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMTkgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZF8zMTkpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMxOTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzE5LCBcImV4cGVjdGluZyBhIHRlbXBsYXRlIGxpdGVyYWxcIik7XG4gIH1cbiAgbWF0Y2hQYXJlbnMoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMjAgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1BhcmVucyhsb29rYWhlYWRfMzIwKSkge1xuICAgICAgcmV0dXJuIGxvb2thaGVhZF8zMjAuaW5uZXIoKTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzIwLCBcImV4cGVjdGluZyBwYXJlbnNcIik7XG4gIH1cbiAgbWF0Y2hDdXJsaWVzKCkge1xuICAgIGxldCBsb29rYWhlYWRfMzIxID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkXzMyMSkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWRfMzIxLmlubmVyKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMyMSwgXCJleHBlY3RpbmcgY3VybHkgYnJhY2VzXCIpO1xuICB9XG4gIG1hdGNoU3F1YXJlcygpIHtcbiAgICBsZXQgbG9va2FoZWFkXzMyMiA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzQnJhY2tldHMobG9va2FoZWFkXzMyMikpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWRfMzIyLmlubmVyKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMyMiwgXCJleHBlY3Rpbmcgc3FhdXJlIGJyYWNlc1wiKTtcbiAgfVxuICBtYXRjaFVuYXJ5T3BlcmF0b3IoKSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMjMgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAoaXNVbmFyeU9wZXJhdG9yKGxvb2thaGVhZF8zMjMpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMyMztcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzIzLCBcImV4cGVjdGluZyBhIHVuYXJ5IG9wZXJhdG9yXCIpO1xuICB9XG4gIG1hdGNoUHVuY3R1YXRvcih2YWxfMzI0KSB7XG4gICAgbGV0IGxvb2thaGVhZF8zMjUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkXzMyNSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsXzMyNCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAobG9va2FoZWFkXzMyNS52YWwoKSA9PT0gdmFsXzMyNCkge1xuICAgICAgICAgIHJldHVybiBsb29rYWhlYWRfMzI1O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkXzMyNSwgXCJleHBlY3RpbmcgYSBcIiArIHZhbF8zMjQgKyBcIiBwdW5jdHVhdG9yXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbG9va2FoZWFkXzMyNTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWRfMzI1LCBcImV4cGVjdGluZyBhIHB1bmN0dWF0b3JcIik7XG4gIH1cbiAgY3JlYXRlRXJyb3Ioc3R4XzMyNiwgbWVzc2FnZV8zMjcpIHtcbiAgICBsZXQgY3R4XzMyOCA9IFwiXCI7XG4gICAgbGV0IG9mZmVuZGluZ18zMjkgPSBzdHhfMzI2O1xuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgIGN0eF8zMjggPSB0aGlzLnJlc3Quc2xpY2UoMCwgMjApLm1hcCh0ZXJtXzMzMCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKHRlcm1fMzMwKSkge1xuICAgICAgICAgIHJldHVybiB0ZXJtXzMzMC5pbm5lcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMaXN0Lm9mKHRlcm1fMzMwKTtcbiAgICAgIH0pLmZsYXR0ZW4oKS5tYXAoc18zMzEgPT4ge1xuICAgICAgICBpZiAoc18zMzEgPT09IG9mZmVuZGluZ18zMjkpIHtcbiAgICAgICAgICByZXR1cm4gXCJfX1wiICsgc18zMzEudmFsKCkgKyBcIl9fXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNfMzMxLnZhbCgpO1xuICAgICAgfSkuam9pbihcIiBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eF8zMjggPSBvZmZlbmRpbmdfMzI5LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IobWVzc2FnZV8zMjcgKyBcIlxcblwiICsgY3R4XzMyOCk7XG4gIH1cbn1cbmV4cG9ydCB7RW5mb3Jlc3Rlcl80NiBhcyBFbmZvcmVzdGVyfSJdfQ== \ No newline at end of file +exports.Enforester = Enforester; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmZvcmVzdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUNBOztBQUlBOztBQXdCQTs7QUFDQTs7QUFDQTs7QUFPQTs7OztBQUVBOztBQUNBOztBQUVBOzs7Ozs7QUF6Q0EsTUFBTSxPQUFPLG9CQUFNLElBQW5CO0FBQ0EsTUFBTSxVQUFVLG9CQUFNLE9BQXRCOztBQTBDQSxNQUFNLHFCQUFxQixFQUEzQjtBQUNBLE1BQU0sc0JBQXNCLEVBQTVCO0FBQ0EsTUFBTSxzQkFBc0IsRUFBNUI7O0FBRU8sTUFBTSxVQUFOLENBQWlCO0FBQ3RCLGNBQVksSUFBWixFQUFrQixJQUFsQixFQUF3QixPQUF4QixFQUFpQztBQUMvQixTQUFLLElBQUwsR0FBWSxLQUFaO0FBQ0Esd0JBQU8sZ0JBQUssTUFBTCxDQUFZLElBQVosQ0FBUCxFQUEwQix1Q0FBMUI7QUFDQSx3QkFBTyxnQkFBSyxNQUFMLENBQVksSUFBWixDQUFQLEVBQTBCLHVDQUExQjtBQUNBLHdCQUFPLE9BQVAsRUFBZ0IsaUNBQWhCO0FBQ0EsU0FBSyxJQUFMLEdBQVksSUFBWjs7QUFFQSxTQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsU0FBSyxJQUFMLEdBQVksSUFBWjs7QUFFQSxTQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0Q7O0FBRUQsU0FBWTtBQUFBLFFBQVAsQ0FBTyx5REFBSCxDQUFHOztBQUNWLFdBQU8sS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLENBQWQsQ0FBUDtBQUNEOztBQUVELFlBQVU7QUFDUixRQUFJLE1BQU0sS0FBSyxJQUFMLENBQVUsS0FBVixFQUFWO0FBQ0EsU0FBSyxJQUFMLEdBQVksS0FBSyxJQUFMLENBQVUsSUFBVixFQUFaO0FBQ0EsV0FBTyxHQUFQO0FBQ0Q7O0FBRUQ7Ozs7OztBQU1BLGFBQTBCO0FBQUEsUUFBakIsSUFBaUIseURBQVYsUUFBVTs7QUFDeEI7QUFDQSxTQUFLLElBQUwsR0FBWSxJQUFaOztBQUVBLFFB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SUFBTCxDQUFVLElBQVYsR0FBaUIsQ0FBckIsRUFBd0I7QUFDdEIsWUFBTSxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQWdCLENBQWhCLEVBQW1CLEVBQW5CLEVBQXVCLEdBQXZCLENBQTJCLFFBQVE7QUFDdkMsWUFBSSxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBSixFQUE0QjtBQUMxQixpQkFBTyxLQUFLLEtBQUwsRUFBUDtBQUNEO0FBQ0QsZUFBTyxnQkFBSyxFQUFMLENBQVEsSUFBUixDQUFQO0FBQ0QsT0FMSyxFQUtILE9BTEcsR0FLTyxHQUxQLENBS1csS0FBSztBQUNwQixZQUFJLE1BQU0sU0FBVixFQUFxQjtBQUNuQixpQkFBTyxPQUFPLEVBQUUsR0FBRixFQUFQLEdBQWlCLElBQXhCO0FBQ0Q7QUFDRCxlQUFPLEVBQUUsR0FBRixFQUFQO0FBQ0QsT0FWSyxFQVVILElBVkcsQ0FVRSxHQVZGLENBQU47QUFXRCxLQVpELE1BWU87QUFDTCxZQUFNLFVBQVUsUUFBVixFQUFOO0FBQ0Q7QUFDRCxXQUFPLElBQUksS0FBSixDQUFVLFVBQVUsSUFBVixHQUFpQixHQUEzQixDQUFQO0FBRUQ7QUFqckVxQjtRQUFYLFUsR0FBQSxVIiwiZmlsZSI6ImVuZm9yZXN0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVybSwgeyBpc0lkZW50aWZpZXJFeHByZXNzaW9uLCBpc1N0YXRpY01lbWJlckV4cHJlc3Npb24sIGlzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uIH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IE1heWJlIH0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmNvbnN0IEp1c3QgPSBNYXliZS5KdXN0O1xuY29uc3QgTm90aGluZyA9IE1heWJlLk5vdGhpbmc7XG5cbmltcG9ydCB7XG4gIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybSxcbiAgVmFyaWFibGVEZWNsVHJhbnNmb3JtLFxuICBOZXdUcmFuc2Zvcm0sXG4gIExldERlY2xUcmFuc2Zvcm0sXG4gIENvbnN0RGVjbFRyYW5zZm9ybSxcbiAgU3ludGF4RGVjbFRyYW5zZm9ybSxcbiAgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSxcbiAgU3ludGF4UXVvdGVUcmFuc2Zvcm0sXG4gIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSxcbiAgV2hpbGVUcmFuc2Zvcm0sXG4gIElmVHJhbnNmb3JtLFxuICBGb3JUcmFuc2Zvcm0sXG4gIFN3aXRjaFRyYW5zZm9ybSxcbiAgQnJlYWtUcmFuc2Zvcm0sXG4gIENvbnRpbnVlVHJhbnNmb3JtLFxuICBEb1RyYW5zZm9ybSxcbiAgRGVidWdnZXJUcmFuc2Zvcm0sXG4gIFdpdGhUcmFuc2Zvcm0sXG4gIFRyeVRyYW5zZm9ybSxcbiAgVGhyb3dUcmFuc2Zvcm0sXG4gIENvbXBpbGV0aW1lVHJhbnNmb3JtLFxuICBWYXJCaW5kaW5nVHJhbnNmb3JtXG59IGZyb20gXCIuL3RyYW5zZm9ybXNcIjtcbmltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgeyBleHBlY3QsIGFzc2VydCB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtcbiAgaXNPcGVyYXRvcixcbiAgaXNVbmFyeU9wZXJhdG9yLFxuICBnZXRPcGVyYXRvckFzc29jLFxuICBnZXRPcGVyYXRvclByZWMsXG4gIG9wZXJhdG9yTHRcbn0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgU3ludGF4LCB7IEFMTF9QSEFTRVMgfSBmcm9tIFwiLi9zeW50YXhcIjtcblxuaW1wb3J0IHsgZnJlc2hTY29wZSB9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgeyBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzIH0gZnJvbSAnLi9sb2FkLXN5bnRheCc7XG5cbmltcG9ydCBNYWNyb0NvbnRleHQgZnJvbSBcIi4vbWFjcm8tY29udGV4dFwiO1xuXG5jb25zdCBFWFBSX0xPT1BfT1BFUkFUT1IgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9OT19DSEFOR0UgPSB7fTtcbmNvbnN0IEVYUFJfTE9PUF9FWFBBTlNJT04gPSB7fTtcblxuZXhwb3J0IGNsYXNzIEVuZm9yZXN0ZXIge1xuICBjb25zdHJ1Y3RvcihzdHhsLCBwcmV2LCBjb250ZXh0KSB7XG4gICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHN0eGwpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KExpc3QuaXNMaXN0KHByZXYpLCBcImV4cGVjdGluZyBhIGxpc3Qgb2YgdGVybXMgdG8gZW5mb3Jlc3RcIik7XG4gICAgYXNzZXJ0KGNvbnRleHQsIFwiZXhwZWN0aW5nIGEgY29udGV4dCB0byBlbmZvcmVzdFwiKTtcbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuXG4gICAgdGhpcy5yZXN0ID0gc3R4bDtcbiAgICB0aGlzLnByZXYgPSBwcmV2O1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHBlZWsobiA9IDApIHtcbiAgICByZXR1cm4gdGhpcy5yZXN0LmdldChuKTtcbiAgfVxuXG4gIGFkdmFuY2UoKSB7XG4gICAgbGV0IHJldCA9IHRoaXMucmVzdC5maXJzdCgpO1xuICAgIHRoaXMucmVzdCA9IHRoaXMucmVzdC5yZXN0KCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qXG4gICBlbmZvcmVzdCB3b3JrcyBvdmVyOlxuICAgcHJldiAtIGEgbGlzdCBvZiB0aGUgcHJldmlvdXNseSBlbmZvcmVzdCBUZXJtc1xuICAgdGVybSAtIHRoZSBjdXJyZW50IHRlcm0gYmVpbmcgZW5mb3Jlc3RlZCAoaW5pdGlhbGx5IG51bGwpXG4gICByZXN0IC0gcmVtYWluaW5nIFRlcm1zIHRvIGVuZm9yZXN0XG4gICAqL1xuICBlbmZvcmVzdCh0eXBlID0gXCJNb2R1bGVcIikge1xuICAgIC8vIGluaXRpYWxpemUgdGhlIHRlcm1cbiAgICB0aGlzLnRlcm0gPSBudWxsO1xuXG4gICAgaWYgKHRoaXMucmVzdC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMudGVybTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0VPRih0aGlzLnBlZWsoKSkpIHtcbiAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKFwiRU9GXCIsIHt9KTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRoaXMudGVybTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlID09PSBcImV4cHJlc3Npb25cIikge1xuICAgICAgcmVzdWx0ID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZW5mb3Jlc3RNb2R1bGUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBlbmZvcmVzdE1vZHVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJvZHkoKTtcbiAgfVxuXG4gIGVuZm9yZXN0Qm9keSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdE1vZHVsZUl0ZW0oKTtcbiAgfVxuXG4gIGVuZm9yZXN0TW9kdWxlSXRlbSgpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2ltcG9ydCcpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SW1wb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2V4cG9ydCcpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RXhwb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCwgJyMnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMYW5ndWFnZVByYWdtYSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICB9XG5cbiAgZW5mb3Jlc3RMYW5ndWFnZVByYWdtYSgpIHtcbiAgICB0aGlzLm1hdGNoSWRlbnRpZmllcignIycpO1xuICAgIHRoaXMubWF0Y2hJZGVudGlmaWVyKCdsYW5nJyk7XG4gICAgbGV0IHBhdGggPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybSgnUHJhZ21hJywge1xuICAgICAga2luZDogJ2xhbmcnLFxuICAgICAgaXRlbXM6IExpc3Qub2YocGF0aClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0RXhwb3J0RGVjbGFyYXRpb24oKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcqJykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydEFsbEZyb20nLCB7IG1vZHVsZVNwZWNpZmllciB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgbGV0IG5hbWVkRXhwb3J0cyA9IHRoaXMuZW5mb3Jlc3RFeHBvcnRDbGF1c2UoKTtcbiAgICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCAnZnJvbScpKSB7XG4gICAgICAgIG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydEZyb20nLCB7IG5hbWVkRXhwb3J0cywgbW9kdWxlU3BlY2lmaWVyIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnY2xhc3MnKSkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnQnLCB7XG4gICAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0Q2xhc3MoeyBpc0V4cHI6IGZhbHNlIH0pXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnQnLCB7XG4gICAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwcjogZmFsc2UsIGluRGVmYXVsdDogZmFsc2V9KVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdkZWZhdWx0JykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaWYgKHRoaXMuaXNGbkRlY2xUcmFuc2Zvcm0odGhpcy5wZWVrKCkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0RGVmYXVsdCcsIHtcbiAgICAgICAgICBib2R5OiB0aGlzLmVuZm9yZXN0RnVuY3Rpb24oe2lzRXhwcjogZmFsc2UsIGluRGVmYXVsdDogdHJ1ZX0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2NsYXNzJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnREZWZhdWx0Jywge1xuICAgICAgICAgIGJvZHk6IHRoaXMuZW5mb3Jlc3RDbGFzcyh7aXNFeHByOiBmYWxzZSwgaW5EZWZhdWx0OiB0cnVlfSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgYm9keSA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnREZWZhdWx0JywgeyBib2R5IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1ZhckRlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICB0aGlzLmlzTGV0RGVjbFRyYW5zZm9ybShsb29rYWhlYWQpIHx8XG4gICAgICAgIHRoaXMuaXNDb25zdERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICB0aGlzLmlzU3ludGF4cmVjRGVjbFRyYW5zZm9ybShsb29rYWhlYWQpIHx8XG4gICAgICAgIHRoaXMuaXNTeW50YXhEZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0Jywge1xuICAgICAgICBkZWNsYXJhdGlvbjogdGhpcy5lbmZvcmVzdFZhcmlhYmxlRGVjbGFyYXRpb24oKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCAndW5leHBlY3RlZCBzeW50YXgnKTtcbiAgfVxuXG4gIGVuZm9yZXN0RXhwb3J0Q2xhdXNlKCkge1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcih0aGlzLm1hdGNoQ3VybGllcygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHdoaWxlIChlbmYucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICByZXN1bHQucHVzaChlbmYuZW5mb3Jlc3RFeHBvcnRTcGVjaWZpZXIoKSk7XG4gICAgICBlbmYuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdEV4cG9ydFNwZWNpZmllcigpIHtcbiAgICBsZXQgbmFtZSA9IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCk7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygpLCAnYXMnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgZXhwb3J0ZWROYW1lID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0U3BlY2lmaWVyJywgeyBuYW1lLCBleHBvcnRlZE5hbWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0U3BlY2lmaWVyJywge1xuICAgICAgbmFtZTogbnVsbCxcbiAgICAgIGV4cG9ydGVkTmFtZTogbmFtZVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RJbXBvcnREZWNsYXJhdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGRlZmF1bHRCaW5kaW5nID0gbnVsbDtcbiAgICBsZXQgbmFtZWRJbXBvcnRzID0gTGlzdCgpO1xuICAgIGxldCBmb3JTeW50YXggPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWQpKSB7XG4gICAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0Jywge1xuICAgICAgICBkZWZhdWx0QmluZGluZyxcbiAgICAgICAgbmFtZWRJbXBvcnRzLFxuICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIGZvclN5bnRheFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkKSkge1xuICAgICAgZGVmYXVsdEJpbmRpbmcgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICcsJykpIHtcbiAgICAgICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2ZvcicpICYmIHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygxKSwgJ3N5bnRheCcpKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgZm9yU3ludGF4ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0Jywge1xuICAgICAgICAgIGRlZmF1bHRCaW5kaW5nLCBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgbmFtZWRJbXBvcnRzOiBMaXN0KCksXG4gICAgICAgICAgZm9yU3ludGF4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnN1bWVDb21tYSgpO1xuICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkpIHtcbiAgICAgIGxldCBpbXBvcnRzID0gdGhpcy5lbmZvcmVzdE5hbWVkSW1wb3J0cygpO1xuICAgICAgbGV0IGZyb21DbGF1c2UgPSB0aGlzLmVuZm9yZXN0RnJvbUNsYXVzZSgpO1xuICAgICAgaWYgKHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygpLCAnZm9yJykgJiYgdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKDEpLCAnc3ludGF4JykpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBmb3JTeW50YXggPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnRcIiwge1xuICAgICAgICBkZWZhdWx0QmluZGluZyxcbiAgICAgICAgZm9yU3ludGF4LFxuICAgICAgICBuYW1lZEltcG9ydHM6IGltcG9ydHMsXG4gICAgICAgIG1vZHVsZVNwZWNpZmllcjogZnJvbUNsYXVzZVxuXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJyonKSkge1xuICAgICAgbGV0IG5hbWVzcGFjZUJpbmRpbmcgPSB0aGlzLmVuZm9yZXN0TmFtZXNwYWNlQmluZGluZygpO1xuICAgICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHRoaXMuZW5mb3Jlc3RGcm9tQ2xhdXNlKCk7XG4gICAgICBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdmb3InKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksICdzeW50YXgnKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGZvclN5bnRheCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ0ltcG9ydE5hbWVzcGFjZScsIHtcbiAgICAgICAgZGVmYXVsdEJpbmRpbmcsIGZvclN5bnRheCwgbmFtZXNwYWNlQmluZGluZywgbW9kdWxlU3BlY2lmaWVyXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsICd1bmV4cGVjdGVkIHN5bnRheCcpO1xuICB9XG5cbiAgZW5mb3Jlc3ROYW1lc3BhY2VCaW5kaW5nKCkge1xuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKCcqJyk7XG4gICAgdGhpcy5tYXRjaElkZW50aWZpZXIoJ2FzJyk7XG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcigpO1xuICB9XG5cbiAgZW5mb3Jlc3ROYW1lZEltcG9ydHMoKSB7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKGVuZi5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKGVuZi5lbmZvcmVzdEltcG9ydFNwZWNpZmllcnMoKSk7XG4gICAgICBlbmYuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdEltcG9ydFNwZWNpZmllcnMoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBuYW1lO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCkpIHtcbiAgICAgIG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGlmICghdGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCksICdhcycpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0U3BlY2lmaWVyJywge1xuICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgYmluZGluZzogbmV3IFRlcm0oJ0JpbmRpbmdJZGVudGlmaWVyJywge1xuICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXRjaElkZW50aWZpZXIoJ2FzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCAndW5leHBlY3RlZCB0b2tlbiBpbiBpbXBvcnQgc3BlY2lmaWVyJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0U3BlY2lmaWVyJywge1xuICAgICAgbmFtZSwgYmluZGluZzogdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0RnJvbUNsYXVzZSgpIHtcbiAgICB0aGlzLm1hdGNoSWRlbnRpZmllcignZnJvbScpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLm1hdGNoU3RyaW5nTGl0ZXJhbCgpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBsb29rYWhlYWQ7XG4gIH1cblxuICBlbmZvcmVzdFN0YXRlbWVudExpc3RJdGVtKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RnVuY3Rpb25EZWNsYXJhdGlvbih7IGlzRXhwcjogZmFsc2UgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENsYXNzKHsgaXNFeHByOiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBlbmZvcmVzdFN0YXRlbWVudCgpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNDb21waWxldGltZVRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICB0aGlzLmV4cGFuZE1hY3JvKCk7XG4gICAgICBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUZXJtKGxvb2thaGVhZCkpIHtcbiAgICAgIC8vIFRPRE86IGNoZWNrIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhbiBzdGF0ZW1lbnRcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCbG9ja1N0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1doaWxlVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0V2hpbGVTdGF0ZW1lbnQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNJZlRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdElmU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0ZvclRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEZvclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNTd2l0Y2hUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RTd2l0Y2hTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJlYWtUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCcmVha1N0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNDb250aW51ZVRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0RvVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RG9TdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRGVidWdnZXJUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3REZWJ1Z2dlclN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNXaXRoVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0V2l0aFN0YXRlbWVudCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUcnlUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUcnlTdGF0ZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVGhyb3dUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUaHJvd1N0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHB1dCBzb21ld2hlcmUgZWxzZVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCBcImNsYXNzXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkKSAmJlxuICAgICAgICB0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoMSksICc6JykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TGFiZWxlZFN0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiZcbiAgICAgICAgKHRoaXMuaXNWYXJEZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkgfHxcbiAgICAgICAgIHRoaXMuaXNMZXREZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkgfHxcbiAgICAgICAgIHRoaXMuaXNDb25zdERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgdGhpcy5pc1N5bnRheHJlY0RlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgdGhpcy5pc1N5bnRheERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSkpIHtcbiAgICAgIGxldCBzdG10ID0gbmV3IFRlcm0oJ1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQnLCB7XG4gICAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzUmV0dXJuU3RtdFRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFJldHVyblN0YXRlbWVudCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCBcIjtcIikpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRW1wdHlTdGF0ZW1lbnRcIiwge30pO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uU3RhdGVtZW50KCk7XG4gIH1cblxuICBlbmZvcmVzdExhYmVsZWRTdGF0ZW1lbnQoKSB7XG4gICAgbGV0IGxhYmVsID0gdGhpcy5tYXRjaElkZW50aWZpZXIoKTtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignOicpO1xuICAgIGxldCBzdG10ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdMYWJlbGVkU3RhdGVtZW50Jywge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgYm9keTogc3RtdFxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RCcmVha1N0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnYnJlYWsnKTtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGxhYmVsID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCAnOycpKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnQnJlYWtTdGF0ZW1lbnQnLCB7IGxhYmVsIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkKSB8fCB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICd5aWVsZCcpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2xldCcpKSB7XG4gICAgICBsYWJlbCA9IHRoaXMuZW5mb3Jlc3RJZGVudGlmaWVyKCk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCcmVha1N0YXRlbWVudCcsIHsgbGFiZWwgfSk7XG4gIH1cblxuICBlbmZvcmVzdFRyeVN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgndHJ5Jyk7XG4gICAgbGV0IGJvZHkgPSB0aGlzLmVuZm9yZXN0QmxvY2soKTtcbiAgICBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdjYXRjaCcpKSB7XG4gICAgICBsZXQgY2F0Y2hDbGF1c2UgPSB0aGlzLmVuZm9yZXN0Q2F0Y2hDbGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2ZpbmFsbHknKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgbGV0IGZpbmFsaXplciA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ1RyeUZpbmFsbHlTdGF0ZW1lbnQnLCB7XG4gICAgICAgICAgYm9keSwgY2F0Y2hDbGF1c2UsIGZpbmFsaXplclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSgnVHJ5Q2F0Y2hTdGF0ZW1lbnQnLCB7IGJvZHksIGNhdGNoQ2xhdXNlIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdmaW5hbGx5JykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IGZpbmFsaXplciA9IHRoaXMuZW5mb3Jlc3RCbG9jaygpO1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdUcnlGaW5hbGx5U3RhdGVtZW50JywgeyBib2R5LCBjYXRjaENsYXVzZTogbnVsbCwgZmluYWxpemVyIH0pO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKHRoaXMucGVlaygpLCAndHJ5IHdpdGggbm8gY2F0Y2ggb3IgZmluYWxseScpO1xuICB9XG5cbiAgZW5mb3Jlc3RDYXRjaENsYXVzZSgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnY2F0Y2gnKTtcbiAgICBsZXQgYmluZGluZ1BhcmVucyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoYmluZGluZ1BhcmVucywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBiaW5kaW5nID0gZW5mLmVuZm9yZXN0QmluZGluZ1RhcmdldCgpO1xuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdEJsb2NrKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDYXRjaENsYXVzZScsIHsgYmluZGluZywgYm9keSB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VGhyb3dTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ3Rocm93Jyk7XG4gICAgbGV0IGV4cHJlc3Npb24gPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybSgnVGhyb3dTdGF0ZW1lbnQnLCB7IGV4cHJlc3Npb24gfSk7XG4gIH1cblxuICBlbmZvcmVzdFdpdGhTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ3dpdGgnKTtcbiAgICBsZXQgb2JqUGFyZW5zID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihvYmpQYXJlbnMsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgb2JqZWN0ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIHJldHVybiBuZXcgVGVybSgnV2l0aFN0YXRlbWVudCcsIHsgb2JqZWN0LCBib2R5IH0pO1xuICB9XG5cbiAgZW5mb3Jlc3REZWJ1Z2dlclN0YXRlbWVudCgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnZGVidWdnZXInKTtcblxuICAgIHJldHVybiBuZXcgVGVybSgnRGVidWdnZXJTdGF0ZW1lbnQnLCB7fSk7XG4gIH1cblxuICBlbmZvcmVzdERvU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKCdkbycpO1xuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKCd3aGlsZScpO1xuICAgIGxldCB0ZXN0Qm9keSA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGVzdEJvZHksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0RvV2hpbGVTdGF0ZW1lbnQnLCB7IGJvZHksIHRlc3QgfSk7XG4gIH1cblxuICBlbmZvcmVzdENvbnRpbnVlU3RhdGVtZW50KCkge1xuICAgIGxldCBrd2QgPSB0aGlzLm1hdGNoS2V5d29yZCgnY29udGludWUnKTtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGxhYmVsID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkLCAnOycpKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnQ29udGludWVTdGF0ZW1lbnQnLCB7IGxhYmVsIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5saW5lTnVtYmVyRXEoa3dkLCBsb29rYWhlYWQpICYmXG4gICAgICAgICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8XG4gICAgICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICd5aWVsZCcpIHx8XG4gICAgICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdsZXQnKSkpIHtcbiAgICAgIGxhYmVsID0gdGhpcy5lbmZvcmVzdElkZW50aWZpZXIoKTtcbiAgICB9XG4gICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oJ0NvbnRpbnVlU3RhdGVtZW50JywgeyBsYWJlbCB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0U3dpdGNoU3RhdGVtZW50KCkge1xuICAgIHRoaXMubWF0Y2hLZXl3b3JkKCdzd2l0Y2gnKTtcbiAgICBsZXQgY29uZCA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoY29uZCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBkaXNjcmltaW5hbnQgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuXG4gICAgaWYgKGJvZHkuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnQnLCB7XG4gICAgICAgIGRpc2NyaW1pbmFudDogZGlzY3JpbWluYW50LFxuICAgICAgICBjYXNlczogTGlzdCgpXG4gICAgICB9KTtcbiAgICB9XG4gICAgZW5mID0gbmV3IEVuZm9yZXN0ZXIoYm9keSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBjYXNlcyA9IGVuZi5lbmZvcmVzdFN3aXRjaENhc2VzKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IGVuZi5wZWVrKCk7XG4gICAgaWYgKGVuZi5pc0tleXdvcmQobG9va2FoZWFkLCAnZGVmYXVsdCcpKSB7XG4gICAgICBsZXQgZGVmYXVsdENhc2UgPSBlbmYuZW5mb3Jlc3RTd2l0Y2hEZWZhdWx0KCk7XG4gICAgICBsZXQgcG9zdERlZmF1bHRDYXNlcyA9IGVuZi5lbmZvcmVzdFN3aXRjaENhc2VzKCk7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ1N3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0Jywge1xuICAgICAgICBkaXNjcmltaW5hbnQsXG4gICAgICAgIHByZURlZmF1bHRDYXNlczogY2FzZXMsXG4gICAgICAgIGRlZmF1bHRDYXNlLFxuICAgICAgICBwb3N0RGVmYXVsdENhc2VzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnQnLCB7ICBkaXNjcmltaW5hbnQsIGNhc2VzIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RTd2l0Y2hDYXNlcygpIHtcbiAgICBsZXQgY2FzZXMgPSBbXTtcbiAgICB3aGlsZSAoISh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCB0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2RlZmF1bHQnKSkpIHtcbiAgICAgIGNhc2VzLnB1c2godGhpcy5lbmZvcmVzdFN3aXRjaENhc2UoKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KGNhc2VzKTtcbiAgfVxuXG4gIGVuZm9yZXN0U3dpdGNoQ2FzZSgpIHtcbiAgICB0aGlzLm1hdGNoS2V5d29yZCgnY2FzZScpO1xuICAgIHJldHVybiBuZXcgVGVybSgnU3dpdGNoQ2FzZScsIHtcbiAgICAgIHRlc3Q6IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uKCksXG4gICAgICBjb25zZXF1ZW50OiB0aGlzLmVuZm9yZXN0U3dpdGNoQ2FzZUJvZHkoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RTd2l0Y2hDYXNlQm9keSgpIHtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignOicpO1xuICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50TGlzdEluU3dpdGNoQ2FzZUJvZHkoKTtcbiAgfVxuXG4gIGVuZm9yZXN0U3RhdGVtZW50TGlzdEluU3dpdGNoQ2FzZUJvZHkoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHdoaWxlKCEodGhpcy5yZXN0LnNpemUgPT09IDAgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdkZWZhdWx0JykgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKCksICdjYXNlJykpKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmVuZm9yZXN0U3RhdGVtZW50TGlzdEl0ZW0oKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdFN3aXRjaERlZmF1bHQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ2RlZmF1bHQnKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1N3aXRjaERlZmF1bHQnLCB7XG4gICAgICBjb25zZXF1ZW50OiB0aGlzLmVuZm9yZXN0U3dpdGNoQ2FzZUJvZHkoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGb3JTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ2ZvcicpO1xuICAgIGxldCBjb25kID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcihjb25kLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGxvb2thaGVhZCwgdGVzdCwgaW5pdCwgcmlnaHQsIHR5cGUsIGxlZnQsIHVwZGF0ZTtcblxuICAgIC8vIGNhc2Ugd2hlcmUgaW5pdCBpcyBudWxsXG4gICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJzsnKSkge1xuICAgICAgZW5mLmFkdmFuY2UoKTtcbiAgICAgIGlmICghZW5mLmlzUHVuY3R1YXRvcihlbmYucGVlaygpLCAnOycpKSB7XG4gICAgICAgIHRlc3QgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICB9XG4gICAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc7Jyk7XG4gICAgICBpZiAoZW5mLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgICByaWdodCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSgnRm9yU3RhdGVtZW50Jywge1xuICAgICAgICBpbml0OiBudWxsLFxuICAgICAgICB0ZXN0OiB0ZXN0LFxuICAgICAgICB1cGRhdGU6IHJpZ2h0LFxuICAgICAgICBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KClcbiAgICAgIH0pO1xuICAgIC8vIGNhc2Ugd2hlcmUgaW5pdCBpcyBub3QgbnVsbFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0ZXN0aW5nXG4gICAgICBsb29rYWhlYWQgPSBlbmYucGVlaygpO1xuICAgICAgaWYgKGVuZi5pc1ZhckRlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgIGVuZi5pc0xldERlY2xUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICAgIGVuZi5pc0NvbnN0RGVjbFRyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICAgIGluaXQgPSBlbmYuZW5mb3Jlc3RWYXJpYWJsZURlY2xhcmF0aW9uKCk7XG4gICAgICAgIGxvb2thaGVhZCA9IGVuZi5wZWVrKCk7XG4gICAgICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdpbicpIHx8IHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCwgJ29mJykpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnaW4nKSkge1xuICAgICAgICAgICAgZW5mLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHJpZ2h0ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgdHlwZSA9ICdGb3JJblN0YXRlbWVudCc7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQsICdvZicpKSB7XG4gICAgICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmlnaHQgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICB0eXBlID0gJ0Zvck9mU3RhdGVtZW50JztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKHR5cGUsIHtcbiAgICAgICAgICAgIGxlZnQ6IGluaXQsIHJpZ2h0LCBib2R5OiB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc7Jyk7XG4gICAgICAgIGlmIChlbmYuaXNQdW5jdHVhdG9yKGVuZi5wZWVrKCksICc7JykpIHtcbiAgICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICAgIHRlc3QgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlc3QgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgICAgZW5mLm1hdGNoUHVuY3R1YXRvcignOycpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmlzS2V5d29yZChlbmYucGVlaygxKSwgJ2luJykgfHwgdGhpcy5pc0lkZW50aWZpZXIoZW5mLnBlZWsoMSksICdvZicpKSB7XG4gICAgICAgICAgbGVmdCA9IGVuZi5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgICAgICAgbGV0IGtpbmQgPSBlbmYuYWR2YW5jZSgpO1xuICAgICAgICAgIGlmICh0aGlzLmlzS2V5d29yZChraW5kLCAnaW4nKSkge1xuICAgICAgICAgICAgdHlwZSA9ICdGb3JJblN0YXRlbWVudCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSAnRm9yT2ZTdGF0ZW1lbnQnO1xuICAgICAgICAgIH1cbiAgICAgICAgICByaWdodCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgICAgICAgbGVmdDogbGVmdCwgcmlnaHQsIGJvZHk6IHRoaXMuZW5mb3Jlc3RTdGF0ZW1lbnQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGluaXQgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgIGVuZi5tYXRjaFB1bmN0dWF0b3IoJzsnKTtcbiAgICAgICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJzsnKSkge1xuICAgICAgICAgIGVuZi5hZHZhbmNlKCk7XG4gICAgICAgICAgdGVzdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICAgICAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc7Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBUZXJtKCdGb3JTdGF0ZW1lbnQnLCB7IGluaXQsIHRlc3QsIHVwZGF0ZSwgYm9keTogdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpIH0pO1xuICAgIH1cbiAgfVxuXG4gIGVuZm9yZXN0SWZTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ2lmJyk7XG4gICAgbGV0IGNvbmQgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKGNvbmQsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkID0gZW5mLnBlZWsoKTtcbiAgICBsZXQgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAodGVzdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyBhbiBleHByZXNzaW9uJyk7XG4gICAgfVxuICAgIGxldCBjb25zZXF1ZW50ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgIGxldCBhbHRlcm5hdGUgPSBudWxsO1xuICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2Vsc2UnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBhbHRlcm5hdGUgPSB0aGlzLmVuZm9yZXN0U3RhdGVtZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSgnSWZTdGF0ZW1lbnQnLCB7IHRlc3QsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZSB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0V2hpbGVTdGF0ZW1lbnQoKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ3doaWxlJyk7XG4gICAgbGV0IGNvbmQgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKGNvbmQsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkID0gZW5mLnBlZWsoKTtcbiAgICBsZXQgdGVzdCA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAodGVzdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyBhbiBleHByZXNzaW9uJyk7XG4gICAgfVxuICAgIGxldCBib2R5ID0gdGhpcy5lbmZvcmVzdFN0YXRlbWVudCgpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdXaGlsZVN0YXRlbWVudCcsIHsgdGVzdCwgYm9keSB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0QmxvY2tTdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCbG9ja1N0YXRlbWVudCcsIHtcbiAgICAgIGJsb2NrOiB0aGlzLmVuZm9yZXN0QmxvY2soKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RCbG9jaygpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0Jsb2NrJywge1xuICAgICAgc3RhdGVtZW50czogdGhpcy5tYXRjaEN1cmxpZXMoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RDbGFzcyh7IGlzRXhwciwgaW5EZWZhdWx0IH0pIHtcbiAgICBsZXQga3cgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBsZXQgbmFtZSA9IG51bGwsIHN1cHIgPSBudWxsO1xuICAgIGxldCB0eXBlID0gaXNFeHByID8gJ0NsYXNzRXhwcmVzc2lvbicgOiAnQ2xhc3NEZWNsYXJhdGlvbic7XG5cbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfSBlbHNlIGlmICghaXNFeHByKSB7XG4gICAgICBpZiAoaW5EZWZhdWx0KSB7XG4gICAgICAgIG5hbWUgPSBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7XG4gICAgICAgICAgbmFtZTogU3ludGF4LmZyb21JZGVudGlmaWVyKCdfZGVmYXVsdCcsIGt3KVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IodGhpcy5wZWVrKCksICd1bmV4cGVjdGVkIHN5bnRheCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzS2V5d29yZCh0aGlzLnBlZWsoKSwgJ2V4dGVuZHMnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBzdXByID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnRzID0gW107XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB3aGlsZSAoZW5mLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJzsnKSkge1xuICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU3RhdGljID0gZmFsc2U7XG4gICAgICBsZXQge21ldGhvZE9yS2V5LCBraW5kfSA9IGVuZi5lbmZvcmVzdE1ldGhvZERlZmluaXRpb24oKTtcbiAgICAgIGlmIChraW5kID09PSAnaWRlbnRpZmllcicgJiYgbWV0aG9kT3JLZXkudmFsdWUudmFsKCkgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIGlzU3RhdGljID0gdHJ1ZTtcbiAgICAgICAgKHttZXRob2RPcktleSwga2luZH0gPSBlbmYuZW5mb3Jlc3RNZXRob2REZWZpbml0aW9uKCkpO1xuICAgICAgfVxuICAgICAgaWYgKGtpbmQgPT09ICdtZXRob2QnKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2gobmV3IFRlcm0oJ0NsYXNzRWxlbWVudCcsIHtpc1N0YXRpYywgbWV0aG9kOiBtZXRob2RPcktleX0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IoZW5mLnBlZWsoKSwgXCJPbmx5IG1ldGhvZHMgYXJlIGFsbG93ZWQgaW4gY2xhc3Nlc1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgbmFtZSwgc3VwZXI6IHN1cHIsXG4gICAgICBlbGVtZW50czogTGlzdChlbGVtZW50cylcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0QmluZGluZ1RhcmdldCh7IGFsbG93UHVuY3R1YXRvciB9ID0ge30pIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkKSB8fCAoYWxsb3dQdW5jdHVhdG9yICYmIHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKHsgYWxsb3dQdW5jdHVhdG9yIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QXJyYXlCaW5kaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0T2JqZWN0QmluZGluZygpO1xuICAgIH1cbiAgICBhc3NlcnQoZmFsc2UsICdub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gIH1cblxuICBlbmZvcmVzdE9iamVjdEJpbmRpbmcoKSB7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMubWF0Y2hDdXJsaWVzKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgcHJvcGVydGllcyA9IFtdO1xuICAgIHdoaWxlIChlbmYucmVzdC5zaXplICE9PSAwKSB7XG4gICAgICBwcm9wZXJ0aWVzLnB1c2goZW5mLmVuZm9yZXN0QmluZGluZ1Byb3BlcnR5KCkpO1xuICAgICAgZW5mLmNvbnN1bWVDb21tYSgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGVybSgnT2JqZWN0QmluZGluZycsIHtcbiAgICAgIHByb3BlcnRpZXM6IExpc3QocHJvcGVydGllcylcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0QmluZGluZ1Byb3BlcnR5KCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQge25hbWUsIGJpbmRpbmd9ID0gdGhpcy5lbmZvcmVzdFByb3BlcnR5TmFtZSgpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ2xldCcpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ3lpZWxkJykpIHtcbiAgICAgIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICc6JykpIHtcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzQXNzaWduKHRoaXMucGVlaygpKSkge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIGxldCBleHByID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlID0gZXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXInLCB7XG4gICAgICAgICAgYmluZGluZywgaW5pdDogZGVmYXVsdFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignOicpO1xuICAgIGJpbmRpbmcgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0VsZW1lbnQoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5Jywge1xuICAgICAgbmFtZSwgYmluZGluZ1xuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcnJheUJpbmRpbmcoKSB7XG4gICAgbGV0IGJyYWNrZXQgPSB0aGlzLm1hdGNoU3F1YXJlcygpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihicmFja2V0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGVsZW1lbnRzID0gW10sIHJlc3RFbGVtZW50ID0gbnVsbDtcbiAgICB3aGlsZSAoZW5mLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgbGV0IGVsO1xuICAgICAgaWYgKGVuZi5pc1B1bmN0dWF0b3IoZW5mLnBlZWsoKSwgJywnKSkge1xuICAgICAgICBlbmYuY29uc3VtZUNvbW1hKCk7XG4gICAgICAgIGVsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlbmYuaXNQdW5jdHVhdG9yKGVuZi5wZWVrKCksICcuLi4nKSkge1xuICAgICAgICAgIGVuZi5hZHZhbmNlKCk7XG4gICAgICAgICAgcmVzdEVsZW1lbnQgPSBlbmYuZW5mb3Jlc3RCaW5kaW5nVGFyZ2V0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwgPSBlbmYuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGVuZi5jb25zdW1lQ29tbWEoKTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRzLnB1c2goZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oJ0FycmF5QmluZGluZycsIHtcbiAgICAgIGVsZW1lbnRzOiBMaXN0KGVsZW1lbnRzKSxcbiAgICAgIHJlc3RFbGVtZW50XG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdEJpbmRpbmdFbGVtZW50KCkge1xuICAgIGxldCBiaW5kaW5nID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoKTtcblxuICAgIGlmICh0aGlzLmlzQXNzaWduKHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQgaW5pdCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgYmluZGluZyA9IG5ldyBUZXJtKCdCaW5kaW5nV2l0aERlZmF1bHQnLCB7IGJpbmRpbmcsIGluaXQgfSk7XG4gICAgfVxuICAgIHJldHVybiBiaW5kaW5nO1xuICB9XG5cbiAgZW5mb3Jlc3RCaW5kaW5nSWRlbnRpZmllcih7IGFsbG93UHVuY3R1YXRvciB9ID0ge30pIHtcbiAgICBsZXQgbmFtZTtcbiAgICBpZiAoYWxsb3dQdW5jdHVhdG9yICYmIHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpKSkge1xuICAgICAgbmFtZSA9IHRoaXMuZW5mb3Jlc3RQdW5jdHVhdG9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSB0aGlzLmVuZm9yZXN0SWRlbnRpZmllcigpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7IG5hbWUgfSk7XG4gIH1cblxuICBlbmZvcmVzdFB1bmN0dWF0b3IoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhIHB1bmN0dWF0b3JcIik7XG4gIH1cblxuICBlbmZvcmVzdElkZW50aWZpZXIoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQpIHx8IHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwiZXhwZWN0aW5nIGFuIGlkZW50aWZpZXJcIik7XG4gIH1cblxuXG4gIGVuZm9yZXN0UmV0dXJuU3RhdGVtZW50KCkge1xuICAgIGxldCBrdyA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIC8vIHNob3J0IGNpcmN1aXQgZm9yIHRoZSBlbXB0eSBleHByZXNzaW9uIGNhc2VcbiAgICBpZiAodGhpcy5yZXN0LnNpemUgPT09IDAgfHxcbiAgICAgICAgKGxvb2thaGVhZCAmJiAhdGhpcy5saW5lTnVtYmVyRXEoa3csIGxvb2thaGVhZCkpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJSZXR1cm5TdGF0ZW1lbnRcIiwge1xuICAgICAgICBleHByZXNzaW9uOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgdGVybSA9IG51bGw7XG4gICAgaWYgKCF0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICc7JykpIHtcbiAgICAgIHRlcm0gPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgZXhwZWN0KHRlcm0gIT0gbnVsbCwgXCJFeHBlY3RpbmcgYW4gZXhwcmVzc2lvbiB0byBmb2xsb3cgcmV0dXJuIGtleXdvcmRcIiwgbG9va2FoZWFkLCB0aGlzLnJlc3QpO1xuICAgIH1cblxuICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7XG4gICAgICBleHByZXNzaW9uOiB0ZXJtXG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7XG4gICAgbGV0IGtpbmQ7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBraW5kU3luID0gbG9va2FoZWFkO1xuICAgIGxldCBwaGFzZSA9IHRoaXMuY29udGV4dC5waGFzZTtcblxuICAgIGlmIChraW5kU3luICYmXG4gICAgICAgIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW4ucmVzb2x2ZShwaGFzZSkpID09PSBWYXJpYWJsZURlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmQgPSBcInZhclwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5biAmJlxuICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bi5yZXNvbHZlKHBoYXNlKSkgPT09IExldERlY2xUcmFuc2Zvcm0pIHtcbiAgICAgIGtpbmQgPSBcImxldFwiO1xuICAgIH0gZWxzZSBpZiAoa2luZFN5biAmJlxuICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmVudi5nZXQoa2luZFN5bi5yZXNvbHZlKHBoYXNlKSkgPT09IENvbnN0RGVjbFRyYW5zZm9ybSkge1xuICAgICAga2luZCA9IFwiY29uc3RcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW4gJiZcbiAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW4ucmVzb2x2ZShwaGFzZSkpID09PSBTeW50YXhEZWNsVHJhbnNmb3JtKSB7XG4gICAgICBraW5kID0gXCJzeW50YXhcIjtcbiAgICB9IGVsc2UgaWYgKGtpbmRTeW4gJiZcbiAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5lbnYuZ2V0KGtpbmRTeW4ucmVzb2x2ZShwaGFzZSkpID09PSBTeW50YXhyZWNEZWNsVHJhbnNmb3JtKSB7XG4gICAgICBraW5kID0gXCJzeW50YXhyZWNcIjtcbiAgICB9XG5cbiAgICBsZXQgZGVjbHMgPSBMaXN0KCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0VmFyaWFibGVEZWNsYXJhdG9yKHsgaXNTeW50YXg6IGtpbmQgPT09IFwic3ludGF4XCIgfHwga2luZCA9PT0gJ3N5bnRheHJlYycgfSk7XG4gICAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgICBkZWNscyA9IGRlY2xzLmNvbmNhdCh0ZXJtKTtcblxuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIsXCIpKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdWYXJpYWJsZURlY2xhcmF0aW9uJywge1xuICAgICAga2luZDoga2luZCxcbiAgICAgIGRlY2xhcmF0b3JzOiBkZWNsc1xuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RWYXJpYWJsZURlY2xhcmF0b3IoeyBpc1N5bnRheCB9KSB7XG4gICAgbGV0IGlkID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdUYXJnZXQoeyBhbGxvd1B1bmN0dWF0b3I6IGlzU3ludGF4IH0pO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGxldCBpbml0O1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICc9JykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgaW5pdCA9IGVuZi5lbmZvcmVzdChcImV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRvclwiLCB7XG4gICAgICBiaW5kaW5nOiBpZCxcbiAgICAgIGluaXQ6IGluaXRcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0RXhwcmVzc2lvblN0YXRlbWVudCgpIHtcbiAgICBsZXQgc3RhcnQgPSB0aGlzLnJlc3QuZ2V0KDApO1xuICAgIGxldCBleHByID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb24oKTtcbiAgICBpZiAoZXhwciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihzdGFydCwgXCJub3QgYSB2YWxpZCBleHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblxuICAgIHJldHVybiBuZXcgVGVybShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge1xuICAgICAgZXhwcmVzc2lvbjogZXhwclxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RFeHByZXNzaW9uKCkge1xuICAgIGxldCBsZWZ0ID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcsJykpIHtcbiAgICAgIHdoaWxlICh0aGlzLnJlc3Quc2l6ZSAhPT0gMCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCAnLCcpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdG9yID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGxldCByaWdodCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICBsZWZ0ID0gbmV3IFRlcm0oJ0JpbmFyeUV4cHJlc3Npb24nLCB7bGVmdCwgb3BlcmF0b3IsIHJpZ2h0fSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgcmV0dXJuIGxlZnQ7XG4gIH1cblxuICBlbmZvcmVzdEV4cHJlc3Npb25Mb29wKCkge1xuICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgdGhpcy5vcEN0eCA9IHtcbiAgICAgIHByZWM6IDAsXG4gICAgICBjb21iaW5lOiAoeCkgPT4geCxcbiAgICAgIHN0YWNrOiBMaXN0KClcbiAgICB9O1xuXG4gICAgZG8ge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLmVuZm9yZXN0QXNzaWdubWVudEV4cHJlc3Npb24oKTtcbiAgICAgIC8vIG5vIGNoYW5nZSBtZWFucyB3ZSd2ZSBkb25lIGFzIG11Y2ggZW5mb3Jlc3RpbmcgYXMgcG9zc2libGVcbiAgICAgIC8vIGlmIG5vdGhpbmcgY2hhbmdlZCwgbWF5YmUgd2UganVzdCBuZWVkIHRvIHBvcCB0aGUgZXhwciBzdGFja1xuICAgICAgaWYgKHRlcm0gPT09IEVYUFJfTE9PUF9OT19DSEFOR0UgJiYgdGhpcy5vcEN0eC5zdGFjay5zaXplID4gMCkge1xuICAgICAgICB0aGlzLnRlcm0gPSB0aGlzLm9wQ3R4LmNvbWJpbmUodGhpcy50ZXJtKTtcbiAgICAgICAgbGV0IHtwcmVjLCBjb21iaW5lfSA9IHRoaXMub3BDdHguc3RhY2subGFzdCgpO1xuICAgICAgICB0aGlzLm9wQ3R4LnByZWMgPSBwcmVjO1xuICAgICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAodGVybSA9PT0gRVhQUl9MT09QX05PX0NIQU5HRSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAodGVybSA9PT0gRVhQUl9MT09QX09QRVJBVE9SIHx8IHRlcm0gPT09IEVYUFJfTE9PUF9FWFBBTlNJT04pIHtcbiAgICAgICAgLy8gb3BlcmF0b3IgbWVhbnMgYW4gb3BDdHggd2FzIHB1c2hlZCBvbiB0aGUgc3RhY2tcbiAgICAgICAgdGhpcy50ZXJtID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGVybSA9IHRlcm07XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7ICAvLyBnZXQgYSBmaXhwb2ludFxuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBlbmZvcmVzdEFzc2lnbm1lbnRFeHByZXNzaW9uKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc0NvbXBpbGV0aW1lVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kTWFjcm8oKTtcbiAgICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1Rlcm0obG9va2FoZWFkKSkge1xuICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb25cbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ3lpZWxkJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0WWllbGRFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdjbGFzcycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IHRydWV9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJlxuICAgICAgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSAmJlxuICAgICAgIHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygxKSwgJz0+JykgJiZcbiAgICAgICB0aGlzLmxpbmVOdW1iZXJFcShsb29rYWhlYWQsIHRoaXMucGVlaygxKSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QXJyb3dFeHByZXNzaW9uKCk7XG4gICAgfVxuXG5cblxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1N5bnRheFRlbXBsYXRlKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4VGVtcGxhdGUoKTtcbiAgICB9XG4gICAgLy8gc3ludGF4UXVvdGUgYCAuLi4gYFxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc1N5bnRheFF1b3RlVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3ludGF4UXVvdGUoKTtcbiAgICB9XG5cbiAgICAvLyAoJHg6ZXhwcilcbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNQYXJlbnMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIiwge1xuICAgICAgICBpbm5lcjogdGhpcy5hZHZhbmNlKCkuaW5uZXIoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiAoXG4gICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsIFwidGhpc1wiKSB8fFxuICAgICAgdGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkKSB8fFxuICAgICAgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnbGV0JykgfHxcbiAgICAgIHRoaXMuaXNLZXl3b3JkKGxvb2thaGVhZCwgJ3lpZWxkJykgfHxcbiAgICAgIHRoaXMuaXNOdW1lcmljTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzVGVtcGxhdGUobG9va2FoZWFkKSB8fFxuICAgICAgdGhpcy5pc0Jvb2xlYW5MaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgIHRoaXMuaXNOdWxsTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzUmVndWxhckV4cHJlc3Npb24obG9va2FoZWFkKSB8fFxuICAgICAgdGhpcy5pc0ZuRGVjbFRyYW5zZm9ybShsb29rYWhlYWQpIHx8XG4gICAgICB0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkgfHxcbiAgICAgIHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWQpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RQcmltYXJ5RXhwcmVzc2lvbigpO1xuICAgIH1cblxuICAgIC8vIHByZWZpeCB1bmFyeVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc09wZXJhdG9yKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0VW5hcnlFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzVmFyQmluZGluZ1RyYW5zZm9ybShsb29rYWhlYWQpKSB7XG4gICAgICBsZXQgaWQgPSB0aGlzLmdldEZyb21Db21waWxldGltZUVudmlyb25tZW50KGxvb2thaGVhZCkuaWQ7XG4gICAgICBpZiAoaWQgIT09IGxvb2thaGVhZCkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdGhpcy5yZXN0ID0gTGlzdC5vZihpZCkuY29uY2F0KHRoaXMucmVzdCk7XG4gICAgICAgIHJldHVybiBFWFBSX0xPT1BfRVhQQU5TSU9OO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgodGhpcy50ZXJtID09PSBudWxsICYmIChcbiAgICAgIHRoaXMuaXNOZXdUcmFuc2Zvcm0obG9va2FoZWFkKSB8fFxuICAgICAgICB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdzdXBlcicpKSkgfHxcbiAgICAgICAgLy8gYW5kIHRoZW4gY2hlY2sgdGhlIGNhc2VzIHdoZXJlIHRoZSB0ZXJtIHBhcnQgb2YgcCBpcyBzb21ldGhpbmcuLi5cbiAgICAgICAgKHRoaXMudGVybSAmJiAoXG4gICAgICAgICAgLy8gJHg6ZXhwciAuICRwcm9wOmlkZW50XG4gICAgICAgICAgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJy4nKSAmJiAoXG4gICAgICAgICAgICB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSkpIHx8IHRoaXMuaXNLZXl3b3JkKHRoaXMucGVlaygxKSkpKSB8fFxuICAgICAgICAgICAgLy8gJHg6ZXhwciBbICRiOmV4cHIgXVxuICAgICAgICAgICAgdGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkgfHxcbiAgICAgICAgICAgIC8vICR4OmV4cHIgKC4uLilcbiAgICAgICAgICAgIHRoaXMuaXNQYXJlbnMobG9va2FoZWFkKVxuICAgICAgICApKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKHsgYWxsb3dDYWxsOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vICR4OmlkIGAuLi5gXG4gICAgaWYodGhpcy50ZXJtICYmIHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgIH1cblxuICAgIC8vIHBvc3RmaXggdW5hcnlcbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNVcGRhdGVPcGVyYXRvcihsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFVwZGF0ZUV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICAvLyAkbDpleHByICRvcDpiaW5hcnlPcGVyYXRvciAkcjpleHByXG4gICAgaWYgKHRoaXMudGVybSAmJiB0aGlzLmlzT3BlcmF0b3IobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RCaW5hcnlFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgLy8gJHg6ZXhwciA9ICRpbml0OmV4cHJcbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNBc3NpZ24obG9va2FoZWFkKSkge1xuICAgICAgbGV0IGJpbmRpbmcgPSB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodGhpcy50ZXJtKTtcbiAgICAgIGxldCBvcCA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGhpcy5yZXN0LCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgaW5pdCA9IGVuZi5lbmZvcmVzdChcImV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcblxuICAgICAgaWYgKG9wLnZhbCgpID09PSAnPScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdBc3NpZ25tZW50RXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBiaW5kaW5nLFxuICAgICAgICAgIGV4cHJlc3Npb246IGluaXRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0NvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb24nLCB7XG4gICAgICAgICAgYmluZGluZyxcbiAgICAgICAgICBvcGVyYXRvcjogb3AudmFsKCksXG4gICAgICAgICAgZXhwcmVzc2lvbjogaW5pdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtICYmIHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJz8nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RDb25kaXRpb25hbEV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRVhQUl9MT09QX05PX0NIQU5HRTtcbiAgfVxuXG4gIGVuZm9yZXN0UHJpbWFyeUV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIC8vICR4OlRoaXNFeHByZXNzaW9uXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsIFwidGhpc1wiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RUaGlzRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICAvLyAkeDppZGVudFxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAnbGV0JykgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCAneWllbGQnKSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0SWRlbnRpZmllckV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzTnVtZXJpY0xpdGVyYWwobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3ROdW1lcmljTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0U3RyaW5nTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNUZW1wbGF0ZShsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCb29sZWFuTGl0ZXJhbChsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmZvcmVzdEJvb2xlYW5MaXRlcmFsKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gPT09IG51bGwgJiYgdGhpcy5pc051bGxMaXRlcmFsKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0TnVsbExpdGVyYWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzUmVndWxhckV4cHJlc3Npb24obG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwoKTtcbiAgICB9XG4gICAgLy8gJHg6RnVuY3Rpb25FeHByZXNzaW9uXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzRm5EZWNsVHJhbnNmb3JtKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZm9yZXN0RnVuY3Rpb25FeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIC8vIHsgJHA6cHJvcCAoLCkgLi4uIH1cbiAgICBpZiAodGhpcy50ZXJtID09PSBudWxsICYmIHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RPYmplY3RFeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIC8vIFskeDpleHByICgsKSAuLi5dXG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCAmJiB0aGlzLmlzQnJhY2tldHMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW5mb3Jlc3RBcnJheUV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgYXNzZXJ0KGZhbHNlLCAnTm90IGEgcHJpbWFyeSBleHByZXNzaW9uJyk7XG4gIH1cblxuICBlbmZvcmVzdExlZnRIYW5kU2lkZUV4cHJlc3Npb24oeyBhbGxvd0NhbGwgfSkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLmlzS2V5d29yZChsb29rYWhlYWQsICdzdXBlcicpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHRoaXMudGVybSA9IG5ldyBUZXJtKCdTdXBlcicsIHt9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNOZXdUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdE5ld0V4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAodGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSB7XG4gICAgICAgIGlmICghYWxsb3dDYWxsKSB7XG4gICAgICAgICAgLy8gd2UncmUgZGVhbGluZyB3aXRoIGEgbmV3IGV4cHJlc3Npb25cbiAgICAgICAgICBpZiAodGhpcy50ZXJtICYmXG4gICAgICAgICAgICAgIChpc0lkZW50aWZpZXJFeHByZXNzaW9uKHRoaXMudGVybSkgfHxcbiAgICAgICAgICAgICAgIGlzU3RhdGljTWVtYmVyRXhwcmVzc2lvbih0aGlzLnRlcm0pIHx8XG4gICAgICAgICAgICAgICBpc0NvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbih0aGlzLnRlcm0pKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVybTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdENhbGxFeHByZXNzaW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy50ZXJtID8gdGhpcy5lbmZvcmVzdENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbigpIDogdGhpcy5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJy4nKSAmJiAoXG4gICAgICAgIHRoaXMuaXNJZGVudGlmaWVyKHRoaXMucGVlaygxKSkgfHwgdGhpcy5pc0tleXdvcmQodGhpcy5wZWVrKDEpKSkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFN0YXRpY01lbWJlckV4cHJlc3Npb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFRlbXBsYXRlTGl0ZXJhbCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQnJhY2VzKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGhpcy5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gbmV3IFRlcm0oJ0lkZW50aWZpZXJFeHByZXNzaW9uJywgeyBuYW1lOiB0aGlzLmVuZm9yZXN0SWRlbnRpZmllcigpIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBlbmZvcmVzdEJvb2xlYW5MaXRlcmFsKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxCb29sZWFuRXhwcmVzc2lvblwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5hZHZhbmNlKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VGVtcGxhdGVMaXRlcmFsKCkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVGVtcGxhdGVFeHByZXNzaW9uJywge1xuICAgICAgdGFnOiB0aGlzLnRlcm0sXG4gICAgICBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RTdHJpbmdMaXRlcmFsKCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmFkdmFuY2UoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3ROdW1lcmljTGl0ZXJhbCgpIHtcbiAgICBsZXQgbnVtID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKG51bS52YWwoKSA9PT0gMSAvIDApIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbicsIHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiBudW1cbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0SWRlbnRpZmllckV4cHJlc3Npb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge1xuICAgICAgbmFtZTogdGhpcy5hZHZhbmNlKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0UmVndWxhckV4cHJlc3Npb25MaXRlcmFsKCkge1xuICAgIGxldCByZVN0eCA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgbGV0IGxhc3RTbGFzaCA9IHJlU3R4LnRva2VuLnZhbHVlLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICBsZXQgcGF0dGVybiA9IHJlU3R4LnRva2VuLnZhbHVlLnNsaWNlKDEsIGxhc3RTbGFzaCk7XG4gICAgbGV0IGZsYWdzID0gcmVTdHgudG9rZW4udmFsdWUuc2xpY2UobGFzdFNsYXNoICsgMSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb25cIiwge1xuICAgICAgcGF0dGVybiwgZmxhZ3NcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0TnVsbExpdGVyYWwoKSB7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbE51bGxFeHByZXNzaW9uXCIsIHt9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VGhpc0V4cHJlc3Npb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVGhpc0V4cHJlc3Npb25cIiwge1xuICAgICAgc3R4OiB0aGlzLmFkdmFuY2UoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcmd1bWVudExpc3QoKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHdoaWxlICh0aGlzLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgIGxldCBhcmc7XG4gICAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICcuLi4nKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgYXJnID0gbmV3IFRlcm0oJ1NwcmVhZEVsZW1lbnQnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKClcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgICAgdGhpcy5tYXRjaFB1bmN0dWF0b3IoJywnKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGFyZyk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gIH1cblxuICBlbmZvcmVzdE5ld0V4cHJlc3Npb24oKSB7XG4gICAgdGhpcy5tYXRjaEtleXdvcmQoJ25ldycpO1xuICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcih0aGlzLnBlZWsoKSwgJy4nKSAmJiB0aGlzLmlzSWRlbnRpZmllcih0aGlzLnBlZWsoMSksICd0YXJnZXQnKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiBuZXcgVGVybSgnTmV3VGFyZ2V0RXhwcmVzc2lvbicsIHt9KTtcbiAgICB9XG5cbiAgICBsZXQgY2FsbGVlID0gdGhpcy5lbmZvcmVzdExlZnRIYW5kU2lkZUV4cHJlc3Npb24oeyBhbGxvd0NhbGw6IGZhbHNlIH0pO1xuICAgIGxldCBhcmdzO1xuICAgIGlmICh0aGlzLmlzUGFyZW5zKHRoaXMucGVlaygpKSkge1xuICAgICAgYXJncyA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IExpc3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdOZXdFeHByZXNzaW9uJywge1xuICAgICAgY2FsbGVlLFxuICAgICAgYXJndW1lbnRzOiBhcmdzXG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGhpcy5tYXRjaFNxdWFyZXMoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiBuZXcgVGVybSgnQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uJywge1xuICAgICAgb2JqZWN0OiB0aGlzLnRlcm0sXG4gICAgICBleHByZXNzaW9uOiBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKClcbiAgICB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybURlc3RydWN0dXJpbmcodGVybSkge1xuICAgIHN3aXRjaCAodGVybS50eXBlKSB7XG4gICAgICBjYXNlICdJZGVudGlmaWVyRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7bmFtZTogdGVybS5uYW1lfSk7XG5cbiAgICAgIGNhc2UgJ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uJzpcbiAgICAgICAgaWYgKHRlcm0uaW5uZXIuc2l6ZSA9PT0gMSAmJiB0aGlzLmlzSWRlbnRpZmllcih0ZXJtLmlubmVyLmdldCgwKSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdJZGVudGlmaWVyJywgeyBuYW1lOiB0ZXJtLmlubmVyLmdldCgwKX0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXJtO1xuICAgICAgY2FzZSAnRGF0YVByb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eScsIHtcbiAgICAgICAgICBuYW1lOiB0ZXJtLm5hbWUsXG4gICAgICAgICAgYmluZGluZzogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nV2l0aERlZmF1bHQodGVybS5leHByZXNzaW9uKVxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ1Nob3J0aGFuZFByb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyJywge1xuICAgICAgICAgIGJpbmRpbmc6IG5ldyBUZXJtKCdCaW5kaW5nSWRlbnRpZmllcicsIHsgbmFtZTogdGVybS5uYW1lIH0pLFxuICAgICAgICAgIGluaXQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdPYmplY3RFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdPYmplY3RCaW5kaW5nJywge1xuICAgICAgICAgIHByb3BlcnRpZXM6IHRlcm0ucHJvcGVydGllcy5tYXAodCA9PiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodCkpXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAnQXJyYXlFeHByZXNzaW9uJzoge1xuICAgICAgICBsZXQgbGFzdCA9IHRlcm0uZWxlbWVudHMubGFzdCgpO1xuICAgICAgICBpZiAobGFzdCAhPSBudWxsICYmIGxhc3QudHlwZSA9PT0gJ1NwcmVhZEVsZW1lbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKCdBcnJheUJpbmRpbmcnLCB7XG4gICAgICAgICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5zbGljZSgwLCAtMSkubWFwKHQgPT4gdCAmJiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdCh0KSksXG4gICAgICAgICAgICByZXN0RWxlbWVudDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nV2l0aERlZmF1bHQobGFzdC5leHByZXNzaW9uKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSgnQXJyYXlCaW5kaW5nJywge1xuICAgICAgICAgICAgZWxlbWVudHM6IHRlcm0uZWxlbWVudHMubWFwKHQgPT4gdCAmJiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdCh0KSksXG4gICAgICAgICAgICByZXN0RWxlbWVudDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdTdGF0aWNQcm9wZXJ0eU5hbWUnOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdJZGVudGlmaWVyJywge1xuICAgICAgICAgIG5hbWU6IHRlcm0udmFsdWVcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdDb21wdXRlZE1lbWJlckV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnU3RhdGljTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdBcnJheUJpbmRpbmcnOlxuICAgICAgY2FzZSAnQmluZGluZ0lkZW50aWZpZXInOlxuICAgICAgY2FzZSAnQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcic6XG4gICAgICBjYXNlICdCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eSc6XG4gICAgICBjYXNlICdCaW5kaW5nV2l0aERlZmF1bHQnOlxuICAgICAgY2FzZSAnT2JqZWN0QmluZGluZyc6XG4gICAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgICBhc3NlcnQoZmFsc2UsICdub3QgaW1wbGVtZW50ZWQgeWV0IGZvciAnICsgdGVybS50eXBlKTtcbiAgfVxuXG4gIHRyYW5zZm9ybURlc3RydWN0dXJpbmdXaXRoRGVmYXVsdCh0ZXJtKSB7XG4gICAgc3dpdGNoICh0ZXJtLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ0JpbmRpbmdXaXRoRGVmYXVsdCcsIHtcbiAgICAgICAgICBiaW5kaW5nOiB0aGlzLnRyYW5zZm9ybURlc3RydWN0dXJpbmcodGVybS5iaW5kaW5nKSxcbiAgICAgICAgICBpbml0OiB0ZXJtLmV4cHJlc3Npb24sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRlcm0pO1xuICB9XG5cbiAgZW5mb3Jlc3RDYWxsRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgcGFyZW4gPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYWxsRXhwcmVzc2lvblwiLCB7XG4gICAgICBjYWxsZWU6IHRoaXMudGVybSxcbiAgICAgIGFyZ3VtZW50czogcGFyZW4uaW5uZXIoKVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKSB7XG4gICAgbGV0IGVuZjtcbiAgICBpZiAodGhpcy5pc0lkZW50aWZpZXIodGhpcy5wZWVrKCkpKSB7XG4gICAgICBlbmYgPSBuZXcgRW5mb3Jlc3RlcihMaXN0Lm9mKHRoaXMuYWR2YW5jZSgpKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcCA9IHRoaXMubWF0Y2hQYXJlbnMoKTtcbiAgICAgIGVuZiA9IG5ldyBFbmZvcmVzdGVyKHAsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG4gICAgbGV0IHBhcmFtcyA9IGVuZi5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcbiAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignPT4nKTtcblxuICAgIGxldCBib2R5O1xuICAgIGlmICh0aGlzLmlzQnJhY2VzKHRoaXMucGVlaygpKSkge1xuICAgICAgYm9keSA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgYm9keSA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdBcnJvd0V4cHJlc3Npb24nLCB7IHBhcmFtcywgYm9keSB9KTtcbiAgfVxuXG5cbiAgZW5mb3Jlc3RZaWVsZEV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGt3ZCA9IHRoaXMubWF0Y2hLZXl3b3JkKCd5aWVsZCcpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcblxuICAgIGlmICh0aGlzLnJlc3Quc2l6ZSA9PT0gMCB8fCAobG9va2FoZWFkICYmICF0aGlzLmxpbmVOdW1iZXJFcShrd2QsIGxvb2thaGVhZCkpKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oJ1lpZWxkRXhwcmVzc2lvbicsIHtcbiAgICAgICAgZXhwcmVzc2lvbjogbnVsbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpc0dlbmVyYXRvciA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKHRoaXMucGVlaygpLCAnKicpKSB7XG4gICAgICAgICAgaXNHZW5lcmF0b3IgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfVxuICAgICAgbGV0IGV4cHIgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgbGV0IHR5cGUgPSBpc0dlbmVyYXRvciA/ICdZaWVsZEdlbmVyYXRvckV4cHJlc3Npb24nIDogJ1lpZWxkRXhwcmVzc2lvbic7XG4gICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgICBleHByZXNzaW9uOiBleHByXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBlbmZvcmVzdFN5bnRheFRlbXBsYXRlKCkge1xuICAgIHJldHVybiBuZXcgVGVybSgnU3ludGF4VGVtcGxhdGUnLCB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy5hZHZhbmNlKClcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0U3ludGF4UXVvdGUoKSB7XG4gICAgbGV0IG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1N5bnRheFF1b3RlJywge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHRlbXBsYXRlOiBuZXcgVGVybSgnVGVtcGxhdGVFeHByZXNzaW9uJywge1xuICAgICAgICB0YWc6IG5ldyBUZXJtKCdJZGVudGlmaWVyRXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH0pLFxuICAgICAgICBlbGVtZW50czogdGhpcy5lbmZvcmVzdFRlbXBsYXRlRWxlbWVudHMoKVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0U3RhdGljTWVtYmVyRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgb2JqZWN0ID0gdGhpcy50ZXJtO1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBwcm9wZXJ0eSA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBvYmplY3Q6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RBcnJheUV4cHJlc3Npb24oKSB7XG4gICAgbGV0IGFyciA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgbGV0IGVsZW1lbnRzID0gW107XG5cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoYXJyLmlubmVyKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcblxuICAgIHdoaWxlIChlbmYucmVzdC5zaXplID4gMCkge1xuICAgICAgbGV0IGxvb2thaGVhZCA9IGVuZi5wZWVrKCk7XG4gICAgICBpZiAoZW5mLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsIFwiLFwiKSkge1xuICAgICAgICBlbmYuYWR2YW5jZSgpO1xuICAgICAgICBlbGVtZW50cy5wdXNoKG51bGwpO1xuICAgICAgfSBlbHNlIGlmIChlbmYuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJy4uLicpKSB7XG4gICAgICAgIGVuZi5hZHZhbmNlKCk7XG4gICAgICAgIGxldCBleHByZXNzaW9uID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IGVuZi5jcmVhdGVFcnJvcihsb29rYWhlYWQsICdleHBlY3RpbmcgZXhwcmVzc2lvbicpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2gobmV3IFRlcm0oJ1NwcmVhZEVsZW1lbnQnLCB7IGV4cHJlc3Npb24gfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHRlcm0gPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICBpZiAodGVybSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgXCJleHBlY3RlZCBleHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2godGVybSk7XG4gICAgICAgIGVuZi5jb25zdW1lQ29tbWEoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUV4cHJlc3Npb25cIiwge1xuICAgICAgZWxlbWVudHM6IExpc3QoZWxlbWVudHMpXG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdE9iamVjdEV4cHJlc3Npb24oKSB7XG4gICAgbGV0IG9iaiA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgbGV0IHByb3BlcnRpZXMgPSBMaXN0KCk7XG5cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIob2JqLmlubmVyKCksIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcblxuICAgIGxldCBsYXN0UHJvcCA9IG51bGw7XG4gICAgd2hpbGUgKGVuZi5yZXN0LnNpemUgPiAwKSB7XG4gICAgICBsZXQgcHJvcCA9IGVuZi5lbmZvcmVzdFByb3BlcnR5RGVmaW5pdGlvbigpO1xuICAgICAgZW5mLmNvbnN1bWVDb21tYSgpO1xuICAgICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMuY29uY2F0KHByb3ApO1xuXG4gICAgICBpZiAobGFzdFByb3AgPT09IHByb3ApIHtcbiAgICAgICAgdGhyb3cgZW5mLmNyZWF0ZUVycm9yKHByb3AsIFwiaW52YWxpZCBzeW50YXggaW4gb2JqZWN0XCIpO1xuICAgICAgfVxuICAgICAgbGFzdFByb3AgPSBwcm9wO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEV4cHJlc3Npb25cIiwge1xuICAgICAgcHJvcGVydGllczogcHJvcGVydGllc1xuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RQcm9wZXJ0eURlZmluaXRpb24oKSB7XG5cbiAgICBsZXQge21ldGhvZE9yS2V5LCBraW5kfSA9IHRoaXMuZW5mb3Jlc3RNZXRob2REZWZpbml0aW9uKCk7XG5cbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgJ21ldGhvZCc6XG4gICAgICAgIHJldHVybiBtZXRob2RPcktleTtcbiAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgICBpZiAodGhpcy5pc0Fzc2lnbih0aGlzLnBlZWsoKSkpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICBsZXQgaW5pdCA9IHRoaXMuZW5mb3Jlc3RFeHByZXNzaW9uTG9vcCgpO1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcicsIHtcbiAgICAgICAgICAgIGluaXQsIGJpbmRpbmc6IHRoaXMudHJhbnNmb3JtRGVzdHJ1Y3R1cmluZyhtZXRob2RPcktleSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1B1bmN0dWF0b3IodGhpcy5wZWVrKCksICc6JykpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ1Nob3J0aGFuZFByb3BlcnR5Jywge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kT3JLZXkudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKCc6Jyk7XG4gICAgbGV0IGV4cHIgPSB0aGlzLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcblxuICAgIHJldHVybiBuZXcgVGVybShcIkRhdGFQcm9wZXJ0eVwiLCB7XG4gICAgICBuYW1lOiBtZXRob2RPcktleSxcbiAgICAgIGV4cHJlc3Npb246IGV4cHJcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0TWV0aG9kRGVmaW5pdGlvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgJyonKSkge1xuICAgICAgaXNHZW5lcmF0b3IgPSB0cnVlO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCwgJ2dldCcpICYmIHRoaXMuaXNQcm9wZXJ0eU5hbWUodGhpcy5wZWVrKDEpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBsZXQge25hbWV9ID0gdGhpcy5lbmZvcmVzdFByb3BlcnR5TmFtZSgpO1xuICAgICAgdGhpcy5tYXRjaFBhcmVucygpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kT3JLZXk6IG5ldyBUZXJtKCdHZXR0ZXInLCB7IG5hbWUsIGJvZHkgfSksXG4gICAgICAgIGtpbmQ6ICdtZXRob2QnXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXIobG9va2FoZWFkLCAnc2V0JykgJiYgdGhpcy5pc1Byb3BlcnR5TmFtZSh0aGlzLnBlZWsoMSkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxldCB7bmFtZX0gPSB0aGlzLmVuZm9yZXN0UHJvcGVydHlOYW1lKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGhpcy5tYXRjaFBhcmVucygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgcGFyYW0gPSBlbmYuZW5mb3Jlc3RCaW5kaW5nRWxlbWVudCgpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kT3JLZXk6IG5ldyBUZXJtKCdTZXR0ZXInLCB7IG5hbWUsIHBhcmFtLCBib2R5IH0pLFxuICAgICAgICBraW5kOiAnbWV0aG9kJ1xuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHtuYW1lfSA9IHRoaXMuZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAodGhpcy5pc1BhcmVucyh0aGlzLnBlZWsoKSkpIHtcbiAgICAgIGxldCBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIocGFyYW1zLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgZm9ybWFsUGFyYW1zID0gZW5mLmVuZm9yZXN0Rm9ybWFsUGFyYW1ldGVycygpO1xuXG4gICAgICBsZXQgYm9keSA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2RPcktleTogbmV3IFRlcm0oJ01ldGhvZCcsIHtcbiAgICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgICBuYW1lLCBwYXJhbXM6IGZvcm1hbFBhcmFtcywgYm9keVxuICAgICAgICB9KSxcbiAgICAgICAga2luZDogJ21ldGhvZCdcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtZXRob2RPcktleTogbmFtZSxcbiAgICAgIGtpbmQ6IHRoaXMuaXNJZGVudGlmaWVyKGxvb2thaGVhZCkgfHwgdGhpcy5pc0tleXdvcmQobG9va2FoZWFkKSA/ICdpZGVudGlmaWVyJyA6ICdwcm9wZXJ0eSdcbiAgICB9O1xuICB9XG5cbiAgZW5mb3Jlc3RQcm9wZXJ0eU5hbWUoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZCkgfHwgdGhpcy5pc051bWVyaWNMaXRlcmFsKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG5ldyBUZXJtKCdTdGF0aWNQcm9wZXJ0eU5hbWUnLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuYWR2YW5jZSgpXG4gICAgICAgIH0pLFxuICAgICAgICBiaW5kaW5nOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYWNrZXRzKGxvb2thaGVhZCkpIHtcbiAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcih0aGlzLm1hdGNoU3F1YXJlcygpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICBsZXQgZXhwciA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBuZXcgVGVybSgnQ29tcHV0ZWRQcm9wZXJ0eU5hbWUnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogZXhwclxuICAgICAgICB9KSxcbiAgICAgICAgYmluZGluZzogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmV3IFRlcm0oJ1N0YXRpY1Byb3BlcnR5TmFtZScsIHsgdmFsdWU6IG5hbWUgfSksXG4gICAgICBiaW5kaW5nOiBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7IG5hbWUgfSlcbiAgICB9O1xuICB9XG5cbiAgZW5mb3Jlc3RGdW5jdGlvbih7aXNFeHByLCBpbkRlZmF1bHR9KSB7XG4gICAgbGV0IG5hbWUgPSBudWxsLCBwYXJhbXMsIGJvZHk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgLy8gZWF0IHRoZSBmdW5jdGlvbiBrZXl3b3JkXG4gICAgbGV0IGZuS2V5d29yZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICBsZXQgdHlwZSA9IGlzRXhwciA/ICdGdW5jdGlvbkV4cHJlc3Npb24nIDogJ0Z1bmN0aW9uRGVjbGFyYXRpb24nO1xuXG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSB7XG4gICAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfSBlbHNlIGlmIChpbkRlZmF1bHQpIHtcbiAgICAgIG5hbWUgPSBuZXcgVGVybSgnQmluZGluZ0lkZW50aWZpZXInLCB7XG4gICAgICAgIG5hbWU6IFN5bnRheC5mcm9tSWRlbnRpZmllcignKmRlZmF1bHQqJywgZm5LZXl3b3JkKVxuICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG5cblxuICAgIGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuXG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHBhcmFtcywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXMgPSBlbmYuZW5mb3Jlc3RGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogZm9ybWFsUGFyYW1zLFxuICAgICAgYm9keTogYm9keVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGdW5jdGlvbkV4cHJlc3Npb24oKSB7XG4gICAgbGV0IG5hbWUgPSBudWxsLCBwYXJhbXMsIGJvZHk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgLy8gZWF0IHRoZSBmdW5jdGlvbiBrZXl3b3JkXG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1BhcmVucyhsb29rYWhlYWQpKSB7XG4gICAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG4gICAgfVxuXG4gICAgcGFyYW1zID0gdGhpcy5tYXRjaFBhcmVucygpO1xuICAgIGJvZHkgPSB0aGlzLm1hdGNoQ3VybGllcygpO1xuXG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHBhcmFtcywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBmb3JtYWxQYXJhbXMgPSBlbmYuZW5mb3Jlc3RGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGdW5jdGlvbkV4cHJlc3Npb25cIiwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogZm9ybWFsUGFyYW1zLFxuICAgICAgYm9keTogYm9keVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGdW5jdGlvbkRlY2xhcmF0aW9uKCkge1xuICAgIGxldCBuYW1lLCBwYXJhbXMsIGJvZHk7XG4gICAgbGV0IGlzR2VuZXJhdG9yID0gZmFsc2U7XG4gICAgLy8gZWF0IHRoZSBmdW5jdGlvbiBrZXl3b3JkXG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCIqXCIpKSB7XG4gICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBuYW1lID0gdGhpcy5lbmZvcmVzdEJpbmRpbmdJZGVudGlmaWVyKCk7XG5cbiAgICBwYXJhbXMgPSB0aGlzLm1hdGNoUGFyZW5zKCk7XG4gICAgYm9keSA9IHRoaXMubWF0Y2hDdXJsaWVzKCk7XG5cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIocGFyYW1zLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGZvcm1hbFBhcmFtcyA9IGVuZi5lbmZvcmVzdEZvcm1hbFBhcmFtZXRlcnMoKTtcblxuICAgIHJldHVybiBuZXcgVGVybShcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGlzR2VuZXJhdG9yOiBpc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogZm9ybWFsUGFyYW1zLFxuICAgICAgYm9keTogYm9keVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RGb3JtYWxQYXJhbWV0ZXJzKCkge1xuICAgIGxldCBpdGVtcyA9IFtdO1xuICAgIGxldCByZXN0ID0gbnVsbDtcbiAgICB3aGlsZSAodGhpcy5yZXN0LnNpemUgIT09IDApIHtcbiAgICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLnBlZWsoKTtcbiAgICAgIGlmICh0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcuLi4nKSkge1xuICAgICAgICB0aGlzLm1hdGNoUHVuY3R1YXRvcignLi4uJyk7XG4gICAgICAgIHJlc3QgPSB0aGlzLmVuZm9yZXN0QmluZGluZ0lkZW50aWZpZXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpdGVtcy5wdXNoKHRoaXMuZW5mb3Jlc3RQYXJhbSgpKTtcbiAgICAgIHRoaXMuY29uc3VtZUNvbW1hKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge1xuICAgICAgaXRlbXM6IExpc3QoaXRlbXMpLCByZXN0XG4gICAgfSk7XG4gIH1cblxuICBlbmZvcmVzdFBhcmFtKCkge1xuICAgIHJldHVybiB0aGlzLmVuZm9yZXN0QmluZGluZ0VsZW1lbnQoKTtcbiAgfVxuXG4gIGVuZm9yZXN0VXBkYXRlRXhwcmVzc2lvbigpIHtcbiAgICBsZXQgb3BlcmF0b3IgPSB0aGlzLm1hdGNoVW5hcnlPcGVyYXRvcigpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdVcGRhdGVFeHByZXNzaW9uJywge1xuICAgICAgaXNQcmVmaXg6IGZhbHNlLFxuICAgICAgb3BlcmF0b3I6IG9wZXJhdG9yLnZhbCgpLFxuICAgICAgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHRoaXMudGVybSlcbiAgICB9KTtcbiAgfVxuXG4gIGVuZm9yZXN0VW5hcnlFeHByZXNzaW9uKCkge1xuICAgIGxldCBvcGVyYXRvciA9IHRoaXMubWF0Y2hVbmFyeU9wZXJhdG9yKCk7XG4gICAgdGhpcy5vcEN0eC5zdGFjayA9IHRoaXMub3BDdHguc3RhY2sucHVzaCh7XG4gICAgICBwcmVjOiB0aGlzLm9wQ3R4LnByZWMsXG4gICAgICBjb21iaW5lOiB0aGlzLm9wQ3R4LmNvbWJpbmVcbiAgICB9KTtcbiAgICAvLyBUT0RPOiBhbGwgYnVpbHRpbnMgYXJlIDE0LCBjdXN0b20gb3BlcmF0b3JzIHdpbGwgY2hhbmdlIHRoaXNcbiAgICB0aGlzLm9wQ3R4LnByZWMgPSAxNDtcbiAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSByaWdodFRlcm0gPT4ge1xuICAgICAgaWYgKG9wZXJhdG9yLnZhbCgpID09PSAnKysnIHx8IG9wZXJhdG9yLnZhbCgpID09PSAnLS0nKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybSgnVXBkYXRlRXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IudmFsKCksXG4gICAgICAgICAgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1EZXN0cnVjdHVyaW5nKHJpZ2h0VGVybSksXG4gICAgICAgICAgaXNQcmVmaXg6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFRlcm0oJ1VuYXJ5RXhwcmVzc2lvbicsIHtcbiAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IudmFsKCksXG4gICAgICAgICAgb3BlcmFuZDogcmlnaHRUZXJtXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEVYUFJfTE9PUF9PUEVSQVRPUjtcbiAgfVxuXG4gIGVuZm9yZXN0Q29uZGl0aW9uYWxFeHByZXNzaW9uKCkge1xuICAgIC8vIGZpcnN0LCBwb3AgdGhlIG9wZXJhdG9yIHN0YWNrXG4gICAgbGV0IHRlc3QgPSB0aGlzLm9wQ3R4LmNvbWJpbmUodGhpcy50ZXJtKTtcbiAgICBpZiAodGhpcy5vcEN0eC5zdGFjay5zaXplID4gMCkge1xuICAgICAgbGV0IHsgcHJlYywgY29tYmluZSB9ID0gdGhpcy5vcEN0eC5zdGFjay5sYXN0KCk7XG4gICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IHByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgIH1cblxuICAgIHRoaXMubWF0Y2hQdW5jdHVhdG9yKCc/Jyk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRoaXMucmVzdCwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBjb25zZXF1ZW50ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICBlbmYubWF0Y2hQdW5jdHVhdG9yKCc6Jyk7XG4gICAgZW5mID0gbmV3IEVuZm9yZXN0ZXIoZW5mLnJlc3QsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYWx0ZXJuYXRlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICB0aGlzLnJlc3QgPSBlbmYucmVzdDtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbicsIHtcbiAgICAgIHRlc3QsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZVxuICAgIH0pO1xuICB9XG5cbiAgZW5mb3Jlc3RCaW5hcnlFeHByZXNzaW9uKCkge1xuXG4gICAgbGV0IGxlZnRUZXJtID0gdGhpcy50ZXJtO1xuICAgIGxldCBvcFN0eCA9IHRoaXMucGVlaygpO1xuICAgIGxldCBvcCA9IG9wU3R4LnZhbCgpO1xuICAgIGxldCBvcFByZWMgPSBnZXRPcGVyYXRvclByZWMob3ApO1xuICAgIGxldCBvcEFzc29jID0gZ2V0T3BlcmF0b3JBc3NvYyhvcCk7XG5cbiAgICBpZiAob3BlcmF0b3JMdCh0aGlzLm9wQ3R4LnByZWMsIG9wUHJlYywgb3BBc3NvYykpIHtcbiAgICAgIHRoaXMub3BDdHguc3RhY2sgPSB0aGlzLm9wQ3R4LnN0YWNrLnB1c2goe1xuICAgICAgICBwcmVjOiB0aGlzLm9wQ3R4LnByZWMsXG4gICAgICAgIGNvbWJpbmU6IHRoaXMub3BDdHguY29tYmluZVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9wQ3R4LnByZWMgPSBvcFByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSAocmlnaHRUZXJtKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGxlZnQ6IGxlZnRUZXJtLFxuICAgICAgICAgIG9wZXJhdG9yOiBvcFN0eCxcbiAgICAgICAgICByaWdodDogcmlnaHRUZXJtXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIEVYUFJfTE9PUF9PUEVSQVRPUjtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRlcm0gPSB0aGlzLm9wQ3R4LmNvbWJpbmUobGVmdFRlcm0pO1xuICAgICAgLy8gdGhpcy5yZXN0IGRvZXMgbm90IGNoYW5nZVxuICAgICAgbGV0IHsgcHJlYywgY29tYmluZSB9ID0gdGhpcy5vcEN0eC5zdGFjay5sYXN0KCk7XG4gICAgICB0aGlzLm9wQ3R4LnN0YWNrID0gdGhpcy5vcEN0eC5zdGFjay5wb3AoKTtcbiAgICAgIHRoaXMub3BDdHgucHJlYyA9IHByZWM7XG4gICAgICB0aGlzLm9wQ3R4LmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICB9XG5cbiAgZW5mb3Jlc3RUZW1wbGF0ZUVsZW1lbnRzKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLm1hdGNoVGVtcGxhdGUoKTtcbiAgICBsZXQgZWxlbWVudHMgPSBsb29rYWhlYWQudG9rZW4uaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKGl0KSkge1xuICAgICAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIoaXQuaW5uZXIoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICByZXR1cm4gZW5mLmVuZm9yZXN0KFwiZXhwcmVzc2lvblwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVGVybSgnVGVtcGxhdGVFbGVtZW50Jywge1xuICAgICAgICByYXdWYWx1ZTogaXQuc2xpY2UudGV4dFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9XG5cbiAgZXhwYW5kTWFjcm8oKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuICAgIHdoaWxlICh0aGlzLmlzQ29tcGlsZXRpbWVUcmFuc2Zvcm0obG9va2FoZWFkKSkge1xuICAgICAgbGV0IG5hbWUgPSB0aGlzLmFkdmFuY2UoKTtcblxuICAgICAgbGV0IHN5bnRheFRyYW5zZm9ybSA9IHRoaXMuZ2V0RnJvbUNvbXBpbGV0aW1lRW52aXJvbm1lbnQobmFtZSk7XG4gICAgICBpZiAoc3ludGF4VHJhbnNmb3JtID09IG51bGwgfHwgdHlwZW9mIHN5bnRheFRyYW5zZm9ybS52YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSxcbiAgICAgICAgICBcInRoZSBtYWNybyBuYW1lIHdhcyBub3QgYm91bmQgdG8gYSB2YWx1ZSB0aGF0IGNvdWxkIGJlIGludm9rZWRcIik7XG4gICAgICB9XG4gICAgICBsZXQgdXNlU2l0ZVNjb3BlID0gZnJlc2hTY29wZShcInVcIik7XG4gICAgICBsZXQgaW50cm9kdWNlZFNjb3BlID0gZnJlc2hTY29wZShcImlcIik7XG4gICAgICAvLyBUT0RPOiBuZWVkcyB0byBiZSBhIGxpc3Qgb2Ygc2NvcGVzIEkgdGhpbmtcbiAgICAgIHRoaXMuY29udGV4dC51c2VTY29wZSA9IHVzZVNpdGVTY29wZTtcblxuICAgICAgbGV0IGN0eCA9IG5ldyBNYWNyb0NvbnRleHQodGhpcywgbmFtZSwgdGhpcy5jb250ZXh0LCB1c2VTaXRlU2NvcGUsIGludHJvZHVjZWRTY29wZSk7XG5cbiAgICAgIGxldCByZXN1bHQgPSBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKHN5bnRheFRyYW5zZm9ybS52YWx1ZS5jYWxsKG51bGwsIGN0eCkpO1xuICAgICAgaWYgKCFMaXN0LmlzTGlzdChyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobmFtZSwgXCJtYWNybyBtdXN0IHJldHVybiBhIGxpc3QgYnV0IGdvdDogXCIgKyByZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChzdHggPT4ge1xuICAgICAgICBpZiAoIShzdHggJiYgdHlwZW9mIHN0eC5hZGRTY29wZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKG5hbWUsICdtYWNybyBtdXN0IHJldHVybiBzeW50YXggb2JqZWN0cyBvciB0ZXJtcyBidXQgZ290OiAnICsgc3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3R4LmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTLCB7IGZsaXA6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZXN0ID0gcmVzdWx0LmNvbmNhdChjdHguX3Jlc3QodGhpcykpO1xuICAgICAgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3VtZVNlbWljb2xvbigpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5wZWVrKCk7XG5cbiAgICBpZiAobG9va2FoZWFkICYmIHRoaXMuaXNQdW5jdHVhdG9yKGxvb2thaGVhZCwgXCI7XCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdW1lQ29tbWEoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMucGVlaygpO1xuXG4gICAgaWYgKGxvb2thaGVhZCAmJiB0aGlzLmlzUHVuY3R1YXRvcihsb29rYWhlYWQsICcsJykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNhZmVDaGVjayhvYmosIHR5cGUsIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gb2JqICYmICh0eXBlb2Ygb2JqLm1hdGNoID09PSAnZnVuY3Rpb24nID8gb2JqLm1hdGNoKHR5cGUsIHZhbCkgOiBmYWxzZSk7XG4gIH1cblxuICBpc1Rlcm0odGVybSkge1xuICAgIHJldHVybiB0ZXJtICYmICh0ZXJtIGluc3RhbmNlb2YgVGVybSk7XG4gIH1cblxuICBpc0VPRihvYmopIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnZW9mJyk7XG4gIH1cblxuICBpc0lkZW50aWZpZXIob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2lkZW50aWZpZXInLCB2YWwpO1xuICB9XG5cbiAgaXNQcm9wZXJ0eU5hbWUob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJZGVudGlmaWVyKG9iaikgfHwgdGhpcy5pc0tleXdvcmQob2JqKSB8fFxuICAgICAgICAgICB0aGlzLmlzTnVtZXJpY0xpdGVyYWwob2JqKSB8fCB0aGlzLmlzU3RyaW5nTGl0ZXJhbChvYmopIHx8IHRoaXMuaXNCcmFja2V0cyhvYmopO1xuICB9XG5cbiAgaXNOdW1lcmljTGl0ZXJhbChvYmosIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnbnVtYmVyJywgdmFsKTtcbiAgfVxuXG4gIGlzU3RyaW5nTGl0ZXJhbChvYmosIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnc3RyaW5nJywgdmFsKTtcbiAgfVxuXG4gIGlzVGVtcGxhdGUob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ3RlbXBsYXRlJywgdmFsKTtcbiAgfVxuXG4gIGlzU3ludGF4VGVtcGxhdGUob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ3N5bnRheFRlbXBsYXRlJyk7XG4gIH1cblxuICBpc0Jvb2xlYW5MaXRlcmFsKG9iaiwgdmFsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdib29sZWFuJywgdmFsKTtcbiAgfVxuXG4gIGlzTnVsbExpdGVyYWwob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ251bGwnLCB2YWwpO1xuICB9XG5cbiAgaXNSZWd1bGFyRXhwcmVzc2lvbihvYmosIHZhbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAncmVndWxhckV4cHJlc3Npb24nLCB2YWwpO1xuICB9XG5cbiAgaXNEZWxpbWl0ZXIob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2RlbGltaXRlcicpO1xuICB9XG5cbiAgaXNQYXJlbnMob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ3BhcmVucycpO1xuICB9XG5cbiAgaXNCcmFjZXMob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2JyYWNlcycpO1xuICB9XG5cbiAgaXNCcmFja2V0cyhvYmopIHtcbiAgICByZXR1cm4gdGhpcy5zYWZlQ2hlY2sob2JqLCAnYnJhY2tldHMnKTtcbiAgfVxuXG4gIGlzQXNzaWduKG9iaiwgdmFsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdhc3NpZ24nLCB2YWwpO1xuICB9XG5cblxuICBpc0tleXdvcmQob2JqLCB2YWwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2tleXdvcmQnLCB2YWwpO1xuICB9XG5cbiAgaXNQdW5jdHVhdG9yKG9iaiwgdmFsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdwdW5jdHVhdG9yJywgdmFsKTtcbiAgfVxuXG4gIGlzT3BlcmF0b3Iob2JqKSB7XG4gICAgcmV0dXJuICh0aGlzLnNhZmVDaGVjayhvYmosICdwdW5jdHVhdG9yJykgfHxcbiAgICAgICAgICAgIHRoaXMuc2FmZUNoZWNrKG9iaiwgJ2lkZW50aWZpZXInKSB8fFxuICAgICAgICAgICAgdGhpcy5zYWZlQ2hlY2sob2JqLCAna2V5d29yZCcpKSAmJiBpc09wZXJhdG9yKG9iaik7XG4gIH1cblxuICBpc1VwZGF0ZU9wZXJhdG9yKG9iaikge1xuICAgIHJldHVybiB0aGlzLnNhZmVDaGVjayhvYmosICdwdW5jdHVhdG9yJywgJysrJykgfHxcbiAgICAgICAgICAgdGhpcy5zYWZlQ2hlY2sob2JqLCAncHVuY3R1YXRvcicsICctLScpO1xuICB9XG5cbiAgc2FmZVJlc29sdmUob2JqLCBwaGFzZSkge1xuICAgIHJldHVybiAob2JqICYmIHR5cGVvZiBvYmoucmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJykgPyBKdXN0KG9iai5yZXNvbHZlKHBoYXNlKSkgOiBOb3RoaW5nKCk7XG4gIH1cblxuICBpc1RyYW5zZm9ybShvYmosIHRyYW5zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZVJlc29sdmUob2JqLCB0aGlzLmNvbnRleHQucGhhc2UpXG4gICAgICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5jb250ZXh0LmVudi5nZXQobmFtZSkgPT09IHRyYW5zIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0b3JlLmdldChuYW1lKSA9PT0gdHJhbnMpXG4gICAgICAgICAgICAgICAuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuXG4gIGlzVHJhbnNmb3JtSW5zdGFuY2Uob2JqLCB0cmFucykge1xuICAgIHJldHVybiB0aGlzLnNhZmVSZXNvbHZlKG9iaiwgdGhpcy5jb250ZXh0LnBoYXNlKVxuICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuY29udGV4dC5lbnYuZ2V0KG5hbWUpIGluc3RhbmNlb2YgdHJhbnMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3RvcmUuZ2V0KG5hbWUpIGluc3RhbmNlb2YgdHJhbnMpXG4gICAgICAgICAgICAgICAuZ2V0T3JFbHNlKGZhbHNlKTtcbiAgfVxuXG4gIGlzRm5EZWNsVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgRnVuY3Rpb25EZWNsVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzVmFyRGVjbFRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc0xldERlY2xUcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqLCBMZXREZWNsVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzQ29uc3REZWNsVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgQ29uc3REZWNsVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzU3ludGF4RGVjbFRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFN5bnRheERlY2xUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNTeW50YXhyZWNEZWNsVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1N5bnRheFF1b3RlVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgU3ludGF4UXVvdGVUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNSZXR1cm5TdG10VHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgUmV0dXJuU3RhdGVtZW50VHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzV2hpbGVUcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqLCBXaGlsZVRyYW5zZm9ybSk7XG4gIH1cblxuICBpc0ZvclRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIEZvclRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1N3aXRjaFRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFN3aXRjaFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc0JyZWFrVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgQnJlYWtUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNDb250aW51ZVRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIENvbnRpbnVlVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzRG9UcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm0ob2JqLCBEb1RyYW5zZm9ybSk7XG4gIH1cblxuICBpc0RlYnVnZ2VyVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgRGVidWdnZXJUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNXaXRoVHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgV2l0aFRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1RyeVRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIFRyeVRyYW5zZm9ybSk7XG4gIH1cblxuICBpc1Rocm93VHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgVGhyb3dUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaXNJZlRyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybShvYmosIElmVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzTmV3VHJhbnNmb3JtKG9iaikge1xuICAgIHJldHVybiB0aGlzLmlzVHJhbnNmb3JtKG9iaiwgTmV3VHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzQ29tcGlsZXRpbWVUcmFuc2Zvcm0ob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmFuc2Zvcm1JbnN0YW5jZShvYmosIENvbXBpbGV0aW1lVHJhbnNmb3JtKTtcbiAgfVxuXG4gIGlzVmFyQmluZGluZ1RyYW5zZm9ybShvYmopIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyYW5zZm9ybUluc3RhbmNlKG9iaiwgVmFyQmluZGluZ1RyYW5zZm9ybSk7XG4gIH1cblxuICBnZXRGcm9tQ29tcGlsZXRpbWVFbnZpcm9ubWVudCh0ZXJtKSB7XG4gICAgaWYgKHRoaXMuY29udGV4dC5lbnYuaGFzKHRlcm0ucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5lbnYuZ2V0KHRlcm0ucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5zdG9yZS5nZXQodGVybS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkpO1xuICB9XG5cbiAgbGluZU51bWJlckVxKGEsIGIpIHtcbiAgICBpZiAoIShhICYmIGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhLmxpbmVOdW1iZXIoKSA9PT0gYi5saW5lTnVtYmVyKCk7XG4gIH1cblxuICBtYXRjaElkZW50aWZpZXIodmFsKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzSWRlbnRpZmllcihsb29rYWhlYWQsIHZhbCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhbiBpZGVudGlmaWVyXCIpO1xuICB9XG5cbiAgbWF0Y2hLZXl3b3JkKHZhbCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc0tleXdvcmQobG9va2FoZWFkLCB2YWwpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyAnICsgdmFsKTtcbiAgfVxuXG4gIG1hdGNoTGl0ZXJhbCgpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNOdW1lcmljTGl0ZXJhbChsb29rYWhlYWQpIHx8XG4gICAgICAgIHRoaXMuaXNTdHJpbmdMaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc0Jvb2xlYW5MaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc051bGxMaXRlcmFsKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZCkgfHxcbiAgICAgICAgdGhpcy5pc1JlZ3VsYXJFeHByZXNzaW9uKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhIGxpdGVyYWxcIik7XG4gIH1cblxuICBtYXRjaFN0cmluZ0xpdGVyYWwoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzU3RyaW5nTGl0ZXJhbChsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgJ2V4cGVjdGluZyBhIHN0cmluZyBsaXRlcmFsJyk7XG4gIH1cblxuICBtYXRjaFRlbXBsYXRlKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1RlbXBsYXRlKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCAnZXhwZWN0aW5nIGEgdGVtcGxhdGUgbGl0ZXJhbCcpO1xuICB9XG5cbiAgbWF0Y2hQYXJlbnMoKSB7XG4gICAgbGV0IGxvb2thaGVhZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIGlmICh0aGlzLmlzUGFyZW5zKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQuaW5uZXIoKTtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwiZXhwZWN0aW5nIHBhcmVuc1wiKTtcbiAgfVxuXG4gIG1hdGNoQ3VybGllcygpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNCcmFjZXMobG9va2FoZWFkKSkge1xuICAgICAgcmV0dXJuIGxvb2thaGVhZC5pbm5lcigpO1xuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGxvb2thaGVhZCwgXCJleHBlY3RpbmcgY3VybHkgYnJhY2VzXCIpO1xuICB9XG4gIG1hdGNoU3F1YXJlcygpIHtcbiAgICBsZXQgbG9va2FoZWFkID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgaWYgKHRoaXMuaXNCcmFja2V0cyhsb29rYWhlYWQpKSB7XG4gICAgICByZXR1cm4gbG9va2FoZWFkLmlubmVyKCk7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBzcWF1cmUgYnJhY2VzXCIpO1xuICB9XG5cbiAgbWF0Y2hVbmFyeU9wZXJhdG9yKCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAoaXNVbmFyeU9wZXJhdG9yKGxvb2thaGVhZCkpIHtcbiAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgfVxuICAgIHRocm93IHRoaXMuY3JlYXRlRXJyb3IobG9va2FoZWFkLCBcImV4cGVjdGluZyBhIHVuYXJ5IG9wZXJhdG9yXCIpO1xuICB9XG5cbiAgbWF0Y2hQdW5jdHVhdG9yKHZhbCkge1xuICAgIGxldCBsb29rYWhlYWQgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5pc1B1bmN0dWF0b3IobG9va2FoZWFkKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChsb29rYWhlYWQudmFsKCkgPT09IHZhbCkge1xuICAgICAgICAgIHJldHVybiBsb29rYWhlYWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsXG4gICAgICAgICAgICBcImV4cGVjdGluZyBhIFwiICsgdmFsICsgXCIgcHVuY3R1YXRvclwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxvb2thaGVhZDtcbiAgICB9XG4gICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwiZXhwZWN0aW5nIGEgcHVuY3R1YXRvclwiKTtcbiAgfVxuXG4gIGNyZWF0ZUVycm9yKHN0eCwgbWVzc2FnZSkge1xuICAgIGxldCBjdHggPSBcIlwiO1xuICAgIGxldCBvZmZlbmRpbmcgPSBzdHg7XG4gICAgaWYgKHRoaXMucmVzdC5zaXplID4gMCkge1xuICAgICAgY3R4ID0gdGhpcy5yZXN0LnNsaWNlKDAsIDIwKS5tYXAodGVybSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKHRlcm0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRlcm0uaW5uZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTGlzdC5vZih0ZXJtKTtcbiAgICAgIH0pLmZsYXR0ZW4oKS5tYXAocyA9PiB7XG4gICAgICAgIGlmIChzID09PSBvZmZlbmRpbmcpIHtcbiAgICAgICAgICByZXR1cm4gXCJfX1wiICsgcy52YWwoKSArIFwiX19cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcy52YWwoKTtcbiAgICAgIH0pLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHggPSBvZmZlbmRpbmcudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcihtZXNzYWdlICsgXCJcXG5cIiArIGN0eCk7XG5cbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/env.js b/dist/env.js index a2721a29..50b5cc7d 100644 --- a/dist/env.js +++ b/dist/env.js @@ -30,15 +30,18 @@ class Env { this.map.set("throw", _transforms.ThrowTransform); this.map.set("new", _transforms.NewTransform); } - has(key_332) { - return this.map.has(key_332); + + has(key) { + return this.map.has(key); } - get(key_333) { - return this.map.get(key_333); + + get(key) { + return this.map.get(key); } - set(key_334, val_335) { - return this.map.set(key_334, val_335); + + set(key, val) { + return this.map.set(key, val); } } exports.default = Env; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2Vudi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDZSxNQUFNLEdBQU4sQ0FBVTtBQUN2QixnQkFBYztBQUNaLFNBQUssR0FBTCxHQUFXLElBQUksR0FBSixFQUFYO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFVBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsS0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsYUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxXQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFFBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsUUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxPQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLElBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsS0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxRQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsVUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxJQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFVBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsTUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsS0FBYjtBQUNEO0FBQ0QsTUFBSSxPQUFKLEVBQWE7QUFDWCxXQUFPLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxPQUFiLENBQVA7QUFDRDtBQUNELE1BQUksT0FBSixFQUFhO0FBQ1gsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYixDQUFQO0FBQ0Q7QUFDRCxNQUFJLE9BQUosRUFBYSxPQUFiLEVBQXNCO0FBQ3BCLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWIsRUFBc0IsT0FBdEIsQ0FBUDtBQUNEO0FBaENzQjtrQkFBSixHIiwiZmlsZSI6ImVudi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RnVuY3Rpb25EZWNsVHJhbnNmb3JtLCBWYXJpYWJsZURlY2xUcmFuc2Zvcm0sIExldERlY2xUcmFuc2Zvcm0sIENvbnN0RGVjbFRyYW5zZm9ybSwgU3ludGF4RGVjbFRyYW5zZm9ybSwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSwgU3ludGF4UXVvdGVUcmFuc2Zvcm0sIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSwgSWZUcmFuc2Zvcm0sIEZvclRyYW5zZm9ybSwgU3dpdGNoVHJhbnNmb3JtLCBCcmVha1RyYW5zZm9ybSwgQ29udGludWVUcmFuc2Zvcm0sIERvVHJhbnNmb3JtLCBEZWJ1Z2dlclRyYW5zZm9ybSwgV2l0aFRyYW5zZm9ybSwgVHJ5VHJhbnNmb3JtLCBUaHJvd1RyYW5zZm9ybSwgTmV3VHJhbnNmb3JtLCBXaGlsZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW52IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwO1xuICAgIHRoaXMubWFwLnNldChcImZ1bmN0aW9uXCIsIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwidmFyXCIsIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwibGV0XCIsIExldERlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImNvbnN0XCIsIENvbnN0RGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwic3ludGF4UXVvdGVcIiwgU3ludGF4UXVvdGVUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInN5bnRheHJlY1wiLCBTeW50YXhyZWNEZWNsVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJzeW50YXhcIiwgU3ludGF4RGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwicmV0dXJuXCIsIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwid2hpbGVcIiwgV2hpbGVUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImlmXCIsIElmVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJmb3JcIiwgRm9yVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJzd2l0Y2hcIiwgU3dpdGNoVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJicmVha1wiLCBCcmVha1RyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiY29udGludWVcIiwgQ29udGludWVUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImRvXCIsIERvVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJkZWJ1Z2dlclwiLCBEZWJ1Z2dlclRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwid2l0aFwiLCBXaXRoVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJ0cnlcIiwgVHJ5VHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJ0aHJvd1wiLCBUaHJvd1RyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwibmV3XCIsIE5ld1RyYW5zZm9ybSk7XG4gIH1cbiAgaGFzKGtleV8zMzIpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleV8zMzIpO1xuICB9XG4gIGdldChrZXlfMzMzKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXlfMzMzKTtcbiAgfVxuICBzZXQoa2V5XzMzNCwgdmFsXzMzNSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoa2V5XzMzNCwgdmFsXzMzNSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBdUJlLE1BQU0sR0FBTixDQUFVO0FBQ3ZCLGdCQUFjO0FBQ1osU0FBSyxHQUFMLEdBQVcsSUFBSSxHQUFKLEVBQVg7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsVUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxhQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFdBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsUUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxRQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsSUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLFFBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxVQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLElBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsVUFBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxNQUFiO0FBQ0EsU0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYjtBQUNBLFNBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiO0FBQ0Q7O0FBRUQsTUFBSSxHQUFKLEVBQVM7QUFDUCxXQUFPLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxHQUFiLENBQVA7QUFDRDs7QUFFRCxNQUFJLEdBQUosRUFBUztBQUNQLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEdBQWIsQ0FBUDtBQUNEOztBQUVELE1BQUksR0FBSixFQUFTLEdBQVQsRUFBYztBQUNaLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEdBQWIsRUFBa0IsR0FBbEIsQ0FBUDtBQUNEO0FBbkNzQjtrQkFBSixHIiwiZmlsZSI6ImVudi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybSxcbiAgVmFyaWFibGVEZWNsVHJhbnNmb3JtLFxuICBMZXREZWNsVHJhbnNmb3JtLFxuICBDb25zdERlY2xUcmFuc2Zvcm0sXG4gIFN5bnRheERlY2xUcmFuc2Zvcm0sXG4gIFN5bnRheHJlY0RlY2xUcmFuc2Zvcm0sXG4gIFN5bnRheFF1b3RlVHJhbnNmb3JtLFxuICBSZXR1cm5TdGF0ZW1lbnRUcmFuc2Zvcm0sXG4gIElmVHJhbnNmb3JtLFxuICBGb3JUcmFuc2Zvcm0sXG4gIFN3aXRjaFRyYW5zZm9ybSxcbiAgQnJlYWtUcmFuc2Zvcm0sXG4gIENvbnRpbnVlVHJhbnNmb3JtLFxuICBEb1RyYW5zZm9ybSxcbiAgRGVidWdnZXJUcmFuc2Zvcm0sXG4gIFdpdGhUcmFuc2Zvcm0sXG4gIFRyeVRyYW5zZm9ybSxcbiAgVGhyb3dUcmFuc2Zvcm0sXG4gIE5ld1RyYW5zZm9ybSxcbiAgV2hpbGVUcmFuc2Zvcm1cbn0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbnYge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJmdW5jdGlvblwiLCBGdW5jdGlvbkRlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInZhclwiLCBWYXJpYWJsZURlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImxldFwiLCBMZXREZWNsVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJjb25zdFwiLCBDb25zdERlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInN5bnRheFF1b3RlXCIsIFN5bnRheFF1b3RlVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJzeW50YXhyZWNcIiwgU3ludGF4cmVjRGVjbFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwic3ludGF4XCIsIFN5bnRheERlY2xUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcInJldHVyblwiLCBSZXR1cm5TdGF0ZW1lbnRUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcIndoaWxlXCIsIFdoaWxlVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJpZlwiLCBJZlRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiZm9yXCIsIEZvclRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwic3dpdGNoXCIsIFN3aXRjaFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiYnJlYWtcIiwgQnJlYWtUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcImNvbnRpbnVlXCIsIENvbnRpbnVlVHJhbnNmb3JtKTtcbiAgICB0aGlzLm1hcC5zZXQoXCJkb1wiLCBEb1RyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwiZGVidWdnZXJcIiwgRGVidWdnZXJUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcIndpdGhcIiwgV2l0aFRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwidHJ5XCIsIFRyeVRyYW5zZm9ybSk7XG4gICAgdGhpcy5tYXAuc2V0KFwidGhyb3dcIiwgVGhyb3dUcmFuc2Zvcm0pO1xuICAgIHRoaXMubWFwLnNldChcIm5ld1wiLCBOZXdUcmFuc2Zvcm0pO1xuICB9XG5cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXMoa2V5KTtcbiAgfVxuXG4gIGdldChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KGtleSk7XG4gIH1cblxuICBzZXQoa2V5LCB2YWwpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuc2V0KGtleSwgdmFsKTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/errors.js b/dist/errors.js index 6d9664b4..9f5ffe92 100644 --- a/dist/errors.js +++ b/dist/errors.js @@ -3,26 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true }); -function expect_336(cond_338, message_339, offendingSyntax_340, rest_341) { - if (!cond_338) { +exports.expect = expect; +exports.assert = assert; +function expect(cond, message, offendingSyntax, rest) { + if (!cond) { let ctx = ""; - if (rest_341) { - let ctx = rest_341.slice(0, 20).map(s_342 => { - let val_343 = s_342.isDelimiter() ? "( ... )" : s_342.val(); - if (s_342 === offendingSyntax_340) { - return "__" + val_343 + "__"; + if (rest) { + ctx = rest.slice(0, 20).map(s => { + let val = s.isDelimiter() ? "( ... )" : s.val(); + if (s === offendingSyntax) { + return "__" + val + "__"; } - return val_343; + return val; }).join(" "); } - throw new Error("[error]: " + message_339 + "\n" + ctx); + throw new Error("[error]: " + message + "\n" + ctx); } } -function assert_337(cond_344, message_345) { - if (!cond_344) { - throw new Error("[assertion error]: " + message_345); + +function assert(cond, message) { + if (!cond) { + throw new Error("[assertion error]: " + message); } } -exports.expect = expect_336; -exports.assert = assert_337; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2Vycm9ycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLFNBQVMsVUFBVCxDQUFvQixRQUFwQixFQUE4QixXQUE5QixFQUEyQyxtQkFBM0MsRUFBZ0UsUUFBaEUsRUFBMEU7QUFDeEUsTUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLFFBQUksTUFBTSxFQUFWO0FBQ0EsUUFBSSxRQUFKLEVBQWM7QUFDWixVQUFJLE1BQU0sU0FBUyxLQUFULENBQWUsQ0FBZixFQUFrQixFQUFsQixFQUFzQixHQUF0QixDQUEwQixTQUFTO0FBQzNDLFlBQUksVUFBVSxNQUFNLFdBQU4sS0FBc0IsU0FBdEIsR0FBa0MsTUFBTSxHQUFOLEVBQWhEO0FBQ0EsWUFBSSxVQUFVLG1CQUFkLEVBQW1DO0FBQ2pDLGlCQUFPLE9BQU8sT0FBUCxHQUFpQixJQUF4QjtBQUNEO0FBQ0QsZUFBTyxPQUFQO0FBQ0QsT0FOUyxFQU1QLElBTk8sQ0FNRixHQU5FLENBQVY7QUFPRDtBQUNELFVBQU0sSUFBSSxLQUFKLENBQVUsY0FBYyxXQUFkLEdBQTRCLElBQTVCLEdBQW1DLEdBQTdDLENBQU47QUFDRDtBQUNGO0FBQ0QsU0FBUyxVQUFULENBQW9CLFFBQXBCLEVBQThCLFdBQTlCLEVBQTJDO0FBQ3pDLE1BQUksQ0FBQyxRQUFMLEVBQWU7QUFDYixVQUFNLElBQUksS0FBSixDQUFVLHdCQUF3QixXQUFsQyxDQUFOO0FBQ0Q7QUFDRjtRQUNxQixNLEdBQWQsVTtRQUNjLE0sR0FBZCxVIiwiZmlsZSI6ImVycm9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGV4cGVjdF8zMzYoY29uZF8zMzgsIG1lc3NhZ2VfMzM5LCBvZmZlbmRpbmdTeW50YXhfMzQwLCByZXN0XzM0MSkge1xuICBpZiAoIWNvbmRfMzM4KSB7XG4gICAgbGV0IGN0eCA9IFwiXCI7XG4gICAgaWYgKHJlc3RfMzQxKSB7XG4gICAgICBsZXQgY3R4ID0gcmVzdF8zNDEuc2xpY2UoMCwgMjApLm1hcChzXzM0MiA9PiB7XG4gICAgICAgIGxldCB2YWxfMzQzID0gc18zNDIuaXNEZWxpbWl0ZXIoKSA/IFwiKCAuLi4gKVwiIDogc18zNDIudmFsKCk7XG4gICAgICAgIGlmIChzXzM0MiA9PT0gb2ZmZW5kaW5nU3ludGF4XzM0MCkge1xuICAgICAgICAgIHJldHVybiBcIl9fXCIgKyB2YWxfMzQzICsgXCJfX1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxfMzQzO1xuICAgICAgfSkuam9pbihcIiBcIik7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIltlcnJvcl06IFwiICsgbWVzc2FnZV8zMzkgKyBcIlxcblwiICsgY3R4KTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0XzMzNyhjb25kXzM0NCwgbWVzc2FnZV8zNDUpIHtcbiAgaWYgKCFjb25kXzM0NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlthc3NlcnRpb24gZXJyb3JdOiBcIiArIG1lc3NhZ2VfMzQ1KTtcbiAgfVxufVxuZXhwb3J0IHtleHBlY3RfMzM2IGFzIGV4cGVjdH07XG5leHBvcnQge2Fzc2VydF8zMzcgYXMgYXNzZXJ0fSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFBZ0IsTSxHQUFBLE07UUFnQkEsTSxHQUFBLE07QUFoQlQsU0FBUyxNQUFULENBQWdCLElBQWhCLEVBQXNCLE9BQXRCLEVBQStCLGVBQS9CLEVBQWdELElBQWhELEVBQXNEO0FBQzNELE1BQUksQ0FBQyxJQUFMLEVBQVc7QUFDVCxRQUFJLE1BQU0sRUFBVjtBQUNBLFFBQUksSUFBSixFQUFVO0FBQ1IsWUFBTSxLQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsRUFBZCxFQUFrQixHQUFsQixDQUFzQixLQUFLO0FBQy9CLFlBQUksTUFBTSxFQUFFLFdBQUYsS0FBa0IsU0FBbEIsR0FBOEIsRUFBRSxHQUFGLEVBQXhDO0FBQ0EsWUFBSSxNQUFNLGVBQVYsRUFBMkI7QUFDekIsaUJBQU8sT0FBTyxHQUFQLEdBQWEsSUFBcEI7QUFDRDtBQUNELGVBQU8sR0FBUDtBQUNELE9BTkssRUFNSCxJQU5HLENBTUUsR0FORixDQUFOO0FBT0Q7QUFDRCxVQUFNLElBQUksS0FBSixDQUFVLGNBQWMsT0FBZCxHQUF3QixJQUF4QixHQUErQixHQUF6QyxDQUFOO0FBQ0Q7QUFDRjs7QUFFTSxTQUFTLE1BQVQsQ0FBZ0IsSUFBaEIsRUFBc0IsT0FBdEIsRUFBK0I7QUFDcEMsTUFBSSxDQUFDLElBQUwsRUFBVztBQUNULFVBQU0sSUFBSSxLQUFKLENBQVUsd0JBQXdCLE9BQWxDLENBQU47QUFDRDtBQUNGIiwiZmlsZSI6ImVycm9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBleHBlY3QoY29uZCwgbWVzc2FnZSwgb2ZmZW5kaW5nU3ludGF4LCByZXN0KSB7XG4gIGlmICghY29uZCkge1xuICAgIGxldCBjdHggPSBcIlwiO1xuICAgIGlmIChyZXN0KSB7XG4gICAgICBjdHggPSByZXN0LnNsaWNlKDAsIDIwKS5tYXAocyA9PiB7XG4gICAgICAgIGxldCB2YWwgPSBzLmlzRGVsaW1pdGVyKCkgPyBcIiggLi4uIClcIiA6IHMudmFsKCk7XG4gICAgICAgIGlmIChzID09PSBvZmZlbmRpbmdTeW50YXgpIHtcbiAgICAgICAgICByZXR1cm4gXCJfX1wiICsgdmFsICsgXCJfX1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9KS5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW2Vycm9yXTogXCIgKyBtZXNzYWdlICsgXCJcXG5cIiArIGN0eCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kLCBtZXNzYWdlKSB7XG4gIGlmICghY29uZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlthc3NlcnRpb24gZXJyb3JdOiBcIiArIG1lc3NhZ2UpO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/hygiene-utils.js b/dist/hygiene-utils.js index ccc288ea..008d9e4a 100644 --- a/dist/hygiene-utils.js +++ b/dist/hygiene-utils.js @@ -1,65 +1,91 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.collectBindings = exports.CollectBindingSyntax = undefined; +exports.CollectBindingSyntax = undefined; +exports.collectBindings = collectBindings; -var _symbol = require("./symbol"); +var _immutable = require('immutable'); -var _transforms = require("./transforms"); - -var _errors = require("./errors"); - -var _terms = require("./terms"); - -var _terms2 = _interopRequireDefault(_terms); - -var _immutable = require("immutable"); - -var _astDispatcher = require("./ast-dispatcher"); +var _astDispatcher = require('./ast-dispatcher'); var _astDispatcher2 = _interopRequireDefault(_astDispatcher); -var _ramda = require("ramda"); - -var _ = _interopRequireWildcard(_ramda); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -class CollectBindingSyntax_346 extends _astDispatcher2.default { +class CollectBindingSyntax extends _astDispatcher2.default { constructor() { - super("collect", true); + super('collect', true); this.names = (0, _immutable.List)(); } - collect(term_348) { - return this.dispatch(term_348); + + // registerSyntax(stx) { + // let newBinding = gensym(stx.val()); + // this.context.bindings.add(stx, { + // binding: newBinding, + // phase: this.context.phase, + // // skip dup because js allows variable redeclarations + // // (technically only for `var` but we can let later stages of the pipeline + // // handle incorrect redeclarations of `const` and `let`) + // skipDup: true + // }); + // return stx; + // } + + collect(term) { + return this.dispatch(term); } - collectBindingIdentifier(term_349) { - return this.names.concat(term_349.name); + + collectBindingIdentifier(term) { + return this.names.concat(term.name); } - collectBindingPropertyIdentifier(term_350) { - return this.collect(term_350.binding); + + collectBindingPropertyIdentifier(term) { + return this.collect(term.binding); } - collectBindingPropertyProperty(term_351) { - return this.collect(term_351.binding); + + collectBindingPropertyProperty(term) { + return this.collect(term.binding); } - collectArrayBinding(term_352) { - let restElement_353 = null; - if (term_352.restElement != null) { - restElement_353 = this.collect(term_352.restElement); + + collectArrayBinding(term) { + let restElement = null; + if (term.restElement != null) { + restElement = this.collect(term.restElement); } - return this.names.concat(restElement_353).concat(term_352.elements.filter(el_354 => el_354 != null).flatMap(el_355 => this.collect(el_355))); + return this.names.concat(restElement).concat(term.elements.filter(el => el != null).flatMap(el => this.collect(el))); } - collectObjectBinding(term_356) { + + collectObjectBinding() { + // return term.properties.flatMap(prop => this.collect(prop)); return (0, _immutable.List)(); } + + // registerVariableDeclaration(term) { + // let declarators = term.declarators.map(decl => { + // return decl.extend({ + // binding: this.register(decl.binding) + // }); + // }); + // return term.extend({ declarators }); + // } + // + // registerFunctionDeclaration(term) { + // return term.extend({ + // name: this.register(term.name) + // }); + // } + // + // registerExport(term) { + // return term.extend({ + // declaration: this.register(term.declaration) + // }); + // } } -function collectBindings_347(term_357) { - return new CollectBindingSyntax_346().collect(term_357); + +exports.CollectBindingSyntax = CollectBindingSyntax; +function collectBindings(term) { + return new CollectBindingSyntax().collect(term); } -exports.CollectBindingSyntax = CollectBindingSyntax_346; -exports.collectBindings = collectBindings_347; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2h5Z2llbmUtdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7SUFBYSxDOzs7Ozs7QUFDYixNQUFNLHdCQUFOLGlDQUFxRDtBQUNuRCxnQkFBYztBQUNaLFVBQU0sU0FBTixFQUFpQixJQUFqQjtBQUNBLFNBQUssS0FBTCxHQUFhLHNCQUFiO0FBQ0Q7QUFDRCxVQUFRLFFBQVIsRUFBa0I7QUFDaEIsV0FBTyxLQUFLLFFBQUwsQ0FBYyxRQUFkLENBQVA7QUFDRDtBQUNELDJCQUF5QixRQUF6QixFQUFtQztBQUNqQyxXQUFPLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBa0IsU0FBUyxJQUEzQixDQUFQO0FBQ0Q7QUFDRCxtQ0FBaUMsUUFBakMsRUFBMkM7QUFDekMsV0FBTyxLQUFLLE9BQUwsQ0FBYSxTQUFTLE9BQXRCLENBQVA7QUFDRDtBQUNELGlDQUErQixRQUEvQixFQUF5QztBQUN2QyxXQUFPLEtBQUssT0FBTCxDQUFhLFNBQVMsT0FBdEIsQ0FBUDtBQUNEO0FBQ0Qsc0JBQW9CLFFBQXBCLEVBQThCO0FBQzVCLFFBQUksa0JBQWtCLElBQXRCO0FBQ0EsUUFBSSxTQUFTLFdBQVQsSUFBd0IsSUFBNUIsRUFBa0M7QUFDaEMsd0JBQWtCLEtBQUssT0FBTCxDQUFhLFNBQVMsV0FBdEIsQ0FBbEI7QUFDRDtBQUNELFdBQU8sS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixlQUFsQixFQUFtQyxNQUFuQyxDQUEwQyxTQUFTLFFBQVQsQ0FBa0IsTUFBbEIsQ0FBeUIsVUFBVSxVQUFVLElBQTdDLEVBQW1ELE9BQW5ELENBQTJELFVBQVUsS0FBSyxPQUFMLENBQWEsTUFBYixDQUFyRSxDQUExQyxDQUFQO0FBQ0Q7QUFDRCx1QkFBcUIsUUFBckIsRUFBK0I7QUFDN0IsV0FBTyxzQkFBUDtBQUNEO0FBMUJrRDtBQTRCckQsU0FBUyxtQkFBVCxDQUE2QixRQUE3QixFQUF1QztBQUNyQyxTQUFRLElBQUksd0JBQUosRUFBRCxDQUErQixPQUEvQixDQUF1QyxRQUF2QyxDQUFQO0FBQ0Q7UUFDbUMsb0IsR0FBNUIsd0I7UUFDdUIsZSxHQUF2QixtQiIsImZpbGUiOiJoeWdpZW5lLXV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtnZW5zeW19IGZyb20gXCIuL3N5bWJvbFwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHtleHBlY3QsIGFzc2VydH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgVGVybSwge2lzRU9GLCBpc0JpbmRpbmdJZGVudGlmaWVyLCBpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5LCBpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXIsIGlzT2JqZWN0QmluZGluZywgaXNBcnJheUJpbmRpbmcsIGlzRnVuY3Rpb25EZWNsYXJhdGlvbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24sIGlzRnVuY3Rpb25UZXJtLCBpc0Z1bmN0aW9uV2l0aE5hbWUsIGlzU3ludGF4RGVjbGFyYXRpb24sIGlzU3ludGF4cmVjRGVjbGFyYXRpb24sIGlzVmFyaWFibGVEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LCBpc0ltcG9ydCwgaXNFeHBvcnQsIGlzUHJhZ21hLCBpc0V4cG9ydFN5bnRheH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IEFTVERpc3BhdGNoZXIgZnJvbSBcIi4vYXN0LWRpc3BhdGNoZXJcIjtcbmltcG9ydCAgKiBhcyBfIGZyb20gXCJyYW1kYVwiO1xuY2xhc3MgQ29sbGVjdEJpbmRpbmdTeW50YXhfMzQ2IGV4dGVuZHMgQVNURGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiY29sbGVjdFwiLCB0cnVlKTtcbiAgICB0aGlzLm5hbWVzID0gTGlzdCgpO1xuICB9XG4gIGNvbGxlY3QodGVybV8zNDgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaCh0ZXJtXzM0OCk7XG4gIH1cbiAgY29sbGVjdEJpbmRpbmdJZGVudGlmaWVyKHRlcm1fMzQ5KSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuY29uY2F0KHRlcm1fMzQ5Lm5hbWUpO1xuICB9XG4gIGNvbGxlY3RCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyKHRlcm1fMzUwKSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdCh0ZXJtXzM1MC5iaW5kaW5nKTtcbiAgfVxuICBjb2xsZWN0QmluZGluZ1Byb3BlcnR5UHJvcGVydHkodGVybV8zNTEpIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRlcm1fMzUxLmJpbmRpbmcpO1xuICB9XG4gIGNvbGxlY3RBcnJheUJpbmRpbmcodGVybV8zNTIpIHtcbiAgICBsZXQgcmVzdEVsZW1lbnRfMzUzID0gbnVsbDtcbiAgICBpZiAodGVybV8zNTIucmVzdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgcmVzdEVsZW1lbnRfMzUzID0gdGhpcy5jb2xsZWN0KHRlcm1fMzUyLnJlc3RFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuY29uY2F0KHJlc3RFbGVtZW50XzM1MykuY29uY2F0KHRlcm1fMzUyLmVsZW1lbnRzLmZpbHRlcihlbF8zNTQgPT4gZWxfMzU0ICE9IG51bGwpLmZsYXRNYXAoZWxfMzU1ID0+IHRoaXMuY29sbGVjdChlbF8zNTUpKSk7XG4gIH1cbiAgY29sbGVjdE9iamVjdEJpbmRpbmcodGVybV8zNTYpIHtcbiAgICByZXR1cm4gTGlzdCgpO1xuICB9XG59XG5mdW5jdGlvbiBjb2xsZWN0QmluZGluZ3NfMzQ3KHRlcm1fMzU3KSB7XG4gIHJldHVybiAobmV3IENvbGxlY3RCaW5kaW5nU3ludGF4XzM0NikuY29sbGVjdCh0ZXJtXzM1Nyk7XG59XG5leHBvcnQge0NvbGxlY3RCaW5kaW5nU3ludGF4XzM0NiBhcyBDb2xsZWN0QmluZGluZ1N5bnRheH07XG5leHBvcnQge2NvbGxlY3RCaW5kaW5nc18zNDcgYXMgY29sbGVjdEJpbmRpbmdzfSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oeWdpZW5lLXV0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztRQTZFZ0IsZSxHQUFBLGU7O0FBN0VoQjs7QUFFQTs7Ozs7O0FBRU8sTUFBTSxvQkFBTixpQ0FBaUQ7QUFDdEQsZ0JBQWM7QUFDWixVQUFNLFNBQU4sRUFBaUIsSUFBakI7QUFDQSxTQUFLLEtBQUwsR0FBYSxzQkFBYjtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFRLElBQVIsRUFBYztBQUNaLFdBQU8sS0FBSyxRQUFMLENBQWMsSUFBZCxDQUFQO0FBQ0Q7O0FBRUQsMkJBQXlCLElBQXpCLEVBQStCO0FBQzdCLFdBQU8sS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixLQUFLLElBQXZCLENBQVA7QUFDRDs7QUFFRCxtQ0FBaUMsSUFBakMsRUFBdUM7QUFDckMsV0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUFLLE9BQWxCLENBQVA7QUFDRDs7QUFFRCxpQ0FBZ0MsSUFBaEMsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUFLLE9BQWxCLENBQVA7QUFDRDs7QUFFRCxzQkFBcUIsSUFBckIsRUFBMkI7QUFDekIsUUFBSSxjQUFjLElBQWxCO0FBQ0EsUUFBSSxLQUFLLFdBQUwsSUFBb0IsSUFBeEIsRUFBOEI7QUFDNUIsb0JBQWMsS0FBSyxPQUFMLENBQWEsS0FBSyxXQUFsQixDQUFkO0FBQ0Q7QUFDRCxXQUFPLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBa0IsV0FBbEIsRUFBK0IsTUFBL0IsQ0FDTCxLQUFLLFFBQUwsQ0FBYyxNQUFkLENBQXFCLE1BQU0sTUFBTSxJQUFqQyxFQUNjLE9BRGQsQ0FDc0IsTUFBTSxLQUFLLE9BQUwsQ0FBYSxFQUFiLENBRDVCLENBREssQ0FBUDtBQUlEOztBQUVELHlCQUF3QjtBQUN0QjtBQUNBLFdBQU8sc0JBQVA7QUFDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEVzRDs7UUFBM0Msb0IsR0FBQSxvQjtBQXlFTixTQUFTLGVBQVQsQ0FBeUIsSUFBekIsRUFBK0I7QUFDcEMsU0FBTyxJQUFJLG9CQUFKLEdBQTJCLE9BQTNCLENBQW1DLElBQW5DLENBQVA7QUFDRCIsImZpbGUiOiJoeWdpZW5lLXV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlzdCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbmltcG9ydCBBU1REaXNwYXRjaGVyIGZyb20gJy4vYXN0LWRpc3BhdGNoZXInO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdEJpbmRpbmdTeW50YXggZXh0ZW5kcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2NvbGxlY3QnLCB0cnVlKTtcbiAgICB0aGlzLm5hbWVzID0gTGlzdCgpO1xuICB9XG5cbiAgLy8gcmVnaXN0ZXJTeW50YXgoc3R4KSB7XG4gIC8vICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4LnZhbCgpKTtcbiAgLy8gICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eCwge1xuICAvLyAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgLy8gICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsXG4gIC8vICAgICAvLyBza2lwIGR1cCBiZWNhdXNlIGpzIGFsbG93cyB2YXJpYWJsZSByZWRlY2xhcmF0aW9uc1xuICAvLyAgICAgLy8gKHRlY2huaWNhbGx5IG9ubHkgZm9yIGB2YXJgIGJ1dCB3ZSBjYW4gbGV0IGxhdGVyIHN0YWdlcyBvZiB0aGUgcGlwZWxpbmVcbiAgLy8gICAgIC8vIGhhbmRsZSBpbmNvcnJlY3QgcmVkZWNsYXJhdGlvbnMgb2YgYGNvbnN0YCBhbmQgYGxldGApXG4gIC8vICAgICBza2lwRHVwOiB0cnVlXG4gIC8vICAgfSk7XG4gIC8vICAgcmV0dXJuIHN0eDtcbiAgLy8gfVxuXG4gIGNvbGxlY3QodGVybSkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKHRlcm0pO1xuICB9XG5cbiAgY29sbGVjdEJpbmRpbmdJZGVudGlmaWVyKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5jb25jYXQodGVybS5uYW1lKTtcbiAgfVxuXG4gIGNvbGxlY3RCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRlcm0uYmluZGluZyk7XG4gIH1cblxuICBjb2xsZWN0QmluZGluZ1Byb3BlcnR5UHJvcGVydHkgKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRlcm0uYmluZGluZyk7XG4gIH1cblxuICBjb2xsZWN0QXJyYXlCaW5kaW5nICh0ZXJtKSB7XG4gICAgbGV0IHJlc3RFbGVtZW50ID0gbnVsbDtcbiAgICBpZiAodGVybS5yZXN0RWxlbWVudCAhPSBudWxsKSB7XG4gICAgICByZXN0RWxlbWVudCA9IHRoaXMuY29sbGVjdCh0ZXJtLnJlc3RFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuY29uY2F0KHJlc3RFbGVtZW50KS5jb25jYXQoXG4gICAgICB0ZXJtLmVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKGVsID0+IHRoaXMuY29sbGVjdChlbCkpXG4gICAgKTtcbiAgfVxuXG4gIGNvbGxlY3RPYmplY3RCaW5kaW5nICgpIHtcbiAgICAvLyByZXR1cm4gdGVybS5wcm9wZXJ0aWVzLmZsYXRNYXAocHJvcCA9PiB0aGlzLmNvbGxlY3QocHJvcCkpO1xuICAgIHJldHVybiBMaXN0KCk7XG4gIH1cblxuICAvLyByZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybSkge1xuICAvLyAgIGxldCBkZWNsYXJhdG9ycyA9IHRlcm0uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAvLyAgICAgcmV0dXJuIGRlY2wuZXh0ZW5kKHtcbiAgLy8gICAgICAgYmluZGluZzogdGhpcy5yZWdpc3RlcihkZWNsLmJpbmRpbmcpXG4gIC8vICAgICB9KTtcbiAgLy8gICB9KTtcbiAgLy8gICByZXR1cm4gdGVybS5leHRlbmQoeyBkZWNsYXJhdG9ycyB9KTtcbiAgLy8gfVxuICAvL1xuICAvLyByZWdpc3RlckZ1bmN0aW9uRGVjbGFyYXRpb24odGVybSkge1xuICAvLyAgIHJldHVybiB0ZXJtLmV4dGVuZCh7XG4gIC8vICAgICBuYW1lOiB0aGlzLnJlZ2lzdGVyKHRlcm0ubmFtZSlcbiAgLy8gICB9KTtcbiAgLy8gfVxuICAvL1xuICAvLyByZWdpc3RlckV4cG9ydCh0ZXJtKSB7XG4gIC8vICAgcmV0dXJuIHRlcm0uZXh0ZW5kKHtcbiAgLy8gICAgIGRlY2xhcmF0aW9uOiB0aGlzLnJlZ2lzdGVyKHRlcm0uZGVjbGFyYXRpb24pXG4gIC8vICAgfSk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCaW5kaW5ncyh0ZXJtKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdEJpbmRpbmdTeW50YXgoKS5jb2xsZWN0KHRlcm0pO1xufVxuIl19 \ No newline at end of file diff --git a/dist/list-collector.js b/dist/list-collector.js index c2d53b92..e4367ead 100644 --- a/dist/list-collector.js +++ b/dist/list-collector.js @@ -1,26 +1,26 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var _immutable = require("immutable"); +var _immutable = require('immutable'); -let EMPTY_358; +let EMPTY; class ListCollector { - constructor(x_359) { - this.value = x_359; + constructor(x) { + this.value = x; } static empty() { - return EMPTY_358; + return EMPTY; } - concat(a_360) { - return new ListCollector(this.value.concat(a_360.value)); + concat(a) { + return new ListCollector(this.value.concat(a.value)); } extract() { return this.value; } } exports.default = ListCollector; -EMPTY_358 = new ListCollector((0, _immutable.List)()); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2xpc3QtY29sbGVjdG9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBLElBQUksU0FBSjtBQUNlLE1BQU0sYUFBTixDQUFvQjtBQUNqQyxjQUFZLEtBQVosRUFBbUI7QUFDakIsU0FBSyxLQUFMLEdBQWEsS0FBYjtBQUNEO0FBQ0QsU0FBTyxLQUFQLEdBQWU7QUFDYixXQUFPLFNBQVA7QUFDRDtBQUNELFNBQU8sS0FBUCxFQUFjO0FBQ1osV0FBTyxJQUFJLGFBQUosQ0FBa0IsS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixNQUFNLEtBQXhCLENBQWxCLENBQVA7QUFDRDtBQUNELFlBQVU7QUFDUixXQUFPLEtBQUssS0FBWjtBQUNEO0FBWmdDO2tCQUFkLGE7QUFjckIsWUFBWSxJQUFJLGFBQUosQ0FBa0Isc0JBQWxCLENBQVoiLCJmaWxlIjoibGlzdC1jb2xsZWN0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3R9IGZyb20gXCJpbW11dGFibGVcIjtcbmxldCBFTVBUWV8zNTg7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0Q29sbGVjdG9yIHtcbiAgY29uc3RydWN0b3IoeF8zNTkpIHtcbiAgICB0aGlzLnZhbHVlID0geF8zNTk7XG4gIH1cbiAgc3RhdGljIGVtcHR5KCkge1xuICAgIHJldHVybiBFTVBUWV8zNTg7XG4gIH1cbiAgY29uY2F0KGFfMzYwKSB7XG4gICAgcmV0dXJuIG5ldyBMaXN0Q29sbGVjdG9yKHRoaXMudmFsdWUuY29uY2F0KGFfMzYwLnZhbHVlKSk7XG4gIH1cbiAgZXh0cmFjdCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuRU1QVFlfMzU4ID0gbmV3IExpc3RDb2xsZWN0b3IoTGlzdCgpKTtcbiJdfQ== \ No newline at end of file +EMPTY = new ListCollector((0, _immutable.List)()); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saXN0LWNvbGxlY3Rvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFFQSxJQUFJLEtBQUo7QUFDZSxNQUFNLGFBQU4sQ0FBb0I7QUFDakMsY0FBWSxDQUFaLEVBQWU7QUFBRSxTQUFLLEtBQUwsR0FBYSxDQUFiO0FBQWlCO0FBQ2xDLFNBQU8sS0FBUCxHQUFlO0FBQUUsV0FBTyxLQUFQO0FBQWU7QUFDaEMsU0FBTyxDQUFQLEVBQVU7QUFBRSxXQUFPLElBQUksYUFBSixDQUFrQixLQUFLLEtBQUwsQ0FBVyxNQUFYLENBQWtCLEVBQUUsS0FBcEIsQ0FBbEIsQ0FBUDtBQUF1RDtBQUNuRSxZQUFVO0FBQUUsV0FBTyxLQUFLLEtBQVo7QUFBb0I7QUFKQztrQkFBZCxhO0FBTXJCLFFBQVEsSUFBSSxhQUFKLENBQWtCLHNCQUFsQixDQUFSIiwiZmlsZSI6Imxpc3QtY29sbGVjdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlzdCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5cbmxldCBFTVBUWTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpc3RDb2xsZWN0b3Ige1xuICBjb25zdHJ1Y3Rvcih4KSB7IHRoaXMudmFsdWUgPSB4OyB9XG4gIHN0YXRpYyBlbXB0eSgpIHsgcmV0dXJuIEVNUFRZOyB9XG4gIGNvbmNhdChhKSB7IHJldHVybiBuZXcgTGlzdENvbGxlY3Rvcih0aGlzLnZhbHVlLmNvbmNhdChhLnZhbHVlKSk7IH1cbiAgZXh0cmFjdCgpIHsgcmV0dXJuIHRoaXMudmFsdWU7IH1cbn1cbkVNUFRZID0gbmV3IExpc3RDb2xsZWN0b3IoTGlzdCgpKTtcbiJdfQ== \ No newline at end of file diff --git a/dist/load-syntax.js b/dist/load-syntax.js index 0d6698e9..aa96afa3 100644 --- a/dist/load-syntax.js +++ b/dist/load-syntax.js @@ -1,123 +1,172 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.evalCompiletimeValue = exports.evalRuntimeValues = exports.sanitizeReplacementValues = undefined; +exports.sanitizeReplacementValues = sanitizeReplacementValues; +exports.evalRuntimeValues = evalRuntimeValues; +exports.evalCompiletimeValue = evalCompiletimeValue; -var _termExpander = require("./term-expander"); +var _ramda = require('ramda'); -var _termExpander2 = _interopRequireDefault(_termExpander); +var _ = _interopRequireWildcard(_ramda); -var _immutable = require("immutable"); +var _immutable = require('immutable'); -var _parseReducer = require("./parse-reducer.js"); +var _parseReducer = require('./parse-reducer.js'); var _parseReducer2 = _interopRequireDefault(_parseReducer); -var _shiftReducer = require("shift-reducer"); +var _shiftReducer = require('shift-reducer'); var _shiftReducer2 = _interopRequireDefault(_shiftReducer); -var _serializer = require("./serializer"); +var _serializer = require('./serializer'); -var _syntax = require("./syntax"); +var _syntax = require('./syntax'); var _syntax2 = _interopRequireDefault(_syntax); -var _shiftCodegen = require("shift-codegen"); +var _shiftCodegen = require('shift-codegen'); var _shiftCodegen2 = _interopRequireDefault(_shiftCodegen); -var _transforms = require("./transforms"); - -var _terms = require("./terms"); +var _terms = require('./terms'); var _terms2 = _interopRequireDefault(_terms); -var _shiftReader = require("./shift-reader"); +var _shiftReader = require('./shift-reader'); var _shiftReader2 = _interopRequireDefault(_shiftReader); -var _macroContext = require("./macro-context"); +var _macroContext = require('./macro-context'); -var _templateProcessor = require("./template-processor"); +var _templateProcessor = require('./template-processor'); -var _vm = require("vm"); +var _vm = require('vm'); var _vm2 = _interopRequireDefault(_vm); -var _ramda = require("ramda"); - -var _ = _interopRequireWildcard(_ramda); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -let geval_361 = eval; -function sanitizeReplacementValues_362(values_365) { - if (Array.isArray(values_365)) { - return sanitizeReplacementValues_362((0, _immutable.List)(values_365)); - } else if (_immutable.List.isList(values_365)) { - return values_365.map(sanitizeReplacementValues_362); - } else if (values_365 == null) { +function sanitizeReplacementValues(values) { + if (Array.isArray(values)) { + return sanitizeReplacementValues((0, _immutable.List)(values)); + } else if (_immutable.List.isList(values)) { + return values.map(sanitizeReplacementValues); + } else if (values == null) { throw new Error("replacement values for syntax template must not be null or undefined"); - } else if (typeof values_365.next === "function") { - return sanitizeReplacementValues_362((0, _immutable.List)(values_365)); + } else if (typeof values.next === 'function') { + return sanitizeReplacementValues((0, _immutable.List)(values)); } - return (0, _macroContext.unwrap)(values_365); + return (0, _macroContext.unwrap)(values); } -function evalRuntimeValues_363(terms_366, context_367) { - let prepped_368 = terms_366.reduce((acc_374, term_375) => { - let result_376 = (0, _immutable.List)(); - if ((0, _terms.isExport)(term_375)) { - if ((0, _terms.isVariableDeclaration)(term_375.declaration)) { - return acc_374.concat(new _terms2.default("VariableDeclarationStatement", { declaration: term_375.declaration })).concat(term_375.declaration.declarators.map(decl_377 => { - return new _terms2.default("ExpressionStatement", { expression: new _terms2.default("AssignmentExpression", { binding: new _terms2.default("StaticMemberExpression", { object: new _terms2.default("IdentifierExpression", { name: _syntax2.default.fromIdentifier("exports") }), property: decl_377.binding.name }), expression: new _terms2.default("IdentifierExpression", { name: decl_377.binding.name }) }) }); + +function evalRuntimeValues(terms, context) { + let prepped = terms.reduce((acc, term) => { + if ((0, _terms.isExport)(term)) { + if ((0, _terms.isVariableDeclaration)(term.declaration)) { + return acc.concat(new _terms2.default('VariableDeclarationStatement', { + declaration: term.declaration + })).concat(term.declaration.declarators.map(decl => { + return new _terms2.default('ExpressionStatement', { + expression: new _terms2.default('AssignmentExpression', { + binding: new _terms2.default('StaticMemberExpression', { + object: new _terms2.default('IdentifierExpression', { + name: _syntax2.default.fromIdentifier('exports') + }), + property: decl.binding.name + }), + expression: new _terms2.default('IdentifierExpression', { + name: decl.binding.name + }) + }) + }); })); } - } else if ((0, _terms.isImport)(term_375)) { - return acc_374; + } else if ((0, _terms.isImport)(term)) { + return acc; } - return acc_374.concat(term_375); + return acc.concat(term); }, (0, _immutable.List)()); - let parsed_369 = (0, _shiftReducer2.default)(new _parseReducer2.default(context_367, false), new _terms2.default("Module", { directives: (0, _immutable.List)(), items: prepped_368 }).gen({ includeImports: false })); - let gen_370 = (0, _shiftCodegen2.default)(parsed_369, new _shiftCodegen.FormattedCodeGen()); - let result_371 = context_367.transform(gen_370, { babelrc: true, filename: context_367.filename }); - let exportsObj_372 = {}; - context_367.store.set("exports", exportsObj_372); - let val_373 = _vm2.default.runInContext(result_371.code, context_367.store.getNodeContext()); - return exportsObj_372; + let parsed = (0, _shiftReducer2.default)(new _parseReducer2.default(context, false), new _terms2.default('Module', { + directives: (0, _immutable.List)(), + items: prepped + }).gen(false)); + + let gen = (0, _shiftCodegen2.default)(parsed, new _shiftCodegen.FormattedCodeGen()); + let result = context.transform(gen, { + babelrc: true, + filename: context.filename + }); + + let exportsObj = {}; + context.store.set('exports', exportsObj); + + _vm2.default.runInContext(result.code, context.store.getNodeContext()); + return exportsObj; } -function evalCompiletimeValue_364(expr_378, context_379) { - let deserializer_380 = (0, _serializer.makeDeserializer)(context_379.bindings); - let sandbox_381 = { syntaxQuote: function syntaxQuote(strings_389) { - for (var _len = arguments.length, values_388 = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - values_388[_key - 1] = arguments[_key]; + +// (Expression, Context) -> [function] +function evalCompiletimeValue(expr, context) { + let deserializer = (0, _serializer.makeDeserializer)(context.bindings); + let sandbox = { + syntaxQuote: function syntaxQuote(strings) { + for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + values[_key - 1] = arguments[_key]; } - let ctx_390 = deserializer_380.read(_.last(values_388)); - let reader_391 = new _shiftReader2.default(strings_389, ctx_390, _.take(values_388.length - 1, values_388)); - return reader_391.read(); - }, syntaxTemplate: function syntaxTemplate(str_393) { - for (var _len2 = arguments.length, values_392 = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - values_392[_key2 - 1] = arguments[_key2]; + let ctx = deserializer.read(_.last(values)); + let reader = new _shiftReader2.default(strings, ctx, _.take(values.length - 1, values)); + return reader.read(); + }, + syntaxTemplate: function syntaxTemplate(str) { + for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + values[_key2 - 1] = arguments[_key2]; } - return (0, _templateProcessor.replaceTemplate)(deserializer_380.read(str_393), sanitizeReplacementValues_362(values_392)); - } }; - let sandboxKeys_382 = (0, _immutable.List)(Object.keys(sandbox_381)); - let sandboxVals_383 = sandboxKeys_382.map(k_394 => sandbox_381[k_394]).toArray(); - let parsed_384 = (0, _shiftReducer2.default)(new _parseReducer2.default(context_379), new _terms2.default("Module", { directives: (0, _immutable.List)(), items: _immutable.List.of(new _terms2.default("ExpressionStatement", { expression: new _terms2.default("FunctionExpression", { isGenerator: false, name: null, params: new _terms2.default("FormalParameters", { items: sandboxKeys_382.map(param_395 => { - return new _terms2.default("BindingIdentifier", { name: _syntax2.default.from("identifier", param_395) }); - }), rest: null }), body: new _terms2.default("FunctionBody", { directives: _immutable.List.of(new _terms2.default("Directive", { rawValue: "use strict" })), statements: _immutable.List.of(new _terms2.default("ReturnStatement", { expression: expr_378 })) }) }) })) })); - let gen_385 = (0, _shiftCodegen2.default)(parsed_384, new _shiftCodegen.FormattedCodeGen()); - let result_386 = context_379.transform(gen_385, { babelrc: true, filename: context_379.filename }); - let val_387 = _vm2.default.runInContext(result_386.code, context_379.store.getNodeContext()); - return val_387.apply(undefined, sandboxVals_383); + return (0, _templateProcessor.replaceTemplate)(deserializer.read(str), sanitizeReplacementValues(values)); + } + }; + + let sandboxKeys = (0, _immutable.List)(Object.keys(sandbox)); + let sandboxVals = sandboxKeys.map(k => sandbox[k]).toArray(); + + let parsed = (0, _shiftReducer2.default)(new _parseReducer2.default(context), new _terms2.default("Module", { + directives: (0, _immutable.List)(), + items: _immutable.List.of(new _terms2.default("ExpressionStatement", { + expression: new _terms2.default("FunctionExpression", { + isGenerator: false, + name: null, + params: new _terms2.default("FormalParameters", { + items: sandboxKeys.map(param => { + return new _terms2.default("BindingIdentifier", { + name: _syntax2.default.from("identifier", param) + }); + }), + rest: null + }), + body: new _terms2.default("FunctionBody", { + directives: _immutable.List.of(new _terms2.default('Directive', { + rawValue: 'use strict' + })), + statements: _immutable.List.of(new _terms2.default("ReturnStatement", { + expression: expr + })) + }) + }) + })) + })); + + let gen = (0, _shiftCodegen2.default)(parsed, new _shiftCodegen.FormattedCodeGen()); + let result = context.transform(gen, { + babelrc: true, + filename: context.filename + }); + + let val = _vm2.default.runInContext(result.code, context.store.getNodeContext()); + return val.apply(undefined, sandboxVals); } -exports.sanitizeReplacementValues = sanitizeReplacementValues_362; -exports.evalRuntimeValues = evalRuntimeValues_363; -exports.evalCompiletimeValue = evalCompiletimeValue_364; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L2xvYWQtc3ludGF4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7O0lBQWEsQzs7Ozs7O0FBQ2IsSUFBSSxZQUFZLElBQWhCO0FBQ0EsU0FBUyw2QkFBVCxDQUF1QyxVQUF2QyxFQUFtRDtBQUNqRCxNQUFJLE1BQU0sT0FBTixDQUFjLFVBQWQsQ0FBSixFQUErQjtBQUM3QixXQUFPLDhCQUE4QixxQkFBSyxVQUFMLENBQTlCLENBQVA7QUFDRCxHQUZELE1BRU8sSUFBSSxnQkFBSyxNQUFMLENBQVksVUFBWixDQUFKLEVBQTZCO0FBQ2xDLFdBQU8sV0FBVyxHQUFYLENBQWUsNkJBQWYsQ0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDN0IsVUFBTSxJQUFJLEtBQUosQ0FBVSxzRUFBVixDQUFOO0FBQ0QsR0FGTSxNQUVBLElBQUksT0FBTyxXQUFXLElBQWxCLEtBQTJCLFVBQS9CLEVBQTJDO0FBQ2hELFdBQU8sOEJBQThCLHFCQUFLLFVBQUwsQ0FBOUIsQ0FBUDtBQUNEO0FBQ0QsU0FBTywwQkFBTyxVQUFQLENBQVA7QUFDRDtBQUNELFNBQVMscUJBQVQsQ0FBK0IsU0FBL0IsRUFBMEMsV0FBMUMsRUFBdUQ7QUFDckQsTUFBSSxjQUFjLFVBQVUsTUFBVixDQUFpQixDQUFDLE9BQUQsRUFBVSxRQUFWLEtBQXVCO0FBQ3hELFFBQUksYUFBYSxzQkFBakI7QUFDQSxRQUFJLHFCQUFTLFFBQVQsQ0FBSixFQUF3QjtBQUN0QixVQUFJLGtDQUFzQixTQUFTLFdBQS9CLENBQUosRUFBaUQ7QUFDL0MsZUFBTyxRQUFRLE1BQVIsQ0FBZSxvQkFBUyw4QkFBVCxFQUF5QyxFQUFDLGFBQWEsU0FBUyxXQUF2QixFQUF6QyxDQUFmLEVB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QixFQUFDLGFBQWEsS0FBZCxFQUFxQixNQUFNLElBQTNCLEVBQWlDLFFBQVEsb0JBQVMsa0JBQVQsRUFBNkIsRUFBQyxPQUFPLGdCQUFnQixHQUFoQixDQUFvQixhQUFhO0FBQ3hTLG1CQUFPLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsTUFBTSxpQkFBTyxJQUFQLENBQVksWUFBWixFQUEwQixTQUExQixDQUFQLEVBQTlCLENBQVA7QUFDRCxXQUZ3USxDQUFSLEVBRTdQLE1BQU0sSUFGdVAsRUFBN0IsQ0FBekMsRUFFekssTUFBTSxvQkFBUyxjQUFULEVBQXlCLEVBQUMsWUFBWSxnQkFBSyxFQUFMLENBQVEsb0JBQVMsV0FBVCxFQUFzQixFQUFDLFVBQVUsWUFBWCxFQUF0QixDQUFSLENBQWIsRUFBdUUsWUFBWSxnQkFBSyxFQUFMLENBQVEsb0JBQVMsaUJBQVQsRUFBNEIsRUFBQyxZQUFZLFFBQWIsRUFBNUIsQ0FBUixDQUFuRixFQUF6QixDQUZtSyxFQUEvQixDQUFiLEVBQWhDLENBQVIsQ0FBNUIsRUFBbkIsQ0FBdkMsQ0FBakI7QUFHQSxNQUFJLFVBQVUsNEJBQVEsVUFBUixFQUFvQixvQ0FBcEIsQ0FBZDtBQUNBLE1BQUksYUFBYSxZQUFZLFNBQVosQ0FBc0IsT0FBdEIsRUFBK0IsRUFBQyxTQUFTLElBQVYsRUFBZ0IsVUFBVSxZQUFZLFFBQXRDLEVBQS9CLENBQWpCO0FBQ0EsTUFBSSxVQUFVLGFBQUcsWUFBSCxDQUFnQixXQUFXLElBQTNCLEVBQWlDLFlBQVksS0FBWixDQUFrQixjQUFsQixFQUFqQyxDQUFkO0FBQ0EsU0FBTyxRQUFRLEtBQVIsQ0FBYyxTQUFkLEVBQXlCLGVBQXpCLENBQVA7QUFDRDtRQUN3Qyx5QixHQUFqQyw2QjtRQUN5QixpQixHQUF6QixxQjtRQUM0QixvQixHQUE1Qix3QiIsImZpbGUiOiJsb2FkLXN5bnRheC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlclwiO1xuaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgUGFyc2VSZWR1Y2VyIGZyb20gXCIuL3BhcnNlLXJlZHVjZXIuanNcIjtcbmltcG9ydCByZWR1Y2VyLCB7TW9ub2lkYWxSZWR1Y2VyfSBmcm9tIFwic2hpZnQtcmVkdWNlclwiO1xuaW1wb3J0IHttYWtlRGVzZXJpYWxpemVyfSBmcm9tIFwiLi9zZXJpYWxpemVyXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IGNvZGVnZW4sIHtGb3JtYXR0ZWRDb2RlR2VufSBmcm9tIFwic2hpZnQtY29kZWdlblwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IFRlcm0sIHtpc0VPRiwgaXNCaW5kaW5nSWRlbnRpZmllciwgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLCBpc0Z1bmN0aW9uRXhwcmVzc2lvbiwgaXNGdW5jdGlvblRlcm0sIGlzRnVuY3Rpb25XaXRoTmFtZSwgaXNTeW50YXhEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uLCBpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQsIGlzSW1wb3J0LCBpc0V4cG9ydH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCBSZWFkZXIgZnJvbSBcIi4vc2hpZnQtcmVhZGVyXCI7XG5pbXBvcnQge3Vud3JhcH0gZnJvbSBcIi4vbWFjcm8tY29udGV4dFwiO1xuaW1wb3J0IHtyZXBsYWNlVGVtcGxhdGV9IGZyb20gXCIuL3RlbXBsYXRlLXByb2Nlc3NvclwiO1xuaW1wb3J0IHZtIGZyb20gXCJ2bVwiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5sZXQgZ2V2YWxfMzYxID0gZXZhbDtcbmZ1bmN0aW9uIHNhbml0aXplUmVwbGFjZW1lbnRWYWx1ZXNfMzYyKHZhbHVlc18zNjUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzXzM2NSkpIHtcbiAgICByZXR1cm4gc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIoTGlzdCh2YWx1ZXNfMzY1KSk7XG4gIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodmFsdWVzXzM2NSkpIHtcbiAgICByZXR1cm4gdmFsdWVzXzM2NS5tYXAoc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIpO1xuICB9IGVsc2UgaWYgKHZhbHVlc18zNjUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInJlcGxhY2VtZW50IHZhbHVlcyBmb3Igc3ludGF4IHRlbXBsYXRlIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXNfMzY1Lm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzXzM2MihMaXN0KHZhbHVlc18zNjUpKTtcbiAgfVxuICByZXR1cm4gdW53cmFwKHZhbHVlc18zNjUpO1xufVxuZnVuY3Rpb24gZXZhbFJ1bnRpbWVWYWx1ZXNfMzYzKHRlcm1zXzM2NiwgY29udGV4dF8zNjcpIHtcbiAgbGV0IHByZXBwZWRfMzY4ID0gdGVybXNfMzY2LnJlZHVjZSgoYWNjXzM3NCwgdGVybV8zNzUpID0+IHtcbiAgICBsZXQgcmVzdWx0XzM3NiA9IExpc3QoKTtcbiAgICBpZiAoaXNFeHBvcnQodGVybV8zNzUpKSB7XG4gICAgICBpZiAoaXNWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm1fMzc1LmRlY2xhcmF0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWNjXzM3NC5jb25jYXQobmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XCIsIHtkZWNsYXJhdGlvbjogdGVybV8zNzUuZGVjbGFyYXRpb259KSkuY29uY2F0KHRlcm1fMzc1LmRlY2xhcmF0aW9uLmRlY2xhcmF0b3JzLm1hcChkZWNsXzM3NyA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogbmV3IFRlcm0oXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7YmluZGluZzogbmV3IFRlcm0oXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCIsIHtvYmplY3Q6IG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge25hbWU6IFN5bnRheC5mcm9tSWRlbnRpZmllcihcImV4cG9ydHNcIil9KSwgcHJvcGVydHk6IGRlY2xfMzc3LmJpbmRpbmcubmFtZX0pLCBleHByZXNzaW9uOiBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiBkZWNsXzM3Ny5iaW5kaW5nLm5hbWV9KX0pfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzSW1wb3J0KHRlcm1fMzc1KSkge1xuICAgICAgcmV0dXJuIGFjY18zNzQ7XG4gICAgfVxuICAgIHJldHVybiBhY2NfMzc0LmNvbmNhdCh0ZXJtXzM3NSk7XG4gIH0sIExpc3QoKSk7XG4gIGxldCBwYXJzZWRfMzY5ID0gcmVkdWNlcihuZXcgUGFyc2VSZWR1Y2VyKGNvbnRleHRfMzY3LCBmYWxzZSksIG5ldyBUZXJtKFwiTW9kdWxlXCIsIHtkaXJlY3RpdmVzOiBMaXN0KCksIGl0ZW1zOiBwcmVwcGVkXzM2OH0pLmdlbih7aW5jbHVkZUltcG9ydHM6IGZhbHNlfSkpO1xuICBsZXQgZ2VuXzM3MCA9IGNvZGVnZW4ocGFyc2VkXzM2OSwgbmV3IEZvcm1hdHRlZENvZGVHZW4pO1xuICBsZXQgcmVzdWx0XzM3MSA9IGNvbnRleHRfMzY3LnRyYW5zZm9ybShnZW5fMzcwLCB7YmFiZWxyYzogdHJ1ZSwgZmlsZW5hbWU6IGNvbnRleHRfMzY3LmZpbGVuYW1lfSk7XG4gIGxldCBleHBvcnRzT2JqXzM3MiA9IHt9O1xuICBjb250ZXh0XzM2Ny5zdG9yZS5zZXQoXCJleHBvcnRzXCIsIGV4cG9ydHNPYmpfMzcyKTtcbiAgbGV0IHZhbF8zNzMgPSB2bS5ydW5JbkNvbnRleHQocmVzdWx0XzM3MS5jb2RlLCBjb250ZXh0XzM2Ny5zdG9yZS5nZXROb2RlQ29udGV4dCgpKTtcbiAgcmV0dXJuIGV4cG9ydHNPYmpfMzcyO1xufVxuZnVuY3Rpb24gZXZhbENvbXBpbGV0aW1lVmFsdWVfMzY0KGV4cHJfMzc4LCBjb250ZXh0XzM3OSkge1xuICBsZXQgZGVzZXJpYWxpemVyXzM4MCA9IG1ha2VEZXNlcmlhbGl6ZXIoY29udGV4dF8zNzkuYmluZGluZ3MpO1xuICBsZXQgc2FuZGJveF8zODEgPSB7c3ludGF4UXVvdGU6IGZ1bmN0aW9uIChzdHJpbmdzXzM4OSwgLi4udmFsdWVzXzM4OCkge1xuICAgIGxldCBjdHhfMzkwID0gZGVzZXJpYWxpemVyXzM4MC5yZWFkKF8ubGFzdCh2YWx1ZXNfMzg4KSk7XG4gICAgbGV0IHJlYWRlcl8zOTEgPSBuZXcgUmVhZGVyKHN0cmluZ3NfMzg5LCBjdHhfMzkwLCBfLnRha2UodmFsdWVzXzM4OC5sZW5ndGggLSAxLCB2YWx1ZXNfMzg4KSk7XG4gICAgcmV0dXJuIHJlYWRlcl8zOTEucmVhZCgpO1xuICB9LCBzeW50YXhUZW1wbGF0ZTogZnVuY3Rpb24gKHN0cl8zOTMsIC4uLnZhbHVlc18zOTIpIHtcbiAgICByZXR1cm4gcmVwbGFjZVRlbXBsYXRlKGRlc2VyaWFsaXplcl8zODAucmVhZChzdHJfMzkzKSwgc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIodmFsdWVzXzM5MikpO1xuICB9fTtcbiAgbGV0IHNhbmRib3hLZXlzXzM4MiA9IExpc3QoT2JqZWN0LmtleXMoc2FuZGJveF8zODEpKTtcbiAgbGV0IHNhbmRib3hWYWxzXzM4MyA9IHNhbmRib3hLZXlzXzM4Mi5tYXAoa18zOTQgPT4gc2FuZGJveF8zODFba18zOTRdKS50b0FycmF5KCk7XG4gIGxldCBwYXJzZWRfMzg0ID0gcmVkdWNlcihuZXcgUGFyc2VSZWR1Y2VyKGNvbnRleHRfMzc5KSwgbmV3IFRlcm0oXCJNb2R1bGVcIiwge2RpcmVjdGl2ZXM6IExpc3QoKSwgaXRlbXM6IExpc3Qub2YobmV3IFRlcm0oXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsIHtleHByZXNzaW9uOiBuZXcgVGVybShcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCB7aXNHZW5lcmF0b3I6IGZhbHNlLCBuYW1lOiBudWxsLCBwYXJhbXM6IG5ldyBUZXJtKFwiRm9ybWFsUGFyYW1ldGVyc1wiLCB7aXRlbXM6IHNhbmRib3hLZXlzXzM4Mi5tYXAocGFyYW1fMzk1ID0+IHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogU3ludGF4LmZyb20oXCJpZGVudGlmaWVyXCIsIHBhcmFtXzM5NSl9KTtcbiAgfSksIHJlc3Q6IG51bGx9KSwgYm9keTogbmV3IFRlcm0oXCJGdW5jdGlvbkJvZHlcIiwge2RpcmVjdGl2ZXM6IExpc3Qub2YobmV3IFRlcm0oXCJEaXJlY3RpdmVcIiwge3Jhd1ZhbHVlOiBcInVzZSBzdHJpY3RcIn0pKSwgc3RhdGVtZW50czogTGlzdC5vZihuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogZXhwcl8zNzh9KSl9KX0pfSkpfSkpO1xuICBsZXQgZ2VuXzM4NSA9IGNvZGVnZW4ocGFyc2VkXzM4NCwgbmV3IEZvcm1hdHRlZENvZGVHZW4pO1xuICBsZXQgcmVzdWx0XzM4NiA9IGNvbnRleHRfMzc5LnRyYW5zZm9ybShnZW5fMzg1LCB7YmFiZWxyYzogdHJ1ZSwgZmlsZW5hbWU6IGNvbnRleHRfMzc5LmZpbGVuYW1lfSk7XG4gIGxldCB2YWxfMzg3ID0gdm0ucnVuSW5Db250ZXh0KHJlc3VsdF8zODYuY29kZSwgY29udGV4dF8zNzkuc3RvcmUuZ2V0Tm9kZUNvbnRleHQoKSk7XG4gIHJldHVybiB2YWxfMzg3LmFwcGx5KHVuZGVmaW5lZCwgc2FuZGJveFZhbHNfMzgzKTtcbn1cbmV4cG9ydCB7c2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc18zNjIgYXMgc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlc307XG5leHBvcnQge2V2YWxSdW50aW1lVmFsdWVzXzM2MyBhcyBldmFsUnVudGltZVZhbHVlc307XG5leHBvcnQge2V2YWxDb21waWxldGltZVZhbHVlXzM2NCBhcyBldmFsQ29tcGlsZXRpbWVWYWx1ZX0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2FkLXN5bnRheC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQWdCZ0IseUIsR0FBQSx5QjtRQWFBLGlCLEdBQUEsaUI7UUE4Q0Esb0IsR0FBQSxvQjs7QUEzRWhCOztJQUFZLEM7O0FBQ1o7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7O0FBRUE7O0FBRUE7Ozs7Ozs7O0FBRU8sU0FBUyx5QkFBVCxDQUFtQyxNQUFuQyxFQUEyQztBQUNoRCxNQUFJLE1BQU0sT0FBTixDQUFjLE1BQWQsQ0FBSixFQUEyQjtBQUN6QixXQUFPLDBCQUEwQixxQkFBSyxNQUFMLENBQTFCLENBQVA7QUFDRCxHQUZELE1BRU8sSUFBSSxnQkFBSyxNQUFMLENBQVksTUFBWixDQUFKLEVBQXlCO0FBQzlCLFdBQU8sT0FBTyxHQUFQLENBQVcseUJBQVgsQ0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJLFVBQVUsSUFBZCxFQUFvQjtBQUN6QixVQUFNLElBQUksS0FBSixDQUFVLHNFQUFWLENBQU47QUFDRCxHQUZNLE1BRUEsSUFBSSxPQUFPLE9BQU8sSUFBZCxLQUF1QixVQUEzQixFQUF1QztBQUM1QyxXQUFPLDBCQUEwQixxQkFBSyxNQUFMLENBQTFCLENBQVA7QUFDRDtBQUNELFNBQU8sMEJBQU8sTUFBUCxDQUFQO0FBQ0Q7O0FBRU0sU0FBUyxpQkFBVCxDQUEyQixLQUEzQixFQUFrQyxPQUFsQyxFQUEyQztBQUNoRCxNQUFJLFVBQVUsTUFBTSxNQUFOLENBQWEsQ0FBQyxHQUFELEVBQU0sSUFBTixLQUFlO0FBQ3hDLFFBQUkscUJBQVMsSUFBVCxDQUFKLEVBQW9CO0FBQ2xCLFVBQUksa0NBQXNCLEtBQUssV0FBM0IsQ0FBSixFQUE2QztBQUMzQyxlQUFPLElBQUksTUFBSixDQUFXLG9CQUFTLDhCQUFULEVBQXlDO0FBQ3pELHVCQUFhLEtBQUs7QUFEdUMsU0FBekMsQ0FBWCxFQUVILE1B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LElBRm1DO0FBR3pDLGdCQUFRLG9CQUFTLGtCQUFULEVBQTZCO0FBQ25DLGlCQUFPLFlBQVksR0FBWixDQUFnQixTQUFTO0FBQzlCLG1CQUFPLG9CQUFTLG1CQUFULEVBQThCO0FBQ25DLG9CQUFNLGlCQUFPLElBQVAsQ0FBWSxZQUFaLEVBQTBCLEtBQTFCO0FBRDZCLGFBQTlCLENBQVA7QUFHRCxXQUpNLENBRDRCO0FBTW5DLGdCQUFNO0FBTjZCLFNBQTdCLENBSGlDO0FBV3pDLGNBQU0sb0JBQVMsY0FBVCxFQUF5QjtBQUM3QixzQkFBWSxnQkFBSyxFQUFMLENBQVEsb0JBQVMsV0FBVCxFQUFzQjtBQUN4QyxzQkFBVTtBQUQ4QixXQUF0QixDQUFSLENBRGlCO0FBSTdCLHNCQUFZLGdCQUFLLEVBQUwsQ0FBUSxvQkFBUyxpQkFBVCxFQUE0QjtBQUM5Qyx3QkFBWTtBQURrQyxXQUE1QixDQUFSO0FBSmlCLFNBQXpCO0FBWG1DLE9BQS9CO0FBRGlDLEtBQWhDLENBQVI7QUFGMEQsR0FBbkIsQ0FBbkMsQ0FBYjs7QUEwQkEsTUFBSSxNQUFNLDRCQUFRLE1BQVIsRUFBZ0Isb0NBQWhCLENBQVY7QUFDQSxNQUFJLFNBQVMsUUFBUSxTQUFSLENBQWtCLEdBQWxCLEVBQXVCO0FBQ2xDLGFBQVMsSUFEeUI7QUFFbEMsY0FBVSxRQUFRO0FBRmdCLEdBQXZCLENBQWI7O0FBS0EsTUFBSSxNQUFNLGFBQUcsWUFBSCxDQUFnQixPQUFPLElBQXZCLEVBQTZCLFFBQVEsS0FBUixDQUFjLGNBQWQsRUFBN0IsQ0FBVjtBQUNBLFNBQU8sSUFBSSxLQUFKLENBQVUsU0FBVixFQUFxQixXQUFyQixDQUFQO0FBQ0QiLCJmaWxlIjoibG9hZC1zeW50YXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IExpc3QgfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IFBhcnNlUmVkdWNlciBmcm9tICcuL3BhcnNlLXJlZHVjZXIuanMnO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmltcG9ydCB7IG1ha2VEZXNlcmlhbGl6ZXIgfSBmcm9tICcuL3NlcmlhbGl6ZXInO1xuaW1wb3J0IFN5bnRheCBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBjb2RlZ2VuLCB7IEZvcm1hdHRlZENvZGVHZW4gfSBmcm9tICdzaGlmdC1jb2RlZ2VuJztcbmltcG9ydCBUZXJtLCB7IGlzVmFyaWFibGVEZWNsYXJhdGlvbiwgaXNJbXBvcnQsIGlzRXhwb3J0IH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCBSZWFkZXIgZnJvbSAnLi9zaGlmdC1yZWFkZXInO1xuXG5pbXBvcnQgeyB1bndyYXAgfSBmcm9tICcuL21hY3JvLWNvbnRleHQnO1xuXG5pbXBvcnQgeyByZXBsYWNlVGVtcGxhdGUgfSBmcm9tICcuL3RlbXBsYXRlLXByb2Nlc3Nvcic7XG5cbmltcG9ydCB2bSBmcm9tIFwidm1cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUmVwbGFjZW1lbnRWYWx1ZXModmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICByZXR1cm4gc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlcyhMaXN0KHZhbHVlcykpO1xuICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHZhbHVlcykpIHtcbiAgICByZXR1cm4gdmFsdWVzLm1hcChzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKTtcbiAgfSBlbHNlIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInJlcGxhY2VtZW50IHZhbHVlcyBmb3Igc3ludGF4IHRlbXBsYXRlIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXMubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzYW5pdGl6ZVJlcGxhY2VtZW50VmFsdWVzKExpc3QodmFsdWVzKSk7XG4gIH1cbiAgcmV0dXJuIHVud3JhcCh2YWx1ZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbFJ1bnRpbWVWYWx1ZXModGVybXMsIGNvbnRleHQpIHtcbiAgbGV0IHByZXBwZWQgPSB0ZXJtcy5yZWR1Y2UoKGFjYywgdGVybSkgPT4ge1xuICAgIGlmIChpc0V4cG9ydCh0ZXJtKSkge1xuICAgICAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtLmRlY2xhcmF0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChuZXcgVGVybSgnVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCcsIHtcbiAgICAgICAgICBkZWNsYXJhdGlvbjogdGVybS5kZWNsYXJhdGlvblxuICAgICAgICB9KSkuY29uY2F0KHRlcm0uZGVjbGFyYXRpb24uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgVGVybSgnRXhwcmVzc2lvblN0YXRlbWVudCcsIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IG5ldyBUZXJtKCdBc3NpZ25tZW50RXhwcmVzc2lvbicsIHtcbiAgICAgICAgICAgICAgYmluZGluZzogbmV3IFRlcm0oJ1N0YXRpY01lbWJlckV4cHJlc3Npb24nLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0OiBuZXcgVGVybSgnSWRlbnRpZmllckV4cHJlc3Npb24nLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBTeW50YXguZnJvbUlkZW50aWZpZXIoJ2V4cG9ydHMnKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBkZWNsLmJpbmRpbmcubmFtZVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbmV3IFRlcm0oJ0lkZW50aWZpZXJFeHByZXNzaW9uJywge1xuICAgICAgICAgICAgICAgIG5hbWU6IGRlY2wuYmluZGluZy5uYW1lXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0ltcG9ydCh0ZXJtKSkge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG4gICAgcmV0dXJuIGFjYy5jb25jYXQodGVybSk7XG4gIH0sIExpc3QoKSk7XG4gIGxldCBwYXJzZWQgPSByZWR1Y2VyKG5ldyBQYXJzZVJlZHVjZXIoY29udGV4dCwgZmFsc2UpLCBuZXcgVGVybSgnTW9kdWxlJywge1xuICAgIGRpcmVjdGl2ZXM6IExpc3QoKSxcbiAgICBpdGVtczogcHJlcHBlZFxuICB9KS5nZW4oZmFsc2UpKTtcblxuICBsZXQgZ2VuID0gY29kZWdlbihwYXJzZWQsIG5ldyBGb3JtYXR0ZWRDb2RlR2VuKTtcbiAgbGV0IHJlc3VsdCA9IGNvbnRleHQudHJhbnNmb3JtKGdlbiwge1xuICAgIGJhYmVscmM6IHRydWUsXG4gICAgZmlsZW5hbWU6IGNvbnRleHQuZmlsZW5hbWVcbiAgfSk7XG5cbiAgbGV0IGV4cG9ydHNPYmogPSB7fTtcbiAgY29udGV4dC5zdG9yZS5zZXQoJ2V4cG9ydHMnLCBleHBvcnRzT2JqKTtcblxuICB2bS5ydW5JbkNvbnRleHQocmVzdWx0LmNvZGUsIGNvbnRleHQuc3RvcmUuZ2V0Tm9kZUNvbnRleHQoKSk7XG4gIHJldHVybiBleHBvcnRzT2JqO1xufVxuXG4vLyAoRXhwcmVzc2lvbiwgQ29udGV4dCkgLT4gW2Z1bmN0aW9uXVxuZXhwb3J0IGZ1bmN0aW9uIGV2YWxDb21waWxldGltZVZhbHVlKGV4cHIsIGNvbnRleHQpIHtcbiAgbGV0IGRlc2VyaWFsaXplciA9IG1ha2VEZXNlcmlhbGl6ZXIoY29udGV4dC5iaW5kaW5ncyk7XG4gIGxldCBzYW5kYm94ID0ge1xuICAgIHN5bnRheFF1b3RlOiBmdW5jdGlvbiAoc3RyaW5ncywgLi4udmFsdWVzKSB7XG4gICAgICBsZXQgY3R4ID0gZGVzZXJpYWxpemVyLnJlYWQoXy5sYXN0KHZhbHVlcykpO1xuICAgICAgbGV0IHJlYWRlciA9IG5ldyBSZWFkZXIoc3RyaW5ncywgY3R4LCBfLnRha2UodmFsdWVzLmxlbmd0aCAtIDEsIHZhbHVlcykpO1xuICAgICAgcmV0dXJuIHJlYWRlci5yZWFkKCk7XG4gICAgfSxcbiAgICBzeW50YXhUZW1wbGF0ZTogZnVuY3Rpb24oc3RyLCAuLi52YWx1ZXMpIHtcbiAgICAgIHJldHVybiByZXBsYWNlVGVtcGxhdGUoZGVzZXJpYWxpemVyLnJlYWQoc3RyKSwgc2FuaXRpemVSZXBsYWNlbWVudFZhbHVlcyh2YWx1ZXMpKTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IHNhbmRib3hLZXlzID0gTGlzdChPYmplY3Qua2V5cyhzYW5kYm94KSk7XG4gIGxldCBzYW5kYm94VmFscyA9IHNhbmRib3hLZXlzLm1hcChrID0+IHNhbmRib3hba10pLnRvQXJyYXkoKTtcblxuICBsZXQgcGFyc2VkID0gcmVkdWNlcihuZXcgUGFyc2VSZWR1Y2VyKGNvbnRleHQpLCBuZXcgVGVybShcIk1vZHVsZVwiLCB7XG4gICAgZGlyZWN0aXZlczogTGlzdCgpLFxuICAgIGl0ZW1zOiBMaXN0Lm9mKG5ldyBUZXJtKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCB7XG4gICAgICBleHByZXNzaW9uOiBuZXcgVGVybShcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCB7XG4gICAgICAgIGlzR2VuZXJhdG9yOiBmYWxzZSxcbiAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgcGFyYW1zOiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge1xuICAgICAgICAgIGl0ZW1zOiBzYW5kYm94S2V5cy5tYXAocGFyYW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge1xuICAgICAgICAgICAgICBuYW1lOiBTeW50YXguZnJvbShcImlkZW50aWZpZXJcIiwgcGFyYW0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByZXN0OiBudWxsXG4gICAgICAgIH0pLFxuICAgICAgICBib2R5OiBuZXcgVGVybShcIkZ1bmN0aW9uQm9keVwiLCB7XG4gICAgICAgICAgZGlyZWN0aXZlczogTGlzdC5vZihuZXcgVGVybSgnRGlyZWN0aXZlJywge1xuICAgICAgICAgICAgcmF3VmFsdWU6ICd1c2Ugc3RyaWN0J1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBMaXN0Lm9mKG5ldyBUZXJtKFwiUmV0dXJuU3RhdGVtZW50XCIsIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IGV4cHJcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSkpXG4gIH0pKTtcblxuICBsZXQgZ2VuID0gY29kZWdlbihwYXJzZWQsIG5ldyBGb3JtYXR0ZWRDb2RlR2VuKTtcbiAgbGV0IHJlc3VsdCA9IGNvbnRleHQudHJhbnNmb3JtKGdlbiwge1xuICAgIGJhYmVscmM6IHRydWUsXG4gICAgZmlsZW5hbWU6IGNvbnRleHQuZmlsZW5hbWVcbiAgfSk7XG5cbiAgbGV0IHZhbCA9IHZtLnJ1bkluQ29udGV4dChyZXN1bHQuY29kZSwgY29udGV4dC5zdG9yZS5nZXROb2RlQ29udGV4dCgpKTtcbiAgcmV0dXJuIHZhbC5hcHBseSh1bmRlZmluZWQsIHNhbmRib3hWYWxzKTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/macro-context.js b/dist/macro-context.js index 7343083b..c73058a7 100644 --- a/dist/macro-context.js +++ b/dist/macro-context.js @@ -1,346 +1,406 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.unwrap = exports.SyntaxOrTermWrapper = undefined; +exports.SyntaxOrTermWrapper = undefined; +exports.unwrap = unwrap; -var _mapSyntaxReducer = require("./map-syntax-reducer"); +var _errors = require('./errors'); -var _mapSyntaxReducer2 = _interopRequireDefault(_mapSyntaxReducer); +var _immutable = require('immutable'); -var _shiftReducer = require("shift-reducer"); +var _enforester = require('./enforester'); -var _shiftReducer2 = _interopRequireDefault(_shiftReducer); +var _syntax = require('./syntax'); -var _errors = require("./errors"); - -var _immutable = require("immutable"); - -var _enforester = require("./enforester"); - -var _syntax = require("./syntax"); - -var _syntax2 = _interopRequireDefault(_syntax); - -var _ramdaFantasy = require("ramda-fantasy"); - -var _ramda = require("ramda"); +var _ramda = require('ramda'); var _ = _interopRequireWildcard(_ramda); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const symWrap = Symbol('wrapper'); +const privateData = new WeakMap(); -const Just_396 = _ramdaFantasy.Maybe.Just; -const Nothing_397 = _ramdaFantasy.Maybe.Nothing; -const symWrap_398 = Symbol("wrapper"); -const privateData_399 = new WeakMap(); -const getVal_400 = t_405 => { - if (t_405.match("delimiter")) { +const getVal = t => { + if (t.match("delimiter")) { return null; } - if (typeof t_405.val === "function") { - return t_405.val(); + if (typeof t.val === 'function') { + return t.val(); } return null; }; -class SyntaxOrTermWrapper_401 { - constructor(s_406) { - let context_407 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - this[symWrap_398] = s_406; - this.context = context_407; +class SyntaxOrTermWrapper { + constructor(s) { + let context = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + this[symWrap] = s; + this.context = context; } - from(type_408, value_409) { - let stx_410 = this[symWrap_398]; - if (typeof stx_410.from === "function") { - return stx_410.from(type_408, value_409); + + from(type, value) { + let stx = this[symWrap]; + if (typeof stx.from === 'function') { + return stx.from(type, value); } } fromNull() { return this.from("null", null); } - fromNumber(value_411) { - return this.from("number", value_411); + + fromNumber(value) { + return this.from('number', value); } - fromString(value_412) { - return this.from("string", value_412); + + fromString(value) { + return this.from("string", value); } - fromPunctuator(value_413) { - return this.from("punctuator", value_413); + + fromPunctuator(value) { + return this.from("punctuator", value); } - fromKeyword(value_414) { - return this.from("keyword"); + + fromKeyword(value) { + return this.from("keyword", value); } - fromIdentifier(value_415) { - return this.from("identifier", value_415); + + fromIdentifier(value) { + return this.from("identifier", value); } - fromRegularExpression(value_416) { - return this.from("regularExpression", value_416); + + fromRegularExpression(value) { + return this.from("regularExpression", value); } - fromBraces(inner_417) { - return this.from("braces", inner_417); + + fromBraces(inner) { + return this.from("braces", inner); } - fromBrackets(inner_418) { - return this.from("brackets", inner_418); + + fromBrackets(inner) { + return this.from("brackets", inner); } - fromParens(inner_419) { - return this.from("parens", inner_419); + + fromParens(inner) { + return this.from("parens", inner); } - match(type_420, value_421) { - let stx_422 = this[symWrap_398]; - if (typeof stx_422.match === "function") { - return stx_422.match(type_420, value_421); + + match(type, value) { + let stx = this[symWrap]; + if (typeof stx.match === 'function') { + return stx.match(type, value); } } - isIdentifier(value_423) { - return this.match("identifier", value_423); + + isIdentifier(value) { + return this.match("identifier", value); } - isAssign(value_424) { - return this.match("assign", value_424); + + isAssign(value) { + return this.match("assign", value); } - isBooleanLiteral(value_425) { - return this.match("boolean", value_425); + + isBooleanLiteral(value) { + return this.match("boolean", value); } - isKeyword(value_426) { - return this.match("keyword", value_426); + + isKeyword(value) { + return this.match("keyword", value); } - isNullLiteral(value_427) { - return this.match("null", value_427); + + isNullLiteral(value) { + return this.match("null", value); } - isNumericLiteral(value_428) { - return this.match("number", value_428); + + isNumericLiteral(value) { + return this.match("number", value); } - isPunctuator(value_429) { - return this.match("punctuator", value_429); + + isPunctuator(value) { + return this.match("punctuator", value); } - isStringLiteral(value_430) { - return this.match("string", value_430); + + isStringLiteral(value) { + return this.match("string", value); } - isRegularExpression(value_431) { - return this.match("regularExpression", value_431); + + isRegularExpression(value) { + return this.match("regularExpression", value); } - isTemplate(value_432) { - return this.match("template", value_432); + + isTemplate(value) { + return this.match("template", value); } - isDelimiter(value_433) { - return this.match("delimiter", value_433); + + isDelimiter(value) { + return this.match("delimiter", value); } - isParens(value_434) { - return this.match("parens", value_434); + + isParens(value) { + return this.match("parens", value); } - isBraces(value_435) { - return this.match("braces", value_435); + + isBraces(value) { + return this.match("braces", value); } - isBrackets(value_436) { - return this.match("brackets", value_436); + + isBrackets(value) { + return this.match("brackets", value); } - isSyntaxTemplate(value_437) { - return this.match("syntaxTemplate", value_437); + + isSyntaxTemplate(value) { + return this.match("syntaxTemplate", value); } - isEOF(value_438) { - return this.match("eof", value_438); + + isEOF(value) { + return this.match("eof", value); } + lineNumber() { - return this[symWrap_398].lineNumber(); + return this[symWrap].lineNumber(); } + val() { - return getVal_400(this[symWrap_398]); + return getVal(this[symWrap]); } + inner() { - let stx_439 = this[symWrap_398]; - if (!stx_439.match("delimiter")) { - throw new Error("Can only get inner syntax on a delimiter"); + let stx = this[symWrap]; + if (!stx.match("delimiter")) { + throw new Error('Can only get inner syntax on a delimiter'); } - let enf_440 = new _enforester.Enforester(stx_439.inner(), (0, _immutable.List)(), this.context); - return new MacroContext(enf_440, "inner", this.context); + + let enf = new _enforester.Enforester(stx.inner(), (0, _immutable.List)(), this.context); + return new MacroContext(enf, 'inner', this.context); } } -function unwrap_402(x_441) { - if (x_441 instanceof SyntaxOrTermWrapper_401) { - return x_441[symWrap_398]; + +exports.SyntaxOrTermWrapper = SyntaxOrTermWrapper; +function unwrap(x) { + if (x instanceof SyntaxOrTermWrapper) { + return x[symWrap]; } - return x_441; + return x; } -function cloneEnforester_403(enf_442) { - const rest = enf_442.rest; - const prev = enf_442.prev; - const context = enf_442.context; + +function cloneEnforester(enf) { + const rest = enf.rest; + const prev = enf.prev; + const context = enf.context; return new _enforester.Enforester(rest, prev, context); } -function Marker_404() {} + +function Marker() {} + +/* +ctx :: { + of: (Syntax) -> ctx + next: (String) -> Syntax or Term +} +*/ class MacroContext { - constructor(enf_443, name_444, context_445, useScope_446, introducedScope_447) { - const startMarker_448 = new Marker_404(); - const startEnf_449 = cloneEnforester_403(enf_443); - const priv_450 = { name: name_444, context: context_445, startMarker: startMarker_448, markers: new Map([[startMarker_448, enf_443]]) }; - if (useScope_446 && introducedScope_447) { - priv_450.noScopes = false; - priv_450.useScope = useScope_446; - priv_450.introducedScope = introducedScope_447; + + constructor(enf, name, context, useScope, introducedScope) { + const startMarker = new Marker(); + const startEnf = cloneEnforester(enf); + const priv = { + name: name, + context: context, + enf: startEnf, + startMarker: startMarker, + markers: new Map([[startMarker, enf]]) + }; + + if (useScope && introducedScope) { + priv.noScopes = false; + priv.useScope = useScope; + priv.introducedScope = introducedScope; } else { - priv_450.noScopes = true; + priv.noScopes = true; } - privateData_399.set(this, priv_450); - this.reset(); + privateData.set(this, priv); + this.reset(); // set current enforester + this[Symbol.iterator] = () => this; } + name() { - var _privateData_399$get = privateData_399.get(this); + var _privateData$get = privateData.get(this); - const name = _privateData_399$get.name; - const context = _privateData_399$get.context; + const name = _privateData$get.name; + const context = _privateData$get.context; - return new SyntaxOrTermWrapper_401(name, context); + return new SyntaxOrTermWrapper(name, context); } - expand(type_451) { - var _privateData_399$get2 = privateData_399.get(this); - const enf = _privateData_399$get2.enf; - const context = _privateData_399$get2.context; + expand(type) { + var _privateData$get2 = privateData.get(this); + + const enf = _privateData$get2.enf; + const context = _privateData$get2.context; if (enf.rest.size === 0) { - return { done: true, value: null }; + return { + done: true, + value: null + }; } enf.expandMacro(); - let originalRest_452 = enf.rest; - let value_453; - switch (type_451) { - case "AssignmentExpression": - case "expr": - value_453 = enf.enforestExpressionLoop(); + let originalRest = enf.rest; + let value; + switch (type) { + case 'AssignmentExpression': + case 'expr': + value = enf.enforestExpressionLoop(); break; - case "Expression": - value_453 = enf.enforestExpression(); + case 'Expression': + value = enf.enforestExpression(); break; - case "Statement": - case "stmt": - value_453 = enf.enforestStatement(); + case 'Statement': + case 'stmt': + value = enf.enforestStatement(); break; - case "BlockStatement": - case "WhileStatement": - case "IfStatement": - case "ForStatement": - case "SwitchStatement": - case "BreakStatement": - case "ContinueStatement": - case "DebuggerStatement": - case "WithStatement": - case "TryStatement": - case "ThrowStatement": - case "ClassDeclaration": - case "FunctionDeclaration": - case "LabeledStatement": - case "VariableDeclarationStatement": - case "ReturnStatement": - case "ExpressionStatement": - value_453 = enf.enforestStatement(); - (0, _errors.expect)(_.whereEq({ type: type_451 }, value_453), `Expecting a ${ type_451 }`, value_453, originalRest_452); + case 'BlockStatement': + case 'WhileStatement': + case 'IfStatement': + case 'ForStatement': + case 'SwitchStatement': + case 'BreakStatement': + case 'ContinueStatement': + case 'DebuggerStatement': + case 'WithStatement': + case 'TryStatement': + case 'ThrowStatement': + case 'ClassDeclaration': + case 'FunctionDeclaration': + case 'LabeledStatement': + case 'VariableDeclarationStatement': + case 'ReturnStatement': + case 'ExpressionStatement': + value = enf.enforestStatement(); + (0, _errors.expect)(_.whereEq({ type: type }, value), `Expecting a ${ type }`, value, originalRest); break; - case "YieldExpression": - value_453 = enf.enforestYieldExpression(); + case 'YieldExpression': + value = enf.enforestYieldExpression(); break; - case "ClassExpression": - value_453 = enf.enforestClass({ isExpr: true }); + case 'ClassExpression': + value = enf.enforestClass({ isExpr: true }); break; - case "ArrowExpression": - value_453 = enf.enforestArrowExpression(); + case 'ArrowExpression': + value = enf.enforestArrowExpression(); break; - case "NewExpression": - value_453 = enf.enforestNewExpression(); + case 'NewExpression': + value = enf.enforestNewExpression(); break; - case "ThisExpression": - case "FunctionExpression": - case "IdentifierExpression": - case "LiteralNumericExpression": - case "LiteralInfinityExpression": - case "LiteralStringExpression": - case "TemplateExpression": - case "LiteralBooleanExpression": - case "LiteralNullExpression": - case "LiteralRegExpExpression": - case "ObjectExpression": - case "ArrayExpression": - value_453 = enf.enforestPrimaryExpression(); + case 'ThisExpression': + case 'FunctionExpression': + case 'IdentifierExpression': + case 'LiteralNumericExpression': + case 'LiteralInfinityExpression': + case 'LiteralStringExpression': + case 'TemplateExpression': + case 'LiteralBooleanExpression': + case 'LiteralNullExpression': + case 'LiteralRegExpExpression': + case 'ObjectExpression': + case 'ArrayExpression': + value = enf.enforestPrimaryExpression(); break; - case "UnaryExpression": - case "UpdateExpression": - case "BinaryExpression": - case "StaticMemberExpression": - case "ComputedMemberExpression": - case "AssignmentExpression": - case "CompoundAssignmentExpression": - case "ConditionalExpression": - value_453 = enf.enforestExpressionLoop(); - (0, _errors.expect)(_.whereEq({ type: type_451 }, value_453), `Expecting a ${ type_451 }`, value_453, originalRest_452); + case 'UnaryExpression': + case 'UpdateExpression': + case 'BinaryExpression': + case 'StaticMemberExpression': + case 'ComputedMemberExpression': + case 'CompoundAssignmentExpression': + case 'ConditionalExpression': + value = enf.enforestExpressionLoop(); + (0, _errors.expect)(_.whereEq({ type: type }, value), `Expecting a ${ type }`, value, originalRest); break; default: - throw new Error("Unknown term type: " + type_451); + throw new Error('Unknown term type: ' + type); } - return { done: false, value: new SyntaxOrTermWrapper_401(value_453, context) }; + return { + done: false, + value: new SyntaxOrTermWrapper(value, context) + }; } - _rest(enf_454) { - const priv_455 = privateData_399.get(this); - if (priv_455.markers.get(priv_455.startMarker) === enf_454) { - return priv_455.enf.rest; + + _rest(enf) { + const priv = privateData.get(this); + if (priv.markers.get(priv.startMarker) === enf) { + return priv.enf.rest; } throw Error("Unauthorized access!"); } - reset(marker_456) { - const priv_457 = privateData_399.get(this); - let enf_458; - if (marker_456 == null) { - enf_458 = priv_457.markers.get(priv_457.startMarker); - } else if (marker_456 && marker_456 instanceof Marker_404) { - if (priv_457.markers.has(marker_456)) { - enf_458 = priv_457.markers.get(marker_456); + + reset(marker) { + const priv = privateData.get(this); + let enf; + if (marker == null) { + // go to the beginning + enf = priv.markers.get(priv.startMarker); + } else if (marker && marker instanceof Marker) { + // marker could be from another context + if (priv.markers.has(marker)) { + enf = priv.markers.get(marker); } else { - throw new Error("marker must originate from this context"); + throw new Error('marker must originate from this context'); } } else { - throw new Error("marker must be an instance of Marker"); + throw new Error('marker must be an instance of Marker'); } - priv_457.enf = cloneEnforester_403(enf_458); + priv.enf = cloneEnforester(enf); } + mark() { - const priv_459 = privateData_399.get(this); - let marker_460; - if (priv_459.enf.rest === priv_459.markers.get(priv_459.startMarker).rest) { - marker_460 = priv_459.startMarker; - } else if (priv_459.enf.rest.isEmpty()) { - if (!priv_459.endMarker) priv_459.endMarker = new Marker_404(); - marker_460 = priv_459.endMarker; + const priv = privateData.get(this); + let marker; + + // the idea here is that marking at the beginning shouldn't happen more than once. + // We can reuse startMarker. + if (priv.enf.rest === priv.markers.get(priv.startMarker).rest) { + marker = priv.startMarker; + } else if (priv.enf.rest.isEmpty()) { + // same reason as above + if (!priv.endMarker) priv.endMarker = new Marker(); + marker = priv.endMarker; } else { - marker_460 = new Marker_404(); + //TODO(optimization/dubious): check that there isn't already a marker for this index? + marker = new Marker(); } - if (!priv_459.markers.has(marker_460)) { - priv_459.markers.set(marker_460, cloneEnforester_403(priv_459.enf)); + if (!priv.markers.has(marker)) { + priv.markers.set(marker, cloneEnforester(priv.enf)); } - return marker_460; + return marker; } + next() { - var _privateData_399$get3 = privateData_399.get(this); + var _privateData$get3 = privateData.get(this); - const enf = _privateData_399$get3.enf; - const noScopes = _privateData_399$get3.noScopes; - const useScope = _privateData_399$get3.useScope; - const introducedScope = _privateData_399$get3.introducedScope; - const context = _privateData_399$get3.context; + const enf = _privateData$get3.enf; + const noScopes = _privateData$get3.noScopes; + const useScope = _privateData$get3.useScope; + const introducedScope = _privateData$get3.introducedScope; + const context = _privateData$get3.context; if (enf.rest.size === 0) { - return { done: true, value: null }; + return { + done: true, + value: null + }; } - let value_461 = enf.advance(); + let value = enf.advance(); if (!noScopes) { - value_461 = value_461.addScope(useScope, context.bindings, _syntax.ALL_PHASES).addScope(introducedScope, context.bindings, _syntax.ALL_PHASES, { flip: true }); + value = value.addScope(useScope, context.bindings, _syntax.ALL_PHASES).addScope(introducedScope, context.bindings, _syntax.ALL_PHASES, { flip: true }); } - return { done: false, value: new SyntaxOrTermWrapper_401(value_461, context) }; + return { + done: false, + value: new SyntaxOrTermWrapper(value, context) + }; } } exports.default = MacroContext; -exports.SyntaxOrTermWrapper = SyntaxOrTermWrapper_401; -exports.unwrap = unwrap_402; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L21hY3JvLWNvbnRleHQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUNBOztBQUNBOztJQUFhLEM7Ozs7OztBQUNiLE1BQU0sV0FBVyxvQkFBTSxJQUF2QjtBQUNBLE1BQU0sY0FBYyxvQkFBTSxPQUExQjtBQUNBLE1BQU0sY0FBYyxPQUFPLFNBQVAsQ0FBcEI7QUFDQSxNQUFNLGtCQUFrQixJQUFJLE9BQUosRUFBeEI7QUFDQSxNQUFNLGFBQWEsU0FBUztBQUMxQixNQUFJLE1BQU0sS0FBTixDQUFZLFdBQVosQ0FBSixFQUE4QjtBQUM1QixXQUFPLElBQVA7QUFDRDtBQUNELE1BQUksT0FBTyxNQUFNLEdBQWIsS0FBcUIsVUFBekIsRUFBcUM7QUFDbkMsV0FBTyxNQUFNLEdBQU4sRUFBUDtBQUNEO0FBQ0QsU0FBTyxJQUFQO0FBQ0QsQ0FSRDtBQVNBLE1BQU0sdUJBQU4sQ0FBOEI7QUFDNUIsY0FBWSxLQUFaLEVBQXFDO0FBQUEsUUFBbEIsV0FBa0IseURBQUosRUFBSTs7QUFDbkMsU0FBSyxXQUFMLElBQW9CLEtBQXBCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsV0FBZjtBQUNEO0FBQ0QsT0FBSyxRQUFMLEVBQWUsU0FBZixFQUEwQjtBQUN4QixRQUFJLFVBQVUsS0FBSyxXQUFMLENBQWQ7QUFDQSxRQUFJLE9BQU8sUUFBUSxJQUFmLEtBQXdCLFVBQTVCLEVBQXdDO0FBQ3RDLGFBQU8sUUFBUSxJQUFSLENBQWEsUUFBYixFQUF1QixTQUF2QixDQUFQO0FBQ0Q7QUFDRjtBQUNELGFBQVc7QUFDVCxXQUFPLEtBQUssSUFBTCxDQUFVLE1BQVYsRUFBa0IsSUFBbEIsQ0FBUDtBQUNEO0FBQ0QsYUFBVyxTQUFYLEVBQXNCO0FBQ3BCLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBVixFQUFvQixTQUFwQixDQUFQO0FBQ0Q7QUFDRCxhQUFXLFNBQVgsRUFBc0I7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RCxXQUFPLFVBQVA7QUFDRDtBQUNELFNBQU87QUFBQSxnQ0FDdUQsZ0JBQWdCLEdBQWhCLENBQW9CLElBQXBCLENBRHZEOztBQUFBLFVBQ0UsR0FERix5QkFDRSxHQURGO0FBQUEsVUFDTyxRQURQLHlCQUNPLFFBRFA7QUFBQSxVQUNpQixRQURqQix5QkFDaUIsUUFEakI7QUFBQSxVQUMyQixlQUQzQix5QkFDMkIsZUFEM0I7QUFBQSxVQUM0QyxPQUQ1Qyx5QkFDNEMsT0FENUM7O0FBRUwsUUFBSSxJQUFJLElBQUosQ0FBUyxJQUFULEtBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCLGFBQU8sRUFBQyxNQUFNLElBQVAsRUFBYSxPQUFPLElBQXBCLEVBQVA7QUFDRDtBQUNELFFBQUksWUFBWSxJQUFJLE9BQUosRUFBaEI7QUFDQSxRQUFJLENBQUMsUUFBTCxFQUFlO0FBQ2Isa0JBQVksVUFBVSxRQUFWLENBQW1CLFFBQW5CLEVBQTZCLFFBQVEsUUFBckMsc0JBQTJELFFBQTNELENBQW9FLGVBQXBFLEVBQXFGLFFBQVEsUUFBN0Ysc0JBQW1ILEVBQUMsTUFBTSxJQUFQLEVBQW5ILENBQVo7QUFDRDtBQUNELFdBQU8sRUFBQyxNQUFNLEtBQVAsRUFBYyxPQUFPLElBQUksdUJBQUosQ0FBNEIsU0FBNUIsRUFBdUMsT0FBdkMsQ0FBckIsRUFBUDtBQUNEO0FBdkorQjtrQkFBYixZO1FBeUpjLG1CLEdBQTNCLHVCO1FBQ2MsTSxHQUFkLFUiLCJmaWxlIjoibWFjcm8tY29udGV4dC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXBTeW50YXhSZWR1Y2VyIGZyb20gXCIuL21hcC1zeW50YXgtcmVkdWNlclwiO1xuaW1wb3J0IHJlZHVjZXIgZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHtFbmZvcmVzdGVyfSBmcm9tIFwiLi9lbmZvcmVzdGVyXCI7XG5pbXBvcnQgU3ludGF4LCB7QUxMX1BIQVNFU30gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge01heWJlfSBmcm9tIFwicmFtZGEtZmFudGFzeVwiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5jb25zdCBKdXN0XzM5NiA9IE1heWJlLkp1c3Q7XG5jb25zdCBOb3RoaW5nXzM5NyA9IE1heWJlLk5vdGhpbmc7XG5jb25zdCBzeW1XcmFwXzM5OCA9IFN5bWJvbChcIndyYXBwZXJcIik7XG5jb25zdCBwcml2YXRlRGF0YV8zOTkgPSBuZXcgV2Vha01hcDtcbmNvbnN0IGdldFZhbF80MDAgPSB0XzQwNSA9PiB7XG4gIGlmICh0XzQwNS5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdF80MDUudmFsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdF80MDUudmFsKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuY2xhc3MgU3ludGF4T3JUZXJtV3JhcHBlcl80MDEge1xuICBjb25zdHJ1Y3RvcihzXzQwNiwgY29udGV4dF80MDcgPSB7fSkge1xuICAgIHRoaXNbc3ltV3JhcF8zOThdID0gc180MDY7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF80MDc7XG4gIH1cbiAgZnJvbSh0eXBlXzQwOCwgdmFsdWVfNDA5KSB7XG4gICAgbGV0IHN0eF80MTAgPSB0aGlzW3N5bVdyYXBfMzk4XTtcbiAgICBpZiAodHlwZW9mIHN0eF80MTAuZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gc3R4XzQxMC5mcm9tKHR5cGVfNDA4LCB2YWx1ZV80MDkpO1xuICAgIH1cbiAgfVxuICBmcm9tTnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwibnVsbFwiLCBudWxsKTtcbiAgfVxuICBmcm9tTnVtYmVyKHZhbHVlXzQxMSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJudW1iZXJcIiwgdmFsdWVfNDExKTtcbiAgfVxuICBmcm9tU3RyaW5nKHZhbHVlXzQxMikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJzdHJpbmdcIiwgdmFsdWVfNDEyKTtcbiAgfVxuICBmcm9tUHVuY3R1YXRvcih2YWx1ZV80MTMpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZV80MTMpO1xuICB9XG4gIGZyb21LZXl3b3JkKHZhbHVlXzQxNCkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJrZXl3b3JkXCIpO1xuICB9XG4gIGZyb21JZGVudGlmaWVyKHZhbHVlXzQxNSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlXzQxNSk7XG4gIH1cbiAgZnJvbVJlZ3VsYXJFeHByZXNzaW9uKHZhbHVlXzQxNikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZV80MTYpO1xuICB9XG4gIGZyb21CcmFjZXMoaW5uZXJfNDE3KSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImJyYWNlc1wiLCBpbm5lcl80MTcpO1xuICB9XG4gIGZyb21CcmFja2V0cyhpbm5lcl80MTgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXJfNDE4KTtcbiAgfVxuICBmcm9tUGFyZW5zKGlubmVyXzQxOSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJwYXJlbnNcIiwgaW5uZXJfNDE5KTtcbiAgfVxuICBtYXRjaCh0eXBlXzQyMCwgdmFsdWVfNDIxKSB7XG4gICAgbGV0IHN0eF80MjIgPSB0aGlzW3N5bVdyYXBfMzk4XTtcbiAgICBpZiAodHlwZW9mIHN0eF80MjIubWF0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHN0eF80MjIubWF0Y2godHlwZV80MjAsIHZhbHVlXzQyMSk7XG4gICAgfVxuICB9XG4gIGlzSWRlbnRpZmllcih2YWx1ZV80MjMpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImlkZW50aWZpZXJcIiwgdmFsdWVfNDIzKTtcbiAgfVxuICBpc0Fzc2lnbih2YWx1ZV80MjQpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImFzc2lnblwiLCB2YWx1ZV80MjQpO1xuICB9XG4gIGlzQm9vbGVhbkxpdGVyYWwodmFsdWVfNDI1KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJib29sZWFuXCIsIHZhbHVlXzQyNSk7XG4gIH1cbiAgaXNLZXl3b3JkKHZhbHVlXzQyNikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwia2V5d29yZFwiLCB2YWx1ZV80MjYpO1xuICB9XG4gIGlzTnVsbExpdGVyYWwodmFsdWVfNDI3KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJudWxsXCIsIHZhbHVlXzQyNyk7XG4gIH1cbiAgaXNOdW1lcmljTGl0ZXJhbCh2YWx1ZV80MjgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcIm51bWJlclwiLCB2YWx1ZV80MjgpO1xuICB9XG4gIGlzUHVuY3R1YXRvcih2YWx1ZV80MjkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInB1bmN0dWF0b3JcIiwgdmFsdWVfNDI5KTtcbiAgfVxuICBpc1N0cmluZ0xpdGVyYWwodmFsdWVfNDMwKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzdHJpbmdcIiwgdmFsdWVfNDMwKTtcbiAgfVxuICBpc1JlZ3VsYXJFeHByZXNzaW9uKHZhbHVlXzQzMSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicmVndWxhckV4cHJlc3Npb25cIiwgdmFsdWVfNDMxKTtcbiAgfVxuICBpc1RlbXBsYXRlKHZhbHVlXzQzMikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwidGVtcGxhdGVcIiwgdmFsdWVfNDMyKTtcbiAgfVxuICBpc0RlbGltaXRlcih2YWx1ZV80MzMpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImRlbGltaXRlclwiLCB2YWx1ZV80MzMpO1xuICB9XG4gIGlzUGFyZW5zKHZhbHVlXzQzNCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicGFyZW5zXCIsIHZhbHVlXzQzNCk7XG4gIH1cbiAgaXNCcmFjZXModmFsdWVfNDM1KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJicmFjZXNcIiwgdmFsdWVfNDM1KTtcbiAgfVxuICBpc0JyYWNrZXRzKHZhbHVlXzQzNikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYnJhY2tldHNcIiwgdmFsdWVfNDM2KTtcbiAgfVxuICBpc1N5bnRheFRlbXBsYXRlKHZhbHVlXzQzNykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwic3ludGF4VGVtcGxhdGVcIiwgdmFsdWVfNDM3KTtcbiAgfVxuICBpc0VPRih2YWx1ZV80MzgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImVvZlwiLCB2YWx1ZV80MzgpO1xuICB9XG4gIGxpbmVOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXNbc3ltV3JhcF8zOThdLmxpbmVOdW1iZXIoKTtcbiAgfVxuICB2YWwoKSB7XG4gICAgcmV0dXJuIGdldFZhbF80MDAodGhpc1tzeW1XcmFwXzM5OF0pO1xuICB9XG4gIGlubmVyKCkge1xuICAgIGxldCBzdHhfNDM5ID0gdGhpc1tzeW1XcmFwXzM5OF07XG4gICAgaWYgKCFzdHhfNDM5Lm1hdGNoKFwiZGVsaW1pdGVyXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gb25seSBnZXQgaW5uZXIgc3ludGF4IG9uIGEgZGVsaW1pdGVyXCIpO1xuICAgIH1cbiAgICBsZXQgZW5mXzQ0MCA9IG5ldyBFbmZvcmVzdGVyKHN0eF80MzkuaW5uZXIoKSwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiBuZXcgTWFjcm9Db250ZXh0KGVuZl80NDAsIFwiaW5uZXJcIiwgdGhpcy5jb250ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gdW53cmFwXzQwMih4XzQ0MSkge1xuICBpZiAoeF80NDEgaW5zdGFuY2VvZiBTeW50YXhPclRlcm1XcmFwcGVyXzQwMSkge1xuICAgIHJldHVybiB4XzQ0MVtzeW1XcmFwXzM5OF07XG4gIH1cbiAgcmV0dXJuIHhfNDQxO1xufVxuZnVuY3Rpb24gY2xvbmVFbmZvcmVzdGVyXzQwMyhlbmZfNDQyKSB7XG4gIGNvbnN0IHtyZXN0LCBwcmV2LCBjb250ZXh0fSA9IGVuZl80NDI7XG4gIHJldHVybiBuZXcgRW5mb3Jlc3RlcihyZXN0LCBwcmV2LCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIE1hcmtlcl80MDQoKSB7fVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFjcm9Db250ZXh0IHtcbiAgY29uc3RydWN0b3IoZW5mXzQ0MywgbmFtZV80NDQsIGNvbnRleHRfNDQ1LCB1c2VTY29wZV80NDYsIGludHJvZHVjZWRTY29wZV80NDcpIHtcbiAgICBjb25zdCBzdGFydE1hcmtlcl80NDggPSBuZXcgTWFya2VyXzQwNDtcbiAgICBjb25zdCBzdGFydEVuZl80NDkgPSBjbG9uZUVuZm9yZXN0ZXJfNDAzKGVuZl80NDMpO1xuICAgIGNvbnN0IHByaXZfNDUwID0ge25hbWU6IG5hbWVfNDQ0LCBjb250ZXh0OiBjb250ZXh0XzQ0NSwgc3RhcnRNYXJrZXI6IHN0YXJ0TWFya2VyXzQ0OCwgbWFya2VyczogbmV3IE1hcChbW3N0YXJ0TWFya2VyXzQ0OCwgZW5mXzQ0M11dKX07XG4gICAgaWYgKHVzZVNjb3BlXzQ0NiAmJiBpbnRyb2R1Y2VkU2NvcGVfNDQ3KSB7XG4gICAgICBwcml2XzQ1MC5ub1Njb3BlcyA9IGZhbHNlO1xuICAgICAgcHJpdl80NTAudXNlU2NvcGUgPSB1c2VTY29wZV80NDY7XG4gICAgICBwcml2XzQ1MC5pbnRyb2R1Y2VkU2NvcGUgPSBpbnRyb2R1Y2VkU2NvcGVfNDQ3O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcml2XzQ1MC5ub1Njb3BlcyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGVEYXRhXzM5OS5zZXQodGhpcywgcHJpdl80NTApO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzW1N5bWJvbC5pdGVyYXRvcl0gPSAoKSA9PiB0aGlzO1xuICB9XG4gIG5hbWUoKSB7XG4gICAgY29uc3Qge25hbWUsIGNvbnRleHR9ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICByZXR1cm4gbmV3IFN5bnRheE9yVGVybVdyYXBwZXJfNDAxKG5hbWUsIGNvbnRleHQpO1xuICB9XG4gIGV4cGFuZCh0eXBlXzQ1MSkge1xuICAgIGNvbnN0IHtlbmYsIGNvbnRleHR9ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICBpZiAoZW5mLnJlc3Quc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtkb25lOiB0cnVlLCB2YWx1ZTogbnVsbH07XG4gICAgfVxuICAgIGVuZi5leHBhbmRNYWNybygpO1xuICAgIGxldCBvcmlnaW5hbFJlc3RfNDUyID0gZW5mLnJlc3Q7XG4gICAgbGV0IHZhbHVlXzQ1MztcbiAgICBzd2l0Y2ggKHR5cGVfNDUxKSB7XG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJleHByXCI6XG4gICAgICAgIHZhbHVlXzQ1MyA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkV4cHJlc3Npb25cIjpcbiAgICAgICAgdmFsdWVfNDUzID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJzdG10XCI6XG4gICAgICAgIHZhbHVlXzQ1MyA9IGVuZi5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJCbG9ja1N0YXRlbWVudFwiOlxuICAgICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiSWZTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJGb3JTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJTd2l0Y2hTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJCcmVha1N0YXRlbWVudFwiOlxuICAgICAgY2FzZSBcIkNvbnRpbnVlU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiRGVidWdnZXJTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJXaXRoU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiVHJ5U3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiVGhyb3dTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICAgIGNhc2UgXCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiUmV0dXJuU3RhdGVtZW50XCI6XG4gICAgICBjYXNlIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3RTdGF0ZW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KF8ud2hlcmVFcSh7dHlwZTogdHlwZV80NTF9LCB2YWx1ZV80NTMpLCBgRXhwZWN0aW5nIGEgJHt0eXBlXzQ1MX1gLCB2YWx1ZV80NTMsIG9yaWdpbmFsUmVzdF80NTIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgdmFsdWVfNDUzID0gZW5mLmVuZm9yZXN0WWllbGRFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3RDbGFzcyh7aXNFeHByOiB0cnVlfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93RXhwcmVzc2lvblwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3RBcnJvd0V4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgICAgICB2YWx1ZV80NTMgPSBlbmYuZW5mb3Jlc3ROZXdFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlRoaXNFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiRnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiSWRlbnRpZmllckV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJMaXRlcmFsUmVnRXhwRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJBcnJheUV4cHJlc3Npb25cIjpcbiAgICAgICAgdmFsdWVfNDUzID0gZW5mLmVuZm9yZXN0UHJpbWFyeUV4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiVXBkYXRlRXhwcmVzc2lvblwiOlxuICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgIGNhc2UgXCJDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgICAgIHZhbHVlXzQ1MyA9IGVuZi5lbmZvcmVzdEV4cHJlc3Npb25Mb29wKCk7XG4gICAgICAgIGV4cGVjdChfLndoZXJlRXEoe3R5cGU6IHR5cGVfNDUxfSwgdmFsdWVfNDUzKSwgYEV4cGVjdGluZyBhICR7dHlwZV80NTF9YCwgdmFsdWVfNDUzLCBvcmlnaW5hbFJlc3RfNDUyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHRlcm0gdHlwZTogXCIgKyB0eXBlXzQ1MSk7XG4gICAgfVxuICAgIHJldHVybiB7ZG9uZTogZmFsc2UsIHZhbHVlOiBuZXcgU3ludGF4T3JUZXJtV3JhcHBlcl80MDEodmFsdWVfNDUzLCBjb250ZXh0KX07XG4gIH1cbiAgX3Jlc3QoZW5mXzQ1NCkge1xuICAgIGNvbnN0IHByaXZfNDU1ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICBpZiAocHJpdl80NTUubWFya2Vycy5nZXQocHJpdl80NTUuc3RhcnRNYXJrZXIpID09PSBlbmZfNDU0KSB7XG4gICAgICByZXR1cm4gcHJpdl80NTUuZW5mLnJlc3Q7XG4gICAgfVxuICAgIHRocm93IEVycm9yKFwiVW5hdXRob3JpemVkIGFjY2VzcyFcIik7XG4gIH1cbiAgcmVzZXQobWFya2VyXzQ1Nikge1xuICAgIGNvbnN0IHByaXZfNDU3ID0gcHJpdmF0ZURhdGFfMzk5LmdldCh0aGlzKTtcbiAgICBsZXQgZW5mXzQ1ODtcbiAgICBpZiAobWFya2VyXzQ1NiA9PSBudWxsKSB7XG4gICAgICBlbmZfNDU4ID0gcHJpdl80NTcubWFya2Vycy5nZXQocHJpdl80NTcuc3RhcnRNYXJrZXIpO1xuICAgIH0gZWxzZSBpZiAobWFya2VyXzQ1NiAmJiBtYXJrZXJfNDU2IGluc3RhbmNlb2YgTWFya2VyXzQwNCkge1xuICAgICAgaWYgKHByaXZfNDU3Lm1hcmtlcnMuaGFzKG1hcmtlcl80NTYpKSB7XG4gICAgICAgIGVuZl80NTggPSBwcml2XzQ1Ny5tYXJrZXJzLmdldChtYXJrZXJfNDU2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1hcmtlciBtdXN0IG9yaWdpbmF0ZSBmcm9tIHRoaXMgY29udGV4dFwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWFya2VyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTWFya2VyXCIpO1xuICAgIH1cbiAgICBwcml2XzQ1Ny5lbmYgPSBjbG9uZUVuZm9yZXN0ZXJfNDAzKGVuZl80NTgpO1xuICB9XG4gIG1hcmsoKSB7XG4gICAgY29uc3QgcHJpdl80NTkgPSBwcml2YXRlRGF0YV8zOTkuZ2V0KHRoaXMpO1xuICAgIGxldCBtYXJrZXJfNDYwO1xuICAgIGlmIChwcml2XzQ1OS5lbmYucmVzdCA9PT0gcHJpdl80NTkubWFya2Vycy5nZXQocHJpdl80NTkuc3RhcnRNYXJrZXIpLnJlc3QpIHtcbiAgICAgIG1hcmtlcl80NjAgPSBwcml2XzQ1OS5zdGFydE1hcmtlcjtcbiAgICB9IGVsc2UgaWYgKHByaXZfNDU5LmVuZi5yZXN0LmlzRW1wdHkoKSkge1xuICAgICAgaWYgKCFwcml2XzQ1OS5lbmRNYXJrZXIpIHByaXZfNDU5LmVuZE1hcmtlciA9IG5ldyBNYXJrZXJfNDA0O1xuICAgICAgbWFya2VyXzQ2MCA9IHByaXZfNDU5LmVuZE1hcmtlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFya2VyXzQ2MCA9IG5ldyBNYXJrZXJfNDA0O1xuICAgIH1cbiAgICBpZiAoIXByaXZfNDU5Lm1hcmtlcnMuaGFzKG1hcmtlcl80NjApKSB7XG4gICAgICBwcml2XzQ1OS5tYXJrZXJzLnNldChtYXJrZXJfNDYwLCBjbG9uZUVuZm9yZXN0ZXJfNDAzKHByaXZfNDU5LmVuZikpO1xuICAgIH1cbiAgICByZXR1cm4gbWFya2VyXzQ2MDtcbiAgfVxuICBuZXh0KCkge1xuICAgIGNvbnN0IHtlbmYsIG5vU2NvcGVzLCB1c2VTY29wZSwgaW50cm9kdWNlZFNjb3BlLCBjb250ZXh0fSA9IHByaXZhdGVEYXRhXzM5OS5nZXQodGhpcyk7XG4gICAgaWYgKGVuZi5yZXN0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB7ZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGx9O1xuICAgIH1cbiAgICBsZXQgdmFsdWVfNDYxID0gZW5mLmFkdmFuY2UoKTtcbiAgICBpZiAoIW5vU2NvcGVzKSB7XG4gICAgICB2YWx1ZV80NjEgPSB2YWx1ZV80NjEuYWRkU2NvcGUodXNlU2NvcGUsIGNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpLmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUywge2ZsaXA6IHRydWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IG5ldyBTeW50YXhPclRlcm1XcmFwcGVyXzQwMSh2YWx1ZV80NjEsIGNvbnRleHQpfTtcbiAgfVxufVxuZXhwb3J0IHtTeW50YXhPclRlcm1XcmFwcGVyXzQwMSBhcyBTeW50YXhPclRlcm1XcmFwcGVyfTtcbmV4cG9ydCB7dW53cmFwXzQwMiBhcyB1bndyYXB9Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYWNyby1jb250ZXh0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztRQWlLZ0IsTSxHQUFBLE07O0FBaktoQjs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7SUFBWSxDOzs7O0FBRVosTUFBTSxVQUFVLE9BQU8sU0FBUCxDQUFoQjtBQUNBLE1BQU0sY0FBYyxJQUFJLE9BQUosRUFBcEI7O0FBRUEsTUFBTSxTQUFTLEtBQUs7QUFDbEIsTUFBSSxFQUFFLEtBQUYsQ0FBUSxXQUFSLENBQUosRUFBMEI7QUFDeEIsV0FBTyxJQUFQO0FBQ0Q7QUFDRCxNQUFJLE9BQU8sRUFBRSxHQUFULEtBQWlCLFVBQXJCLEVBQWlDO0FBQy9CLFdBQU8sRUFBRSxHQUFGLEVBQVA7QUFDRDtBQUNELFNBQU8sSUFBUDtBQUNELENBUkQ7O0FBVU8sTUFBTSxtQkFBTixDQUEwQjtBQUMvQixjQUFZLENBQVosRUFBNkI7QUFBQSxRQUFkLE9BQWMseURBQUosRUFBSTs7QUFDM0IsU0FBSyxPQUFMLElBQWdCLENBQWhCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEOztBQUVELE9BQUssSUFBTCxFQUFXLEtBQVgsRUFBa0I7QUFDaEIsUUFBSSxNQUFNLEtBQUssT0FBTCxDQUFWO0FBQ0EsUUFBSSxPQUFPLElBQUksSUFBWCxLQUFvQixVQUF4QixFQUFvQztBQUNsQyxhQUFPLElBQUksSUFBSixDQUFTLElBQVQsRUFBZSxLQUFmLENBQVA7QUFDRDtBQUNGO0FBQ0QsYUFBVztBQUNULFdBQU8sS0FBSyxJQUFMLENBQVUsTUFBVixFQUFrQixJQUFsQixDQUFQO0FBQ0Q7O0FBRUQsYUFBVyxLQUFYLEVBQWtCO0FBQ2hCLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBVixFQUFvQixLQUFwQixDQUFQO0FBQ0Q7O0FBRUQsYUFBVyxLQUFYLEVBQWtCO0FBQ2hCLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBVixFQUFvQixLQUFwQixDQUFQO0FBQ0Q7O0FBRUQsaUJB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aEIsQ0FEekQ7O0FBQUEsVUFDRyxHQURILHFCQUNHLEdBREg7QUFBQSxVQUNRLFFBRFIscUJBQ1EsUUFEUjtBQUFBLFVBQ2tCLFFBRGxCLHFCQUNrQixRQURsQjtBQUFBLFVBQzRCLGVBRDVCLHFCQUM0QixlQUQ1QjtBQUFBLFVBQzZDLE9BRDdDLHFCQUM2QyxPQUQ3Qzs7QUFFTCxRQUFJLElBQUksSUFBSixDQUFTLElBQVQsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkIsYUFBTztBQUNMLGNBQU0sSUFERDtBQUVMLGVBQU87QUFGRixPQUFQO0FBSUQ7QUFDRCxRQUFJLFFBQVEsSUFBSSxPQUFKLEVBQVo7QUFDQSxRQUFJLENBQUMsUUFBTCxFQUFlO0FBQ2IsY0FBUSxNQUNMLFFBREssQ0FDSSxRQURKLEVBQ2MsUUFBUSxRQUR0QixzQkFFTCxRQUZLLENBRUksZUFGSixFQUVxQixRQUFRLFFBRjdCLHNCQUVtRCxFQUFFLE1BQU0sSUFBUixFQUZuRCxDQUFSO0FBR0Q7QUFDRCxXQUFPO0FBQ0wsWUFBTSxLQUREO0FBRUwsYUFBTyxJQUFJLG1CQUFKLENBQXdCLEtBQXhCLEVBQStCLE9BQS9CO0FBRkYsS0FBUDtBQUlEO0FBMUwrQjtrQkFBYixZIiwiZmlsZSI6Im1hY3JvLWNvbnRleHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHBlY3QgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBMaXN0IH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7IEVuZm9yZXN0ZXIgfSBmcm9tICcuL2VuZm9yZXN0ZXInO1xuaW1wb3J0IHsgQUxMX1BIQVNFUyB9IGZyb20gJy4vc3ludGF4JztcbmltcG9ydCAqIGFzIF8gZnJvbSAncmFtZGEnO1xuXG5jb25zdCBzeW1XcmFwID0gU3ltYm9sKCd3cmFwcGVyJyk7XG5jb25zdCBwcml2YXRlRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IGdldFZhbCA9IHQgPT4ge1xuICBpZiAodC5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdC52YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdC52YWwoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW50YXhPclRlcm1XcmFwcGVyIHtcbiAgY29uc3RydWN0b3IocywgY29udGV4dCA9IHt9KSB7XG4gICAgdGhpc1tzeW1XcmFwXSA9IHM7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIGZyb20odHlwZSwgdmFsdWUpIHtcbiAgICBsZXQgc3R4ID0gdGhpc1tzeW1XcmFwXTtcbiAgICBpZiAodHlwZW9mIHN0eC5mcm9tID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc3R4LmZyb20odHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBmcm9tTnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwibnVsbFwiLCBudWxsKTtcbiAgfVxuXG4gIGZyb21OdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKCdudW1iZXInLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcInN0cmluZ1wiLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tUHVuY3R1YXRvcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJwdW5jdHVhdG9yXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21LZXl3b3JkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImtleXdvcmRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnJvbUlkZW50aWZpZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiaWRlbnRpZmllclwiLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tUmVndWxhckV4cHJlc3Npb24odmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicmVndWxhckV4cHJlc3Npb25cIiwgdmFsdWUpO1xuICB9XG5cbiAgZnJvbUJyYWNlcyhpbm5lcikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJicmFjZXNcIiwgaW5uZXIpO1xuICB9XG5cbiAgZnJvbUJyYWNrZXRzKGlubmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImJyYWNrZXRzXCIsIGlubmVyKTtcbiAgfVxuXG4gIGZyb21QYXJlbnMoaW5uZXIpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicGFyZW5zXCIsIGlubmVyKTtcbiAgfVxuXG4gIG1hdGNoKHR5cGUsIHZhbHVlKSB7XG4gICAgbGV0IHN0eCA9IHRoaXNbc3ltV3JhcF07XG4gICAgaWYgKHR5cGVvZiBzdHgubWF0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzdHgubWF0Y2godHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGlzSWRlbnRpZmllcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiaWRlbnRpZmllclwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0Fzc2lnbih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYXNzaWduXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzQm9vbGVhbkxpdGVyYWwodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJvb2xlYW5cIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNLZXl3b3JkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJrZXl3b3JkXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzTnVsbExpdGVyYWwodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcIm51bGxcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNOdW1lcmljTGl0ZXJhbCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwibnVtYmVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzUHVuY3R1YXRvcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicHVuY3R1YXRvclwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1N0cmluZ0xpdGVyYWwodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInN0cmluZ1wiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1JlZ3VsYXJFeHByZXNzaW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1RlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJ0ZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0RlbGltaXRlcih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZGVsaW1pdGVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzUGFyZW5zKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwYXJlbnNcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNCcmFjZXModmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJyYWNlc1wiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0JyYWNrZXRzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJicmFja2V0c1wiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1N5bnRheFRlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzeW50YXhUZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0VPRih2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZW9mXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGxpbmVOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXNbc3ltV3JhcF0ubGluZU51bWJlcigpO1xuICB9XG5cbiAgdmFsKCkge1xuICAgIHJldHVybiBnZXRWYWwodGhpc1tzeW1XcmFwXSk7XG4gIH1cblxuICBpbm5lcigpIHtcbiAgICBsZXQgc3R4ID0gdGhpc1tzeW1XcmFwXTtcbiAgICBpZiAoIXN0eC5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBnZXQgaW5uZXIgc3ludGF4IG9uIGEgZGVsaW1pdGVyJyk7XG4gICAgfVxuXG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHN0eC5pbm5lcigpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgcmV0dXJuIG5ldyBNYWNyb0NvbnRleHQoZW5mLCAnaW5uZXInLCB0aGlzLmNvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXAoeCkge1xuICBpZiAoeCBpbnN0YW5jZW9mIFN5bnRheE9yVGVybVdyYXBwZXIpIHtcbiAgICByZXR1cm4geFtzeW1XcmFwXTtcbiAgfVxuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbmZvcmVzdGVyKGVuZikge1xuICBjb25zdCB7IHJlc3QsIHByZXYsIGNvbnRleHQgfSA9IGVuZjtcbiAgcmV0dXJuIG5ldyBFbmZvcmVzdGVyKHJlc3QsIHByZXYsIGNvbnRleHQpO1xufVxuXG5mdW5jdGlvbiBNYXJrZXIgKCkge31cblxuLypcbmN0eCA6OiB7XG4gIG9mOiAoU3ludGF4KSAtPiBjdHhcbiAgbmV4dDogKFN0cmluZykgLT4gU3ludGF4IG9yIFRlcm1cbn1cbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWNyb0NvbnRleHQge1xuXG4gIGNvbnN0cnVjdG9yKGVuZiwgbmFtZSwgY29udGV4dCwgdXNlU2NvcGUsIGludHJvZHVjZWRTY29wZSkge1xuICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gbmV3IE1hcmtlcigpO1xuICAgIGNvbnN0IHN0YXJ0RW5mID0gY2xvbmVFbmZvcmVzdGVyKGVuZik7XG4gICAgY29uc3QgcHJpdiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBjb250ZXh0LFxuICAgICAgZW5mOiBzdGFydEVuZixcbiAgICAgIHN0YXJ0TWFya2VyLFxuICAgICAgbWFya2VyczogbmV3IE1hcChbW3N0YXJ0TWFya2VyLCBlbmZdXSksXG4gICAgfTtcblxuICAgIGlmICh1c2VTY29wZSAmJiBpbnRyb2R1Y2VkU2NvcGUpIHtcbiAgICAgIHByaXYubm9TY29wZXMgPSBmYWxzZTtcbiAgICAgIHByaXYudXNlU2NvcGUgPSB1c2VTY29wZTtcbiAgICAgIHByaXYuaW50cm9kdWNlZFNjb3BlID0gaW50cm9kdWNlZFNjb3BlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcml2Lm5vU2NvcGVzID0gdHJ1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZURhdGEuc2V0KHRoaXMsIHByaXYpO1xuICAgIHRoaXMucmVzZXQoKTsgLy8gc2V0IGN1cnJlbnQgZW5mb3Jlc3RlclxuXG4gICAgdGhpc1tTeW1ib2wuaXRlcmF0b3JdID0gKCkgPT4gdGhpcztcbiAgfVxuXG4gIG5hbWUoKSB7XG4gICAgY29uc3QgeyBuYW1lLCBjb250ZXh0IH0gPSBwcml2YXRlRGF0YS5nZXQodGhpcyk7XG4gICAgcmV0dXJuIG5ldyBTeW50YXhPclRlcm1XcmFwcGVyKG5hbWUsIGNvbnRleHQpO1xuICB9XG5cbiAgZXhwYW5kKHR5cGUpIHtcbiAgICBjb25zdCB7IGVuZiwgY29udGV4dCB9ID0gcHJpdmF0ZURhdGEuZ2V0KHRoaXMpO1xuICAgIGlmIChlbmYucmVzdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgZW5mLmV4cGFuZE1hY3JvKCk7XG4gICAgbGV0IG9yaWdpbmFsUmVzdCA9IGVuZi5yZXN0O1xuICAgIGxldCB2YWx1ZTtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgY2FzZSAnQXNzaWdubWVudEV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnZXhwcic6XG4gICAgICAgIHZhbHVlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFeHByZXNzaW9uJzpcbiAgICAgICAgdmFsdWUgPSBlbmYuZW5mb3Jlc3RFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ3N0bXQnOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdFN0YXRlbWVudCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Jsb2NrU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ1doaWxlU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ0lmU3RhdGVtZW50JzpcbiAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICBjYXNlICdTd2l0Y2hTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQnJlYWtTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQ29udGludWVTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnRGVidWdnZXJTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnV2l0aFN0YXRlbWVudCc6XG4gICAgICBjYXNlICdUcnlTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnVGhyb3dTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnQ2xhc3NEZWNsYXJhdGlvbic6XG4gICAgICBjYXNlICdGdW5jdGlvbkRlY2xhcmF0aW9uJzpcbiAgICAgIGNhc2UgJ0xhYmVsZWRTdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCc6XG4gICAgICBjYXNlICdSZXR1cm5TdGF0ZW1lbnQnOlxuICAgICAgY2FzZSAnRXhwcmVzc2lvblN0YXRlbWVudCc6XG4gICAgICAgIHZhbHVlID0gZW5mLmVuZm9yZXN0U3RhdGVtZW50KCk7XG4gICAgICAgIGV4cGVjdChfLndoZXJlRXEoe3R5cGV9LCB2YWx1ZSksIGBFeHBlY3RpbmcgYSAke3R5cGV9YCwgdmFsdWUsIG9yaWdpbmFsUmVzdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWWllbGRFeHByZXNzaW9uJzpcbiAgICAgICAgdmFsdWUgPSBlbmYuZW5mb3Jlc3RZaWVsZEV4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdDbGFzc0V4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdENsYXNzKHtpc0V4cHI6IHRydWV9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0V4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdEFycm93RXhwcmVzc2lvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05ld0V4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdE5ld0V4cHJlc3Npb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUaGlzRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdGdW5jdGlvbkV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnSWRlbnRpZmllckV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0xpdGVyYWxJbmZpbml0eUV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnVGVtcGxhdGVFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0xpdGVyYWxCb29sZWFuRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdMaXRlcmFsTnVsbEV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnT2JqZWN0RXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdBcnJheUV4cHJlc3Npb24nOlxuICAgICAgICB2YWx1ZSA9IGVuZi5lbmZvcmVzdFByaW1hcnlFeHByZXNzaW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVW5hcnlFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ1VwZGF0ZUV4cHJlc3Npb24nOlxuICAgICAgY2FzZSAnQmluYXJ5RXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdTdGF0aWNNZW1iZXJFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0NvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICBjYXNlICdDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uJzpcbiAgICAgIGNhc2UgJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic6XG4gICAgICAgIHZhbHVlID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbkxvb3AoKTtcbiAgICAgICAgZXhwZWN0KF8ud2hlcmVFcSh7dHlwZX0sIHZhbHVlKSwgYEV4cGVjdGluZyBhICR7dHlwZX1gLCB2YWx1ZSwgb3JpZ2luYWxSZXN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdGVybSB0eXBlOiAnICsgdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBuZXcgU3ludGF4T3JUZXJtV3JhcHBlcih2YWx1ZSwgY29udGV4dClcbiAgICB9O1xuICB9XG5cbiAgX3Jlc3QoZW5mKSB7XG4gICAgY29uc3QgcHJpdiA9IHByaXZhdGVEYXRhLmdldCh0aGlzKTtcbiAgICBpZiAocHJpdi5tYXJrZXJzLmdldChwcml2LnN0YXJ0TWFya2VyKSA9PT0gZW5mKSB7XG4gICAgICByZXR1cm4gcHJpdi5lbmYucmVzdDtcbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoXCJVbmF1dGhvcml6ZWQgYWNjZXNzIVwiKTtcbiAgfVxuXG4gIHJlc2V0KG1hcmtlcikge1xuICAgIGNvbnN0IHByaXYgPSBwcml2YXRlRGF0YS5nZXQodGhpcyk7XG4gICAgbGV0IGVuZjtcbiAgICBpZiAobWFya2VyID09IG51bGwpIHtcbiAgICAgIC8vIGdvIHRvIHRoZSBiZWdpbm5pbmdcbiAgICAgIGVuZiA9IHByaXYubWFya2Vycy5nZXQocHJpdi5zdGFydE1hcmtlcik7XG4gICAgfSBlbHNlIGlmIChtYXJrZXIgJiYgbWFya2VyIGluc3RhbmNlb2YgTWFya2VyKSB7XG4gICAgICAvLyBtYXJrZXIgY291bGQgYmUgZnJvbSBhbm90aGVyIGNvbnRleHRcbiAgICAgIGlmIChwcml2Lm1hcmtlcnMuaGFzKG1hcmtlcikpIHtcbiAgICAgICAgZW5mID0gcHJpdi5tYXJrZXJzLmdldChtYXJrZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXJrZXIgbXVzdCBvcmlnaW5hdGUgZnJvbSB0aGlzIGNvbnRleHQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXJrZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBNYXJrZXInKTtcbiAgICB9XG4gICAgcHJpdi5lbmYgPSBjbG9uZUVuZm9yZXN0ZXIoZW5mKTtcbiAgfVxuXG4gIG1hcmsoKSB7XG4gICAgY29uc3QgcHJpdiA9IHByaXZhdGVEYXRhLmdldCh0aGlzKTtcbiAgICBsZXQgbWFya2VyO1xuXG4gICAgLy8gdGhlIGlkZWEgaGVyZSBpcyB0aGF0IG1hcmtpbmcgYXQgdGhlIGJlZ2lubmluZyBzaG91bGRuJ3QgaGFwcGVuIG1vcmUgdGhhbiBvbmNlLlxuICAgIC8vIFdlIGNhbiByZXVzZSBzdGFydE1hcmtlci5cbiAgICBpZiAocHJpdi5lbmYucmVzdCA9PT0gcHJpdi5tYXJrZXJzLmdldChwcml2LnN0YXJ0TWFya2VyKS5yZXN0KSB7XG4gICAgICBtYXJrZXIgPSBwcml2LnN0YXJ0TWFya2VyO1xuICAgIH0gZWxzZSBpZiAocHJpdi5lbmYucmVzdC5pc0VtcHR5KCkpIHtcbiAgICAgIC8vIHNhbWUgcmVhc29uIGFzIGFib3ZlXG4gICAgICBpZiAoIXByaXYuZW5kTWFya2VyKSBwcml2LmVuZE1hcmtlciA9IG5ldyBNYXJrZXIoKTtcbiAgICAgIG1hcmtlciA9IHByaXYuZW5kTWFya2VyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1RPRE8ob3B0aW1pemF0aW9uL2R1YmlvdXMpOiBjaGVjayB0aGF0IHRoZXJlIGlzbid0IGFscmVhZHkgYSBtYXJrZXIgZm9yIHRoaXMgaW5kZXg/XG4gICAgICBtYXJrZXIgPSBuZXcgTWFya2VyKCk7XG4gICAgfVxuICAgIGlmICghcHJpdi5tYXJrZXJzLmhhcyhtYXJrZXIpKSB7XG4gICAgICBwcml2Lm1hcmtlcnMuc2V0KG1hcmtlciwgY2xvbmVFbmZvcmVzdGVyKHByaXYuZW5mKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXJrZXI7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGNvbnN0IHsgZW5mLCBub1Njb3BlcywgdXNlU2NvcGUsIGludHJvZHVjZWRTY29wZSwgY29udGV4dCB9ID0gcHJpdmF0ZURhdGEuZ2V0KHRoaXMpO1xuICAgIGlmIChlbmYucmVzdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gZW5mLmFkdmFuY2UoKTtcbiAgICBpZiAoIW5vU2NvcGVzKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgIC5hZGRTY29wZSh1c2VTY29wZSwgY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUylcbiAgICAgICAgLmFkZFNjb3BlKGludHJvZHVjZWRTY29wZSwgY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUywgeyBmbGlwOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbmV3IFN5bnRheE9yVGVybVdyYXBwZXIodmFsdWUsIGNvbnRleHQpXG4gICAgfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/map-syntax-reducer.js b/dist/map-syntax-reducer.js index f74da315..0cf6167f 100644 --- a/dist/map-syntax-reducer.js +++ b/dist/map-syntax-reducer.js @@ -13,18 +13,26 @@ var _shiftReducer = require("shift-reducer"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class MapSyntaxReducer extends _shiftReducer.CloneReducer { - constructor(fn_462) { + constructor(fn) { super(); - this.fn = fn_462; + this.fn = fn; } - reduceBindingIdentifier(node_463, state_464) { - let name_465 = this.fn(node_463.name); - return new _terms2.default("BindingIdentifier", { name: name_465 }); + + reduceBindingIdentifier(node) { + let name = this.fn(node.name); + + return new _terms2.default("BindingIdentifier", { + name: name + }); } - reduceIdentifierExpression(node_466, state_467) { - let name_468 = this.fn(node_466.name); - return new _terms2.default("IdentifierExpression", { name: name_468 }); + + reduceIdentifierExpression(node) { + let name = this.fn(node.name); + + return new _terms2.default("IdentifierExpression", { + name: name + }); } } exports.default = MapSyntaxReducer; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L21hcC1zeW50YXgtcmVkdWNlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ2UsTUFBTSxnQkFBTixvQ0FBNEM7QUFDekQsY0FBWSxNQUFaLEVBQW9CO0FBQ2xCO0FBQ0EsU0FBSyxFQUFMLEdBQVUsTUFBVjtBQUNEO0FBQ0QsMEJBQXdCLFFBQXhCLEVBQWtDLFNBQWxDLEVBQTZDO0FBQzNDLFFBQUksV0FBVyxLQUFLLEVBQUwsQ0FBUSxTQUFTLElBQWpCLENBQWY7QUFDQSxXQUFPLG9CQUFTLG1CQUFULEVBQThCLEVBQUMsTUFBTSxRQUFQLEVBQTlCLENBQVA7QUFDRDtBQUNELDZCQUEyQixRQUEzQixFQUFxQyxTQUFyQyxFQUFnRDtBQUM5QyxRQUFJLFdBQVcsS0FBSyxFQUFMLENBQVEsU0FBUyxJQUFqQixDQUFmO0FBQ0EsV0FBTyxvQkFBUyxzQkFBVCxFQUFpQyxFQUFDLE1BQU0sUUFBUCxFQUFqQyxDQUFQO0FBQ0Q7QUFad0Q7a0JBQXRDLGdCIiwiZmlsZSI6Im1hcC1zeW50YXgtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge0Nsb25lUmVkdWNlcn0gZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcFN5bnRheFJlZHVjZXIgZXh0ZW5kcyBDbG9uZVJlZHVjZXIge1xuICBjb25zdHJ1Y3Rvcihmbl80NjIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm4gPSBmbl80NjI7XG4gIH1cbiAgcmVkdWNlQmluZGluZ0lkZW50aWZpZXIobm9kZV80NjMsIHN0YXRlXzQ2NCkge1xuICAgIGxldCBuYW1lXzQ2NSA9IHRoaXMuZm4obm9kZV80NjMubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge25hbWU6IG5hbWVfNDY1fSk7XG4gIH1cbiAgcmVkdWNlSWRlbnRpZmllckV4cHJlc3Npb24obm9kZV80NjYsIHN0YXRlXzQ2Nykge1xuICAgIGxldCBuYW1lXzQ2OCA9IHRoaXMuZm4obm9kZV80NjYubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge25hbWU6IG5hbWVfNDY4fSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXAtc3ludGF4LXJlZHVjZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUVlLE1BQU0sZ0JBQU4sb0NBQTRDO0FBQ3pELGNBQVksRUFBWixFQUFnQjtBQUNkO0FBQ0EsU0FBSyxFQUFMLEdBQVUsRUFBVjtBQUNEOztBQUVELDBCQUF3QixJQUF4QixFQUE4QjtBQUM1QixRQUFJLE9BQU8sS0FBSyxFQUFMLENBQVEsS0FBSyxJQUFiLENBQVg7O0FBRUEsV0FBTyxvQkFBUyxtQkFBVCxFQUE4QjtBQUNuQyxZQUFNO0FBRDZCLEtBQTlCLENBQVA7QUFHRDs7QUFFRCw2QkFBMkIsSUFBM0IsRUFBaUM7QUFDL0IsUUFBSSxPQUFPLEtBQUssRUFBTCxDQUFRLEtBQUssSUFBYixDQUFYOztBQUVBLFdBQU8sb0JBQVMsc0JBQVQsRUFBaUM7QUFDdEMsWUFBTTtBQURnQyxLQUFqQyxDQUFQO0FBR0Q7QUFwQndEO2tCQUF0QyxnQiIsImZpbGUiOiJtYXAtc3ludGF4LXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVybSBmcm9tIFwiLi90ZXJtc1wiO1xuaW1wb3J0IHsgQ2xvbmVSZWR1Y2VyIH0gZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFwU3ludGF4UmVkdWNlciBleHRlbmRzIENsb25lUmVkdWNlciB7XG4gIGNvbnN0cnVjdG9yKGZuKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZuID0gZm47XG4gIH1cblxuICByZWR1Y2VCaW5kaW5nSWRlbnRpZmllcihub2RlKSB7XG4gICAgbGV0IG5hbWUgPSB0aGlzLmZuKG5vZGUubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7XG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VJZGVudGlmaWVyRXhwcmVzc2lvbihub2RlKSB7XG4gICAgbGV0IG5hbWUgPSB0aGlzLmZuKG5vZGUubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/modules.js b/dist/modules.js index d3647a46..69d53b1c 100644 --- a/dist/modules.js +++ b/dist/modules.js @@ -19,23 +19,15 @@ var _shiftReader = require("./shift-reader"); var _shiftReader2 = _interopRequireDefault(_shiftReader); -var _tokenExpander = require("./token-expander.js"); - -var _tokenExpander2 = _interopRequireDefault(_tokenExpander); - -var _termExpander = require("./term-expander.js"); - -var _termExpander2 = _interopRequireDefault(_termExpander); - -var _bindingMap = require("./binding-map.js"); +var _ramda = require("ramda"); -var _bindingMap2 = _interopRequireDefault(_bindingMap); +var _ = _interopRequireWildcard(_ramda); var _symbol = require("./symbol"); var _terms = require("./terms"); -var _terms2 = _interopRequireDefault(_terms); +var T = _interopRequireWildcard(_terms); var _loadSyntax = require("./load-syntax"); @@ -57,180 +49,239 @@ var _utilsDirname = require("utils-dirname"); var _utilsDirname2 = _interopRequireDefault(_utilsDirname); -var _ramda = require("ramda"); - -var _ = _interopRequireWildcard(_ramda); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -class Module_469 { - constructor(moduleSpecifier_474, isNative_475, importEntries_476, exportEntries_477, pragmas_478, body_479) { - this.moduleSpecifier = moduleSpecifier_474; - this.isNative = isNative_475; - this.importEntries = importEntries_476; - this.exportEntries = exportEntries_477; - this.pragmas = pragmas_478; - this.body = body_479; +class Module { + constructor(moduleSpecifier, isNative, importEntries, exportEntries, pragmas, body) { + this.moduleSpecifier = moduleSpecifier; + this.isNative = isNative; + this.importEntries = importEntries; + this.exportEntries = exportEntries; + this.pragmas = pragmas; + this.body = body; } } -const findBindingIdentifierName_470 = term_480 => { - (0, _errors.assert)(term_480.name, `not implemented yet for type ${ term_480.type }`); - return term_480.name; + +exports.Module = Module; +const findBindingIdentifierName = term => { + // TODO: handle destructuring + (0, _errors.assert)(term.name, `not implemented yet for type ${ term.type }`); + return term.name; }; -const convertExport_471 = term_481 => { - let declaration_482 = term_481.declaration; - let bindings_483 = []; - if ((0, _terms.isVariableDeclaration)(declaration_482)) { - bindings_483 = declaration_482.declarators.map(decl_485 => findBindingIdentifierName_470(decl_485.binding)); - } else if ((0, _terms.isFunctionDeclaration)(declaration_482) || (0, _terms.isClassDeclaration)(declaration_482)) { - bindings_483.push(findBindingIdentifierName_470(declaration_482.name)); + +const convertExport = term => { + let declaration = term.declaration; + let bindings = []; + if (T.isVariableDeclaration(declaration)) { + bindings = declaration.declarators.map(decl => findBindingIdentifierName(decl.binding)); + } else if (T.isFunctionDeclaration(declaration) || T.isClassDeclaration(declaration)) { + bindings.push(findBindingIdentifierName(declaration.name)); } - let namedExports_484 = bindings_483.map(binding_486 => { - return new _terms2.default("ExportSpecifier", { name: null, exportedName: binding_486 }); + + let namedExports = bindings.map(binding => { + return new T.default('ExportSpecifier', { + name: null, + exportedName: binding + }); + }); + return new T.default('ExportFrom', { + moduleSpecifier: null, + namedExports: (0, _immutable.List)(namedExports) }); - return new _terms2.default("ExportFrom", { moduleSpecifier: null, namedExports: (0, _immutable.List)(namedExports_484) }); }; -const pragmaRegep_472 = /^\s*#\w*/; -class Modules_473 { - constructor(context_487) { + +const pragmaRegep = /^\s*#\w*/; + +class Modules { + constructor(context) { this.compiledModules = new Map(); - this.context = context_487; + this.context = context; this.context.modules = this; } - loadString(str_488) { - let checkPragma_489 = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; - let hasPragma_490 = pragmaRegep_472.test(str_488); - if (checkPragma_489 && !hasPragma_490) { - return { isNative: true, body: (0, _immutable.List)() }; + loadString(str) { + let checkPragma = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1]; + + let hasPragma = pragmaRegep.test(str); + if (checkPragma && !hasPragma) { + return { + isNative: true, + body: (0, _immutable.List)() + }; } - return { isNative: !hasPragma_490, body: new _shiftReader2.default(str_488).read() }; + return { + isNative: !hasPragma, + body: new _shiftReader2.default(str).read() + }; } - load(path_491) { - return this.loadString(this.context.moduleLoader(path_491)); + + load(path) { + // TODO resolve and we need to carry the cwd through correctly + return this.loadString(this.context.moduleLoader(path)); } - compile(mod_492, path_493) { - let stxl_494 = mod_492.body; - let outScope_495 = (0, _scope.freshScope)("outsideEdge"); - let inScope_496 = (0, _scope.freshScope)(`insideEdge0`); - let compiler_497 = new _compiler2.default(0, new _env2.default(), new _store2.default(), _.merge(this.context, { currentScope: [outScope_495, inScope_496], cwd: path_493 === "<>" ? this.context.cwd : (0, _utilsDirname2.default)(path_493) })); - let terms_498 = compiler_497.compile(stxl_494.map(s_503 => s_503.addScope(outScope_495, this.context.bindings, _syntax.ALL_PHASES).addScope(inScope_496, this.context.bindings, 0))); - let importEntries_499 = []; - let exportEntries_500 = []; - let pragmas_501 = []; - let filteredTerms_502 = terms_498.reduce((acc_504, t_505) => { - return _.cond([[_terms.isImport, t_506 => { - importEntries_499.push(t_506); - return acc_504; - }], [_terms.isExport, t_507 => { - if (t_507.declaration) { - exportEntries_500.push(convertExport_471(t_507)); - if ((0, _terms.isVariableDeclaration)(t_507.declaration)) { - return acc_504.concat(new _terms2.default("VariableDeclarationStatement", { declaration: t_507.declaration })); + + compile(mod, path) { + let stxl = mod.body; + let outScope = (0, _scope.freshScope)('outsideEdge'); + let inScope = (0, _scope.freshScope)(`insideEdge0`); + // the compiler starts at phase 0, with an empty environment and store + let compiler = new _compiler2.default(0, new _env2.default(), new _store2.default(), _.merge(this.context, { + currentScope: [outScope, inScope], + cwd: path === '<>' ? this.context.cwd : (0, _utilsDirname2.default)(path) + })); + let terms = compiler.compile(stxl.map(s => s.addScope(outScope, this.context.bindings, _syntax.ALL_PHASES).addScope(inScope, this.context.bindings, 0))); + + let importEntries = []; + let exportEntries = []; + let pragmas = []; + let filteredTerms = terms.reduce((acc, t) => { + return _.cond([[T.isImport, t => { + importEntries.push(t); + return acc; + }], [T.isExport, t => { + // exportEntries.push(t); + // return acc.concat(t); + if (t.declaration) { + exportEntries.push(convertExport(t)); + if (T.isVariableDeclaration(t.declaration)) { + return acc.concat(new T.default('VariableDeclarationStatement', { + declaration: t.declaration + })); } - return acc_504.concat(t_507.declaration); + return acc.concat(t.declaration); } - exportEntries_500.push(t_507); - return acc_504; - }], [_terms.isPragma, t_508 => { - pragmas_501.push(t_508); - return acc_504; - }], [_.T, t_509 => acc_504.concat(t_509)]])(t_505); + exportEntries.push(t); + return acc; + }], [T.isPragma, t => { + pragmas.push(t);return acc; + }], [_.T, t => acc.concat(t)]])(t); }, (0, _immutable.List)()); - return new Module_469(path_493, mod_492.isNative, (0, _immutable.List)(importEntries_499), (0, _immutable.List)(exportEntries_500), (0, _immutable.List)(pragmas_501), filteredTerms_502); + return new Module(path, mod.isNative, (0, _immutable.List)(importEntries), (0, _immutable.List)(exportEntries), (0, _immutable.List)(pragmas), filteredTerms); } - compileEntrypoint(source_510, filename_511) { - let enforcePragma_512 = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; - let stxl_513 = this.loadString(source_510, false); - if (enforcePragma_512 && stxl_513.isNative) { - throw new Error(`Entrypoint ${ filename_511 } must begin with #lang pragma`); + compileEntrypoint(source, filename) { + let enforcePragma = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + + let stxl = this.loadString(source, false); + if (enforcePragma && stxl.isNative) { + throw new Error(`Entrypoint ${ filename } must begin with #lang pragma`); } - return this.getAtPhase("<>", 0, this.context.cwd, stxl_513); + return this.getAtPhase('<>', 0, this.context.cwd, stxl); } - getAtPhase(rawPath_514, phase_515, cwd_516) { - let rawStxl_517 = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; - - let path_518 = rawPath_514 === "<>" ? rawPath_514 : this.context.moduleResolver(rawPath_514, cwd_516); - let mapKey_519 = `${ path_518 }:${ phase_515 }`; - if (!this.compiledModules.has(mapKey_519)) { - if (phase_515 === 0) { - let stxl = rawStxl_517 != null ? rawStxl_517 : this.load(path_518); - this.compiledModules.set(mapKey_519, this.compile(stxl, path_518)); + + // Modules have a unique scope per-phase. We compile each module once at + // phase 0 and store the compiled module in a map. Then, as we ask for + // the module in a particular phase, we add that new phase-specific scope + // to the compiled module and update the map with the module at that specific + // phase. + getAtPhase(rawPath, phase, cwd) { + let rawStxl = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; + + let path = rawPath === '<>' ? rawPath : this.context.moduleResolver(rawPath, cwd); + let mapKey = `${ path }:${ phase }`; + if (!this.compiledModules.has(mapKey)) { + if (phase === 0) { + let stxl = rawStxl != null ? rawStxl : this.load(path); + this.compiledModules.set(mapKey, this.compile(stxl, path)); } else { - let rawMod = this.getAtPhase(rawPath_514, 0, cwd_516, rawStxl_517); - let scope = (0, _scope.freshScope)(`insideEdge${ phase_515 }`); - this.compiledModules.set(mapKey_519, new Module_469(rawMod.moduleSpecifier, false, rawMod.importEntries.map(term_520 => term_520.addScope(scope, this.context.bindings, phase_515)), rawMod.exportEntries.map(term_521 => term_521.addScope(scope, this.context.bindings, phase_515)), rawMod.pragmas, rawMod.body.map(term_522 => term_522.addScope(scope, this.context.bindings, phase_515)))); + let rawMod = this.getAtPhase(rawPath, 0, cwd, rawStxl); + let scope = (0, _scope.freshScope)(`insideEdge${ phase }`); + this.compiledModules.set(mapKey, new Module(rawMod.moduleSpecifier, false, rawMod.importEntries.map(term => term.addScope(scope, this.context.bindings, phase)), rawMod.exportEntries.map(term => term.addScope(scope, this.context.bindings, phase)), rawMod.pragmas, rawMod.body.map(term => term.addScope(scope, this.context.bindings, phase)))); } } - return this.compiledModules.get(mapKey_519); + return this.compiledModules.get(mapKey); } - has(rawPath_523) { - let phase_524 = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - let path_525 = rawPath_523 === "<>" ? rawPath_523 : this.context.moduleResolver(rawPath_523, this.context.cwd); - let key_526 = `${ path_525 }:${ phase_524 }`; - return this.compiledModules.has(key_526) && !this.compiledModules.get(key_526).isNative; + has(rawPath) { + let phase = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + + let path = rawPath === '<>' ? rawPath : this.context.moduleResolver(rawPath, this.context.cwd); + let key = `${ path }:${ phase }`; + return this.compiledModules.has(key) && !this.compiledModules.get(key).isNative; } - registerSyntaxDeclaration(term_527, phase_528, store_529) { - term_527.declarators.forEach(decl_530 => { - let val_531 = (0, _loadSyntax.evalCompiletimeValue)(decl_530.init.gen(), _.merge(this.context, { phase: phase_528 + 1, store: store_529 })); - (0, _hygieneUtils.collectBindings)(decl_530.binding).forEach(stx_532 => { - if (phase_528 !== 0) { - let newBinding = (0, _symbol.gensym)(stx_532.val()); - this.context.bindings.add(stx_532, { binding: newBinding, phase: phase_528, skipDup: false }); + + registerSyntaxDeclaration(term, phase, store) { + term.declarators.forEach(decl => { + let val = (0, _loadSyntax.evalCompiletimeValue)(decl.init.gen(), _.merge(this.context, { + phase: phase + 1, store: store + })); + (0, _hygieneUtils.collectBindings)(decl.binding).forEach(stx => { + if (phase !== 0) { + // phase 0 bindings extend the binding map during compilation + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: phase, + skipDup: false + }); } - let resolvedName_533 = stx_532.resolve(phase_528); - store_529.set(resolvedName_533, new _transforms.CompiletimeTransform(val_531)); + let resolvedName = stx.resolve(phase); + store.set(resolvedName, new _transforms.CompiletimeTransform(val)); }); }); } - registerVariableDeclaration(term_534, phase_535, store_536) { - term_534.declarators.forEach(decl_537 => { - (0, _hygieneUtils.collectBindings)(decl_537.binding).forEach(stx_538 => { - if (phase_535 !== 0) { - let newBinding = (0, _symbol.gensym)(stx_538.val()); - this.context.bindings.add(stx_538, { binding: newBinding, phase: phase_535, skipDup: term_534.kind === "var" }); + + registerVariableDeclaration(term, phase, store) { + term.declarators.forEach(decl => { + (0, _hygieneUtils.collectBindings)(decl.binding).forEach(stx => { + if (phase !== 0) { + // phase 0 bindings extend the binding map during compilation + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: phase, + skipDup: term.kind === 'var' + }); } - let resolvedName_539 = stx_538.resolve(phase_535); - store_536.set(resolvedName_539, new _transforms.VarBindingTransform(stx_538)); + let resolvedName = stx.resolve(phase); + store.set(resolvedName, new _transforms.VarBindingTransform(stx)); }); }); } - registerFunctionOrClass(term_540, phase_541, store_542) { - (0, _hygieneUtils.collectBindings)(term_540.name).forEach(stx_543 => { - if (phase_541 !== 0) { - let newBinding = (0, _symbol.gensym)(stx_543.val()); - this.context.bindings.add(stx_543, { binding: newBinding, phase: phase_541, skipDup: false }); + + registerFunctionOrClass(term, phase, store) { + (0, _hygieneUtils.collectBindings)(term.name).forEach(stx => { + if (phase !== 0) { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: phase, + skipDup: false + }); } - let resolvedName_544 = stx_543.resolve(phase_541); - store_542.set(resolvedName_544, new _transforms.VarBindingTransform(stx_543)); + let resolvedName = stx.resolve(phase); + store.set(resolvedName, new _transforms.VarBindingTransform(stx)); }); } - visit(mod_545, phase_546, store_547) { - mod_545.body.forEach(term_548 => { - if ((0, _terms.isSyntaxDeclarationStatement)(term_548)) { - this.registerSyntaxDeclaration(term_548.declaration, phase_546, store_547); + + visit(mod, phase, store) { + // TODO: recursively visit imports + mod.body.forEach(term => { + if (T.isSyntaxDeclarationStatement(term)) { + this.registerSyntaxDeclaration(term.declaration, phase, store); } }); - return store_547; + return store; } - invoke(mod_549, phase_550, store_551) { - let body_552 = mod_549.body.filter(_.complement(_terms.isCompiletimeStatement)).map(term_554 => { - term_554 = term_554.gen(); - if ((0, _terms.isVariableDeclarationStatement)(term_554)) { - this.registerVariableDeclaration(term_554.declaration, phase_550, store_551); - } else if ((0, _terms.isFunctionDeclaration)(term_554)) { - this.registerFunctionOrClass(term_554, phase_550, store_551); + + invoke(mod, phase, store) { + // TODO: recursively visit imports + let body = mod.body.filter(_.complement(T.isCompiletimeStatement)).map(term => { + term = term.gen(); // TODO: can we remove the need for gen? have to deeply remove compiletime code + if (T.isVariableDeclarationStatement(term)) { + this.registerVariableDeclaration(term.declaration, phase, store); + } else if (T.isFunctionDeclaration(term)) { + this.registerFunctionOrClass(term, phase, store); } - return term_554; + return term; }); - let exportsObj_553 = (0, _loadSyntax.evalRuntimeValues)(body_552, _.merge(this.context, { store: store_551, phase: phase_550 })); - return store_551; + (0, _loadSyntax.evalRuntimeValues)(body, _.merge(this.context, { + store: store, phase: phase + })); + return store; } } -exports.Module = Module_469; -exports.Modules = Modules_473; -//# sourceMappingURL=data:application/json;base64,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LEVBQTRDO0FBQzFDLGFBQUsseUJBQUwsQ0FBK0IsU0FBUyxXQUF4QyxFQUFxRCxTQUFyRCxFQUFnRSxTQUFoRTtBQUNEO0FBQ0YsS0FKRDtBQUtBLFdBQU8sU0FBUDtBQUNEO0FBQ0QsU0FBTyxPQUFQLEVBQWdCLFNBQWhCLEVBQTJCLFNBQTNCLEVBQXNDO0FBQ3BDLFFBQUksV0FBVyxRQUFRLElBQVIsQ0FBYSxNQUFiLENBQW9CLEVBQUUsVUFBRiwrQkFBcEIsRUFBMEQsR0FBMUQsQ0FBOEQsWUFBWTtBQUN2RixpQkFBVyxTQUFTLEdBQVQsRUFBWDtBQUNBLFVBQUksMkNBQStCLFFBQS9CLENBQUosRUFBOEM7QUFDNUMsYUFBSywyQkFBTCxDQUFpQyxTQUFTLFdBQTFDLEVBQXVELFNBQXZELEVBQWtFLFNBQWxFO0FBQ0QsT0FGRCxNQUVPLElBQUksa0NBQXNCLFFBQXRCLENBQUosRUFBcUM7QUFDMUMsYUFBSyx1QkFBTCxDQUE2QixRQUE3QixFQUF1QyxTQUF2QyxFQUFrRCxTQUFsRDtBQUNEO0FBQ0QsYUFBTyxRQUFQO0FBQ0QsS0FSYyxDQUFmO0FBU0EsUUFBSSxpQkFBaUIsbUNBQWtCLFFBQWxCLEVBQTRCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQixFQUFDLE9BQU8sU0FBUixFQUFtQixPQUFPLFNBQTFCLEVBQXRCLENBQTVCLENBQXJCO0FBQ0EsV0FBTyxTQUFQO0FBQ0Q7QUFoSWU7UUFrSUksTSxHQUFkLFU7UUFDZSxPLEdBQWYsVyIsImZpbGUiOiJtb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgRW52IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IFN0b3JlIGZyb20gXCIuL3N0b3JlXCI7XG5pbXBvcnQgUmVhZGVyIGZyb20gXCIuL3NoaWZ0LXJlYWRlclwiO1xuaW1wb3J0IFRva2VuRXhwYW5kZXIgZnJvbSBcIi4vdG9rZW4tZXhwYW5kZXIuanNcIjtcbmltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlci5qc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXAuanNcIjtcbmltcG9ydCB7Z2Vuc3ltfSBmcm9tIFwiLi9zeW1ib2xcIjtcbmltcG9ydCBUZXJtLCB7aXNFT0YsIGlzQmluZGluZ0lkZW50aWZpZXIsIGlzRnVuY3Rpb25EZWNsYXJhdGlvbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24sIGlzRnVuY3Rpb25UZXJtLCBpc0Z1bmN0aW9uV2l0aE5hbWUsIGlzU3ludGF4RGVjbGFyYXRpb24sIGlzU3ludGF4cmVjRGVjbGFyYXRpb24sIGlzVmFyaWFibGVEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LCBpc0ltcG9ydCwgaXNFeHBvcnQsIGlzRXhwb3J0RnJvbSwgaXNFeHBvcnRBbGxGcm9tLCBpc0V4cG9ydERlZmF1bHQsIGlzRXhwb3J0U3ludGF4LCBpc1N5bnRheERlY2xhcmF0aW9uU3RhdGVtZW50LCBpc1ByYWdtYSwgaXNDb21waWxldGltZURlY2xhcmF0aW9uLCBpc0NvbXBpbGV0aW1lU3RhdGVtZW50LCBpc0NsYXNzRGVjbGFyYXRpb259IGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge2V2YWxDb21waWxldGltZVZhbHVlLCBldmFsUnVudGltZVZhbHVlc30gZnJvbSBcIi4vbG9hZC1zeW50YXhcIjtcbmltcG9ydCBDb21waWxlciBmcm9tIFwiLi9jb21waWxlclwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHtTY29wZSwgZnJlc2hTY29wZX0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7Y29sbGVjdEJpbmRpbmdzfSBmcm9tIFwiLi9oeWdpZW5lLXV0aWxzXCI7XG5pbXBvcnQge0FMTF9QSEFTRVN9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IGRpcm5hbWUgZnJvbSBcInV0aWxzLWRpcm5hbWVcIjtcbmltcG9ydCAgKiBhcyBfIGZyb20gXCJyYW1kYVwiO1xuY2xhc3MgTW9kdWxlXzQ2OSB7XG4gIGNvbnN0cnVjdG9yKG1vZHVsZVNwZWNpZmllcl80NzQsIGlzTmF0aXZlXzQ3NSwgaW1wb3J0RW50cmllc180NzYsIGV4cG9ydEVudHJpZXNfNDc3LCBwcmFnbWFzXzQ3OCwgYm9keV80NzkpIHtcbiAgICB0aGlzLm1vZHVsZVNwZWNpZmllciA9IG1vZHVsZVNwZWNpZmllcl80NzQ7XG4gICAgdGhpcy5pc05hdGl2ZSA9IGlzTmF0aXZlXzQ3NTtcbiAgICB0aGlzLmltcG9ydEVudHJpZXMgPSBpbXBvcnRFbnRyaWVzXzQ3NjtcbiAgICB0aGlzLmV4cG9ydEVudHJpZXMgPSBleHBvcnRFbnRyaWVzXzQ3NztcbiAgICB0aGlzLnByYWdtYXMgPSBwcmFnbWFzXzQ3ODtcbiAgICB0aGlzLmJvZHkgPSBib2R5XzQ3OTtcbiAgfVxufVxuY29uc3QgZmluZEJpbmRpbmdJZGVudGlmaWVyTmFtZV80NzAgPSB0ZXJtXzQ4MCA9PiB7XG4gIGFzc2VydCh0ZXJtXzQ4MC5uYW1lLCBgbm90IGltcGxlbWVudGVkIHlldCBmb3IgdHlwZSAke3Rlcm1fNDgwLnR5cGV9YCk7XG4gIHJldHVybiB0ZXJtXzQ4MC5uYW1lO1xufTtcbmNvbnN0IGNvbnZlcnRFeHBvcnRfNDcxID0gdGVybV80ODEgPT4ge1xuICBsZXQgZGVjbGFyYXRpb25fNDgyID0gdGVybV80ODEuZGVjbGFyYXRpb247XG4gIGxldCBiaW5kaW5nc180ODMgPSBbXTtcbiAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbl80ODIpKSB7XG4gICAgYmluZGluZ3NfNDgzID0gZGVjbGFyYXRpb25fNDgyLmRlY2xhcmF0b3JzLm1hcChkZWNsXzQ4NSA9PiBmaW5kQmluZGluZ0lkZW50aWZpZXJOYW1lXzQ3MChkZWNsXzQ4NS5iaW5kaW5nKSk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbkRlY2xhcmF0aW9uKGRlY2xhcmF0aW9uXzQ4MikgfHwgaXNDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uXzQ4MikpIHtcbiAgICBiaW5kaW5nc180ODMucHVzaChmaW5kQmluZGluZ0lkZW50aWZpZXJOYW1lXzQ3MChkZWNsYXJhdGlvbl80ODIubmFtZSkpO1xuICB9XG4gIGxldCBuYW1lZEV4cG9ydHNfNDg0ID0gYmluZGluZ3NfNDgzLm1hcChiaW5kaW5nXzQ4NiA9PiB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwb3J0U3BlY2lmaWVyXCIsIHtuYW1lOiBudWxsLCBleHBvcnRlZE5hbWU6IGJpbmRpbmdfNDg2fSk7XG4gIH0pO1xuICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRGcm9tXCIsIHttb2R1bGVTcGVjaWZpZXI6IG51bGwsIG5hbWVkRXhwb3J0czogTGlzdChuYW1lZEV4cG9ydHNfNDg0KX0pO1xufTtcbmNvbnN0IHByYWdtYVJlZ2VwXzQ3MiA9IC9eXFxzKiNcXHcqLztcbmNsYXNzIE1vZHVsZXNfNDczIHtcbiAgY29uc3RydWN0b3IoY29udGV4dF80ODcpIHtcbiAgICB0aGlzLmNvbXBpbGVkTW9kdWxlcyA9IG5ldyBNYXA7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF80ODc7XG4gICAgdGhpcy5jb250ZXh0Lm1vZHVsZXMgPSB0aGlzO1xuICB9XG4gIGxvYWRTdHJpbmcoc3RyXzQ4OCwgY2hlY2tQcmFnbWFfNDg5ID0gdHJ1ZSkge1xuICAgIGxldCBoYXNQcmFnbWFfNDkwID0gcHJhZ21hUmVnZXBfNDcyLnRlc3Qoc3RyXzQ4OCk7XG4gICAgaWYgKGNoZWNrUHJhZ21hXzQ4OSAmJiAhaGFzUHJhZ21hXzQ5MCkge1xuICAgICAgcmV0dXJuIHtpc05hdGl2ZTogdHJ1ZSwgYm9keTogTGlzdCgpfTtcbiAgICB9XG4gICAgcmV0dXJuIHtpc05hdGl2ZTogIWhhc1ByYWdtYV80OTAsIGJvZHk6IG5ldyBSZWFkZXIoc3RyXzQ4OCkucmVhZCgpfTtcbiAgfVxuICBsb2FkKHBhdGhfNDkxKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFN0cmluZyh0aGlzLmNvbnRleHQubW9kdWxlTG9hZGVyKHBhdGhfNDkxKSk7XG4gIH1cbiAgY29tcGlsZShtb2RfNDkyLCBwYXRoXzQ5Mykge1xuICAgIGxldCBzdHhsXzQ5NCA9IG1vZF80OTIuYm9keTtcbiAgICBsZXQgb3V0U2NvcGVfNDk1ID0gZnJlc2hTY29wZShcIm91dHNpZGVFZGdlXCIpO1xuICAgIGxldCBpblNjb3BlXzQ5NiA9IGZyZXNoU2NvcGUoYGluc2lkZUVkZ2UwYCk7XG4gICAgbGV0IGNvbXBpbGVyXzQ5NyA9IG5ldyBDb21waWxlcigwLCBuZXcgRW52LCBuZXcgU3RvcmUsIF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7Y3VycmVudFNjb3BlOiBbb3V0U2NvcGVfNDk1LCBpblNjb3BlXzQ5Nl0sIGN3ZDogcGF0aF80OTMgPT09IFwiPDxlbnRyeXBvaW50Pj5cIiA/IHRoaXMuY29udGV4dC5jd2QgOiBkaXJuYW1lKHBhdGhfNDkzKX0pKTtcbiAgICBsZXQgdGVybXNfNDk4ID0gY29tcGlsZXJfNDk3LmNvbXBpbGUoc3R4bF80OTQubWFwKHNfNTAzID0+IHNfNTAzLmFkZFNjb3BlKG91dFNjb3BlXzQ5NSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKS5hZGRTY29wZShpblNjb3BlXzQ5NiwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCAwKSkpO1xuICAgIGxldCBpbXBvcnRFbnRyaWVzXzQ5OSA9IFtdO1xuICAgIGxldCBleHBvcnRFbnRyaWVzXzUwMCA9IFtdO1xuICAgIGxldCBwcmFnbWFzXzUwMSA9IFtdO1xuICAgIGxldCBmaWx0ZXJlZFRlcm1zXzUwMiA9IHRlcm1zXzQ5OC5yZWR1Y2UoKGFjY181MDQsIHRfNTA1KSA9PiB7XG4gICAgICByZXR1cm4gXy5jb25kKFtbaXNJbXBvcnQsIHRfNTA2ID0+IHtcbiAgICAgICAgaW1wb3J0RW50cmllc180OTkucHVzaCh0XzUwNik7XG4gICAgICAgIHJldHVybiBhY2NfNTA0O1xuICAgICAgfV0sIFtpc0V4cG9ydCwgdF81MDcgPT4ge1xuICAgICAgICBpZiAodF81MDcuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICBleHBvcnRFbnRyaWVzXzUwMC5wdXNoKGNvbnZlcnRFeHBvcnRfNDcxKHRfNTA3KSk7XG4gICAgICAgICAgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbih0XzUwNy5kZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2NfNTA0LmNvbmNhdChuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRcIiwge2RlY2xhcmF0aW9uOiB0XzUwNy5kZWNsYXJhdGlvbn0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY181MDQuY29uY2F0KHRfNTA3LmRlY2xhcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRFbnRyaWVzXzUwMC5wdXNoKHRfNTA3KTtcbiAgICAgICAgcmV0dXJuIGFjY181MDQ7XG4gICAgICB9XSwgW2lzUHJhZ21hLCB0XzUwOCA9PiB7XG4gICAgICAgIHByYWdtYXNfNTAxLnB1c2godF81MDgpO1xuICAgICAgICByZXR1cm4gYWNjXzUwNDtcbiAgICAgIH1dLCBbXy5ULCB0XzUwOSA9PiBhY2NfNTA0LmNvbmNhdCh0XzUwOSldXSkodF81MDUpO1xuICAgIH0sIExpc3QoKSk7XG4gICAgcmV0dXJuIG5ldyBNb2R1bGVfNDY5KHBhdGhfNDkzLCBtb2RfNDkyLmlzTmF0aXZlLCBMaXN0KGltcG9ydEVudHJpZXNfNDk5KSwgTGlzdChleHBvcnRFbnRyaWVzXzUwMCksIExpc3QocHJhZ21hc181MDEpLCBmaWx0ZXJlZFRlcm1zXzUwMik7XG4gIH1cbiAgY29tcGlsZUVudHJ5cG9pbnQoc291cmNlXzUxMCwgZmlsZW5hbWVfNTExLCBlbmZvcmNlUHJhZ21hXzUxMiA9IGZhbHNlKSB7XG4gICAgbGV0IHN0eGxfNTEzID0gdGhpcy5sb2FkU3RyaW5nKHNvdXJjZV81MTAsIGZhbHNlKTtcbiAgICBpZiAoZW5mb3JjZVByYWdtYV81MTIgJiYgc3R4bF81MTMuaXNOYXRpdmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50cnlwb2ludCAke2ZpbGVuYW1lXzUxMX0gbXVzdCBiZWdpbiB3aXRoICNsYW5nIHByYWdtYWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBdFBoYXNlKFwiPDxlbnRyeXBvaW50Pj5cIiwgMCwgdGhpcy5jb250ZXh0LmN3ZCwgc3R4bF81MTMpO1xuICB9XG4gIGdldEF0UGhhc2UocmF3UGF0aF81MTQsIHBoYXNlXzUxNSwgY3dkXzUxNiwgcmF3U3R4bF81MTcgPSBudWxsKSB7XG4gICAgbGV0IHBhdGhfNTE4ID0gcmF3UGF0aF81MTQgPT09IFwiPDxlbnRyeXBvaW50Pj5cIiA/IHJhd1BhdGhfNTE0IDogdGhpcy5jb250ZXh0Lm1vZHVsZVJlc29sdmVyKHJhd1BhdGhfNTE0LCBjd2RfNTE2KTtcbiAgICBsZXQgbWFwS2V5XzUxOSA9IGAke3BhdGhfNTE4fToke3BoYXNlXzUxNX1gO1xuICAgIGlmICghdGhpcy5jb21waWxlZE1vZHVsZXMuaGFzKG1hcEtleV81MTkpKSB7XG4gICAgICBpZiAocGhhc2VfNTE1ID09PSAwKSB7XG4gICAgICAgIGxldCBzdHhsID0gcmF3U3R4bF81MTcgIT0gbnVsbCA/IHJhd1N0eGxfNTE3IDogdGhpcy5sb2FkKHBhdGhfNTE4KTtcbiAgICAgICAgdGhpcy5jb21waWxlZE1vZHVsZXMuc2V0KG1hcEtleV81MTksIHRoaXMuY29tcGlsZShzdHhsLCBwYXRoXzUxOCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJhd01vZCA9IHRoaXMuZ2V0QXRQaGFzZShyYXdQYXRoXzUxNCwgMCwgY3dkXzUxNiwgcmF3U3R4bF81MTcpO1xuICAgICAgICBsZXQgc2NvcGUgPSBmcmVzaFNjb3BlKGBpbnNpZGVFZGdlJHtwaGFzZV81MTV9YCk7XG4gICAgICAgIHRoaXMuY29tcGlsZWRNb2R1bGVzLnNldChtYXBLZXlfNTE5LCBuZXcgTW9kdWxlXzQ2OShyYXdNb2QubW9kdWxlU3BlY2lmaWVyLCBmYWxzZSwgcmF3TW9kLmltcG9ydEVudHJpZXMubWFwKHRlcm1fNTIwID0+IHRlcm1fNTIwLmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIHBoYXNlXzUxNSkpLCByYXdNb2QuZXhwb3J0RW50cmllcy5tYXAodGVybV81MjEgPT4gdGVybV81MjEuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgcGhhc2VfNTE1KSksIHJhd01vZC5wcmFnbWFzLCByYXdNb2QuYm9keS5tYXAodGVybV81MjIgPT4gdGVybV81MjIuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgcGhhc2VfNTE1KSkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZWRNb2R1bGVzLmdldChtYXBLZXlfNTE5KTtcbiAgfVxuICBoYXMocmF3UGF0aF81MjMsIHBoYXNlXzUyNCA9IDApIHtcbiAgICBsZXQgcGF0aF81MjUgPSByYXdQYXRoXzUyMyA9PT0gXCI8PGVudHJ5cG9pbnQ+PlwiID8gcmF3UGF0aF81MjMgOiB0aGlzLmNvbnRleHQubW9kdWxlUmVzb2x2ZXIocmF3UGF0aF81MjMsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgIGxldCBrZXlfNTI2ID0gYCR7cGF0aF81MjV9OiR7cGhhc2VfNTI0fWA7XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZWRNb2R1bGVzLmhhcyhrZXlfNTI2KSAmJiAhdGhpcy5jb21waWxlZE1vZHVsZXMuZ2V0KGtleV81MjYpLmlzTmF0aXZlO1xuICB9XG4gIHJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybV81MjcsIHBoYXNlXzUyOCwgc3RvcmVfNTI5KSB7XG4gICAgdGVybV81MjcuZGVjbGFyYXRvcnMuZm9yRWFjaChkZWNsXzUzMCA9PiB7XG4gICAgICBsZXQgdmFsXzUzMSA9IGV2YWxDb21waWxldGltZVZhbHVlKGRlY2xfNTMwLmluaXQuZ2VuKCksIF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7cGhhc2U6IHBoYXNlXzUyOCArIDEsIHN0b3JlOiBzdG9yZV81Mjl9KSk7XG4gICAgICBjb2xsZWN0QmluZGluZ3MoZGVjbF81MzAuYmluZGluZykuZm9yRWFjaChzdHhfNTMyID0+IHtcbiAgICAgICAgaWYgKHBoYXNlXzUyOCAhPT0gMCkge1xuICAgICAgICAgIGxldCBuZXdCaW5kaW5nID0gZ2Vuc3ltKHN0eF81MzIudmFsKCkpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4XzUzMiwge2JpbmRpbmc6IG5ld0JpbmRpbmcsIHBoYXNlOiBwaGFzZV81MjgsIHNraXBEdXA6IGZhbHNlfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVkTmFtZV81MzMgPSBzdHhfNTMyLnJlc29sdmUocGhhc2VfNTI4KTtcbiAgICAgICAgc3RvcmVfNTI5LnNldChyZXNvbHZlZE5hbWVfNTMzLCBuZXcgQ29tcGlsZXRpbWVUcmFuc2Zvcm0odmFsXzUzMSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmVnaXN0ZXJWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm1fNTM0LCBwaGFzZV81MzUsIHN0b3JlXzUzNikge1xuICAgIHRlcm1fNTM0LmRlY2xhcmF0b3JzLmZvckVhY2goZGVjbF81MzcgPT4ge1xuICAgICAgY29sbGVjdEJpbmRpbmdzKGRlY2xfNTM3LmJpbmRpbmcpLmZvckVhY2goc3R4XzUzOCA9PiB7XG4gICAgICAgIGlmIChwaGFzZV81MzUgIT09IDApIHtcbiAgICAgICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShzdHhfNTM4LnZhbCgpKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eF81MzgsIHtiaW5kaW5nOiBuZXdCaW5kaW5nLCBwaGFzZTogcGhhc2VfNTM1LCBza2lwRHVwOiB0ZXJtXzUzNC5raW5kID09PSBcInZhclwifSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc29sdmVkTmFtZV81MzkgPSBzdHhfNTM4LnJlc29sdmUocGhhc2VfNTM1KTtcbiAgICAgICAgc3RvcmVfNTM2LnNldChyZXNvbHZlZE5hbWVfNTM5LCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfNTM4KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZWdpc3RlckZ1bmN0aW9uT3JDbGFzcyh0ZXJtXzU0MCwgcGhhc2VfNTQxLCBzdG9yZV81NDIpIHtcbiAgICBjb2xsZWN0QmluZGluZ3ModGVybV81NDAubmFtZSkuZm9yRWFjaChzdHhfNTQzID0+IHtcbiAgICAgIGlmIChwaGFzZV81NDEgIT09IDApIHtcbiAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4XzU0My52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4XzU0Mywge2JpbmRpbmc6IG5ld0JpbmRpbmcsIHBoYXNlOiBwaGFzZV81NDEsIHNraXBEdXA6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgICBsZXQgcmVzb2x2ZWROYW1lXzU0NCA9IHN0eF81NDMucmVzb2x2ZShwaGFzZV81NDEpO1xuICAgICAgc3RvcmVfNTQyLnNldChyZXNvbHZlZE5hbWVfNTQ0LCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfNTQzKSk7XG4gICAgfSk7XG4gIH1cbiAgdmlzaXQobW9kXzU0NSwgcGhhc2VfNTQ2LCBzdG9yZV81NDcpIHtcbiAgICBtb2RfNTQ1LmJvZHkuZm9yRWFjaCh0ZXJtXzU0OCA9PiB7XG4gICAgICBpZiAoaXNTeW50YXhEZWNsYXJhdGlvblN0YXRlbWVudCh0ZXJtXzU0OCkpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclN5bnRheERlY2xhcmF0aW9uKHRlcm1fNTQ4LmRlY2xhcmF0aW9uLCBwaGFzZV81NDYsIHN0b3JlXzU0Nyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0b3JlXzU0NztcbiAgfVxuICBpbnZva2UobW9kXzU0OSwgcGhhc2VfNTUwLCBzdG9yZV81NTEpIHtcbiAgICBsZXQgYm9keV81NTIgPSBtb2RfNTQ5LmJvZHkuZmlsdGVyKF8uY29tcGxlbWVudChpc0NvbXBpbGV0aW1lU3RhdGVtZW50KSkubWFwKHRlcm1fNTU0ID0+IHtcbiAgICAgIHRlcm1fNTU0ID0gdGVybV81NTQuZ2VuKCk7XG4gICAgICBpZiAoaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRlcm1fNTU0KSkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtXzU1NC5kZWNsYXJhdGlvbiwgcGhhc2VfNTUwLCBzdG9yZV81NTEpO1xuICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uRGVjbGFyYXRpb24odGVybV81NTQpKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybV81NTQsIHBoYXNlXzU1MCwgc3RvcmVfNTUxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXJtXzU1NDtcbiAgICB9KTtcbiAgICBsZXQgZXhwb3J0c09ial81NTMgPSBldmFsUnVudGltZVZhbHVlcyhib2R5XzU1MiwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtzdG9yZTogc3RvcmVfNTUxLCBwaGFzZTogcGhhc2VfNTUwfSkpO1xuICAgIHJldHVybiBzdG9yZV81NTE7XG4gIH1cbn1cbmV4cG9ydCB7TW9kdWxlXzQ2OSBhcyBNb2R1bGV9O1xuZXhwb3J0IHtNb2R1bGVzXzQ3MyBhcyBNb2R1bGVzfSJdfQ== \ No newline at end of file +exports.Modules = Modules; +//# sourceMappingURL=data:application/json;base64,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QUFNLEdBQU4sRUFBVyxLQUFYLEVBQWtCLEtBQWxCLEVBQXlCO0FBQ3ZCO0FBQ0EsUUFBSSxJQUFKLENBQVMsT0FBVCxDQUFpQixRQUFRO0FBQ3ZCLFVBQUksRUFBRSw0QkFBRixDQUErQixJQUEvQixDQUFKLEVBQTBDO0FBQ3hDLGFBQUsseUJBQUwsQ0FBK0IsS0FBSyxXQUFwQyxFQUFpRCxLQUFqRCxFQUF3RCxLQUF4RDtBQUNEO0FBQ0YsS0FKRDtBQUtBLFdBQU8sS0FBUDtBQUNEOztBQUVELFNBQU8sR0FBUCxFQUFZLEtBQVosRUFBbUIsS0FBbkIsRUFBMEI7QUFDeEI7QUFDQSxRQUFJLE9BQU8sSUFBSSxJQUFKLENBQVMsTUFBVCxDQUFnQixFQUFFLFVBQUYsQ0FBYSxFQUFFLHNCQUFmLENBQWhCLEVBQXdELEdBQXhELENBQTRELFFBQVE7QUFDN0UsYUFBTyxLQUFLLEdBQUwsRUFBUCxDQUFtQjtBQUNuQixVQUFJLEVBQUUsOEJBQUYsQ0FBaUMsSUFBakMsQ0FBSixFQUE0QztBQUMxQyxhQUFLLDJCQUFMLENBQWlDLEtBQUssV0FBdEMsRUFBbUQsS0FBbkQsRUFBMEQsS0FBMUQ7QUFDRCxPQUZELE1BRU8sSUFBSSxFQUFFLHFCQUFGLENBQXdCLElBQXhCLENBQUosRUFBbUM7QUFDeEMsYUFBSyx1QkFBTCxDQUE2QixJQUE3QixFQUFtQyxLQUFuQyxFQUEwQyxLQUExQztBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0QsS0FSVSxDQUFYO0FBU0EsdUNBQWtCLElBQWxCLEVBQXdCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQjtBQUM1QyxrQkFENEMsRUFDckM7QUFEcUMsS0FBdEIsQ0FBeEI7QUFHQSxXQUFPLEtBQVA7QUFDRDtBQXJNa0I7UUFBUixPLEdBQUEsTyIsImZpbGUiOiJtb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlzdCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgRW52IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IFN0b3JlIGZyb20gXCIuL3N0b3JlXCI7XG5pbXBvcnQgUmVhZGVyIGZyb20gXCIuL3NoaWZ0LXJlYWRlclwiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCB7IGdlbnN5bSB9IGZyb20gJy4vc3ltYm9sJztcbmltcG9ydCBUZXJtLCAqIGFzIFQgZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IGV2YWxDb21waWxldGltZVZhbHVlLCBldmFsUnVudGltZVZhbHVlcyB9IGZyb20gJy4vbG9hZC1zeW50YXgnO1xuaW1wb3J0IENvbXBpbGVyIGZyb20gXCIuL2NvbXBpbGVyXCI7XG5pbXBvcnQgeyBWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybSB9IGZyb20gJy4vdHJhbnNmb3Jtcyc7XG5pbXBvcnQgeyBmcmVzaFNjb3BlIH0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGNvbGxlY3RCaW5kaW5ncyB9IGZyb20gJy4vaHlnaWVuZS11dGlscyc7XG5cbmltcG9ydCB7IEFMTF9QSEFTRVMgfSBmcm9tICcuL3N5bnRheCc7XG5cbmltcG9ydCBkaXJuYW1lIGZyb20gJ3V0aWxzLWRpcm5hbWUnO1xuXG5cbmV4cG9ydCBjbGFzcyBNb2R1bGUge1xuICBjb25zdHJ1Y3Rvcihtb2R1bGVTcGVjaWZpZXIsIGlzTmF0aXZlLCBpbXBvcnRFbnRyaWVzLCBleHBvcnRFbnRyaWVzLCBwcmFnbWFzLCBib2R5KSB7XG4gICAgdGhpcy5tb2R1bGVTcGVjaWZpZXIgPSBtb2R1bGVTcGVjaWZpZXI7XG4gICAgdGhpcy5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIHRoaXMuaW1wb3J0RW50cmllcyA9IGltcG9ydEVudHJpZXM7XG4gICAgdGhpcy5leHBvcnRFbnRyaWVzID0gZXhwb3J0RW50cmllcztcbiAgICB0aGlzLnByYWdtYXMgPSBwcmFnbWFzO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cbn1cblxuY29uc3QgZmluZEJpbmRpbmdJZGVudGlmaWVyTmFtZSA9IHRlcm0gPT4ge1xuICAvLyBUT0RPOiBoYW5kbGUgZGVzdHJ1Y3R1cmluZ1xuICBhc3NlcnQodGVybS5uYW1lLCBgbm90IGltcGxlbWVudGVkIHlldCBmb3IgdHlwZSAke3Rlcm0udHlwZX1gKTtcbiAgcmV0dXJuIHRlcm0ubmFtZTtcbn07XG5cbmNvbnN0IGNvbnZlcnRFeHBvcnQgPSB0ZXJtID0+IHtcbiAgbGV0IGRlY2xhcmF0aW9uID0gdGVybS5kZWNsYXJhdGlvbjtcbiAgbGV0IGJpbmRpbmdzID0gW107XG4gIGlmIChULmlzVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICBiaW5kaW5ncyA9IGRlY2xhcmF0aW9uLmRlY2xhcmF0b3JzLm1hcChkZWNsID0+ICBmaW5kQmluZGluZ0lkZW50aWZpZXJOYW1lKGRlY2wuYmluZGluZykpO1xuICB9IGVsc2UgaWYgKFQuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB8fCBULmlzQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICBiaW5kaW5ncy5wdXNoKGZpbmRCaW5kaW5nSWRlbnRpZmllck5hbWUoZGVjbGFyYXRpb24ubmFtZSkpO1xuICB9XG5cbiAgbGV0IG5hbWVkRXhwb3J0cyA9IGJpbmRpbmdzLm1hcChiaW5kaW5nID0+IHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydFNwZWNpZmllcicsIHtcbiAgICAgIG5hbWU6IG51bGwsXG4gICAgICBleHBvcnRlZE5hbWU6IGJpbmRpbmdcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBuZXcgVGVybSgnRXhwb3J0RnJvbScsIHtcbiAgICBtb2R1bGVTcGVjaWZpZXI6IG51bGwsXG4gICAgbmFtZWRFeHBvcnRzOiBMaXN0KG5hbWVkRXhwb3J0cylcbiAgfSk7XG59O1xuXG5jb25zdCBwcmFnbWFSZWdlcCA9IC9eXFxzKiNcXHcqLztcblxuZXhwb3J0IGNsYXNzIE1vZHVsZXMge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgdGhpcy5jb21waWxlZE1vZHVsZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLmNvbnRleHQubW9kdWxlcyA9IHRoaXM7XG4gIH1cblxuICBsb2FkU3RyaW5nKHN0ciwgY2hlY2tQcmFnbWEgPSB0cnVlKSB7XG4gICAgbGV0IGhhc1ByYWdtYSA9IHByYWdtYVJlZ2VwLnRlc3Qoc3RyKTtcbiAgICBpZiAoY2hlY2tQcmFnbWEgJiYgIWhhc1ByYWdtYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNOYXRpdmU6IHRydWUsXG4gICAgICAgIGJvZHk6IExpc3QoKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTmF0aXZlOiAhaGFzUHJhZ21hLFxuICAgICAgYm9keTogbmV3IFJlYWRlcihzdHIpLnJlYWQoKVxuICAgIH07XG4gIH1cblxuICBsb2FkKHBhdGgpIHtcbiAgICAvLyBUT0RPIHJlc29sdmUgYW5kIHdlIG5lZWQgdG8gY2FycnkgdGhlIGN3ZCB0aHJvdWdoIGNvcnJlY3RseVxuICAgIHJldHVybiB0aGlzLmxvYWRTdHJpbmcodGhpcy5jb250ZXh0Lm1vZHVsZUxvYWRlcihwYXRoKSk7XG4gIH1cblxuICBjb21waWxlKG1vZCwgcGF0aCkge1xuICAgIGxldCBzdHhsID0gbW9kLmJvZHk7XG4gICAgbGV0IG91dFNjb3BlID0gZnJlc2hTY29wZSgnb3V0c2lkZUVkZ2UnKTtcbiAgICBsZXQgaW5TY29wZSA9IGZyZXNoU2NvcGUoYGluc2lkZUVkZ2UwYCk7XG4gICAgLy8gdGhlIGNvbXBpbGVyIHN0YXJ0cyBhdCBwaGFzZSAwLCB3aXRoIGFuIGVtcHR5IGVudmlyb25tZW50IGFuZCBzdG9yZVxuICAgIGxldCBjb21waWxlciA9IG5ldyBDb21waWxlcigwLCBuZXcgRW52KCksIG5ldyBTdG9yZSgpLCBfLm1lcmdlKHRoaXMuY29udGV4dCwge1xuICAgICAgY3VycmVudFNjb3BlOiBbb3V0U2NvcGUsIGluU2NvcGVdLFxuICAgICAgY3dkOiBwYXRoID09PSAnPDxlbnRyeXBvaW50Pj4nID8gdGhpcy5jb250ZXh0LmN3ZCA6IGRpcm5hbWUocGF0aClcbiAgICB9KSk7XG4gICAgbGV0IHRlcm1zID0gY29tcGlsZXIuY29tcGlsZShzdHhsLm1hcChzID0+XG4gICAgICBzLmFkZFNjb3BlKG91dFNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpXG4gICAgICAgLmFkZFNjb3BlKGluU2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgMClcbiAgICApKTtcblxuICAgIGxldCBpbXBvcnRFbnRyaWVzID0gW107XG4gICAgbGV0IGV4cG9ydEVudHJpZXMgPSBbXTtcbiAgICBsZXQgcHJhZ21hcyA9IFtdO1xuICAgIGxldCBmaWx0ZXJlZFRlcm1zID0gdGVybXMucmVkdWNlKChhY2MsIHQpID0+IHtcbiAgICAgIHJldHVybiBfLmNvbmQoW1xuICAgICAgICBbVC5pc0ltcG9ydCwgdCA9PiB7XG4gICAgICAgICAgaW1wb3J0RW50cmllcy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1dLFxuICAgICAgICBbVC5pc0V4cG9ydCwgdCA9PiB7XG4gICAgICAgICAgLy8gZXhwb3J0RW50cmllcy5wdXNoKHQpO1xuICAgICAgICAgIC8vIHJldHVybiBhY2MuY29uY2F0KHQpO1xuICAgICAgICAgIGlmICh0LmRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBleHBvcnRFbnRyaWVzLnB1c2goY29udmVydEV4cG9ydCh0KSk7XG4gICAgICAgICAgICBpZiAoVC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24odC5kZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQobmV3IFRlcm0oJ1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQnLCB7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb246IHQuZGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQodC5kZWNsYXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cG9ydEVudHJpZXMucHVzaCh0KTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XSxcbiAgICAgICAgW1QuaXNQcmFnbWEsIHQgPT4geyBwcmFnbWFzLnB1c2godCk7IHJldHVybiBhY2M7IH0gXSxcbiAgICAgICAgW18uVCwgdCA9PiBhY2MuY29uY2F0KHQpIF1cbiAgICAgIF0pKHQpO1xuICAgIH0sIExpc3QoKSk7XG4gICAgcmV0dXJuIG5ldyBNb2R1bGUoXG4gICAgICBwYXRoLFxuICAgICAgbW9kLmlzTmF0aXZlLFxuICAgICAgTGlzdChpbXBvcnRFbnRyaWVzKSxcbiAgICAgIExpc3QoZXhwb3J0RW50cmllcyksXG4gICAgICBMaXN0KHByYWdtYXMpLFxuICAgICAgZmlsdGVyZWRUZXJtc1xuICAgICk7XG4gIH1cblxuICBjb21waWxlRW50cnlwb2ludChzb3VyY2UsIGZpbGVuYW1lLCBlbmZvcmNlUHJhZ21hID0gZmFsc2UpIHtcbiAgICBsZXQgc3R4bCA9IHRoaXMubG9hZFN0cmluZyhzb3VyY2UsIGZhbHNlKTtcbiAgICBpZiAoZW5mb3JjZVByYWdtYSAmJiBzdHhsLmlzTmF0aXZlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgJHtmaWxlbmFtZX0gbXVzdCBiZWdpbiB3aXRoICNsYW5nIHByYWdtYWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBdFBoYXNlKCc8PGVudHJ5cG9pbnQ+PicsIDAsIHRoaXMuY29udGV4dC5jd2QsIHN0eGwpO1xuICB9XG5cbiAgLy8gTW9kdWxlcyBoYXZlIGEgdW5pcXVlIHNjb3BlIHBlci1waGFzZS4gV2UgY29tcGlsZSBlYWNoIG1vZHVsZSBvbmNlIGF0XG4gIC8vIHBoYXNlIDAgYW5kIHN0b3JlIHRoZSBjb21waWxlZCBtb2R1bGUgaW4gYSBtYXAuIFRoZW4sIGFzIHdlIGFzayBmb3JcbiAgLy8gdGhlIG1vZHVsZSBpbiBhIHBhcnRpY3VsYXIgcGhhc2UsIHdlIGFkZCB0aGF0IG5ldyBwaGFzZS1zcGVjaWZpYyBzY29wZVxuICAvLyB0byB0aGUgY29tcGlsZWQgbW9kdWxlIGFuZCB1cGRhdGUgdGhlIG1hcCB3aXRoIHRoZSBtb2R1bGUgYXQgdGhhdCBzcGVjaWZpY1xuICAvLyBwaGFzZS5cbiAgZ2V0QXRQaGFzZShyYXdQYXRoLCBwaGFzZSwgY3dkLCByYXdTdHhsID0gbnVsbCkge1xuICAgIGxldCBwYXRoID0gcmF3UGF0aCA9PT0gJzw8ZW50cnlwb2ludD4+JyA/IHJhd1BhdGggOiB0aGlzLmNvbnRleHQubW9kdWxlUmVzb2x2ZXIocmF3UGF0aCwgY3dkKTtcbiAgICBsZXQgbWFwS2V5ID0gYCR7cGF0aH06JHtwaGFzZX1gO1xuICAgIGlmICghdGhpcy5jb21waWxlZE1vZHVsZXMuaGFzKG1hcEtleSkpIHtcbiAgICAgIGlmIChwaGFzZSA9PT0gMCkge1xuICAgICAgICBsZXQgc3R4bCA9IHJhd1N0eGwgIT0gbnVsbCA/IHJhd1N0eGwgOiB0aGlzLmxvYWQocGF0aCk7XG4gICAgICAgIHRoaXMuY29tcGlsZWRNb2R1bGVzLnNldChtYXBLZXksIHRoaXMuY29tcGlsZShzdHhsLCBwYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcmF3TW9kID0gdGhpcy5nZXRBdFBoYXNlKHJhd1BhdGgsIDAsIGN3ZCwgcmF3U3R4bCk7XG4gICAgICAgIGxldCBzY29wZSA9IGZyZXNoU2NvcGUoYGluc2lkZUVkZ2Uke3BoYXNlfWApO1xuICAgICAgICB0aGlzLmNvbXBpbGVkTW9kdWxlcy5zZXQobWFwS2V5LCBuZXcgTW9kdWxlKFxuICAgICAgICAgIHJhd01vZC5tb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgcmF3TW9kLmltcG9ydEVudHJpZXMubWFwKHRlcm0gPT4gdGVybS5hZGRTY29wZShzY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBwaGFzZSkpLFxuICAgICAgICAgIHJhd01vZC5leHBvcnRFbnRyaWVzLm1hcCh0ZXJtID0+IHRlcm0uYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgcGhhc2UpKSxcbiAgICAgICAgICByYXdNb2QucHJhZ21hcyxcbiAgICAgICAgICByYXdNb2QuYm9keS5tYXAodGVybSA9PiB0ZXJtLmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIHBoYXNlKSlcbiAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVkTW9kdWxlcy5nZXQobWFwS2V5KTtcbiAgfVxuXG4gIGhhcyhyYXdQYXRoLCBwaGFzZSA9IDApIHtcbiAgICBsZXQgcGF0aCA9IHJhd1BhdGggPT09ICc8PGVudHJ5cG9pbnQ+PicgPyByYXdQYXRoIDogdGhpcy5jb250ZXh0Lm1vZHVsZVJlc29sdmVyKHJhd1BhdGgsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgIGxldCBrZXkgPSBgJHtwYXRofToke3BoYXNlfWA7XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZWRNb2R1bGVzLmhhcyhrZXkpICYmICF0aGlzLmNvbXBpbGVkTW9kdWxlcy5nZXQoa2V5KS5pc05hdGl2ZTtcbiAgfVxuXG4gIHJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybSwgcGhhc2UsIHN0b3JlKSB7XG4gICAgdGVybS5kZWNsYXJhdG9ycy5mb3JFYWNoKGRlY2wgPT4ge1xuICAgICAgbGV0IHZhbCA9IGV2YWxDb21waWxldGltZVZhbHVlKGRlY2wuaW5pdC5nZW4oKSwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtcbiAgICAgICAgcGhhc2U6IHBoYXNlICsgMSwgc3RvcmVcbiAgICAgIH0pKTtcbiAgICAgIGNvbGxlY3RCaW5kaW5ncyhkZWNsLmJpbmRpbmcpLmZvckVhY2goc3R4ID0+IHtcbiAgICAgICAgaWYgKHBoYXNlICE9PSAwKSB7IC8vIHBoYXNlIDAgYmluZGluZ3MgZXh0ZW5kIHRoZSBiaW5kaW5nIG1hcCBkdXJpbmcgY29tcGlsYXRpb25cbiAgICAgICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShzdHgudmFsKCkpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4LCB7XG4gICAgICAgICAgICBiaW5kaW5nOiBuZXdCaW5kaW5nLFxuICAgICAgICAgICAgcGhhc2U6IHBoYXNlLFxuICAgICAgICAgICAgc2tpcER1cDogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWROYW1lID0gc3R4LnJlc29sdmUocGhhc2UpO1xuICAgICAgICBzdG9yZS5zZXQocmVzb2x2ZWROYW1lLCBuZXcgQ29tcGlsZXRpbWVUcmFuc2Zvcm0odmFsKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtLCBwaGFzZSwgc3RvcmUpIHtcbiAgICB0ZXJtLmRlY2xhcmF0b3JzLmZvckVhY2goZGVjbCA9PiB7XG4gICAgICBjb2xsZWN0QmluZGluZ3MoZGVjbC5iaW5kaW5nKS5mb3JFYWNoKHN0eCA9PiB7XG4gICAgICAgIGlmIChwaGFzZSAhPT0gMCkgeyAvLyBwaGFzZSAwIGJpbmRpbmdzIGV4dGVuZCB0aGUgYmluZGluZyBtYXAgZHVyaW5nIGNvbXBpbGF0aW9uXG4gICAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4LnZhbCgpKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eCwge1xuICAgICAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgICAgIHBoYXNlOiBwaGFzZSxcbiAgICAgICAgICAgIHNraXBEdXA6IHRlcm0ua2luZCA9PT0gJ3ZhcidcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWROYW1lID0gc3R4LnJlc29sdmUocGhhc2UpO1xuICAgICAgICBzdG9yZS5zZXQocmVzb2x2ZWROYW1lLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybSwgcGhhc2UsIHN0b3JlKSB7XG4gICAgY29sbGVjdEJpbmRpbmdzKHRlcm0ubmFtZSkuZm9yRWFjaChzdHggPT4ge1xuICAgICAgaWYgKHBoYXNlICE9PSAwKSB7XG4gICAgICAgIGxldCBuZXdCaW5kaW5nID0gZ2Vuc3ltKHN0eC52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4LCB7XG4gICAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgICBwaGFzZTogcGhhc2UsXG4gICAgICAgICAgc2tpcER1cDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgcmVzb2x2ZWROYW1lID0gc3R4LnJlc29sdmUocGhhc2UpO1xuICAgICAgc3RvcmUuc2V0KHJlc29sdmVkTmFtZSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0oc3R4KSk7XG4gICAgfSk7XG4gIH1cblxuICB2aXNpdChtb2QsIHBoYXNlLCBzdG9yZSkge1xuICAgIC8vIFRPRE86IHJlY3Vyc2l2ZWx5IHZpc2l0IGltcG9ydHNcbiAgICBtb2QuYm9keS5mb3JFYWNoKHRlcm0gPT4ge1xuICAgICAgaWYgKFQuaXNTeW50YXhEZWNsYXJhdGlvblN0YXRlbWVudCh0ZXJtKSkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybS5kZWNsYXJhdGlvbiwgcGhhc2UsIHN0b3JlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH1cblxuICBpbnZva2UobW9kLCBwaGFzZSwgc3RvcmUpIHtcbiAgICAvLyBUT0RPOiByZWN1cnNpdmVseSB2aXNpdCBpbXBvcnRzXG4gICAgbGV0IGJvZHkgPSBtb2QuYm9keS5maWx0ZXIoXy5jb21wbGVtZW50KFQuaXNDb21waWxldGltZVN0YXRlbWVudCkpLm1hcCh0ZXJtID0+IHtcbiAgICAgIHRlcm0gPSB0ZXJtLmdlbigpOyAvLyBUT0RPOiBjYW4gd2UgcmVtb3ZlIHRoZSBuZWVkIGZvciBnZW4/IGhhdmUgdG8gZGVlcGx5IHJlbW92ZSBjb21waWxldGltZSBjb2RlXG4gICAgICBpZiAoVC5pc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybSkpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybS5kZWNsYXJhdGlvbiwgcGhhc2UsIHN0b3JlKTtcbiAgICAgIH0gZWxzZSBpZiAoVC5pc0Z1bmN0aW9uRGVjbGFyYXRpb24odGVybSkpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT3JDbGFzcyh0ZXJtLCBwaGFzZSwgc3RvcmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfSk7XG4gICAgZXZhbFJ1bnRpbWVWYWx1ZXMoYm9keSwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtcbiAgICAgIHN0b3JlLCBwaGFzZVxuICAgIH0pKTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/node-module-loader.js b/dist/node-module-loader.js index b6aedf95..d1a6f577 100644 --- a/dist/node-module-loader.js +++ b/dist/node-module-loader.js @@ -1,17 +1,17 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = moduleLoader; -var _fs = require("fs"); +var _fs = require('fs'); -function moduleLoader(path_555) { +function moduleLoader(path) { try { - return (0, _fs.readFileSync)(path_555, "utf8"); + return (0, _fs.readFileSync)(path, 'utf8'); } catch (e) { return ""; } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L25vZGUtbW9kdWxlLWxvYWRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztrQkFDd0IsWTs7QUFEeEI7O0FBQ2UsU0FBUyxZQUFULENBQXNCLFFBQXRCLEVBQWdDO0FBQzdDLE1BQUk7QUFDRixXQUFPLHNCQUFhLFFBQWIsRUFBdUIsTUFBdkIsQ0FBUDtBQUNELEdBRkQsQ0FFRSxPQUFPLENBQVAsRUFBVTtBQUNWLFdBQU8sRUFBUDtBQUNEO0FBQ0YiLCJmaWxlIjoibm9kZS1tb2R1bGUtbG9hZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtyZWFkRmlsZVN5bmMsIHN0YXRTeW5jfSBmcm9tIFwiZnNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1vZHVsZUxvYWRlcihwYXRoXzU1NSkge1xuICB0cnkge1xuICAgIHJldHVybiByZWFkRmlsZVN5bmMocGF0aF81NTUsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub2RlLW1vZHVsZS1sb2FkZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBRXdCLFk7O0FBRnhCOztBQUVlLFNBQVMsWUFBVCxDQUFzQixJQUF0QixFQUE0QjtBQUN6QyxNQUFJO0FBQ0YsV0FBTyxzQkFBYSxJQUFiLEVBQW1CLE1BQW5CLENBQVA7QUFDRCxHQUZELENBRUUsT0FBTyxDQUFQLEVBQVU7QUFDVixXQUFPLEVBQVA7QUFDRDtBQUNGIiwiZmlsZSI6Im5vZGUtbW9kdWxlLWxvYWRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbW9kdWxlTG9hZGVyKHBhdGgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVhZEZpbGVTeW5jKHBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/node-module-resolver.js b/dist/node-module-resolver.js index 5c1e335c..3869a152 100644 --- a/dist/node-module-resolver.js +++ b/dist/node-module-resolver.js @@ -1,17 +1,17 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = resolveModule; -var _resolve = require("resolve"); +var _resolve = require('resolve'); var _resolve2 = _interopRequireDefault(_resolve); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function resolveModule(path_556, cwd_557) { - return _resolve2.default.sync(path_556, { basedir: cwd_557 }); +function resolveModule(path, cwd) { + return _resolve2.default.sync(path, { basedir: cwd }); } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L25vZGUtbW9kdWxlLXJlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUN3QixhOztBQUR4Qjs7Ozs7O0FBQ2UsU0FBUyxhQUFULENBQXVCLFFBQXZCLEVBQWlDLE9BQWpDLEVBQTBDO0FBQ3ZELFNBQU8sa0JBQVEsSUFBUixDQUFhLFFBQWIsRUFBdUIsRUFBQyxTQUFTLE9BQVYsRUFBdkIsQ0FBUDtBQUNEIiwiZmlsZSI6Im5vZGUtbW9kdWxlLXJlc29sdmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlc29sdmUgZnJvbSBcInJlc29sdmVcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc29sdmVNb2R1bGUocGF0aF81NTYsIGN3ZF81NTcpIHtcbiAgcmV0dXJuIHJlc29sdmUuc3luYyhwYXRoXzU1Niwge2Jhc2VkaXI6IGN3ZF81NTd9KTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub2RlLW1vZHVsZS1yZXNvbHZlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztrQkFFd0IsYTs7QUFGeEI7Ozs7OztBQUVlLFNBQVMsYUFBVCxDQUF1QixJQUF2QixFQUE2QixHQUE3QixFQUFrQztBQUMvQyxTQUFPLGtCQUFRLElBQVIsQ0FBYSxJQUFiLEVBQW1CLEVBQUUsU0FBUyxHQUFYLEVBQW5CLENBQVA7QUFDRCIsImZpbGUiOiJub2RlLW1vZHVsZS1yZXNvbHZlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZXNvbHZlIGZyb20gJ3Jlc29sdmUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlKHBhdGgsIGN3ZCkge1xuICByZXR1cm4gcmVzb2x2ZS5zeW5jKHBhdGgsIHsgYmFzZWRpcjogY3dkIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/dist/operators.js b/dist/operators.js index 03b1155b..b8046153 100644 --- a/dist/operators.js +++ b/dist/operators.js @@ -1,36 +1,99 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -const unaryOperators_558 = { "+": true, "-": true, "!": true, "~": true, "++": true, "--": true, typeof: true, void: true, delete: true }; -const binaryOperatorPrecedence_559 = { "*": 13, "/": 13, "%": 13, "+": 12, "-": 12, ">>": 11, "<<": 11, ">>>": 11, "<": 10, "<=": 10, ">": 10, ">=": 10, in: 10, instanceof: 10, "==": 9, "!=": 9, "===": 9, "!==": 9, "&": 8, "^": 7, "|": 6, "&&": 5, "||": 4 }; -var operatorAssoc_560 = { "*": "left", "/": "left", "%": "left", "+": "left", "-": "left", ">>": "left", "<<": "left", ">>>": "left", "<": "left", "<=": "left", ">": "left", ">=": "left", in: "left", instanceof: "left", "==": "left", "!=": "left", "===": "left", "!==": "left", "&": "left", "^": "left", "|": "left", "&&": "left", "||": "left" }; -function operatorLt_561(left_566, right_567, assoc_568) { - if (assoc_568 === "left") { - return left_566 < right_567; +exports.operatorLt = operatorLt; +exports.getOperatorPrec = getOperatorPrec; +exports.getOperatorAssoc = getOperatorAssoc; +exports.isUnaryOperator = isUnaryOperator; +exports.isOperator = isOperator; +const unaryOperators = { + '+': true, + '-': true, + '!': true, + '~': true, + '++': true, + '--': true, + 'typeof': true, + 'void': true, + 'delete': true +}; +const binaryOperatorPrecedence = { + "*": 13, + "/": 13, + "%": 13, + "+": 12, + "-": 12, + ">>": 11, + "<<": 11, + ">>>": 11, + "<": 10, + "<=": 10, + ">": 10, + ">=": 10, + "in": 10, + "instanceof": 10, + "==": 9, + "!=": 9, + "===": 9, + "!==": 9, + "&": 8, + "^": 7, + "|": 6, + "&&": 5, + "||": 4 +}; + +var operatorAssoc = { + "*": "left", + "/": "left", + "%": "left", + "+": "left", + "-": "left", + ">>": "left", + "<<": "left", + ">>>": "left", + "<": "left", + "<=": "left", + ">": "left", + ">=": "left", + "in": "left", + "instanceof": "left", + "==": "left", + "!=": "left", + "===": "left", + "!==": "left", + "&": "left", + "^": "left", + "|": "left", + "&&": "left", + "||": "left" +}; + +function operatorLt(left, right, assoc) { + if (assoc === "left") { + return left < right; } else { - return left_566 <= right_567; + return left <= right; } } -function getOperatorPrec_562(op_569) { - return binaryOperatorPrecedence_559[op_569]; + +function getOperatorPrec(op) { + return binaryOperatorPrecedence[op]; } -function getOperatorAssoc_563(op_570) { - return operatorAssoc_560[op_570]; +function getOperatorAssoc(op) { + return operatorAssoc[op]; } -function isUnaryOperator_564(op_571) { - return (op_571.match("punctuator") || op_571.match("identifier") || op_571.match("keyword")) && unaryOperators_558.hasOwnProperty(op_571.val()); + +function isUnaryOperator(op) { + return (op.match("punctuator") || op.match("identifier") || op.match("keyword")) && unaryOperators.hasOwnProperty(op.val()); } -function isOperator_565(op_572) { - if (op_572.match("punctuator") || op_572.match("identifier") || op_572.match("keyword")) { - return binaryOperatorPrecedence_559.hasOwnProperty(op_572) || unaryOperators_558.hasOwnProperty(op_572.val()); + +function isOperator(op) { + if (op.match("punctuator") || op.match("identifier") || op.match("keyword")) { + return binaryOperatorPrecedence.hasOwnProperty(op) || unaryOperators.hasOwnProperty(op.val()); } return false; } -exports.operatorLt = operatorLt_561; -exports.getOperatorPrec = getOperatorPrec_562; -exports.getOperatorAssoc = getOperatorAssoc_563; -exports.isUnaryOperator = isUnaryOperator_564; -exports.isOperator = isOperator_565; -//# sourceMappingURL=data:application/json;base64,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QixjO1FBQ3VCLGUsR0FBdkIsbUI7UUFDd0IsZ0IsR0FBeEIsb0I7UUFDdUIsZSxHQUF2QixtQjtRQUNrQixVLEdBQWxCLGMiLCJmaWxlIjoib3BlcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdW5hcnlPcGVyYXRvcnNfNTU4ID0ge1wiK1wiOiB0cnVlLCBcIi1cIjogdHJ1ZSwgXCIhXCI6IHRydWUsIFwiflwiOiB0cnVlLCBcIisrXCI6IHRydWUsIFwiLS1cIjogdHJ1ZSwgdHlwZW9mOiB0cnVlLCB2b2lkOiB0cnVlLCBkZWxldGU6IHRydWV9O1xuY29uc3QgYmluYXJ5T3BlcmF0b3JQcmVjZWRlbmNlXzU1OSA9IHtcIipcIjogMTMsIFwiL1wiOiAxMywgXCIlXCI6IDEzLCBcIitcIjogMTIsIFwiLVwiOiAxMiwgXCI+PlwiOiAxMSwgXCI8PFwiOiAxMSwgXCI+Pj5cIjogMTEsIFwiPFwiOiAxMCwgXCI8PVwiOiAxMCwgXCI+XCI6IDEwLCBcIj49XCI6IDEwLCBpbjogMTAsIGluc3RhbmNlb2Y6IDEwLCBcIj09XCI6IDksIFwiIT1cIjogOSwgXCI9PT1cIjogOSwgXCIhPT1cIjogOSwgXCImXCI6IDgsIFwiXlwiOiA3LCBcInxcIjogNiwgXCImJlwiOiA1LCBcInx8XCI6IDR9O1xudmFyIG9wZXJhdG9yQXNzb2NfNTYwID0ge1wiKlwiOiBcImxlZnRcIiwgXCIvXCI6IFwibGVmdFwiLCBcIiVcIjogXCJsZWZ0XCIsIFwiK1wiOiBcImxlZnRcIiwgXCItXCI6IFwibGVmdFwiLCBcIj4+XCI6IFwibGVmdFwiLCBcIjw8XCI6IFwibGVmdFwiLCBcIj4+PlwiOiBcImxlZnRcIiwgXCI8XCI6IFwibGVmdFwiLCBcIjw9XCI6IFwibGVmdFwiLCBcIj5cIjogXCJsZWZ0XCIsIFwiPj1cIjogXCJsZWZ0XCIsIGluOiBcImxlZnRcIiwgaW5zdGFuY2VvZjogXCJsZWZ0XCIsIFwiPT1cIjogXCJsZWZ0XCIsIFwiIT1cIjogXCJsZWZ0XCIsIFwiPT09XCI6IFwibGVmdFwiLCBcIiE9PVwiOiBcImxlZnRcIiwgXCImXCI6IFwibGVmdFwiLCBcIl5cIjogXCJsZWZ0XCIsIFwifFwiOiBcImxlZnRcIiwgXCImJlwiOiBcImxlZnRcIiwgXCJ8fFwiOiBcImxlZnRcIn07XG5mdW5jdGlvbiBvcGVyYXRvckx0XzU2MShsZWZ0XzU2NiwgcmlnaHRfNTY3LCBhc3NvY181NjgpIHtcbiAgaWYgKGFzc29jXzU2OCA9PT0gXCJsZWZ0XCIpIHtcbiAgICByZXR1cm4gbGVmdF81NjYgPCByaWdodF81Njc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxlZnRfNTY2IDw9IHJpZ2h0XzU2NztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0T3BlcmF0b3JQcmVjXzU2MihvcF81NjkpIHtcbiAgcmV0dXJuIGJpbmFyeU9wZXJhdG9yUHJlY2VkZW5jZV81NTlbb3BfNTY5XTtcbn1cbmZ1bmN0aW9uIGdldE9wZXJhdG9yQXNzb2NfNTYzKG9wXzU3MCkge1xuICByZXR1cm4gb3BlcmF0b3JBc3NvY181NjBbb3BfNTcwXTtcbn1cbmZ1bmN0aW9uIGlzVW5hcnlPcGVyYXRvcl81NjQob3BfNTcxKSB7XG4gIHJldHVybiAob3BfNTcxLm1hdGNoKFwicHVuY3R1YXRvclwiKSB8fCBvcF81NzEubWF0Y2goXCJpZGVudGlmaWVyXCIpIHx8IG9wXzU3MS5tYXRjaChcImtleXdvcmRcIikpICYmIHVuYXJ5T3BlcmF0b3JzXzU1OC5oYXNPd25Qcm9wZXJ0eShvcF81NzEudmFsKCkpO1xufVxuZnVuY3Rpb24gaXNPcGVyYXRvcl81NjUob3BfNTcyKSB7XG4gIGlmIChvcF81NzIubWF0Y2goXCJwdW5jdHVhdG9yXCIpIHx8IG9wXzU3Mi5tYXRjaChcImlkZW50aWZpZXJcIikgfHwgb3BfNTcyLm1hdGNoKFwia2V5d29yZFwiKSkge1xuICAgIHJldHVybiBiaW5hcnlPcGVyYXRvclByZWNlZGVuY2VfNTU5Lmhhc093blByb3BlcnR5KG9wXzU3MikgfHwgdW5hcnlPcGVyYXRvcnNfNTU4Lmhhc093blByb3BlcnR5KG9wXzU3Mi52YWwoKSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IHtvcGVyYXRvckx0XzU2MSBhcyBvcGVyYXRvckx0fTtcbmV4cG9ydCB7Z2V0T3BlcmF0b3JQcmVjXzU2MiBhcyBnZXRPcGVyYXRvclByZWN9O1xuZXhwb3J0IHtnZXRPcGVyYXRvckFzc29jXzU2MyBhcyBnZXRPcGVyYXRvckFzc29jfTtcbmV4cG9ydCB7aXNVbmFyeU9wZXJhdG9yXzU2NCBhcyBpc1VuYXJ5T3BlcmF0b3J9O1xuZXhwb3J0IHtpc09wZXJhdG9yXzU2NSBhcyBpc09wZXJhdG9yfSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,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eEMsS0FBK0MsZUFBZSxjQUFmLENBQThCLEdBQUcsR0FBSCxFQUE5QixDQUF0RDtBQUNEO0FBQ0QsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoib3BlcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdW5hcnlPcGVyYXRvcnMgPSB7XG4gICcrJzogdHJ1ZSxcbiAgJy0nOiB0cnVlLFxuICAnISc6IHRydWUsXG4gICd+JzogdHJ1ZSxcbiAgJysrJzogdHJ1ZSxcbiAgJy0tJzogdHJ1ZSxcbiAgJ3R5cGVvZic6IHRydWUsXG4gICd2b2lkJzogdHJ1ZSxcbiAgJ2RlbGV0ZSc6IHRydWUsXG59O1xuY29uc3QgYmluYXJ5T3BlcmF0b3JQcmVjZWRlbmNlID0ge1xuICBcIipcIjogMTMsXG4gIFwiL1wiOiAxMyxcbiAgXCIlXCI6IDEzLFxuICBcIitcIjogMTIsXG4gIFwiLVwiOiAxMixcbiAgXCI+PlwiOiAxMSxcbiAgXCI8PFwiOiAxMSxcbiAgXCI+Pj5cIjogMTEsXG4gIFwiPFwiOiAxMCxcbiAgXCI8PVwiOiAxMCxcbiAgXCI+XCI6IDEwLFxuICBcIj49XCI6IDEwLFxuICBcImluXCI6IDEwLFxuICBcImluc3RhbmNlb2ZcIjogMTAsXG4gIFwiPT1cIjogOSxcbiAgXCIhPVwiOiA5LFxuICBcIj09PVwiOiA5LFxuICBcIiE9PVwiOiA5LFxuICBcIiZcIjogOCxcbiAgXCJeXCI6IDcsXG4gIFwifFwiOiA2LFxuICBcIiYmXCI6IDUsXG4gIFwifHxcIjogNCxcbn07XG5cbnZhciBvcGVyYXRvckFzc29jID0ge1xuICBcIipcIjogXCJsZWZ0XCIsXG4gIFwiL1wiOiBcImxlZnRcIixcbiAgXCIlXCI6IFwibGVmdFwiLFxuICBcIitcIjogXCJsZWZ0XCIsXG4gIFwiLVwiOiBcImxlZnRcIixcbiAgXCI+PlwiOiBcImxlZnRcIixcbiAgXCI8PFwiOiBcImxlZnRcIixcbiAgXCI+Pj5cIjogXCJsZWZ0XCIsXG4gIFwiPFwiOiBcImxlZnRcIixcbiAgXCI8PVwiOiBcImxlZnRcIixcbiAgXCI+XCI6IFwibGVmdFwiLFxuICBcIj49XCI6IFwibGVmdFwiLFxuICBcImluXCI6IFwibGVmdFwiLFxuICBcImluc3RhbmNlb2ZcIjogXCJsZWZ0XCIsXG4gIFwiPT1cIjogXCJsZWZ0XCIsXG4gIFwiIT1cIjogXCJsZWZ0XCIsXG4gIFwiPT09XCI6IFwibGVmdFwiLFxuICBcIiE9PVwiOiBcImxlZnRcIixcbiAgXCImXCI6IFwibGVmdFwiLFxuICBcIl5cIjogXCJsZWZ0XCIsXG4gIFwifFwiOiBcImxlZnRcIixcbiAgXCImJlwiOiBcImxlZnRcIixcbiAgXCJ8fFwiOiBcImxlZnRcIixcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRvckx0KGxlZnQsIHJpZ2h0LCBhc3NvYykge1xuICBpZiAoYXNzb2MgPT09IFwibGVmdFwiKSB7XG4gICAgcmV0dXJuIGxlZnQgPCByaWdodDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGVmdCA8PSByaWdodDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0b3JQcmVjKG9wKSB7XG4gIHJldHVybiBiaW5hcnlPcGVyYXRvclByZWNlZGVuY2Vbb3BdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wZXJhdG9yQXNzb2Mob3ApIHtcbiAgcmV0dXJuIG9wZXJhdG9yQXNzb2Nbb3BdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmFyeU9wZXJhdG9yKG9wKSB7XG4gIHJldHVybiAob3AubWF0Y2goXCJwdW5jdHVhdG9yXCIpIHx8IG9wLm1hdGNoKFwiaWRlbnRpZmllclwiKSB8fCBvcC5tYXRjaChcImtleXdvcmRcIikpICYmXG4gICAgICAgIHVuYXJ5T3BlcmF0b3JzLmhhc093blByb3BlcnR5KG9wLnZhbCgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlcmF0b3Iob3ApIHtcbiAgaWYgKG9wLm1hdGNoKFwicHVuY3R1YXRvclwiKSB8fCBvcC5tYXRjaChcImlkZW50aWZpZXJcIikgfHwgb3AubWF0Y2goXCJrZXl3b3JkXCIpKSB7XG4gICAgcmV0dXJuIGJpbmFyeU9wZXJhdG9yUHJlY2VkZW5jZS5oYXNPd25Qcm9wZXJ0eShvcCkgfHwgdW5hcnlPcGVyYXRvcnMuaGFzT3duUHJvcGVydHkob3AudmFsKCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/parse-reducer.js b/dist/parse-reducer.js index 0251d0d8..3945ab94 100644 --- a/dist/parse-reducer.js +++ b/dist/parse-reducer.js @@ -13,90 +13,170 @@ var _shiftReducer = require("shift-reducer"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class ParseReducer extends _shiftReducer.CloneReducer { - constructor(context_573) { + constructor(context) { super(); - this.context = context_573; + this.context = context; } - reduceModule(node_574, state_575) { - return new _terms2.default("Module", { directives: state_575.directives.toArray(), items: state_575.items.toArray() }); + reduceModule(node, state) { + return new _terms2.default("Module", { + directives: state.directives.toArray(), + items: state.items.toArray() + }); } - reduceImport(node_576, state_577) { - let moduleSpecifier_578 = state_577.moduleSpecifier ? state_577.moduleSpecifier.val() : null; - return new _terms2.default("Import", { defaultBinding: state_577.defaultBinding, namedImports: state_577.namedImports.toArray(), moduleSpecifier: moduleSpecifier_578, forSyntax: node_576.forSyntax }); + + reduceImport(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('Import', { + defaultBinding: state.defaultBinding, + namedImports: state.namedImports.toArray(), + moduleSpecifier: moduleSpecifier, + forSyntax: node.forSyntax + }); } - reduceImportNamespace(node_579, state_580) { - let moduleSpecifier_581 = state_580.moduleSpecifier ? state_580.moduleSpecifier.val() : null; - return new _terms2.default("ImportNamespace", { defaultBinding: state_580.defaultBinding, namespaceBinding: state_580.namespaceBinding, moduleSpecifier: moduleSpecifier_581, forSyntax: node_579.forSyntax }); + + reduceImportNamespace(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('ImportNamespace', { + defaultBinding: state.defaultBinding, + namespaceBinding: state.namespaceBinding, + moduleSpecifier: moduleSpecifier, + forSyntax: node.forSyntax + }); } - reduceExport(node_582, state_583) { - return new _terms2.default("Export", { declaration: state_583.declaration }); + + reduceExport(node, state) { + return new _terms2.default('Export', { + declaration: state.declaration + }); } - reduceExportAllFrom(node_584, state_585) { - let moduleSpecifier_586 = state_585.moduleSpecifier ? state_585.moduleSpecifier.val() : null; - return new _terms2.default("ExportAllFrom", { moduleSpecifier: moduleSpecifier_586 }); + + reduceExportAllFrom(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('ExportAllFrom', { moduleSpecifier: moduleSpecifier }); } - reduceExportFrom(node_587, state_588) { - let moduleSpecifier_589 = state_588.moduleSpecifier ? state_588.moduleSpecifier.val() : null; - return new _terms2.default("ExportFrom", { moduleSpecifier: moduleSpecifier_589, namedExports: state_588.namedExports.toArray() }); + + reduceExportFrom(node, state) { + let moduleSpecifier = state.moduleSpecifier ? state.moduleSpecifier.val() : null; + return new _terms2.default('ExportFrom', { + moduleSpecifier: moduleSpecifier, + namedExports: state.namedExports.toArray() + }); } - reduceExportSpecifier(node_590, state_591) { - let name_592 = state_591.name, - exportedName_593 = state_591.exportedName; - if (name_592 == null) { - name_592 = exportedName_593.resolve(this.context.phase); - exportedName_593 = exportedName_593.val(); + + reduceExportSpecifier(node, state) { + let name = state.name, + exportedName = state.exportedName; + if (name == null) { + name = exportedName.resolve(this.context.phase); + exportedName = exportedName.val(); } else { - name_592 = name_592.resolve(this.context.phase); - exportedName_593 = exportedName_593.val(); + name = name.resolve(this.context.phase); + exportedName = exportedName.val(); } - return new _terms2.default("ExportSpecifier", { name: name_592, exportedName: exportedName_593 }); + return new _terms2.default('ExportSpecifier', { + name: name, exportedName: exportedName + }); } - reduceImportSpecifier(node_594, state_595) { - let name_596 = state_595.name ? state_595.name.resolve(this.context.phase) : null; - return new _terms2.default("ImportSpecifier", { name: name_596, binding: state_595.binding }); + + reduceImportSpecifier(node, state) { + let name = state.name ? state.name.resolve(this.context.phase) : null; + return new _terms2.default('ImportSpecifier', { + name: name, + binding: state.binding + }); } - reduceIdentifierExpression(node_597, state_598) { - return new _terms2.default("IdentifierExpression", { name: node_597.name.resolve(this.context.phase) }); + + reduceIdentifierExpression(node) { + return new _terms2.default("IdentifierExpression", { + name: node.name.resolve(this.context.phase) + }); } - reduceLiteralNumericExpression(node_599, state_600) { - return new _terms2.default("LiteralNumericExpression", { value: node_599.value.val() }); + + reduceLiteralNumericExpression(node) { + return new _terms2.default("LiteralNumericExpression", { + value: node.value.val() + }); } - reduceLiteralBooleanExpression(node_601, state_602) { - return new _terms2.default("LiteralBooleanExpression", { value: node_601.value.val() === "true" }); + + reduceLiteralBooleanExpression(node) { + return new _terms2.default("LiteralBooleanExpression", { + value: node.value.val() === 'true' + }); } - reduceLiteralStringExpression(node_603, state_604) { - return new _terms2.default("LiteralStringExpression", { value: node_603.value.token.str }); + + reduceLiteralStringExpression(node) { + return new _terms2.default("LiteralStringExpression", { + value: node.value.token.str + }); } - reduceCallExpression(node_605, state_606) { - return new _terms2.default("CallExpression", { callee: state_606.callee, arguments: state_606.arguments.toArray() }); + + reduceCallExpression(node, state) { + return new _terms2.default("CallExpression", { + callee: state.callee, + arguments: state.arguments.toArray() + }); } - reduceFunctionBody(node_607, state_608) { - return new _terms2.default("FunctionBody", { directives: state_608.directives.toArray(), statements: state_608.statements.toArray() }); + + reduceFunctionBody(node, state) { + return new _terms2.default("FunctionBody", { + directives: state.directives.toArray(), + statements: state.statements.toArray() + }); } - reduceFormalParameters(node_609, state_610) { - return new _terms2.default("FormalParameters", { items: state_610.items.toArray(), rest: state_610.rest }); + + reduceFormalParameters(node, state) { + return new _terms2.default("FormalParameters", { + items: state.items.toArray(), + rest: state.rest + }); } - reduceBindingIdentifier(node_611, state_612) { - return new _terms2.default("BindingIdentifier", { name: node_611.name.resolve(this.context.phase) }); + + reduceBindingIdentifier(node) { + return new _terms2.default("BindingIdentifier", { + name: node.name.resolve(this.context.phase) + }); } - reduceBinaryExpression(node_613, state_614) { - return new _terms2.default("BinaryExpression", { left: state_614.left, operator: node_613.operator.val(), right: state_614.right }); + + reduceBinaryExpression(node, state) { + return new _terms2.default("BinaryExpression", { + left: state.left, + operator: node.operator.val(), + right: state.right + }); } - reduceObjectExpression(node_615, state_616) { - return new _terms2.default("ObjectExpression", { properties: state_616.properties.toArray() }); + + reduceObjectExpression(node, state) { + return new _terms2.default("ObjectExpression", { + properties: state.properties.toArray() + }); } - reduceVariableDeclaration(node_617, state_618) { - return new _terms2.default("VariableDeclaration", { kind: state_618.kind, declarators: state_618.declarators.toArray() }); + + reduceVariableDeclaration(node, state) { + return new _terms2.default("VariableDeclaration", { + kind: state.kind, + declarators: state.declarators.toArray() + }); } - reduceStaticPropertyName(node_619, state_620) { - return new _terms2.default("StaticPropertyName", { value: node_619.value.val().toString() }); + + reduceStaticPropertyName(node) { + return new _terms2.default("StaticPropertyName", { + value: node.value.val().toString() + }); } - reduceArrayExpression(node_621, state_622) { - return new _terms2.default("ArrayExpression", { elements: state_622.elements.toArray() }); + + reduceArrayExpression(node, state) { + return new _terms2.default("ArrayExpression", { + elements: state.elements.toArray() + }); } - reduceStaticMemberExpression(node_623, state_624) { - return new _terms2.default("StaticMemberExpression", { object: state_624.object, property: state_624.property.val() }); + + reduceStaticMemberExpression(node, state) { + return new _terms2.default("StaticMemberExpression", { + object: state.object, + property: state.property.val() + }); } + } exports.default = ParseReducer; -//# sourceMappingURL=data:application/json;base64,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aUJBQVQsRUFBNEIsRUFBQyxVQUFVLFVBQVUsUUFBVixDQUFtQixPQUFuQixFQUFYLEVBQTVCLENBQVA7QUFDRDtBQUNELCtCQUE2QixRQUE3QixFQUF1QyxTQUF2QyxFQUFrRDtBQUNoRCxXQUFPLG9CQUFTLHdCQUFULEVBQW1DLEVBQUMsUUFBUSxVQUFVLE1BQW5CLEVBQTJCLFVBQVUsVUFBVSxRQUFWLENBQW1CLEdBQW5CLEVBQXJDLEVBQW5DLENBQVA7QUFDRDtBQW5Gb0Q7a0JBQWxDLFkiLCJmaWxlIjoicGFyc2UtcmVkdWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQge0Nsb25lUmVkdWNlcn0gZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlUmVkdWNlciBleHRlbmRzIENsb25lUmVkdWNlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHRfNTczKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XzU3MztcbiAgfVxuICByZWR1Y2VNb2R1bGUobm9kZV81NzQsIHN0YXRlXzU3NSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIk1vZHVsZVwiLCB7ZGlyZWN0aXZlczogc3RhdGVfNTc1LmRpcmVjdGl2ZXMudG9BcnJheSgpLCBpdGVtczogc3RhdGVfNTc1Lml0ZW1zLnRvQXJyYXkoKX0pO1xuICB9XG4gIHJlZHVjZUltcG9ydChub2RlXzU3Niwgc3RhdGVfNTc3KSB7XG4gICAgbGV0IG1vZHVsZVNwZWNpZmllcl81NzggPSBzdGF0ZV81NzcubW9kdWxlU3BlY2lmaWVyID8gc3RhdGVfNTc3Lm1vZHVsZVNwZWNpZmllci52YWwoKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiSW1wb3J0XCIsIHtkZWZhdWx0QmluZGluZzogc3RhdGVfNTc3LmRlZmF1bHRCaW5kaW5nLCBuYW1lZEltcG9ydHM6IHN0YXRlXzU3Ny5uYW1lZEltcG9ydHMudG9BcnJheSgpLCBtb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81NzgsIGZvclN5bnRheDogbm9kZV81NzYuZm9yU3ludGF4fSk7XG4gIH1cbiAgcmVkdWNlSW1wb3J0TmFtZXNwYWNlKG5vZGVfNTc5LCBzdGF0ZV81ODApIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyXzU4MSA9IHN0YXRlXzU4MC5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZV81ODAubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnROYW1lc3BhY2VcIiwge2RlZmF1bHRCaW5kaW5nOiBzdGF0ZV81ODAuZGVmYXVsdEJpbmRpbmcsIG5hbWVzcGFjZUJpbmRpbmc6IHN0YXRlXzU4MC5uYW1lc3BhY2VCaW5kaW5nLCBtb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81ODEsIGZvclN5bnRheDogbm9kZV81NzkuZm9yU3ludGF4fSk7XG4gIH1cbiAgcmVkdWNlRXhwb3J0KG5vZGVfNTgyLCBzdGF0ZV81ODMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiBzdGF0ZV81ODMuZGVjbGFyYXRpb259KTtcbiAgfVxuICByZWR1Y2VFeHBvcnRBbGxGcm9tKG5vZGVfNTg0LCBzdGF0ZV81ODUpIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyXzU4NiA9IHN0YXRlXzU4NS5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZV81ODUubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRBbGxGcm9tXCIsIHttb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81ODZ9KTtcbiAgfVxuICByZWR1Y2VFeHBvcnRGcm9tKG5vZGVfNTg3LCBzdGF0ZV81ODgpIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyXzU4OSA9IHN0YXRlXzU4OC5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZV81ODgubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRGcm9tXCIsIHttb2R1bGVTcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcl81ODksIG5hbWVkRXhwb3J0czogc3RhdGVfNTg4Lm5hbWVkRXhwb3J0cy50b0FycmF5KCl9KTtcbiAgfVxuICByZWR1Y2VFeHBvcnRTcGVjaWZpZXIobm9kZV81OTAsIHN0YXRlXzU5MSkge1xuICAgIGxldCBuYW1lXzU5MiA9IHN0YXRlXzU5MS5uYW1lLCBleHBvcnRlZE5hbWVfNTkzID0gc3RhdGVfNTkxLmV4cG9ydGVkTmFtZTtcbiAgICBpZiAobmFtZV81OTIgPT0gbnVsbCkge1xuICAgICAgbmFtZV81OTIgPSBleHBvcnRlZE5hbWVfNTkzLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgIGV4cG9ydGVkTmFtZV81OTMgPSBleHBvcnRlZE5hbWVfNTkzLnZhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lXzU5MiA9IG5hbWVfNTkyLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgIGV4cG9ydGVkTmFtZV81OTMgPSBleHBvcnRlZE5hbWVfNTkzLnZhbCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRTcGVjaWZpZXJcIiwge25hbWU6IG5hbWVfNTkyLCBleHBvcnRlZE5hbWU6IGV4cG9ydGVkTmFtZV81OTN9KTtcbiAgfVxuICByZWR1Y2VJbXBvcnRTcGVjaWZpZXIobm9kZV81OTQsIHN0YXRlXzU5NSkge1xuICAgIGxldCBuYW1lXzU5NiA9IHN0YXRlXzU5NS5uYW1lID8gc3RhdGVfNTk1Lm5hbWUucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJbXBvcnRTcGVjaWZpZXJcIiwge25hbWU6IG5hbWVfNTk2LCBiaW5kaW5nOiBzdGF0ZV81OTUuYmluZGluZ30pO1xuICB9XG4gIHJlZHVjZUlkZW50aWZpZXJFeHByZXNzaW9uKG5vZGVfNTk3LCBzdGF0ZV81OTgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7bmFtZTogbm9kZV81OTcubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSl9KTtcbiAgfVxuICByZWR1Y2VMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24obm9kZV81OTksIHN0YXRlXzYwMCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwiLCB7dmFsdWU6IG5vZGVfNTk5LnZhbHVlLnZhbCgpfSk7XG4gIH1cbiAgcmVkdWNlTGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uKG5vZGVfNjAxLCBzdGF0ZV82MDIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIiwge3ZhbHVlOiBub2RlXzYwMS52YWx1ZS52YWwoKSA9PT0gXCJ0cnVlXCJ9KTtcbiAgfVxuICByZWR1Y2VMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbihub2RlXzYwMywgc3RhdGVfNjA0KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIiwge3ZhbHVlOiBub2RlXzYwMy52YWx1ZS50b2tlbi5zdHJ9KTtcbiAgfVxuICByZWR1Y2VDYWxsRXhwcmVzc2lvbihub2RlXzYwNSwgc3RhdGVfNjA2KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ2FsbEV4cHJlc3Npb25cIiwge2NhbGxlZTogc3RhdGVfNjA2LmNhbGxlZSwgYXJndW1lbnRzOiBzdGF0ZV82MDYuYXJndW1lbnRzLnRvQXJyYXkoKX0pO1xuICB9XG4gIHJlZHVjZUZ1bmN0aW9uQm9keShub2RlXzYwNywgc3RhdGVfNjA4KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRnVuY3Rpb25Cb2R5XCIsIHtkaXJlY3RpdmVzOiBzdGF0ZV82MDguZGlyZWN0aXZlcy50b0FycmF5KCksIHN0YXRlbWVudHM6IHN0YXRlXzYwOC5zdGF0ZW1lbnRzLnRvQXJyYXkoKX0pO1xuICB9XG4gIHJlZHVjZUZvcm1hbFBhcmFtZXRlcnMobm9kZV82MDksIHN0YXRlXzYxMCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvcm1hbFBhcmFtZXRlcnNcIiwge2l0ZW1zOiBzdGF0ZV82MTAuaXRlbXMudG9BcnJheSgpLCByZXN0OiBzdGF0ZV82MTAucmVzdH0pO1xuICB9XG4gIHJlZHVjZUJpbmRpbmdJZGVudGlmaWVyKG5vZGVfNjExLCBzdGF0ZV82MTIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5kaW5nSWRlbnRpZmllclwiLCB7bmFtZTogbm9kZV82MTEubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSl9KTtcbiAgfVxuICByZWR1Y2VCaW5hcnlFeHByZXNzaW9uKG5vZGVfNjEzLCBzdGF0ZV82MTQpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCaW5hcnlFeHByZXNzaW9uXCIsIHtsZWZ0OiBzdGF0ZV82MTQubGVmdCwgb3BlcmF0b3I6IG5vZGVfNjEzLm9wZXJhdG9yLnZhbCgpLCByaWdodDogc3RhdGVfNjE0LnJpZ2h0fSk7XG4gIH1cbiAgcmVkdWNlT2JqZWN0RXhwcmVzc2lvbihub2RlXzYxNSwgc3RhdGVfNjE2KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7cHJvcGVydGllczogc3RhdGVfNjE2LnByb3BlcnRpZXMudG9BcnJheSgpfSk7XG4gIH1cbiAgcmVkdWNlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlXzYxNywgc3RhdGVfNjE4KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCB7a2luZDogc3RhdGVfNjE4LmtpbmQsIGRlY2xhcmF0b3JzOiBzdGF0ZV82MTguZGVjbGFyYXRvcnMudG9BcnJheSgpfSk7XG4gIH1cbiAgcmVkdWNlU3RhdGljUHJvcGVydHlOYW1lKG5vZGVfNjE5LCBzdGF0ZV82MjApIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTdGF0aWNQcm9wZXJ0eU5hbWVcIiwge3ZhbHVlOiBub2RlXzYxOS52YWx1ZS52YWwoKS50b1N0cmluZygpfSk7XG4gIH1cbiAgcmVkdWNlQXJyYXlFeHByZXNzaW9uKG5vZGVfNjIxLCBzdGF0ZV82MjIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUV4cHJlc3Npb25cIiwge2VsZW1lbnRzOiBzdGF0ZV82MjIuZWxlbWVudHMudG9BcnJheSgpfSk7XG4gIH1cbiAgcmVkdWNlU3RhdGljTWVtYmVyRXhwcmVzc2lvbihub2RlXzYyMywgc3RhdGVfNjI0KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7b2JqZWN0OiBzdGF0ZV82MjQub2JqZWN0LCBwcm9wZXJ0eTogc3RhdGVfNjI0LnByb3BlcnR5LnZhbCgpfSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJzZS1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFFZSxNQUFNLFlBQU4sb0NBQXdDO0FBQ3JELGNBQVksT0FBWixFQUFxQjtBQUNuQjtBQUNBLFNBQUssT0FBTCxHQUFlLE9BQWY7QUFDRDtBQUNELGVBQWEsSUFBYixFQUFtQixLQUFuQixFQUEwQjtBQUN4QixXQUFPLG9CQUFTLFFBQVQsRUFBbUI7QUFDeEIsa0JBQVksTUFBTSxVQUFOLENBQWlCLE9BQWpCLEVBRFk7QUFFeEIsYUFBTyxNQUFNLEtBQU4sQ0FBWSxPQUFaO0FBRmlCLEtBQW5CLENBQVA7QUFJRDs7QUFFRCxlQUFhLElBQWIsRUFBbUIsS0FBbkIsRUFBMEI7QUFDeEIsUUFBSSxrQkFBa0IsTUFBTSxlQUFOLEdBQXdCLE1BQU0sZUFBTixDQUFzQixHQUF0QixFQUF4QixHQUFzRCxJQUE1RTtBQUNBLFdBQU8sb0JBQVMsUUFBVCxFQUFtQjtBQUN4QixzQkFBZ0IsTUFBTSxjQURFO0FBRXhCLG9CQUFjLE1BQU0sWUFBTixDQUFtQixPQUFuQixFQUZVO0FBR3hCLHNDQUh3QjtBQUl4QixpQkFBVyxLQUFLO0FBSlEsS0FBbkIsQ0FBUDtBQU1EOztBQUVELHdCQUFzQixJQUF0QixFQUE0QixLQUE1QixFQUFtQztBQUNqQyxRQUFJLGtCQUFrQixNQUFNLGVBQU4sR0FBd0IsTUFBTSxlQUFOLENBQXNCLEdBQXRCLEVBQXhCLEdBQXNELElBQTVFO0FBQ0EsV0FBTyxvQkFBUyxpQkFBVCxFQUE0QjtBQUNqQyxzQkFBZ0IsTUFBTSxjQURXO0FBRWpDLHdCQUFrQixNQUFNLGdCQUZTO0FBR2pDLHNDQUhpQztBQUlqQyxpQkFBVyxLQUFLO0FBSmlCLEtBQTVCLENBQVA7QUFNRDs7QUFFRCxlQUFhLElBQWIsRUFBbUIsS0FBbkIsRUFBMEI7QUFDeEIsV0FBTyxvQkFBUyxRQUFULEVBQW1CO0FBQ3hCLG1CQUFhLE1BQU07QUFESyxLQUFuQixDQUFQO0FBR0Q7O0FBRUQsc0JBQW9CLElBQXBCLEVBQTBCLEtBQTFCLEVBQWlDO0FBQy9CLFFBQUksa0JBQWtCLE1BQU0sZUFBTixHQUF3QixNQUFNLGVBQU4sQ0FBc0IsR0FBdEIsRUFBeEIsR0FBc0QsSUFBNUU7QUFDQSxXQUFPLG9CQUFTLGVBQVQsRUFBMEIsRUFBRSxnQ0FBRixFQUExQixDQUFQO0FBQ0Q7O0FBRUQsbUJBQWlCLElBQWpCLEVBQXVCLEtBQXZCLEVBQThCO0FBQzVCLFFBQUksa0JBQWtCLE1BQU0sZUFBTixHQUF3QixNQUFNLGVBQU4sQ0FBc0IsR0FBdEIsRUFBeEIsR0FBc0QsSUFBNUU7QUFDQSxXQUFPLG9CQUFTLFlBQVQsRUFBdUI7QUFDNUIsc0NBRDRCO0FBRTVCLG9CQUFjLE1BQU0sWUFBTixDQUFtQixPQUFuQjtBQUZjLEtBQXZCLENBQVA7QUFJRDs7QUFFRCx3QkFBc0IsSUFBdEIsRUFBNEIsS0FBNUIsRUFBbUM7QUFDakMsUUFBSSxPQUFPLE1BQU0sSUFBakI7QUFBQSxRQUF1QixlQUFlLE1BQU0sWUFBNUM7QUFDQSxRQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixhQUFPLGFBQWEsT0FBYixDQUFxQixLQUFLLE9BQUwsQ0FBYSxLQUFsQyxDQUFQO0FBQ0EscUJBQWUsYUFBYSxHQUFiLEVBQWY7QUFDRCxLQUhELE1BR087QUFDTCxhQUFPLEtBQUssT0FBTCxDQUFhLEtBQUssT0FBTCxDQUFhLEtBQTFCLENBQVA7QUFDQSxxQkFBZSxhQUFhLEdBQWIsRUFBZjtBQUNEO0FBQ0QsV0FBTyxvQkFBUyxpQkFBVCxFQUE0QjtBQUNqQyxnQkFEaUMsRUFDM0I7QUFEMkIsS0FBNUIsQ0FBUDtBQUdEOztBQUVELHdCQUFzQixJQUF0QixFQUE0QixLQUE1QixFQUFtQztBQUNqQyxRQUFJLE9BQU8sTUFBTSxJQUFOLEdBQWEsTUFBTSxJQUFOLENBQVcsT0FBWCxDQUFtQixLQUFLLE9BQUwsQ0FBYSxLQUFoQyxDQUFiLEdBQXNELElBQWpFO0FBQ0EsV0FBTyxvQkFBUyxpQkFBVCxFQUE0QjtBQUNqQyxnQkFEaUM7QUFFakMsZUFBUyxNQUFNO0FBRmtCLEtBQTVCLENBQVA7QUFJRDs7QUFFRCw2QkFBMkIsSUFBM0IsRUFBaUM7QUFDL0IsV0FBTyxvQkFBUyxzQkFBVCxFQUFpQztBQUN0QyxZQUFNLEtBQUssSUFBTCxDQUFVLE9BQVYsQ0FBa0IsS0FBSyxPQUFMLENBQWEsS0FBL0I7QUFEZ0MsS0FBakMsQ0FBUDtBQUdEOztBQUVELGlDQUErQixJQUEvQixFQUFxQztBQUNuQyxXQUFPLG9CQUFTLDBCQUFULEVBQXFDO0FBQzFDLGFBQU8sS0FBSyxLQUFMLENBQVcsR0FBWDtBQURtQyxLQUFyQyxDQUFQO0FBR0Q7O0FBRUQsaUNBQStCLElBQS9CLEVBQXFDO0FBQ25DLFdBQU8sb0JBQVMsMEJBQVQsRUFBcUM7QUFDMUMsYUFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLE9BQXFCO0FBRGMsS0FBckMsQ0FBUDtBQUdEOztBQUVELGdDQUE4QixJQUE5QixFQUFvQztBQUNsQyxXQUFPLG9CQUFTLHlCQUFULEVBQW9DO0FBQ3pDLGFBQU8sS0FBSyxLQUFMLENBQVcsS0FBWCxDQUFpQjtBQURpQixLQUFwQyxDQUFQO0FBR0Q7O0FBRUQsdUJBQXFCLElBQXJCLEVBQTJCLEtBQTNCLEVBQWtDO0FBQ2hDLFdBQU8sb0JBQVMsZ0JBQVQsRUFBMkI7QUFDaEMsY0FBUSxNQUFNLE1BRGtCO0FBRWhDLGlCQUFXLE1BQU0sU0FBTixDQUFnQixPQUFoQjtBQUZxQixLQUEzQixDQUFQO0FBSUQ7O0FBRUQscUJBQW1CLElBQW5CLEVBQXlCLEtBQXpCLEVBQWdDO0FBQzlCLFdBQU8sb0JBQVMsY0FBVCxFQUF5QjtBQUM5QixrQkFBWSxNQUFNLFVBQU4sQ0FBaUIsT0FBakIsRUFEa0I7QUFFOUIsa0JBQVksTUFBTSxVQUFOLENBQWlCLE9BQWpCO0FBRmtCLEtBQXpCLENBQVA7QUFJRDs7QUFFRCx5QkFBdUIsSUFBdkIsRUFBNkIsS0FBN0IsRUFBb0M7QUFDbEMsV0FBTyxvQkFBUyxrQkFBVCxFQUE2QjtBQUNsQyxhQUFPLE1BQU0sS0FBTixDQUFZLE9BQVosRUFEMkI7QUFFbEMsWUFBTSxNQUFNO0FBRnNCLEtBQTdCLENBQVA7QUFJRDs7QUFFRCwwQkFBd0IsSUFBeEIsRUFBOEI7QUFDNUIsV0FBTyxvQkFBUyxtQkFBVCxFQUE4QjtBQUNuQyxZQUFNLEtBQUssSUFBTCxDQUFVLE9BQVYsQ0FBa0IsS0FBSyxPQUFMLENBQWEsS0FBL0I7QUFENkIsS0FBOUIsQ0FBUDtBQUdEOztBQUVELHlCQUF1QixJQUF2QixFQUE2QixLQUE3QixFQUFvQztBQUNsQyxXQUFPLG9CQUFTLGtCQUFULEVBQTZCO0FBQ2xDLFlBQU0sTUFBTSxJQURzQjtBQUVsQyxnQkFBVSxLQUFLLFFBQUwsQ0FBYyxHQUFkLEVBRndCO0FBR2xDLGFBQU8sTUFBTTtBQUhxQixLQUE3QixDQUFQO0FBS0Q7O0FBRUQseUJBQXVCLElBQXZCLEVBQTZCLEtBQTdCLEVBQW9DO0FBQ2xDLFdBQU8sb0JBQVMsa0JBQVQsRUFBNkI7QUFDbEMsa0JBQVksTUFBTSxVQUFOLENBQWlCLE9BQWpCO0FBRHNCLEtBQTdCLENBQVA7QUFHRDs7QUFFRCw0QkFBMEIsSUFBMUIsRUFBZ0MsS0FBaEMsRUFBdUM7QUFDckMsV0FBTyxvQkFBUyxxQkFBVCxFQUFnQztBQUNyQyxZQUFNLE1BQU0sSUFEeUI7QUFFckMsbUJBQWEsTUFBTSxXQUFOLENBQWtCLE9BQWxCO0FBRndCLEtBQWhDLENBQVA7QUFJRDs7QUFFRCwyQkFBeUIsSUFBekIsRUFBK0I7QUFDN0IsV0FBTyxvQkFBUyxvQkFBVCxFQUErQjtBQUNwQyxhQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsR0FBaUIsUUFBakI7QUFENkIsS0FBL0IsQ0FBUDtBQUdEOztBQUVELHdCQUFzQixJQUF0QixFQUE0QixLQUE1QixFQUFtQztBQUNqQyxXQUFPLG9CQUFTLGlCQUFULEVBQTRCO0FBQ2pDLGdCQUFVLE1BQU0sUUFBTixDQUFlLE9BQWY7QUFEdUIsS0FBNUIsQ0FBUDtBQUdEOztBQUVELCtCQUE2QixJQUE3QixFQUFtQyxLQUFuQyxFQUEwQztBQUN4QyxXQUFPLG9CQUFTLHdCQUFULEVBQW1DO0FBQ3hDLGNBQVEsTUFBTSxNQUQwQjtBQUV4QyxnQkFBVSxNQUFNLFFBQU4sQ0FBZSxHQUFmO0FBRjhCLEtBQW5DLENBQVA7QUFJRDs7QUFsS29EO2tCQUFsQyxZIiwiZmlsZSI6InBhcnNlLXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVybSBmcm9tIFwiLi90ZXJtc1wiO1xuaW1wb3J0IHsgQ2xvbmVSZWR1Y2VyIH0gZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc2VSZWR1Y2VyIGV4dGVuZHMgQ2xvbmVSZWR1Y2VyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuICByZWR1Y2VNb2R1bGUobm9kZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJNb2R1bGVcIiwge1xuICAgICAgZGlyZWN0aXZlczogc3RhdGUuZGlyZWN0aXZlcy50b0FycmF5KCksXG4gICAgICBpdGVtczogc3RhdGUuaXRlbXMudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VJbXBvcnQobm9kZSwgc3RhdGUpIHtcbiAgICBsZXQgbW9kdWxlU3BlY2lmaWVyID0gc3RhdGUubW9kdWxlU3BlY2lmaWVyID8gc3RhdGUubW9kdWxlU3BlY2lmaWVyLnZhbCgpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0ltcG9ydCcsIHtcbiAgICAgIGRlZmF1bHRCaW5kaW5nOiBzdGF0ZS5kZWZhdWx0QmluZGluZyxcbiAgICAgIG5hbWVkSW1wb3J0czogc3RhdGUubmFtZWRJbXBvcnRzLnRvQXJyYXkoKSxcbiAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIGZvclN5bnRheDogbm9kZS5mb3JTeW50YXhcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUltcG9ydE5hbWVzcGFjZShub2RlLCBzdGF0ZSkge1xuICAgIGxldCBtb2R1bGVTcGVjaWZpZXIgPSBzdGF0ZS5tb2R1bGVTcGVjaWZpZXIgPyBzdGF0ZS5tb2R1bGVTcGVjaWZpZXIudmFsKCkgOiBudWxsO1xuICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0TmFtZXNwYWNlJywge1xuICAgICAgZGVmYXVsdEJpbmRpbmc6IHN0YXRlLmRlZmF1bHRCaW5kaW5nLFxuICAgICAgbmFtZXNwYWNlQmluZGluZzogc3RhdGUubmFtZXNwYWNlQmluZGluZyxcbiAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIGZvclN5bnRheDogbm9kZS5mb3JTeW50YXhcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUV4cG9ydChub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0Jywge1xuICAgICAgZGVjbGFyYXRpb246IHN0YXRlLmRlY2xhcmF0aW9uXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VFeHBvcnRBbGxGcm9tKG5vZGUsIHN0YXRlKSB7XG4gICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHN0YXRlLm1vZHVsZVNwZWNpZmllciA/IHN0YXRlLm1vZHVsZVNwZWNpZmllci52YWwoKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnRBbGxGcm9tJywgeyBtb2R1bGVTcGVjaWZpZXIgfSk7XG4gIH1cblxuICByZWR1Y2VFeHBvcnRGcm9tKG5vZGUsIHN0YXRlKSB7XG4gICAgbGV0IG1vZHVsZVNwZWNpZmllciA9IHN0YXRlLm1vZHVsZVNwZWNpZmllciA/IHN0YXRlLm1vZHVsZVNwZWNpZmllci52YWwoKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnRGcm9tJywge1xuICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgbmFtZWRFeHBvcnRzOiBzdGF0ZS5uYW1lZEV4cG9ydHMudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VFeHBvcnRTcGVjaWZpZXIobm9kZSwgc3RhdGUpIHtcbiAgICBsZXQgbmFtZSA9IHN0YXRlLm5hbWUsIGV4cG9ydGVkTmFtZSA9IHN0YXRlLmV4cG9ydGVkTmFtZTtcbiAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICBuYW1lID0gZXhwb3J0ZWROYW1lLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgIGV4cG9ydGVkTmFtZSA9IGV4cG9ydGVkTmFtZS52YWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgZXhwb3J0ZWROYW1lID0gZXhwb3J0ZWROYW1lLnZhbCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oJ0V4cG9ydFNwZWNpZmllcicsIHtcbiAgICAgIG5hbWUsIGV4cG9ydGVkTmFtZVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlSW1wb3J0U3BlY2lmaWVyKG5vZGUsIHN0YXRlKSB7XG4gICAgbGV0IG5hbWUgPSBzdGF0ZS5uYW1lID8gc3RhdGUubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkgOiBudWxsO1xuICAgIHJldHVybiBuZXcgVGVybSgnSW1wb3J0U3BlY2lmaWVyJywge1xuICAgICAgbmFtZSxcbiAgICAgIGJpbmRpbmc6IHN0YXRlLmJpbmRpbmdcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUlkZW50aWZpZXJFeHByZXNzaW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBuYW1lOiBub2RlLm5hbWUucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24obm9kZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwiLCB7XG4gICAgICB2YWx1ZTogbm9kZS52YWx1ZS52YWwoKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlTGl0ZXJhbEJvb2xlYW5FeHByZXNzaW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIiwge1xuICAgICAgdmFsdWU6IG5vZGUudmFsdWUudmFsKCkgPT09ICd0cnVlJ1xuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb24obm9kZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiBub2RlLnZhbHVlLnRva2VuLnN0clxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlQ2FsbEV4cHJlc3Npb24obm9kZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYWxsRXhwcmVzc2lvblwiLCB7XG4gICAgICBjYWxsZWU6IHN0YXRlLmNhbGxlZSxcbiAgICAgIGFyZ3VtZW50czogc3RhdGUuYXJndW1lbnRzLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlRnVuY3Rpb25Cb2R5KG5vZGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRnVuY3Rpb25Cb2R5XCIsIHtcbiAgICAgIGRpcmVjdGl2ZXM6IHN0YXRlLmRpcmVjdGl2ZXMudG9BcnJheSgpLFxuICAgICAgc3RhdGVtZW50czogc3RhdGUuc3RhdGVtZW50cy50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUZvcm1hbFBhcmFtZXRlcnMobm9kZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGb3JtYWxQYXJhbWV0ZXJzXCIsIHtcbiAgICAgIGl0ZW1zOiBzdGF0ZS5pdGVtcy50b0FycmF5KCksXG4gICAgICByZXN0OiBzdGF0ZS5yZXN0XG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VCaW5kaW5nSWRlbnRpZmllcihub2RlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluZGluZ0lkZW50aWZpZXJcIiwge1xuICAgICAgbmFtZTogbm9kZS5uYW1lLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlQmluYXJ5RXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge1xuICAgICAgbGVmdDogc3RhdGUubGVmdCxcbiAgICAgIG9wZXJhdG9yOiBub2RlLm9wZXJhdG9yLnZhbCgpLFxuICAgICAgcmlnaHQ6IHN0YXRlLnJpZ2h0XG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VPYmplY3RFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7XG4gICAgICBwcm9wZXJ0aWVzOiBzdGF0ZS5wcm9wZXJ0aWVzLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgcmVkdWNlVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiwge1xuICAgICAga2luZDogc3RhdGUua2luZCxcbiAgICAgIGRlY2xhcmF0b3JzOiBzdGF0ZS5kZWNsYXJhdG9ycy50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZVN0YXRpY1Byb3BlcnR5TmFtZShub2RlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljUHJvcGVydHlOYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBub2RlLnZhbHVlLnZhbCgpLnRvU3RyaW5nKClcbiAgICB9KTtcbiAgfVxuXG4gIHJlZHVjZUFycmF5RXhwcmVzc2lvbihub2RlLCBzdGF0ZSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkFycmF5RXhwcmVzc2lvblwiLCB7XG4gICAgICBlbGVtZW50czogc3RhdGUuZWxlbWVudHMudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICByZWR1Y2VTdGF0aWNNZW1iZXJFeHByZXNzaW9uKG5vZGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBvYmplY3Q6IHN0YXRlLm9iamVjdCxcbiAgICAgIHByb3BlcnR5OiBzdGF0ZS5wcm9wZXJ0eS52YWwoKVxuICAgIH0pO1xuICB9XG5cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/scope.js b/dist/scope.js index 00b53e61..0c4d7784 100644 --- a/dist/scope.js +++ b/dist/scope.js @@ -3,23 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.Scope = exports.freshScope = undefined; - -var _errors = require("./errors"); +exports.freshScope = freshScope; +exports.Scope = Scope; var _symbol = require("./symbol"); -let scopeIndex_625 = 0; -function freshScope_626() { - let name_628 = arguments.length <= 0 || arguments[0] === undefined ? "scope" : arguments[0]; +let scopeIndex = 0; + +function freshScope() { + let name = arguments.length <= 0 || arguments[0] === undefined ? "scope" : arguments[0]; - scopeIndex_625++; - return (0, _symbol.Symbol)(name_628 + "_" + scopeIndex_625); + scopeIndex++; + return (0, _symbol.Symbol)(name + "_" + scopeIndex); } -; -function Scope_627(name_629) { - return (0, _symbol.Symbol)(name_629); + +function Scope(name) { + return (0, _symbol.Symbol)(name); } -exports.freshScope = freshScope_626; -exports.Scope = Scope_627; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3Njb3BlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQSxJQUFJLGlCQUFpQixDQUFyQjtBQUNBLFNBQVMsY0FBVCxHQUE0QztBQUFBLE1BQXBCLFFBQW9CLHlEQUFULE9BQVM7O0FBQzFDO0FBQ0EsU0FBTyxvQkFBTyxXQUFXLEdBQVgsR0FBaUIsY0FBeEIsQ0FBUDtBQUNEO0FBQ0Q7QUFDQSxTQUFTLFNBQVQsQ0FBbUIsUUFBbkIsRUFBNkI7QUFDM0IsU0FBTyxvQkFBTyxRQUFQLENBQVA7QUFDRDtRQUN5QixVLEdBQWxCLGM7UUFDYSxLLEdBQWIsUyIsImZpbGUiOiJzY29wZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXhwZWN0LCBhc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHtTeW1ib2wsIGdlbnN5bX0gZnJvbSBcIi4vc3ltYm9sXCI7XG5sZXQgc2NvcGVJbmRleF82MjUgPSAwO1xuZnVuY3Rpb24gZnJlc2hTY29wZV82MjYobmFtZV82MjggPSBcInNjb3BlXCIpIHtcbiAgc2NvcGVJbmRleF82MjUrKztcbiAgcmV0dXJuIFN5bWJvbChuYW1lXzYyOCArIFwiX1wiICsgc2NvcGVJbmRleF82MjUpO1xufVxuO1xuZnVuY3Rpb24gU2NvcGVfNjI3KG5hbWVfNjI5KSB7XG4gIHJldHVybiBTeW1ib2wobmFtZV82MjkpO1xufVxuZXhwb3J0IHtmcmVzaFNjb3BlXzYyNiBhcyBmcmVzaFNjb3BlfTtcbmV4cG9ydCB7U2NvcGVfNjI3IGFzIFNjb3BlfSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY29wZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQUlnQixVLEdBQUEsVTtRQUtBLEssR0FBQSxLOztBQVRoQjs7QUFFQSxJQUFJLGFBQWEsQ0FBakI7O0FBRU8sU0FBUyxVQUFULEdBQW9DO0FBQUEsTUFBaEIsSUFBZ0IseURBQVQsT0FBUzs7QUFDekM7QUFDQSxTQUFPLG9CQUFPLE9BQU8sR0FBUCxHQUFhLFVBQXBCLENBQVA7QUFDRDs7QUFFTSxTQUFTLEtBQVQsQ0FBZSxJQUFmLEVBQXFCO0FBQzFCLFNBQU8sb0JBQU8sSUFBUCxDQUFQO0FBQ0QiLCJmaWxlIjoic2NvcGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTeW1ib2wgfSBmcm9tIFwiLi9zeW1ib2xcIjtcblxubGV0IHNjb3BlSW5kZXggPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZnJlc2hTY29wZShuYW1lID0gXCJzY29wZVwiKSB7XG4gIHNjb3BlSW5kZXgrKztcbiAgcmV0dXJuIFN5bWJvbChuYW1lICsgXCJfXCIgKyBzY29wZUluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNjb3BlKG5hbWUpIHtcbiAgcmV0dXJuIFN5bWJvbChuYW1lKTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/serializer.js b/dist/serializer.js index 3a993467..b22de225 100644 --- a/dist/serializer.js +++ b/dist/serializer.js @@ -21,51 +21,88 @@ var _tokenizer = require("shift-parser/dist/tokenizer"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -let typeMap_630 = [_tokenizer.TokenType.STRING, _tokenizer.TokenType.EOS, _tokenizer.TokenType.LPAREN, _tokenizer.TokenType.RPAREN, _tokenizer.TokenType.LBRACK, _tokenizer.TokenType.RBRACK, _tokenizer.TokenType.LBRACE, _tokenizer.TokenType.RBRACE, _tokenizer.TokenType.COLON, _tokenizer.TokenType.SEMICOLON, _tokenizer.TokenType.PERIOD, _tokenizer.TokenType.ELLIPSIS, _tokenizer.TokenType.ARROW, _tokenizer.TokenType.CONDITIONAL, _tokenizer.TokenType.INC, _tokenizer.TokenType.DEC, _tokenizer.TokenType.ASSIGN, _tokenizer.TokenType.ASSIGN_BIT_OR, _tokenizer.TokenType.ASSIGN_BIT_XOR, _tokenizer.TokenType.ASSIGN_BIT_AND, _tokenizer.TokenType.ASSIGN_SHL, _tokenizer.TokenType.ASSIGN_SHR, _tokenizer.TokenType.ASSIGN_SHR_UNSIGNED, _tokenizer.TokenType.ASSIGN_ADD, _tokenizer.TokenType.ASSIGN_SUB, _tokenizer.TokenType.ASSIGN_MUL, _tokenizer.TokenType.ASSIGN_DIV, _tokenizer.TokenType.ASSIGN_MOD, _tokenizer.TokenType.COMMA, _tokenizer.TokenType.OR, _tokenizer.TokenType.AND, _tokenizer.TokenType.BIT_OR, _tokenizer.TokenType.BIT_XOR, _tokenizer.TokenType.BIT_AND, _tokenizer.TokenType.SHL, _tokenizer.TokenType.SHR, _tokenizer.TokenType.SHR_UNSIGNED, _tokenizer.TokenType.ADD, _tokenizer.TokenType.SUB, _tokenizer.TokenType.MUL, _tokenizer.TokenType.DIV, _tokenizer.TokenType.MOD, _tokenizer.TokenType.EQ, _tokenizer.TokenType.NE, _tokenizer.TokenType.EQ_STRICT, _tokenizer.TokenType.NE_STRICT, _tokenizer.TokenType.LT, _tokenizer.TokenType.GT, _tokenizer.TokenType.LTE, _tokenizer.TokenType.GTE, _tokenizer.TokenType.INSTANCEOF, _tokenizer.TokenType.IN, _tokenizer.TokenType.NOT, _tokenizer.TokenType.BIT_NOT, _tokenizer.TokenType.AWAIT, _tokenizer.TokenType.DELETE, _tokenizer.TokenType.TYPEOF, _tokenizer.TokenType.VOID, _tokenizer.TokenType.BREAK, _tokenizer.TokenType.CASE, _tokenizer.TokenType.CATCH, _tokenizer.TokenType.CLASS, _tokenizer.TokenType.CONTINUE, _tokenizer.TokenType.DEBUGGER, _tokenizer.TokenType.DEFAULT, _tokenizer.TokenType.DO, _tokenizer.TokenType.ELSE, _tokenizer.TokenType.EXPORT, _tokenizer.TokenType.EXTENDS, _tokenizer.TokenType.FINALLY, _tokenizer.TokenType.FOR, _tokenizer.TokenType.FUNCTION, _tokenizer.TokenType.IF, _tokenizer.TokenType.IMPORT, _tokenizer.TokenType.LET, _tokenizer.TokenType.NEW, _tokenizer.TokenType.RETURN, _tokenizer.TokenType.SUPER, _tokenizer.TokenType.SWITCH, _tokenizer.TokenType.THIS, _tokenizer.TokenType.THROW, _tokenizer.TokenType.TRY, _tokenizer.TokenType.VAR, _tokenizer.TokenType.WHILE, _tokenizer.TokenType.WITH, _tokenizer.TokenType.NULL, _tokenizer.TokenType.TRUE, _tokenizer.TokenType.FALSE, _tokenizer.TokenType.YIELD, _tokenizer.TokenType.NUMBER, _tokenizer.TokenType.STRING, _tokenizer.TokenType.REGEXP, _tokenizer.TokenType.IDENTIFIER, _tokenizer.TokenType.CONST, _tokenizer.TokenType.TEMPLATE, _tokenizer.TokenType.ILLEGAL]; -let ListHandler_631 = _transitJs2.default.makeWriteHandler({ tag: () => "array", rep: v_637 => v_637 }); -let MapHandler_632 = _transitJs2.default.makeWriteHandler({ tag: function tag(v_638) { +let typeMap = [_tokenizer.TokenType.STRING, _tokenizer.TokenType.EOS, _tokenizer.TokenType.LPAREN, _tokenizer.TokenType.RPAREN, _tokenizer.TokenType.LBRACK, _tokenizer.TokenType.RBRACK, _tokenizer.TokenType.LBRACE, _tokenizer.TokenType.RBRACE, _tokenizer.TokenType.COLON, _tokenizer.TokenType.SEMICOLON, _tokenizer.TokenType.PERIOD, _tokenizer.TokenType.ELLIPSIS, _tokenizer.TokenType.ARROW, _tokenizer.TokenType.CONDITIONAL, _tokenizer.TokenType.INC, _tokenizer.TokenType.DEC, _tokenizer.TokenType.ASSIGN, _tokenizer.TokenType.ASSIGN_BIT_OR, _tokenizer.TokenType.ASSIGN_BIT_XOR, _tokenizer.TokenType.ASSIGN_BIT_AND, _tokenizer.TokenType.ASSIGN_SHL, _tokenizer.TokenType.ASSIGN_SHR, _tokenizer.TokenType.ASSIGN_SHR_UNSIGNED, _tokenizer.TokenType.ASSIGN_ADD, _tokenizer.TokenType.ASSIGN_SUB, _tokenizer.TokenType.ASSIGN_MUL, _tokenizer.TokenType.ASSIGN_DIV, _tokenizer.TokenType.ASSIGN_MOD, _tokenizer.TokenType.COMMA, _tokenizer.TokenType.OR, _tokenizer.TokenType.AND, _tokenizer.TokenType.BIT_OR, _tokenizer.TokenType.BIT_XOR, _tokenizer.TokenType.BIT_AND, _tokenizer.TokenType.SHL, _tokenizer.TokenType.SHR, _tokenizer.TokenType.SHR_UNSIGNED, _tokenizer.TokenType.ADD, _tokenizer.TokenType.SUB, _tokenizer.TokenType.MUL, _tokenizer.TokenType.DIV, _tokenizer.TokenType.MOD, _tokenizer.TokenType.EQ, _tokenizer.TokenType.NE, _tokenizer.TokenType.EQ_STRICT, _tokenizer.TokenType.NE_STRICT, _tokenizer.TokenType.LT, _tokenizer.TokenType.GT, _tokenizer.TokenType.LTE, _tokenizer.TokenType.GTE, _tokenizer.TokenType.INSTANCEOF, _tokenizer.TokenType.IN, _tokenizer.TokenType.NOT, _tokenizer.TokenType.BIT_NOT, _tokenizer.TokenType.AWAIT, _tokenizer.TokenType.DELETE, _tokenizer.TokenType.TYPEOF, _tokenizer.TokenType.VOID, _tokenizer.TokenType.BREAK, _tokenizer.TokenType.CASE, _tokenizer.TokenType.CATCH, _tokenizer.TokenType.CLASS, _tokenizer.TokenType.CONTINUE, _tokenizer.TokenType.DEBUGGER, _tokenizer.TokenType.DEFAULT, _tokenizer.TokenType.DO, _tokenizer.TokenType.ELSE, _tokenizer.TokenType.EXPORT, _tokenizer.TokenType.EXTENDS, _tokenizer.TokenType.FINALLY, _tokenizer.TokenType.FOR, _tokenizer.TokenType.FUNCTION, _tokenizer.TokenType.IF, _tokenizer.TokenType.IMPORT, _tokenizer.TokenType.LET, _tokenizer.TokenType.NEW, _tokenizer.TokenType.RETURN, _tokenizer.TokenType.SUPER, _tokenizer.TokenType.SWITCH, _tokenizer.TokenType.THIS, _tokenizer.TokenType.THROW, _tokenizer.TokenType.TRY, _tokenizer.TokenType.VAR, _tokenizer.TokenType.WHILE, _tokenizer.TokenType.WITH, _tokenizer.TokenType.NULL, _tokenizer.TokenType.TRUE, _tokenizer.TokenType.FALSE, _tokenizer.TokenType.YIELD, _tokenizer.TokenType.NUMBER, _tokenizer.TokenType.STRING, _tokenizer.TokenType.REGEXP, _tokenizer.TokenType.IDENTIFIER, _tokenizer.TokenType.CONST, _tokenizer.TokenType.TEMPLATE, _tokenizer.TokenType.ILLEGAL]; + +let ListHandler = _transitJs2.default.makeWriteHandler({ + tag: () => "array", + rep: v => v +}); + +let MapHandler = _transitJs2.default.makeWriteHandler({ + tag: function tag() { return "map"; - }, rep: function rep(v_639) { - return v_639; - }, stringRep: function stringRep(v_640) { + }, + rep: function rep(v) { + return v; + }, + stringRep: function stringRep() { return null; - } }); -let SyntaxHandler_633 = _transitJs2.default.makeWriteHandler({ tag: () => "stx", rep: v_641 => { - if (_immutable.List.isList(v_641.token)) { - return [v_641.token, v_641.scopesets]; + } +}); + +let SyntaxHandler = _transitJs2.default.makeWriteHandler({ + tag: () => "stx", + rep: v => { + if (_immutable.List.isList(v.token)) { + return [v.token, v.scopesets]; } else { - let t = _transitJs2.default.objectToMap(v_641.token); - t.set("type", typeMap_630.indexOf(v_641.token.type)); - return [t, v_641.scopesets]; + let t = _transitJs2.default.objectToMap(v.token); + t.set("type", typeMap.indexOf(v.token.type)); + return [t, v.scopesets]; } - } }); -let SymbolHandler_634 = _transitJs2.default.makeWriteHandler({ tag: () => "symb", rep: v_642 => [v_642.name] }); -let writer_635 = _transitJs2.default.writer("json", { handlers: _transitJs2.default.map([_immutable.List, ListHandler_631, _immutable.Map, MapHandler_632, _syntax2.default, SyntaxHandler_633, _symbol.SymbolClass, SymbolHandler_634]) }); -function makeReader_636(bindings_643) { - return _transitJs2.default.reader("json", { arrayBuilder: { init: node_644 => (0, _immutable.List)().asMutable(), add: (ret_645, val_646, node_647) => ret_645.push(val_646), finalize: (ret_648, node_649) => ret_648.asImmutable(), fromArray: (arr_650, node_651) => (0, _immutable.List)(arr_650) }, mapBuilder: { init: function init(node_652) { + } +}); +let SymbolHandler = _transitJs2.default.makeWriteHandler({ + tag: () => "symb", + rep: v => [v.name] +}); + +let writer = _transitJs2.default.writer("json", { + handlers: _transitJs2.default.map([_immutable.List, ListHandler, _immutable.Map, MapHandler, _syntax2.default, SyntaxHandler, _symbol.SymbolClass, SymbolHandler]) +}); + +function makeReader(bindings) { + return _transitJs2.default.reader("json", { + arrayBuilder: { + init: () => (0, _immutable.List)().asMutable(), + add: (ret, val) => ret.push(val), + finalize: ret => ret.asImmutable(), + fromArray: arr => (0, _immutable.List)(arr) + }, + mapBuilder: { + init: function init() { return (0, _immutable.Map)().asMutable(); - }, add: function add(ret_653, key_654, val_655, node_656) { - return ret_653.set(key_654, val_655); - }, finalize: function finalize(ret_657, node_658) { - return ret_657.asImmutable(); - } }, handlers: { stx: rep_659 => { - let scopesets_660 = _transitJs2.default.mapToObject(rep_659[1]); - if (_immutable.List.isList(rep_659[0])) { - let token = rep_659[0]; - return new _syntax2.default(token, { bindings: bindings_643, scopesets: scopesets_660 }); + }, + add: function add(ret, key, val) { + return ret.set(key, val); + }, + finalize: function finalize(ret) { + return ret.asImmutable(); + } + }, + handlers: { + "stx": rep => { + let scopesets = _transitJs2.default.mapToObject(rep[1]); + if (_immutable.List.isList(rep[0])) { + let token = rep[0]; + return new _syntax2.default(token, { bindings: bindings, scopesets: scopesets }); } else { - let token = _transitJs2.default.mapToObject(rep_659[0]); - token.type = typeMap_630[rep_659[0].get("type")]; - token.slice = rep_659[0].has("slice") ? _transitJs2.default.mapToObject(rep_659[0].get("slice")) : undefined; + let token = _transitJs2.default.mapToObject(rep[0]); + token.type = typeMap[rep[0].get("type")]; + token.slice = rep[0].has("slice") ? _transitJs2.default.mapToObject(rep[0].get("slice")) : undefined; if (token.slice) { token.slice.startLocation = _transitJs2.default.mapToObject(token.slice.startLocation); } - return new _syntax2.default(token, { bindings: bindings_643, scopesets: scopesets_660 }); + return new _syntax2.default(token, { bindings: bindings, scopesets: scopesets }); } - }, symb: rep_661 => { - return (0, _symbol.Symbol)(rep_661[0]); - } } }); + }, + "symb": rep => { + return (0, _symbol.Symbol)(rep[0]); + } + } + }); } -exports.makeDeserializer = makeReader_636; -exports.serializer = writer_635; -//# sourceMappingURL=data:application/json;base64,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QUwsQ0FBWSxRQUFRLENBQVIsQ0FBWixDQUFKLEVBQTZCO0FBQzNCLGNBQUksUUFBUSxRQUFRLENBQVIsQ0FBWjtBQUNBLGlCQUFPLHFCQUFXLEtBQVgsRUFBa0IsRUFBQyxVQUFVLFlBQVgsRUFBeUIsV0FBVyxhQUFwQyxFQUFsQixDQUFQO0FBQ0QsU0FIRCxNQUdPO0FBQ0wsY0FBSSxRQUFRLG9CQUFRLFdBQVIsQ0FBb0IsUUFBUSxDQUFSLENBQXBCLENBQVo7QUFDQSxnQkFBTSxJQUFOLEdBQWEsWUFBWSxRQUFRLENBQVIsRUFBVyxHQUFYLENBQWUsTUFBZixDQUFaLENBQWI7QUFDQSxnQkFBTSxLQUFOLEdBQWMsUUFBUSxDQUFSLEVBQVcsR0FBWCxDQUFlLE9BQWYsSUFBMEIsb0JBQVEsV0FBUixDQUFvQixRQUFRLENBQVIsRUFBVyxHQUFYLENBQWUsT0FBZixDQUFwQixDQUExQixHQUF5RSxTQUF2RjtBQUNBLGNBQUksTUFBTSxLQUFWLEVBQWlCO0FBQ2Ysa0JBQU0sS0FBTixDQUFZLGFBQVosR0FBNEIsb0JBQVEsV0FBUixDQUFvQixNQUFNLEtBQU4sQ0FBWSxhQUFoQyxDQUE1QjtBQUNEO0FBQ0QsaUJBQU8scUJBQVcsS0FBWCxFQUFrQixFQUFDLFVBQVUsWUFBWCxFQUF5QixXQUFXLGFBQXBDLEVBQWxCLENBQVA7QUFDRDtBQUNGLE9BZGEsRUFjWCxNQUFNLFdBQVc7QUFDbEIsZUFBTyxvQkFBTyxRQUFRLENBQVIsQ0FBUCxDQUFQO0FBQ0QsT0FoQmEsRUFOZ0IsRUFBdkIsQ0FBUDtBQXVCRDtRQUN5QixnQixHQUFsQixjO1FBQWtELFUsR0FBZCxVIiwiZmlsZSI6InNlcmlhbGl6ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHJhbnNpdCBmcm9tIFwidHJhbnNpdC1qc1wiO1xuaW1wb3J0IHtMaXN0LCBNYXB9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCBTeW50YXggZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge1N5bWJvbCwgZ2Vuc3ltLCBTeW1ib2xDbGFzc30gZnJvbSBcIi4vc3ltYm9sXCI7XG5pbXBvcnQge1Rva2VuQ2xhc3MsIFRva2VuVHlwZX0gZnJvbSBcInNoaWZ0LXBhcnNlci9kaXN0L3Rva2VuaXplclwiO1xubGV0IHR5cGVNYXBfNjMwID0gW1Rva2VuVHlwZS5TVFJJTkcsIFRva2VuVHlwZS5FT1MsIFRva2VuVHlwZS5MUEFSRU4sIFRva2VuVHlwZS5SUEFSRU4sIFRva2VuVHlwZS5MQlJBQ0ssIFRva2VuVHlwZS5SQlJBQ0ssIFRva2VuVHlwZS5MQlJBQ0UsIFRva2VuVHlwZS5SQlJBQ0UsIFRva2VuVHlwZS5DT0xPTiwgVG9rZW5UeXBlLlNFTUlDT0xPTiwgVG9rZW5UeXBlLlBFUklPRCwgVG9rZW5UeXBlLkVMTElQU0lTLCBUb2tlblR5cGUuQVJST1csIFRva2VuVHlwZS5DT05ESVRJT05BTCwgVG9rZW5UeXBlLklOQywgVG9rZW5UeXBlLkRFQywgVG9rZW5UeXBlLkFTU0lHTiwgVG9rZW5UeXBlLkFTU0lHTl9CSVRfT1IsIFRva2VuVHlwZS5BU1NJR05fQklUX1hPUiwgVG9rZW5UeXBlLkFTU0lHTl9CSVRfQU5ELCBUb2tlblR5cGUuQVNTSUdOX1NITCwgVG9rZW5UeXBlLkFTU0lHTl9TSFIsIFRva2VuVHlwZS5BU1NJR05fU0hSX1VOU0lHTkVELCBUb2tlblR5cGUuQVNTSUdOX0FERCwgVG9rZW5UeXBlLkFTU0lHTl9TVUIsIFRva2VuVHlwZS5BU1NJR05fTVVMLCBUb2tlblR5cGUuQVNTSUdOX0RJViwgVG9rZW5UeXBlLkFTU0lHTl9NT0QsIFRva2VuVHlwZS5DT01NQSwgVG9rZW5UeXBlLk9SLCBUb2tlblR5cGUuQU5ELCBUb2tlblR5cGUuQklUX09SLCBUb2tlblR5cGUuQklUX1hPUiwgVG9rZW5UeXBlLkJJVF9BTkQsIFRva2VuVHlwZS5TSEwsIFRva2VuVHlwZS5TSFIsIFRva2VuVHlwZS5TSFJfVU5TSUdORUQsIFRva2VuVHlwZS5BREQsIFRva2VuVHlwZS5TVUIsIFRva2VuVHlwZS5NVUwsIFRva2VuVHlwZS5ESVYsIFRva2VuVHlwZS5NT0QsIFRva2VuVHlwZS5FUSwgVG9rZW5UeXBlLk5FLCBUb2tlblR5cGUuRVFfU1RSSUNULCBUb2tlblR5cGUuTkVfU1RSSUNULCBUb2tlblR5cGUuTFQsIFRva2VuVHlwZS5HVCwgVG9rZW5UeXBlLkxURSwgVG9rZW5UeXBlLkdURSwgVG9rZW5UeXBlLklOU1RBTkNFT0YsIFRva2VuVHlwZS5JTiwgVG9rZW5UeXBlLk5PVCwgVG9rZW5UeXBlLkJJVF9OT1QsIFRva2VuVHlwZS5BV0FJVCwgVG9rZW5UeXBlLkRFTEVURSwgVG9rZW5UeXBlLlRZUEVPRiwgVG9rZW5UeXBlLlZPSUQsIFRva2VuVHlwZS5CUkVBSywgVG9rZW5UeXBlLkNBU0UsIFRva2VuVHlwZS5DQVRDSCwgVG9rZW5UeXBlLkNMQVNTLCBUb2tlblR5cGUuQ09OVElOVUUsIFRva2VuVHlwZS5ERUJVR0dFUiwgVG9rZW5UeXBlLkRFRkFVTFQsIFRva2VuVHlwZS5ETywgVG9rZW5UeXBlLkVMU0UsIFRva2VuVHlwZS5FWFBPUlQsIFRva2VuVHlwZS5FWFRFTkRTLCBUb2tlblR5cGUuRklOQUxMWSwgVG9rZW5UeXBlLkZPUiwgVG9rZW5UeXBlLkZVTkNUSU9OLCBUb2tlblR5cGUuSUYsIFRva2VuVHlwZS5JTVBPUlQsIFRva2VuVHlwZS5MRVQsIFRva2VuVHlwZS5ORVcsIFRva2VuVHlwZS5SRVRVUk4sIFRva2VuVHlwZS5TVVBFUiwgVG9rZW5UeXBlLlNXSVRDSCwgVG9rZW5UeXBlLlRISVMsIFRva2VuVHlwZS5USFJPVywgVG9rZW5UeXBlLlRSWSwgVG9rZW5UeXBlLlZBUiwgVG9rZW5UeXBlLldISUxFLCBUb2tlblR5cGUuV0lUSCwgVG9rZW5UeXBlLk5VTEwsIFRva2VuVHlwZS5UUlVFLCBUb2tlblR5cGUuRkFMU0UsIFRva2VuVHlwZS5ZSUVMRCwgVG9rZW5UeXBlLk5VTUJFUiwgVG9rZW5UeXBlLlNUUklORywgVG9rZW5UeXBlLlJFR0VYUCwgVG9rZW5UeXBlLklERU5USUZJRVIsIFRva2VuVHlwZS5DT05TVCwgVG9rZW5UeXBlLlRFTVBMQVRFLCBUb2tlblR5cGUuSUxMRUdBTF07XG5sZXQgTGlzdEhhbmRsZXJfNjMxID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHt0YWc6ICgpID0+IFwiYXJyYXlcIiwgcmVwOiB2XzYzNyA9PiB2XzYzN30pO1xubGV0IE1hcEhhbmRsZXJfNjMyID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHt0YWc6IGZ1bmN0aW9uICh2XzYzOCkge1xuICByZXR1cm4gXCJtYXBcIjtcbn0sIHJlcDogZnVuY3Rpb24gKHZfNjM5KSB7XG4gIHJldHVybiB2XzYzOTtcbn0sIHN0cmluZ1JlcDogZnVuY3Rpb24gKHZfNjQwKSB7XG4gIHJldHVybiBudWxsO1xufX0pO1xubGV0IFN5bnRheEhhbmRsZXJfNjMzID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHt0YWc6ICgpID0+IFwic3R4XCIsIHJlcDogdl82NDEgPT4ge1xuICBpZiAoTGlzdC5pc0xpc3Qodl82NDEudG9rZW4pKSB7XG4gICAgcmV0dXJuIFt2XzY0MS50b2tlbiwgdl82NDEuc2NvcGVzZXRzXTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdCA9IHRyYW5zaXQub2JqZWN0VG9NYXAodl82NDEudG9rZW4pO1xuICAgIHQuc2V0KFwidHlwZVwiLCB0eXBlTWFwXzYzMC5pbmRleE9mKHZfNjQxLnRva2VuLnR5cGUpKTtcbiAgICByZXR1cm4gW3QsIHZfNjQxLnNjb3Blc2V0c107XG4gIH1cbn19KTtcbmxldCBTeW1ib2xIYW5kbGVyXzYzNCA9IHRyYW5zaXQubWFrZVdyaXRlSGFuZGxlcih7dGFnOiAoKSA9PiBcInN5bWJcIiwgcmVwOiB2XzY0MiA9PiBbdl82NDIubmFtZV19KTtcbmxldCB3cml0ZXJfNjM1ID0gdHJhbnNpdC53cml0ZXIoXCJqc29uXCIsIHtoYW5kbGVyczogdHJhbnNpdC5tYXAoW0xpc3QsIExpc3RIYW5kbGVyXzYzMSwgTWFwLCBNYXBIYW5kbGVyXzYzMiwgU3ludGF4LCBTeW50YXhIYW5kbGVyXzYzMywgU3ltYm9sQ2xhc3MsIFN5bWJvbEhhbmRsZXJfNjM0XSl9KTtcbmZ1bmN0aW9uIG1ha2VSZWFkZXJfNjM2KGJpbmRpbmdzXzY0Mykge1xuICByZXR1cm4gdHJhbnNpdC5yZWFkZXIoXCJqc29uXCIsIHthcnJheUJ1aWxkZXI6IHtpbml0OiBub2RlXzY0NCA9PiBMaXN0KCkuYXNNdXRhYmxlKCksIGFkZDogKHJldF82NDUsIHZhbF82NDYsIG5vZGVfNjQ3KSA9PiByZXRfNjQ1LnB1c2godmFsXzY0NiksIGZpbmFsaXplOiAocmV0XzY0OCwgbm9kZV82NDkpID0+IHJldF82NDguYXNJbW11dGFibGUoKSwgZnJvbUFycmF5OiAoYXJyXzY1MCwgbm9kZV82NTEpID0+IExpc3QoYXJyXzY1MCl9LCBtYXBCdWlsZGVyOiB7aW5pdDogZnVuY3Rpb24gKG5vZGVfNjUyKSB7XG4gICAgcmV0dXJuIE1hcCgpLmFzTXV0YWJsZSgpO1xuICB9LCBhZGQ6IGZ1bmN0aW9uIChyZXRfNjUzLCBrZXlfNjU0LCB2YWxfNjU1LCBub2RlXzY1Nikge1xuICAgIHJldHVybiByZXRfNjUzLnNldChrZXlfNjU0LCB2YWxfNjU1KTtcbiAgfSwgZmluYWxpemU6IGZ1bmN0aW9uIChyZXRfNjU3LCBub2RlXzY1OCkge1xuICAgIHJldHVybiByZXRfNjU3LmFzSW1tdXRhYmxlKCk7XG4gIH19LCBoYW5kbGVyczoge3N0eDogcmVwXzY1OSA9PiB7XG4gICAgbGV0IHNjb3Blc2V0c182NjAgPSB0cmFuc2l0Lm1hcFRvT2JqZWN0KHJlcF82NTlbMV0pO1xuICAgIGlmIChMaXN0LmlzTGlzdChyZXBfNjU5WzBdKSkge1xuICAgICAgbGV0IHRva2VuID0gcmVwXzY1OVswXTtcbiAgICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuLCB7YmluZGluZ3M6IGJpbmRpbmdzXzY0Mywgc2NvcGVzZXRzOiBzY29wZXNldHNfNjYwfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB0b2tlbiA9IHRyYW5zaXQubWFwVG9PYmplY3QocmVwXzY1OVswXSk7XG4gICAgICB0b2tlbi50eXBlID0gdHlwZU1hcF82MzBbcmVwXzY1OVswXS5nZXQoXCJ0eXBlXCIpXTtcbiAgICAgIHRva2VuLnNsaWNlID0gcmVwXzY1OVswXS5oYXMoXCJzbGljZVwiKSA/IHRyYW5zaXQubWFwVG9PYmplY3QocmVwXzY1OVswXS5nZXQoXCJzbGljZVwiKSkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAodG9rZW4uc2xpY2UpIHtcbiAgICAgICAgdG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbiA9IHRyYW5zaXQubWFwVG9PYmplY3QodG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbiwge2JpbmRpbmdzOiBiaW5kaW5nc182NDMsIHNjb3Blc2V0czogc2NvcGVzZXRzXzY2MH0pO1xuICAgIH1cbiAgfSwgc3ltYjogcmVwXzY2MSA9PiB7XG4gICAgcmV0dXJuIFN5bWJvbChyZXBfNjYxWzBdKTtcbiAgfX19KTtcbn1cbmV4cG9ydCB7bWFrZVJlYWRlcl82MzYgYXMgbWFrZURlc2VyaWFsaXplciwgd3JpdGVyXzYzNSBhcyBzZXJpYWxpemVyfTtcbiJdfQ== \ No newline at end of file + +exports.makeDeserializer = makeReader; +exports.serializer = writer; +//# sourceMappingURL=data:application/json;base64,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UUFBUSxJQUFJLENBQUosRUFBTyxHQUFQLENBQVcsTUFBWCxDQUFSLENBQWI7QUFDQSxnQkFBTSxLQUFOLEdBQWMsSUFBSSxDQUFKLEVBQU8sR0FBUCxDQUFXLE9BQVgsSUFBc0Isb0JBQVEsV0FBUixDQUFvQixJQUFJLENBQUosRUFBTyxHQUFQLENBQVcsT0FBWCxDQUFwQixDQUF0QixHQUFpRSxTQUEvRTtBQUNBLGNBQUksTUFBTSxLQUFWLEVBQWlCO0FBQ2Ysa0JBQU0sS0FBTixDQUFZLGFBQVosR0FBNEIsb0JBQVEsV0FBUixDQUFvQixNQUFNLEtBQU4sQ0FBWSxhQUFoQyxDQUE1QjtBQUNEO0FBQ0QsaUJBQU8scUJBQVcsS0FBWCxFQUFrQixFQUFDLGtCQUFELEVBQVcsV0FBVyxTQUF0QixFQUFsQixDQUFQO0FBQ0Q7QUFDRixPQWZPO0FBZ0JSLGNBQVMsR0FBRCxJQUFTO0FBQ2YsZUFBTyxvQkFBTyxJQUFJLENBQUosQ0FBUCxDQUFQO0FBQ0Q7QUFsQk87QUFaa0IsR0FBdkIsQ0FBUDtBQWlDRDs7UUFHZSxnQixHQUFkLFU7UUFBMEMsVSxHQUFWLE0iLCJmaWxlIjoic2VyaWFsaXplci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0cmFuc2l0IGZyb20gXCJ0cmFuc2l0LWpzXCI7XG5pbXBvcnQgeyBMaXN0LCBNYXAgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHsgU3ltYm9sLCAgU3ltYm9sQ2xhc3MgfSBmcm9tIFwiLi9zeW1ib2xcIjtcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gXCJzaGlmdC1wYXJzZXIvZGlzdC90b2tlbml6ZXJcIjtcblxubGV0IHR5cGVNYXAgPSBbVG9rZW5UeXBlLlNUUklORywgVG9rZW5UeXBlLkVPUywgVG9rZW5UeXBlLkxQQVJFTiwgVG9rZW5UeXBlLlJQQVJFTixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5MQlJBQ0ssIFRva2VuVHlwZS5SQlJBQ0ssIFRva2VuVHlwZS5MQlJBQ0UsIFRva2VuVHlwZS5SQlJBQ0UsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuQ09MT04sIFRva2VuVHlwZS5TRU1JQ09MT04sIFRva2VuVHlwZS5QRVJJT0QsIFRva2VuVHlwZS5FTExJUFNJUyxcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5BUlJPVywgVG9rZW5UeXBlLkNPTkRJVElPTkFMLCBUb2tlblR5cGUuSU5DLCBUb2tlblR5cGUuREVDLFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkFTU0lHTiwgVG9rZW5UeXBlLkFTU0lHTl9CSVRfT1IsIFRva2VuVHlwZS5BU1NJR05fQklUX1hPUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5BU1NJR05fQklUX0FORCwgVG9rZW5UeXBlLkFTU0lHTl9TSEwsIFRva2VuVHlwZS5BU1NJR05fU0hSLFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkFTU0lHTl9TSFJfVU5TSUdORUQsIFRva2VuVHlwZS5BU1NJR05fQURELCBUb2tlblR5cGUuQVNTSUdOX1NVQixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5BU1NJR05fTVVMLCBUb2tlblR5cGUuQVNTSUdOX0RJViwgVG9rZW5UeXBlLkFTU0lHTl9NT0QsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuQ09NTUEsIFRva2VuVHlwZS5PUiwgVG9rZW5UeXBlLkFORCwgVG9rZW5UeXBlLkJJVF9PUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5CSVRfWE9SLCBUb2tlblR5cGUuQklUX0FORCwgVG9rZW5UeXBlLlNITCwgVG9rZW5UeXBlLlNIUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5TSFJfVU5TSUdORUQsIFRva2VuVHlwZS5BREQsIFRva2VuVHlwZS5TVUIsIFRva2VuVHlwZS5NVUwsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuRElWLCBUb2tlblR5cGUuTU9ELCBUb2tlblR5cGUuRVEsIFRva2VuVHlwZS5ORSxcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5FUV9TVFJJQ1QsIFRva2VuVHlwZS5ORV9TVFJJQ1QsIFRva2VuVHlwZS5MVCwgVG9rZW5UeXBlLkdULFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkxURSwgVG9rZW5UeXBlLkdURSwgVG9rZW5UeXBlLklOU1RBTkNFT0YsIFRva2VuVHlwZS5JTixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5OT1QsIFRva2VuVHlwZS5CSVRfTk9ULCBUb2tlblR5cGUuQVdBSVQsIFRva2VuVHlwZS5ERUxFVEUsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuVFlQRU9GLCBUb2tlblR5cGUuVk9JRCwgVG9rZW5UeXBlLkJSRUFLLCBUb2tlblR5cGUuQ0FTRSxcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5DQVRDSCwgVG9rZW5UeXBlLkNMQVNTLCBUb2tlblR5cGUuQ09OVElOVUUsIFRva2VuVHlwZS5ERUJVR0dFUixcbiAgICAgICAgICAgICAgIFRva2VuVHlwZS5ERUZBVUxULCBUb2tlblR5cGUuRE8sIFRva2VuVHlwZS5FTFNFLCBUb2tlblR5cGUuRVhQT1JULFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLkVYVEVORFMsIFRva2VuVHlwZS5GSU5BTExZLCBUb2tlblR5cGUuRk9SLCBUb2tlblR5cGUuRlVOQ1RJT04sXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuSUYsIFRva2VuVHlwZS5JTVBPUlQsIFRva2VuVHlwZS5MRVQsIFRva2VuVHlwZS5ORVcsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuUkVUVVJOLCBUb2tlblR5cGUuU1VQRVIsIFRva2VuVHlwZS5TV0lUQ0gsIFRva2VuVHlwZS5USElTLFxuICAgICAgICAgICAgICAgVG9rZW5UeXBlLlRIUk9XLCBUb2tlblR5cGUuVFJZLCBUb2tlblR5cGUuVkFSLCBUb2tlblR5cGUuV0hJTEUsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuV0lUSCwgVG9rZW5UeXBlLk5VTEwsIFRva2VuVHlwZS5UUlVFLCBUb2tlblR5cGUuRkFMU0UsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuWUlFTEQsIFRva2VuVHlwZS5OVU1CRVIsIFRva2VuVHlwZS5TVFJJTkcsIFRva2VuVHlwZS5SRUdFWFAsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuSURFTlRJRklFUiwgVG9rZW5UeXBlLkNPTlNULCBUb2tlblR5cGUuVEVNUExBVEUsXG4gICAgICAgICAgICAgICBUb2tlblR5cGUuSUxMRUdBTF07XG5cbmxldCBMaXN0SGFuZGxlciA9IHRyYW5zaXQubWFrZVdyaXRlSGFuZGxlcih7XG4gIHRhZzogKCkgPT4gXCJhcnJheVwiLFxuICByZXA6ICh2KSA9PiB2XG59KTtcblxubGV0IE1hcEhhbmRsZXIgPSB0cmFuc2l0Lm1ha2VXcml0ZUhhbmRsZXIoe1xuICB0YWc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gXCJtYXBcIjsgfSxcbiAgcmVwOiBmdW5jdGlvbih2KSB7IHJldHVybiB2OyB9LFxuICBzdHJpbmdSZXA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbDsgfVxufSk7XG5cbmxldCBTeW50YXhIYW5kbGVyID0gdHJhbnNpdC5tYWtlV3JpdGVIYW5kbGVyKHtcbiAgdGFnOiAoKSA9PiBcInN0eFwiLFxuICByZXA6ICh2KSA9PiB7XG4gICAgaWYgKExpc3QuaXNMaXN0KHYudG9rZW4pKSB7XG4gICAgICByZXR1cm4gW3YudG9rZW4sIHYuc2NvcGVzZXRzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHQgPSB0cmFuc2l0Lm9iamVjdFRvTWFwKHYudG9rZW4pO1xuICAgICAgdC5zZXQoXCJ0eXBlXCIsIHR5cGVNYXAuaW5kZXhPZih2LnRva2VuLnR5cGUpKTtcbiAgICAgIHJldHVybiBbdCwgdi5zY29wZXNldHNdO1xuICAgIH1cbiAgfVxufSk7XG5sZXQgU3ltYm9sSGFuZGxlciA9IHRyYW5zaXQubWFrZVdyaXRlSGFuZGxlcih7XG4gIHRhZzogKCkgPT4gXCJzeW1iXCIsXG4gIHJlcDogKHYpID0+ICBbdi5uYW1lXVxufSk7XG5cbmxldCB3cml0ZXIgPSB0cmFuc2l0LndyaXRlcihcImpzb25cIiwge1xuICBoYW5kbGVyczogdHJhbnNpdC5tYXAoW1xuICAgIExpc3QsIExpc3RIYW5kbGVyLFxuICAgIE1hcCwgTWFwSGFuZGxlcixcbiAgICBTeW50YXgsIFN5bnRheEhhbmRsZXIsXG4gICAgU3ltYm9sQ2xhc3MsIFN5bWJvbEhhbmRsZXJcbiAgXSlcbn0pO1xuXG5mdW5jdGlvbiBtYWtlUmVhZGVyKGJpbmRpbmdzKSB7XG4gIHJldHVybiB0cmFuc2l0LnJlYWRlcihcImpzb25cIiwge1xuICAgIGFycmF5QnVpbGRlcjoge1xuICAgICAgaW5pdDogKCkgPT4gTGlzdCgpLmFzTXV0YWJsZSgpLFxuICAgICAgYWRkOiAocmV0LCB2YWwpID0+IHJldC5wdXNoKHZhbCksXG4gICAgICBmaW5hbGl6ZTogKHJldCkgPT4gcmV0LmFzSW1tdXRhYmxlKCksXG4gICAgICBmcm9tQXJyYXk6IChhcnIpID0+IExpc3QoYXJyKVxuICAgIH0sXG4gICAgbWFwQnVpbGRlcjoge1xuICAgICAgaW5pdDogZnVuY3Rpb24oKSB7IHJldHVybiBNYXAoKS5hc011dGFibGUoKTsgfSxcbiAgICAgIGFkZDogZnVuY3Rpb24ocmV0LCBrZXksIHZhbCkgeyByZXR1cm4gcmV0LnNldChrZXksIHZhbCk7IH0sXG4gICAgICBmaW5hbGl6ZTogZnVuY3Rpb24ocmV0KSB7IHJldHVybiByZXQuYXNJbW11dGFibGUoKTsgfVxuICAgIH0sXG4gICAgaGFuZGxlcnM6IHtcbiAgICAgIFwic3R4XCI6IChyZXApID0+IHtcbiAgICAgICAgbGV0IHNjb3Blc2V0cyA9IHRyYW5zaXQubWFwVG9PYmplY3QocmVwWzFdKTtcbiAgICAgICAgaWYgKExpc3QuaXNMaXN0KHJlcFswXSkpIHtcbiAgICAgICAgICBsZXQgdG9rZW4gPSByZXBbMF07XG4gICAgICAgICAgcmV0dXJuIG5ldyBTeW50YXgodG9rZW4sIHtiaW5kaW5ncywgc2NvcGVzZXRzOiBzY29wZXNldHN9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgdG9rZW4gPSB0cmFuc2l0Lm1hcFRvT2JqZWN0KHJlcFswXSk7XG4gICAgICAgICAgdG9rZW4udHlwZSA9IHR5cGVNYXBbcmVwWzBdLmdldChcInR5cGVcIildO1xuICAgICAgICAgIHRva2VuLnNsaWNlID0gcmVwWzBdLmhhcyhcInNsaWNlXCIpID8gdHJhbnNpdC5tYXBUb09iamVjdChyZXBbMF0uZ2V0KFwic2xpY2VcIikpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0b2tlbi5zbGljZSkge1xuICAgICAgICAgICAgdG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbiA9IHRyYW5zaXQubWFwVG9PYmplY3QodG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuLCB7YmluZGluZ3MsIHNjb3Blc2V0czogc2NvcGVzZXRzfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInN5bWJcIjogKHJlcCkgPT4ge1xuICAgICAgICByZXR1cm4gU3ltYm9sKHJlcFswXSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHtcbiAgbWFrZVJlYWRlciBhcyBtYWtlRGVzZXJpYWxpemVyLCB3cml0ZXIgYXMgc2VyaWFsaXplclxufTtcbiJdfQ== \ No newline at end of file diff --git a/dist/shift-reader.js b/dist/shift-reader.js index 82209c0f..32ead8f0 100644 --- a/dist/shift-reader.js +++ b/dist/shift-reader.js @@ -14,6 +14,10 @@ var _syntax = require("./syntax"); var _syntax2 = _interopRequireDefault(_syntax); +var _ramda = require("ramda"); + +var R = _interopRequireWildcard(_ramda); + var _ramdaFantasy = require("ramda-fantasy"); var _errors = require("./errors"); @@ -22,251 +26,380 @@ var _terms = require("./terms"); var _terms2 = _interopRequireDefault(_terms); -var _ramda = require("ramda"); - -var R = _interopRequireWildcard(_ramda); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const Just_662 = _ramdaFantasy.Maybe.Just; -const Nothing_663 = _ramdaFantasy.Maybe.Nothing; -const LSYNTAX_664 = { name: "left-syntax" }; -const RSYNTAX_665 = { name: "right-syntax" }; -const AT_666 = { klass: _tokenizer.TokenClass.Punctuator, name: "@" }; -const literalKeywords_667 = ["this", "null", "true", "false"]; -const isLeftBracket_668 = R.whereEq({ type: _tokenizer.TokenType.LBRACK }); -const isLeftBrace_669 = R.whereEq({ type: _tokenizer.TokenType.LBRACE }); -const isLeftParen_670 = R.whereEq({ type: _tokenizer.TokenType.LPAREN }); -const isRightBracket_671 = R.whereEq({ type: _tokenizer.TokenType.RBRACK }); -const isRightBrace_672 = R.whereEq({ type: _tokenizer.TokenType.RBRACE }); -const isRightParen_673 = R.whereEq({ type: _tokenizer.TokenType.RPAREN }); -const isEOS_674 = R.whereEq({ type: _tokenizer.TokenType.EOS }); -const isHash_675 = R.whereEq({ type: _tokenizer.TokenType.IDENTIFIER, value: "#" }); -const isLeftSyntax_676 = R.whereEq({ type: LSYNTAX_664 }); -const isRightSyntax_677 = R.whereEq({ type: RSYNTAX_665 }); -const isLeftDelimiter_678 = R.anyPass([isLeftBracket_668, isLeftBrace_669, isLeftParen_670, isLeftSyntax_676]); -const isRightDelimiter_679 = R.anyPass([isRightBracket_671, isRightBrace_672, isRightParen_673, isRightSyntax_677]); -const isMatchingDelimiters_680 = R.cond([[isLeftBracket_668, (__721, b_722) => isRightBracket_671(b_722)], [isLeftBrace_669, (__723, b_724) => isRightBrace_672(b_724)], [isLeftParen_670, (__725, b_726) => isRightParen_673(b_726)], [isLeftSyntax_676, (__727, b_728) => isRightSyntax_677(b_728)], [R.T, R.F]]); -const assignOps_681 = ["=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "|=", "^=", ","]; -const binaryOps_682 = ["+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", "|", "^", "&&", "||", "?", ":", "===", "==", ">=", "<=", "<", ">", "!=", "!==", "instanceof"]; -const unaryOps_683 = ["++", "--", "~", "!", "delete", "void", "typeof", "yield", "throw", "new"]; -const isEmpty_684 = R.whereEq({ size: 0 }); -const isPunctuator_685 = s_729 => s_729.match("punctuator"); -const isKeyword_686 = s_730 => s_730.match("keyword"); -const isDelimiter_687 = s_731 => s_731.match("delimiter"); -const isParens_688 = s_732 => s_732.match("parens"); -const isBraces_689 = s_733 => s_733.match("braces"); -const isBrackets_690 = s_734 => s_734.match("brackets"); -const isIdentifier_691 = s_735 => s_735.match("identifier"); -const val_692 = s_736 => s_736.val(); -const isVal_693 = R.curry((v_737, s_738) => s_738.val() === v_737); -const isDot_694 = R.allPass([isPunctuator_685, isVal_693(".")]); -const isColon_695 = R.allPass([isPunctuator_685, isVal_693(":")]); -const isFunctionKeyword_696 = R.allPass([isKeyword_686, isVal_693("function")]); -const isOperator_697 = s_739 => (s_739.match("punctuator") || s_739.match("keyword")) && R.any(R.equals(s_739.val()), assignOps_681.concat(binaryOps_682).concat(unaryOps_683)); -const isNonLiteralKeyword_698 = R.allPass([isKeyword_686, s_740 => R.none(R.equals(s_740.val()), literalKeywords_667)]); -const isKeywordExprPrefix_699 = R.allPass([isKeyword_686, s_741 => R.any(R.equals(s_741.val()), ["instanceof", "typeof", "delete", "void", "yield", "throw", "new", "case"])]); -let last_700 = p_742 => p_742.last(); -let safeLast_701 = R.pipe(R.cond([[isEmpty_684, R.always(Nothing_663())], [R.T, R.compose(_ramdaFantasy.Maybe.of, last_700)]])); -let stuffTrue_702 = R.curry((p_743, b_744) => b_744 ? Just_662(p_743) : Nothing_663()); -let stuffFalse_703 = R.curry((p_745, b_746) => !b_746 ? Just_662(p_745) : Nothing_663()); -let isTopColon_704 = R.pipe(safeLast_701, R.map(isColon_695), _ramdaFantasy.Maybe.maybe(false, R.identity)); -let isTopPunctuator_705 = R.pipe(safeLast_701, R.map(isPunctuator_685), _ramdaFantasy.Maybe.maybe(false, R.identity)); -let isExprReturn_706 = R.curry((l_747, p_748) => { - let retKwd_749 = safeLast_701(p_748); - let maybeDot_750 = pop_717(p_748).chain(safeLast_701); - if (maybeDot_750.map(isDot_694).getOrElse(false)) { +const Just = _ramdaFantasy.Maybe.Just; +const Nothing = _ramdaFantasy.Maybe.Nothing; + + +const LSYNTAX = { name: 'left-syntax' }; +const RSYNTAX = { name: 'right-syntax' }; +const AT = { klass: _tokenizer.TokenClass.Punctuator, name: "@" }; + +// TODO: also, need to handle contextual yield +const literalKeywords = ['this', 'null', 'true', 'false']; + +// Token -> Boolean +const isLeftBracket = R.whereEq({ type: _tokenizer.TokenType.LBRACK }); +const isLeftBrace = R.whereEq({ type: _tokenizer.TokenType.LBRACE }); +const isLeftParen = R.whereEq({ type: _tokenizer.TokenType.LPAREN }); +const isRightBracket = R.whereEq({ type: _tokenizer.TokenType.RBRACK }); +const isRightBrace = R.whereEq({ type: _tokenizer.TokenType.RBRACE }); +const isRightParen = R.whereEq({ type: _tokenizer.TokenType.RPAREN }); + +const isEOS = R.whereEq({ type: _tokenizer.TokenType.EOS }); + +// const isHash = R.whereEq({ type: TokenType.IDENTIFIER, value: '#'}); +const isLeftSyntax = R.whereEq({ type: LSYNTAX }); +const isRightSyntax = R.whereEq({ type: RSYNTAX }); + +const isLeftDelimiter = R.anyPass([isLeftBracket, isLeftBrace, isLeftParen, isLeftSyntax]); + +const isRightDelimiter = R.anyPass([isRightBracket, isRightBrace, isRightParen, isRightSyntax]); + +const isMatchingDelimiters = R.cond([[isLeftBracket, (_, b) => isRightBracket(b)], [isLeftBrace, (_, b) => isRightBrace(b)], [isLeftParen, (_, b) => isRightParen(b)], [isLeftSyntax, (_, b) => isRightSyntax(b)], [R.T, R.F]]); + +const assignOps = ["=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "|=", "^=", ","]; + +const binaryOps = ["+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", "|", "^", "&&", "||", "?", ":", "===", "==", ">=", "<=", "<", ">", "!=", "!==", "instanceof"]; + +const unaryOps = ["++", "--", "~", "!", "delete", "void", "typeof", "yield", "throw", "new"]; + +// List -> Boolean +const isEmpty = R.whereEq({ size: 0 }); + +// Syntax -> Boolean +const isPunctuator = s => s.match("punctuator"); +const isKeyword = s => s.match("keyword"); +const isParens = s => s.match("parens"); +const isBraces = s => s.match("braces"); +const isIdentifier = s => s.match("identifier"); + +// Any -> Syntax -> Boolean +const isVal = R.curry((v, s) => s.val() === v); + +// Syntax -> Boolean +const isDot = R.allPass([isPunctuator, isVal('.')]); +const isColon = R.allPass([isPunctuator, isVal(':')]); +const isFunctionKeyword = R.allPass([isKeyword, isVal('function')]); +const isOperator = s => (s.match("punctuator") || s.match("keyword")) && R.any(R.equals(s.val()), assignOps.concat(binaryOps).concat(unaryOps)); +const isNonLiteralKeyword = R.allPass([isKeyword, s => R.none(R.equals(s.val()), literalKeywords)]); +const isKeywordExprPrefix = R.allPass([isKeyword, s => R.any(R.equals(s.val()), ['instanceof', 'typeof', 'delete', 'void', 'yield', 'throw', 'new', 'case'])]); +// List a -> a? +let last = p => p.last(); +// List a -> Maybe a +let safeLast = R.pipe(R.cond([[isEmpty, R.always(Nothing())], [R.T, R.compose(_ramdaFantasy.Maybe.of, last)]])); + +// TODO: better name +// List -> Boolean -> Maybe List +let stuffTrue = R.curry((p, b) => b ? Just(p) : Nothing()); +let stuffFalse = R.curry((p, b) => !b ? Just(p) : Nothing()); + +// List a -> Boolean +let isTopColon = R.pipe(safeLast, R.map(isColon), _ramdaFantasy.Maybe.maybe(false, R.identity)); +// List a -> Boolean +let isTopPunctuator = R.pipe(safeLast, R.map(isPunctuator), _ramdaFantasy.Maybe.maybe(false, R.identity)); + +// Number -> List -> Boolean +let isExprReturn = R.curry((l, p) => { + let retKwd = safeLast(p); + let maybeDot = pop(p).chain(safeLast); + + if (maybeDot.map(isDot).getOrElse(false)) { return true; } - return retKwd_749.map(s_751 => { - return s_751.match("keyword") && s_751.val() === "return" && s_751.lineNumber() === l_747; + return retKwd.map(s => { + return s.match("keyword") && s.val() === 'return' && s.lineNumber() === l; }).getOrElse(false); }); -const isTopOperator_707 = R.pipe(safeLast_701, R.map(isOperator_697), _ramdaFantasy.Maybe.maybe(false, R.identity)); -const isTopKeywordExprPrefix_708 = R.pipe(safeLast_701, R.map(isKeywordExprPrefix_699), _ramdaFantasy.Maybe.maybe(false, R.identity)); -let isExprPrefix_709 = R.curry((l_752, b_753) => R.cond([[isEmpty_684, R.always(b_753)], [isTopColon_704, R.always(b_753)], [isTopKeywordExprPrefix_708, R.T], [isTopOperator_707, R.T], [isTopPunctuator_705, R.always(b_753)], [isExprReturn_706(l_752), R.T], [R.T, R.F]])); -let curly_710 = p_754 => safeLast_701(p_754).map(isBraces_689).chain(stuffTrue_702(p_754)); -let paren_711 = p_755 => safeLast_701(p_755).map(isParens_688).chain(stuffTrue_702(p_755)); -let func_712 = p_756 => safeLast_701(p_756).map(isFunctionKeyword_696).chain(stuffTrue_702(p_756)); -let ident_713 = p_757 => safeLast_701(p_757).map(isIdentifier_691).chain(stuffTrue_702(p_757)); -let nonLiteralKeyword_714 = p_758 => safeLast_701(p_758).map(isNonLiteralKeyword_698).chain(stuffTrue_702(p_758)); -let opt_715 = R.curry((a_759, b_760, p_761) => { - let result_762 = R.pipeK(a_759, b_760)(_ramdaFantasy.Maybe.of(p_761)); - return _ramdaFantasy.Maybe.isJust(result_762) ? result_762 : _ramdaFantasy.Maybe.of(p_761); + +const isTopOperator = R.pipe(safeLast, R.map(isOperator), _ramdaFantasy.Maybe.maybe(false, R.identity)); + +const isTopKeywordExprPrefix = R.pipe(safeLast, R.map(isKeywordExprPrefix), _ramdaFantasy.Maybe.maybe(false, R.identity)); + +// Number -> Boolean -> List -> Boolean +let isExprPrefix = R.curry((l, b) => R.cond([ +// ... ({x: 42} /r/i) +[isEmpty, R.always(b)], +// ... ({x: {x: 42} /r/i }) +[isTopColon, R.always(b)], +// ... throw {x: 42} /r/i +[isTopKeywordExprPrefix, R.T], +// ... 42 + {x: 42} /r/i +[isTopOperator, R.T], +// ... for ( ; {x: 42}/r/i) +[isTopPunctuator, R.always(b)], +// ... return {x: 42} /r /i +// ... return\n{x: 42} /r /i +[isExprReturn(l), R.T], [R.T, R.F]])); + +// List a -> Maybe List a +let curly = p => safeLast(p).map(isBraces).chain(stuffTrue(p)); +let paren = p => safeLast(p).map(isParens).chain(stuffTrue(p)); +let func = p => safeLast(p).map(isFunctionKeyword).chain(stuffTrue(p)); +let ident = p => safeLast(p).map(isIdentifier).chain(stuffTrue(p)); +let nonLiteralKeyword = p => safeLast(p).map(isNonLiteralKeyword).chain(stuffTrue(p)); + +let opt = R.curry((a, b, p) => { + let result = R.pipeK(a, b)(_ramdaFantasy.Maybe.of(p)); + return _ramdaFantasy.Maybe.isJust(result) ? result : _ramdaFantasy.Maybe.of(p); }); -let notDot_716 = R.ifElse(R.whereEq({ size: 0 }), Just_662, p_763 => safeLast_701(p_763).map(s_764 => !(s_764.match("punctuator") && s_764.val() === ".")).chain(stuffTrue_702(p_763))); -let pop_717 = R.compose(Just_662, p_765 => p_765.pop()); -const functionPrefix_718 = R.pipeK(curly_710, pop_717, paren_711, pop_717, opt_715(ident_713, pop_717), func_712); -const isRegexPrefix_719 = b_766 => R.anyPass([isEmpty_684, isTopPunctuator_705, R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(nonLiteralKeyword_714, pop_717, notDot_716), _ramdaFantasy.Maybe.isJust), R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(paren_711, pop_717, nonLiteralKeyword_714, pop_717, notDot_716), _ramdaFantasy.Maybe.isJust), R.pipe(_ramdaFantasy.Maybe.of, functionPrefix_718, R.chain(p_767 => { - return safeLast_701(p_767).map(s_768 => s_768.lineNumber()).chain(fnLine_769 => { - return pop_717(p_767).map(isExprPrefix_709(fnLine_769, b_766)); - }).chain(stuffFalse_703(p_767)); -}), _ramdaFantasy.Maybe.isJust), p_770 => { - let isCurly_771 = _ramdaFantasy.Maybe.isJust(safeLast_701(p_770).map(isBraces_689)); - let alreadyCheckedFunction_772 = R.pipe(_ramdaFantasy.Maybe.of, functionPrefix_718, _ramdaFantasy.Maybe.isJust)(p_770); - if (alreadyCheckedFunction_772) { + +let notDot = R.ifElse(R.whereEq({ size: 0 }), Just, p => safeLast(p).map(s => !(s.match("punctuator") && s.val() === '.')).chain(stuffTrue(p))); + +// List a -> Maybe List a +let pop = R.compose(Just, p => p.pop()); + +// Maybe List a -> Maybe List a +const functionPrefix = R.pipeK(curly, pop, paren, pop, opt(ident, pop), func); + +// Boolean -> List a -> Boolean +const isRegexPrefix = b => R.anyPass([ +// ε +isEmpty, +// P . t where t ∈ Punctuator +isTopPunctuator, +// P . t . t' where t \not = "." and t' ∈ (Keyword \setminus LiteralKeyword) +R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(nonLiteralKeyword, pop, notDot), _ramdaFantasy.Maybe.isJust), +// P . t . t' . (T) where t \not = "." and t' ∈ (Keyword \setminus LiteralKeyword) +R.pipe(_ramdaFantasy.Maybe.of, R.pipeK(paren, pop, nonLiteralKeyword, pop, notDot), _ramdaFantasy.Maybe.isJust), +// P . function^l . x? . () . {} where isExprPrefix(P, b, l) = false +R.pipe(_ramdaFantasy.Maybe.of, functionPrefix, R.chain(p => { + return safeLast(p).map(s => s.lineNumber()).chain(fnLine => { + return pop(p).map(isExprPrefix(fnLine, b)); + }).chain(stuffFalse(p)); +}), _ramdaFantasy.Maybe.isJust), +// P . {T}^l where isExprPrefix(P, b, l) = false +p => { + let alreadyCheckedFunction = R.pipe(_ramdaFantasy.Maybe.of, functionPrefix, _ramdaFantasy.Maybe.isJust)(p); + if (alreadyCheckedFunction) { return false; } - return R.pipe(_ramdaFantasy.Maybe.of, R.chain(curly_710), R.chain(p_773 => { - return safeLast_701(p_773).map(s_774 => s_774.lineNumber()).chain(curlyLine_775 => { - return pop_717(p_773).map(isExprPrefix_709(curlyLine_775, b_766)); - }).chain(stuffFalse_703(p_773)); - }), _ramdaFantasy.Maybe.isJust)(p_770); + return R.pipe(_ramdaFantasy.Maybe.of, R.chain(curly), R.chain(p => { + return safeLast(p).map(s => s.lineNumber()).chain(curlyLine => { + return pop(p).map(isExprPrefix(curlyLine, b)); + }).chain(stuffFalse(p)); + }), _ramdaFantasy.Maybe.isJust)(p); }]); -function lastEl_720(l_776) { - return l_776[l_776.length - 1]; + +function lastEl(l) { + return l[l.length - 1]; } + class Reader extends _tokenizer2.default { - constructor(strings_777, context_778, replacements_779) { - super(Array.isArray(strings_777) ? strings_777.join("") : strings_777); + constructor(strings, context, replacements) { + super(Array.isArray(strings) ? strings.join('') : strings); this.delimStack = new Map(); this.insideSyntaxTemplate = [false]; - this.context = context_778; - if (Array.isArray(strings_777)) { + this.context = context; + + // setup splicing replacement array + if (Array.isArray(strings)) { let totalIndex = 0; - this.replacementIndex = R.reduce((acc_780, strRep_781) => { - acc_780.push({ index: totalIndex + strRep_781[0].length, replacement: strRep_781[1] }); - totalIndex += strRep_781[0].length; - return acc_780; - }, [], R.zip(strings_777, replacements_779)); + this.replacementIndex = R.reduce((acc, strRep) => { + acc.push({ + index: totalIndex + strRep[0].length, + replacement: strRep[1] + }); + totalIndex += strRep[0].length; + return acc; + }, [], R.zip(strings, replacements)); } } + read() { - let stack_782 = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; - let b_783 = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; - let singleDelimiter_784 = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + let stack = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + let b = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + let singleDelimiter = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; - let prefix_785 = (0, _immutable.List)(); + let prefix = (0, _immutable.List)(); while (true) { - let tok = this.advance(prefix_785, b_783); + let tok = this.advance(prefix, b); + + // splicing allows syntax and terms if (tok.scopesets || tok instanceof _terms2.default) { - stack_782.push(tok); + stack.push(tok); continue; } if (Array.isArray(tok)) { - Array.prototype.push.apply(stack_782, tok); + Array.prototype.push.apply(stack, tok); continue; } if (_immutable.List.isList(tok)) { - Array.prototype.push.apply(stack_782, tok.toArray()); + Array.prototype.push.apply(stack, tok.toArray()); continue; } - if (isEOS_674(tok)) { - if (stack_782[0] && isLeftDelimiter_678(stack_782[0].token)) { + + if (isEOS(tok)) { + if (stack[0] && isLeftDelimiter(stack[0].token)) { throw this.createUnexpected(tok); } break; } - if (isLeftDelimiter_678(tok)) { - if (isLeftSyntax_676(tok)) { + + if (isLeftDelimiter(tok)) { + if (isLeftSyntax(tok)) { this.insideSyntaxTemplate.push(true); } let line = tok.slice.startLocation.line; - let innerB = isLeftBrace_669(tok) ? isExprPrefix_709(line, b_783)(prefix_785) : true; + let innerB = isLeftBrace(tok) ? isExprPrefix(line, b)(prefix) : true; let inner = this.read([new _syntax2.default(tok, this.context)], innerB, false); let stx = new _syntax2.default(inner, this.context); - prefix_785 = prefix_785.concat(stx); - stack_782.push(stx); - if (singleDelimiter_784) { + prefix = prefix.concat(stx); + stack.push(stx); + if (singleDelimiter) { break; } - } else if (isRightDelimiter_679(tok)) { - if (stack_782[0] && !isMatchingDelimiters_680(stack_782[0].token, tok)) { + } else if (isRightDelimiter(tok)) { + if (stack[0] && !isMatchingDelimiters(stack[0].token, tok)) { throw this.createUnexpected(tok); } let stx = new _syntax2.default(tok, this.context); - stack_782.push(stx); - if (lastEl_720(this.insideSyntaxTemplate) && isRightSyntax_677(tok)) { + stack.push(stx); + if (lastEl(this.insideSyntaxTemplate) && isRightSyntax(tok)) { this.insideSyntaxTemplate.pop(); } break; } else { let stx = new _syntax2.default(tok, this.context); - prefix_785 = prefix_785.concat(stx); - stack_782.push(stx); + prefix = prefix.concat(stx); + stack.push(stx); } } - return (0, _immutable.List)(stack_782); + return (0, _immutable.List)(stack); } - advance(prefix_786, b_787) { - let startLocation_788 = this.getLocation(); + + advance(prefix, b) { this.lastIndex = this.index; this.lastLine = this.line; this.lastLineStart = this.lineStart; + this.skipComment(); + this.startIndex = this.index; this.startLine = this.line; this.startLineStart = this.lineStart; + if (this.replacementIndex && this.replacementIndex[0] && this.index >= this.replacementIndex[0].index) { let rep = this.replacementIndex[0].replacement; this.replacementIndex.shift(); return rep; } - let charCode_789 = this.source.charCodeAt(this.index); - if (charCode_789 === 96) { + + let charCode = this.source.charCodeAt(this.index); + + if (charCode === 0x60) { + // ` let element, items = []; - let startLocation_788 = this.getLocation(); + let startLocation = this.getLocation(); let start = this.index; this.index++; - if (lastEl_720(this.insideSyntaxTemplate)) { - let slice = this.getSlice(start, startLocation_788); - return { type: RSYNTAX_665, value: "`", slice: slice }; + if (lastEl(this.insideSyntaxTemplate)) { + + let slice = this.getSlice(start, startLocation); + return { + type: RSYNTAX, + value: '`', + slice: slice + }; } do { element = this.scanTemplateElement(); items.push(element); if (element.interp) { + // only read the single delimiter element = this.read([], false, true); (0, _errors.assert)(element.size === 1, "should only have read a single delimiter inside a template"); items.push(element.get(0)); } } while (!element.tail); - return { type: _tokenizer.TokenType.TEMPLATE, items: (0, _immutable.List)(items), slice: this.getSlice(start, startLocation_788) }; - } else if (charCode_789 === 35) { - let startLocation_788 = this.getLocation(); + return { + type: _tokenizer.TokenType.TEMPLATE, + items: (0, _immutable.List)(items), + slice: this.getSlice(start, startLocation) + }; + } else if (charCode === 35) { + // # + let startLocation = this.getLocation(); let start = this.index; - let slice = this.getSlice(start, startLocation_788); + let slice = this.getSlice(start, startLocation); this.index++; - if (this.source.charCodeAt(this.index) === 96) { + // TODO: handle ` inside of syntax template interpolations + if (this.source.charCodeAt(this.index) === 0x60) { + // ` this.index++; - return { type: LSYNTAX_664, value: "#`", slice: slice }; + return { + type: LSYNTAX, + value: '#`', + slice: slice + }; } - return { type: _tokenizer.TokenType.IDENTIFIER, value: "#", slice: slice }; - } else if (charCode_789 === 64) { - let startLocation_788 = this.getLocation(); + return { + type: _tokenizer.TokenType.IDENTIFIER, + value: '#', + slice: slice + }; + } else if (charCode === 64) { + // @ + let startLocation = this.getLocation(); let start = this.index; - let slice = this.getSlice(start, startLocation_788); + let slice = this.getSlice(start, startLocation); this.index++; - return { type: AT_666, value: "@", slice: slice }; + return { + type: AT, + value: '@', + slice: slice + }; } - let lookahead_790 = super.advance(); - if (lookahead_790.type === _tokenizer.TokenType.DIV && isRegexPrefix_719(b_787)(prefix_786)) { + + let lookahead = super.advance(); + if (lookahead.type === _tokenizer.TokenType.DIV && isRegexPrefix(b)(prefix)) { return super.scanRegExp("/"); } - return lookahead_790; + return lookahead; } + + // need to override how templates are lexed because of delimiters scanTemplateElement() { - let startLocation_791 = this.getLocation(); - let start_792 = this.index; + let startLocation = this.getLocation(); + let start = this.index; while (this.index < this.source.length) { let ch = this.source.charCodeAt(this.index); switch (ch) { - case 96: - let slice = this.getSlice(start_792, startLocation_791); - this.index++; - return { type: _tokenizer.TokenType.TEMPLATE, tail: true, interp: false, slice: slice }; - case 36: - if (this.source.charCodeAt(this.index + 1) === 123) { - let slice = this.getSlice(start_792, startLocation_791); + case 0x60: + { + // ` + // don't include the traling "`" + let slice = this.getSlice(start, startLocation); + this.index++; + return { + type: _tokenizer.TokenType.TEMPLATE, + tail: true, + interp: false, + slice: slice + }; + } + case 0x24: + // $ + if (this.source.charCodeAt(this.index + 1) === 0x7B) { + // { + // don't include the trailing "$" + let slice = this.getSlice(start, startLocation); this.index += 1; - return { type: _tokenizer.TokenType.TEMPLATE, tail: false, interp: true, slice: slice }; + return { + type: _tokenizer.TokenType.TEMPLATE, + tail: false, + interp: true, + slice: slice + }; } this.index++; break; - case 92: + case 0x5C: + // \\ { let octal = this.scanStringEscape("", null)[1]; if (octal != null) { @@ -278,8 +411,9 @@ class Reader extends _tokenizer2.default { this.index++; } } + throw this.createILLEGAL(); } } exports.default = Reader; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3NoaWZ0LXJlYWRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7OztBQUVBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7SUFBYSxDOzs7Ozs7QUFDYixNQUFNLFdBQVcsb0JBQU0sSUFBdkI7QUFDQSxNQUFNLGNBQWMsb0JBQU0sT0FBMUI7QUFDQSxNQUFNLGNBQWMsRUFBQyxNQUFNLGFBQVAsRUFBcEI7QUFDQSxNQUFNLGNBQWMsRUFBQyxNQUFNLGNBQVAsRUFBcEI7QUFDQSxNQUFNLFNBQVMsRUFBQyxPQUFPLHNCQUFXLFVBQW5CLEVBQStCLE1BQU0sR0FBckMsRUFBZjtBQUNBLE1BQU0sc0JBQXNCLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsTUFBakIsRUFBeUIsT0FBekIsQ0FBNUI7QUFDQSxNQUFNLG9CQUFvQixFQUFFLE9BQUYsQ0FBVSxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBVixDQUExQjtBQUNBLE1BQU0sa0JBQWtCLEVBQUUsT0FBRixDQUFVLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUFWLENBQXhCO0FBQ0EsTUFBTSxrQkFBa0IsRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLE1BQWpCLEVBQVYsQ0FBeEI7QUFDQSxNQUFNLHFCQUFxQixFQUFFLE9BQUYsQ0FBVSxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBVixDQUEzQjtBQUNBLE1BQU0sbUJBQW1CLEVBQUUsT0FBRixDQUFVLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUFWLENBQXpCO0FBQ0EsTUFBTSxtQkFBbUIsRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLE1BQWpCLEVBQVYsQ0FBekI7QUFDQSxNQUFNLFlBQVksRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLEdBQWpCLEVBQVYsQ0FBbEI7QUFDQSxNQUFNLGFBQWEsRUFBRSxPQUFGLENBQVUsRUFBQyxNQUFNLHFCQUFVLFVBQWpCLEVB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aEQsRUFBc0QsT0FBTyxLQUE3RCxFQUFQO0FBQ0Q7QUFDRCxlQUFLLEtBQUw7QUFDQTtBQUNGLGFBQUssRUFBTDtBQUNFO0FBQ0UsZ0JBQUksUUFBUSxLQUFLLGdCQUFMLENBQXNCLEVBQXRCLEVBQTBCLElBQTFCLEVBQWdDLENBQWhDLENBQVo7QUFDQSxnQkFBSSxTQUFTLElBQWIsRUFBbUI7QUFDakIsb0JBQU0sS0FBSyxhQUFMLEVBQU47QUFDRDtBQUNEO0FBQ0Q7QUFDSDtBQUNFLGVBQUssS0FBTDtBQXRCSjtBQXdCRDtBQUNELFVBQU0sS0FBSyxhQUFMLEVBQU47QUFDRDtBQTVKMkM7a0JBQXpCLE0iLCJmaWxlIjoic2hpZnQtcmVhZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRva2VuaXplciBmcm9tIFwic2hpZnQtcGFyc2VyL2Rpc3QvdG9rZW5pemVyXCI7XG5pbXBvcnQge1Rva2VuQ2xhc3MsIFRva2VuVHlwZX0gZnJvbSBcInNoaWZ0LXBhcnNlci9kaXN0L3Rva2VuaXplclwiO1xuaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHtNYXliZX0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQgICogYXMgUiBmcm9tIFwicmFtZGFcIjtcbmNvbnN0IEp1c3RfNjYyID0gTWF5YmUuSnVzdDtcbmNvbnN0IE5vdGhpbmdfNjYzID0gTWF5YmUuTm90aGluZztcbmNvbnN0IExTWU5UQVhfNjY0ID0ge25hbWU6IFwibGVmdC1zeW50YXhcIn07XG5jb25zdCBSU1lOVEFYXzY2NSA9IHtuYW1lOiBcInJpZ2h0LXN5bnRheFwifTtcbmNvbnN0IEFUXzY2NiA9IHtrbGFzczogVG9rZW5DbGFzcy5QdW5jdHVhdG9yLCBuYW1lOiBcIkBcIn07XG5jb25zdCBsaXRlcmFsS2V5d29yZHNfNjY3ID0gW1widGhpc1wiLCBcIm51bGxcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIl07XG5jb25zdCBpc0xlZnRCcmFja2V0XzY2OCA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLkxCUkFDS30pO1xuY29uc3QgaXNMZWZ0QnJhY2VfNjY5ID0gUi53aGVyZUVxKHt0eXBlOiBUb2tlblR5cGUuTEJSQUNFfSk7XG5jb25zdCBpc0xlZnRQYXJlbl82NzAgPSBSLndoZXJlRXEoe3R5cGU6IFRva2VuVHlwZS5MUEFSRU59KTtcbmNvbnN0IGlzUmlnaHRCcmFja2V0XzY3MSA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLlJCUkFDS30pO1xuY29uc3QgaXNSaWdodEJyYWNlXzY3MiA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLlJCUkFDRX0pO1xuY29uc3QgaXNSaWdodFBhcmVuXzY3MyA9IFIud2hlcmVFcSh7dHlwZTogVG9rZW5UeXBlLlJQQVJFTn0pO1xuY29uc3QgaXNFT1NfNjc0ID0gUi53aGVyZUVxKHt0eXBlOiBUb2tlblR5cGUuRU9TfSk7XG5jb25zdCBpc0hhc2hfNjc1ID0gUi53aGVyZUVxKHt0eXBlOiBUb2tlblR5cGUuSURFTlRJRklFUiwgdmFsdWU6IFwiI1wifSk7XG5jb25zdCBpc0xlZnRTeW50YXhfNjc2ID0gUi53aGVyZUVxKHt0eXBlOiBMU1lOVEFYXzY2NH0pO1xuY29uc3QgaXNSaWdodFN5bnRheF82NzcgPSBSLndoZXJlRXEoe3R5cGU6IFJTWU5UQVhfNjY1fSk7XG5jb25zdCBpc0xlZnREZWxpbWl0ZXJfNjc4ID0gUi5hbnlQYXNzKFtpc0xlZnRCcmFja2V0XzY2OCwgaXNMZWZ0QnJhY2VfNjY5LCBpc0xlZnRQYXJlbl82NzAsIGlzTGVmdFN5bnRheF82NzZdKTtcbmNvbnN0IGlzUmlnaHREZWxpbWl0ZXJfNjc5ID0gUi5hbnlQYXNzKFtpc1JpZ2h0QnJhY2tldF82NzEsIGlzUmlnaHRCcmFjZV82NzIsIGlzUmlnaHRQYXJlbl82NzMsIGlzUmlnaHRTeW50YXhfNjc3XSk7XG5jb25zdCBpc01hdGNoaW5nRGVsaW1pdGVyc182ODAgPSBSLmNvbmQoW1tpc0xlZnRCcmFja2V0XzY2OCwgKF9fNzIxLCBiXzcyMikgPT4gaXNSaWdodEJyYWNrZXRfNjcxKGJfNzIyKV0sIFtpc0xlZnRCcmFjZV82NjksIChfXzcyMywgYl83MjQpID0+IGlzUmlnaHRCcmFjZV82NzIoYl83MjQpXSwgW2lzTGVmdFBhcmVuXzY3MCwgKF9fNzI1LCBiXzcyNikgPT4gaXNSaWdodFBhcmVuXzY3MyhiXzcyNildLCBbaXNMZWZ0U3ludGF4XzY3NiwgKF9fNzI3LCBiXzcyOCkgPT4gaXNSaWdodFN5bnRheF82NzcoYl83MjgpXSwgW1IuVCwgUi5GXV0pO1xuY29uc3QgYXNzaWduT3BzXzY4MSA9IFtcIj1cIiwgXCIrPVwiLCBcIi09XCIsIFwiKj1cIiwgXCIvPVwiLCBcIiU9XCIsIFwiPDw9XCIsIFwiPj49XCIsIFwiPj4+PVwiLCBcIiY9XCIsIFwifD1cIiwgXCJePVwiLCBcIixcIl07XG5jb25zdCBiaW5hcnlPcHNfNjgyID0gW1wiK1wiLCBcIi1cIiwgXCIqXCIsIFwiL1wiLCBcIiVcIiwgXCI8PFwiLCBcIj4+XCIsIFwiPj4+XCIsIFwiJlwiLCBcInxcIiwgXCJeXCIsIFwiJiZcIiwgXCJ8fFwiLCBcIj9cIiwgXCI6XCIsIFwiPT09XCIsIFwiPT1cIiwgXCI+PVwiLCBcIjw9XCIsIFwiPFwiLCBcIj5cIiwgXCIhPVwiLCBcIiE9PVwiLCBcImluc3RhbmNlb2ZcIl07XG5jb25zdCB1bmFyeU9wc182ODMgPSBbXCIrK1wiLCBcIi0tXCIsIFwiflwiLCBcIiFcIiwgXCJkZWxldGVcIiwgXCJ2b2lkXCIsIFwidHlwZW9mXCIsIFwieWllbGRcIiwgXCJ0aHJvd1wiLCBcIm5ld1wiXTtcbmNvbnN0IGlzRW1wdHlfNjg0ID0gUi53aGVyZUVxKHtzaXplOiAwfSk7XG5jb25zdCBpc1B1bmN0dWF0b3JfNjg1ID0gc183MjkgPT4gc183MjkubWF0Y2goXCJwdW5jdHVhdG9yXCIpO1xuY29uc3QgaXNLZXl3b3JkXzY4NiA9IHNfNzMwID0+IHNfNzMwLm1hdGNoKFwia2V5d29yZFwiKTtcbmNvbnN0IGlzRGVsaW1pdGVyXzY4NyA9IHNfNzMxID0+IHNfNzMxLm1hdGNoKFwiZGVsaW1pdGVyXCIpO1xuY29uc3QgaXNQYXJlbnNfNjg4ID0gc183MzIgPT4gc183MzIubWF0Y2goXCJwYXJlbnNcIik7XG5jb25zdCBpc0JyYWNlc182ODkgPSBzXzczMyA9PiBzXzczMy5tYXRjaChcImJyYWNlc1wiKTtcbmNvbnN0IGlzQnJhY2tldHNfNjkwID0gc183MzQgPT4gc183MzQubWF0Y2goXCJicmFja2V0c1wiKTtcbmNvbnN0IGlzSWRlbnRpZmllcl82OTEgPSBzXzczNSA9PiBzXzczNS5tYXRjaChcImlkZW50aWZpZXJcIik7XG5jb25zdCB2YWxfNjkyID0gc183MzYgPT4gc183MzYudmFsKCk7XG5jb25zdCBpc1ZhbF82OTMgPSBSLmN1cnJ5KCh2XzczNywgc183MzgpID0+IHNfNzM4LnZhbCgpID09PSB2XzczNyk7XG5jb25zdCBpc0RvdF82OTQgPSBSLmFsbFBhc3MoW2lzUHVuY3R1YXRvcl82ODUsIGlzVmFsXzY5MyhcIi5cIildKTtcbmNvbnN0IGlzQ29sb25fNjk1ID0gUi5hbGxQYXNzKFtpc1B1bmN0dWF0b3JfNjg1LCBpc1ZhbF82OTMoXCI6XCIpXSk7XG5jb25zdCBpc0Z1bmN0aW9uS2V5d29yZF82OTYgPSBSLmFsbFBhc3MoW2lzS2V5d29yZF82ODYsIGlzVmFsXzY5MyhcImZ1bmN0aW9uXCIpXSk7XG5jb25zdCBpc09wZXJhdG9yXzY5NyA9IHNfNzM5ID0+IChzXzczOS5tYXRjaChcInB1bmN0dWF0b3JcIikgfHwgc183MzkubWF0Y2goXCJrZXl3b3JkXCIpKSAmJiBSLmFueShSLmVxdWFscyhzXzczOS52YWwoKSksIGFzc2lnbk9wc182ODEuY29uY2F0KGJpbmFyeU9wc182ODIpLmNvbmNhdCh1bmFyeU9wc182ODMpKTtcbmNvbnN0IGlzTm9uTGl0ZXJhbEtleXdvcmRfNjk4ID0gUi5hbGxQYXNzKFtpc0tleXdvcmRfNjg2LCBzXzc0MCA9PiBSLm5vbmUoUi5lcXVhbHMoc183NDAudmFsKCkpLCBsaXRlcmFsS2V5d29yZHNfNjY3KV0pO1xuY29uc3QgaXNLZXl3b3JkRXhwclByZWZpeF82OTkgPSBSLmFsbFBhc3MoW2lzS2V5d29yZF82ODYsIHNfNzQxID0+IFIuYW55KFIuZXF1YWxzKHNfNzQxLnZhbCgpKSwgW1wiaW5zdGFuY2VvZlwiLCBcInR5cGVvZlwiLCBcImRlbGV0ZVwiLCBcInZvaWRcIiwgXCJ5aWVsZFwiLCBcInRocm93XCIsIFwibmV3XCIsIFwiY2FzZVwiXSldKTtcbmxldCBsYXN0XzcwMCA9IHBfNzQyID0+IHBfNzQyLmxhc3QoKTtcbmxldCBzYWZlTGFzdF83MDEgPSBSLnBpcGUoUi5jb25kKFtbaXNFbXB0eV82ODQsIFIuYWx3YXlzKE5vdGhpbmdfNjYzKCkpXSwgW1IuVCwgUi5jb21wb3NlKE1heWJlLm9mLCBsYXN0XzcwMCldXSkpO1xubGV0IHN0dWZmVHJ1ZV83MDIgPSBSLmN1cnJ5KChwXzc0MywgYl83NDQpID0+IGJfNzQ0ID8gSnVzdF82NjIocF83NDMpIDogTm90aGluZ182NjMoKSk7XG5sZXQgc3R1ZmZGYWxzZV83MDMgPSBSLmN1cnJ5KChwXzc0NSwgYl83NDYpID0+ICFiXzc0NiA/IEp1c3RfNjYyKHBfNzQ1KSA6IE5vdGhpbmdfNjYzKCkpO1xubGV0IGlzVG9wQ29sb25fNzA0ID0gUi5waXBlKHNhZmVMYXN0XzcwMSwgUi5tYXAoaXNDb2xvbl82OTUpLCBNYXliZS5tYXliZShmYWxzZSwgUi5pZGVudGl0eSkpO1xubGV0IGlzVG9wUHVuY3R1YXRvcl83MDUgPSBSLnBpcGUoc2FmZUxhc3RfNzAxLCBSLm1hcChpc1B1bmN0dWF0b3JfNjg1KSwgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpKTtcbmxldCBpc0V4cHJSZXR1cm5fNzA2ID0gUi5jdXJyeSgobF83NDcsIHBfNzQ4KSA9PiB7XG4gIGxldCByZXRLd2RfNzQ5ID0gc2FmZUxhc3RfNzAxKHBfNzQ4KTtcbiAgbGV0IG1heWJlRG90Xzc1MCA9IHBvcF83MTcocF83NDgpLmNoYWluKHNhZmVMYXN0XzcwMSk7XG4gIGlmIChtYXliZURvdF83NTAubWFwKGlzRG90XzY5NCkuZ2V0T3JFbHNlKGZhbHNlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZXRLd2RfNzQ5Lm1hcChzXzc1MSA9PiB7XG4gICAgcmV0dXJuIHNfNzUxLm1hdGNoKFwia2V5d29yZFwiKSAmJiBzXzc1MS52YWwoKSA9PT0gXCJyZXR1cm5cIiAmJiBzXzc1MS5saW5lTnVtYmVyKCkgPT09IGxfNzQ3O1xuICB9KS5nZXRPckVsc2UoZmFsc2UpO1xufSk7XG5jb25zdCBpc1RvcE9wZXJhdG9yXzcwNyA9IFIucGlwZShzYWZlTGFzdF83MDEsIFIubWFwKGlzT3BlcmF0b3JfNjk3KSwgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpKTtcbmNvbnN0IGlzVG9wS2V5d29yZEV4cHJQcmVmaXhfNzA4ID0gUi5waXBlKHNhZmVMYXN0XzcwMSwgUi5tYXAoaXNLZXl3b3JkRXhwclByZWZpeF82OTkpLCBNYXliZS5tYXliZShmYWxzZSwgUi5pZGVudGl0eSkpO1xubGV0IGlzRXhwclByZWZpeF83MDkgPSBSLmN1cnJ5KChsXzc1MiwgYl83NTMpID0+IFIuY29uZChbW2lzRW1wdHlfNjg0LCBSLmFsd2F5cyhiXzc1MyldLCBbaXNUb3BDb2xvbl83MDQsIFIuYWx3YXlzKGJfNzUzKV0sIFtpc1RvcEtleXdvcmRFeHByUHJlZml4XzcwOCwgUi5UXSwgW2lzVG9wT3BlcmF0b3JfNzA3LCBSLlRdLCBbaXNUb3BQdW5jdHVhdG9yXzcwNSwgUi5hbHdheXMoYl83NTMpXSwgW2lzRXhwclJldHVybl83MDYobF83NTIpLCBSLlRdLCBbUi5ULCBSLkZdXSkpO1xubGV0IGN1cmx5XzcxMCA9IHBfNzU0ID0+IHNhZmVMYXN0XzcwMShwXzc1NCkubWFwKGlzQnJhY2VzXzY4OSkuY2hhaW4oc3R1ZmZUcnVlXzcwMihwXzc1NCkpO1xubGV0IHBhcmVuXzcxMSA9IHBfNzU1ID0+IHNhZmVMYXN0XzcwMShwXzc1NSkubWFwKGlzUGFyZW5zXzY4OCkuY2hhaW4oc3R1ZmZUcnVlXzcwMihwXzc1NSkpO1xubGV0IGZ1bmNfNzEyID0gcF83NTYgPT4gc2FmZUxhc3RfNzAxKHBfNzU2KS5tYXAoaXNGdW5jdGlvbktleXdvcmRfNjk2KS5jaGFpbihzdHVmZlRydWVfNzAyKHBfNzU2KSk7XG5sZXQgaWRlbnRfNzEzID0gcF83NTcgPT4gc2FmZUxhc3RfNzAxKHBfNzU3KS5tYXAoaXNJZGVudGlmaWVyXzY5MSkuY2hhaW4oc3R1ZmZUcnVlXzcwMihwXzc1NykpO1xubGV0IG5vbkxpdGVyYWxLZXl3b3JkXzcxNCA9IHBfNzU4ID0+IHNhZmVMYXN0XzcwMShwXzc1OCkubWFwKGlzTm9uTGl0ZXJhbEtleXdvcmRfNjk4KS5jaGFpbihzdHVmZlRydWVfNzAyKHBfNzU4KSk7XG5sZXQgb3B0XzcxNSA9IFIuY3VycnkoKGFfNzU5LCBiXzc2MCwgcF83NjEpID0+IHtcbiAgbGV0IHJlc3VsdF83NjIgPSBSLnBpcGVLKGFfNzU5LCBiXzc2MCkoTWF5YmUub2YocF83NjEpKTtcbiAgcmV0dXJuIE1heWJlLmlzSnVzdChyZXN1bHRfNzYyKSA/IHJlc3VsdF83NjIgOiBNYXliZS5vZihwXzc2MSk7XG59KTtcbmxldCBub3REb3RfNzE2ID0gUi5pZkVsc2UoUi53aGVyZUVxKHtzaXplOiAwfSksIEp1c3RfNjYyLCBwXzc2MyA9PiBzYWZlTGFzdF83MDEocF83NjMpLm1hcChzXzc2NCA9PiAhKHNfNzY0Lm1hdGNoKFwicHVuY3R1YXRvclwiKSAmJiBzXzc2NC52YWwoKSA9PT0gXCIuXCIpKS5jaGFpbihzdHVmZlRydWVfNzAyKHBfNzYzKSkpO1xubGV0IHBvcF83MTcgPSBSLmNvbXBvc2UoSnVzdF82NjIsIHBfNzY1ID0+IHBfNzY1LnBvcCgpKTtcbmNvbnN0IGZ1bmN0aW9uUHJlZml4XzcxOCA9IFIucGlwZUsoY3VybHlfNzEwLCBwb3BfNzE3LCBwYXJlbl83MTEsIHBvcF83MTcsIG9wdF83MTUoaWRlbnRfNzEzLCBwb3BfNzE3KSwgZnVuY183MTIpO1xuY29uc3QgaXNSZWdleFByZWZpeF83MTkgPSBiXzc2NiA9PiBSLmFueVBhc3MoW2lzRW1wdHlfNjg0LCBpc1RvcFB1bmN0dWF0b3JfNzA1LCBSLnBpcGUoTWF5YmUub2YsIFIucGlwZUsobm9uTGl0ZXJhbEtleXdvcmRfNzE0LCBwb3BfNzE3LCBub3REb3RfNzE2KSwgTWF5YmUuaXNKdXN0KSwgUi5waXBlKE1heWJlLm9mLCBSLnBpcGVLKHBhcmVuXzcxMSwgcG9wXzcxNywgbm9uTGl0ZXJhbEtleXdvcmRfNzE0LCBwb3BfNzE3LCBub3REb3RfNzE2KSwgTWF5YmUuaXNKdXN0KSwgUi5waXBlKE1heWJlLm9mLCBmdW5jdGlvblByZWZpeF83MTgsIFIuY2hhaW4ocF83NjcgPT4ge1xuICByZXR1cm4gc2FmZUxhc3RfNzAxKHBfNzY3KS5tYXAoc183NjggPT4gc183NjgubGluZU51bWJlcigpKS5jaGFpbihmbkxpbmVfNzY5ID0+IHtcbiAgICByZXR1cm4gcG9wXzcxNyhwXzc2NykubWFwKGlzRXhwclByZWZpeF83MDkoZm5MaW5lXzc2OSwgYl83NjYpKTtcbiAgfSkuY2hhaW4oc3R1ZmZGYWxzZV83MDMocF83NjcpKTtcbn0pLCBNYXliZS5pc0p1c3QpLCBwXzc3MCA9PiB7XG4gIGxldCBpc0N1cmx5Xzc3MSA9IE1heWJlLmlzSnVzdChzYWZlTGFzdF83MDEocF83NzApLm1hcChpc0JyYWNlc182ODkpKTtcbiAgbGV0IGFscmVhZHlDaGVja2VkRnVuY3Rpb25fNzcyID0gUi5waXBlKE1heWJlLm9mLCBmdW5jdGlvblByZWZpeF83MTgsIE1heWJlLmlzSnVzdCkocF83NzApO1xuICBpZiAoYWxyZWFkeUNoZWNrZWRGdW5jdGlvbl83NzIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIFIucGlwZShNYXliZS5vZiwgUi5jaGFpbihjdXJseV83MTApLCBSLmNoYWluKHBfNzczID0+IHtcbiAgICByZXR1cm4gc2FmZUxhc3RfNzAxKHBfNzczKS5tYXAoc183NzQgPT4gc183NzQubGluZU51bWJlcigpKS5jaGFpbihjdXJseUxpbmVfNzc1ID0+IHtcbiAgICAgIHJldHVybiBwb3BfNzE3KHBfNzczKS5tYXAoaXNFeHByUHJlZml4XzcwOShjdXJseUxpbmVfNzc1LCBiXzc2NikpO1xuICAgIH0pLmNoYWluKHN0dWZmRmFsc2VfNzAzKHBfNzczKSk7XG4gIH0pLCBNYXliZS5pc0p1c3QpKHBfNzcwKTtcbn1dKTtcbmZ1bmN0aW9uIGxhc3RFbF83MjAobF83NzYpIHtcbiAgcmV0dXJuIGxfNzc2W2xfNzc2Lmxlbmd0aCAtIDFdO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhZGVyIGV4dGVuZHMgVG9rZW5pemVyIHtcbiAgY29uc3RydWN0b3Ioc3RyaW5nc183NzcsIGNvbnRleHRfNzc4LCByZXBsYWNlbWVudHNfNzc5KSB7XG4gICAgc3VwZXIoQXJyYXkuaXNBcnJheShzdHJpbmdzXzc3NykgPyBzdHJpbmdzXzc3Ny5qb2luKFwiXCIpIDogc3RyaW5nc183NzcpO1xuICAgIHRoaXMuZGVsaW1TdGFjayA9IG5ldyBNYXA7XG4gICAgdGhpcy5pbnNpZGVTeW50YXhUZW1wbGF0ZSA9IFtmYWxzZV07XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF83Nzg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RyaW5nc183NzcpKSB7XG4gICAgICBsZXQgdG90YWxJbmRleCA9IDA7XG4gICAgICB0aGlzLnJlcGxhY2VtZW50SW5kZXggPSBSLnJlZHVjZSgoYWNjXzc4MCwgc3RyUmVwXzc4MSkgPT4ge1xuICAgICAgICBhY2NfNzgwLnB1c2goe2luZGV4OiB0b3RhbEluZGV4ICsgc3RyUmVwXzc4MVswXS5sZW5ndGgsIHJlcGxhY2VtZW50OiBzdHJSZXBfNzgxWzFdfSk7XG4gICAgICAgIHRvdGFsSW5kZXggKz0gc3RyUmVwXzc4MVswXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBhY2NfNzgwO1xuICAgICAgfSwgW10sIFIuemlwKHN0cmluZ3NfNzc3LCByZXBsYWNlbWVudHNfNzc5KSk7XG4gICAgfVxuICB9XG4gIHJlYWQoc3RhY2tfNzgyID0gW10sIGJfNzgzID0gZmFsc2UsIHNpbmdsZURlbGltaXRlcl83ODQgPSBmYWxzZSkge1xuICAgIGxldCBwcmVmaXhfNzg1ID0gTGlzdCgpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgdG9rID0gdGhpcy5hZHZhbmNlKHByZWZpeF83ODUsIGJfNzgzKTtcbiAgICAgIGlmICh0b2suc2NvcGVzZXRzIHx8IHRvayBpbnN0YW5jZW9mIFRlcm0pIHtcbiAgICAgICAgc3RhY2tfNzgyLnB1c2godG9rKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b2spKSB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHN0YWNrXzc4MiwgdG9rKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoTGlzdC5pc0xpc3QodG9rKSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzdGFja183ODIsIHRvay50b0FycmF5KCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VPU182NzQodG9rKSkge1xuICAgICAgICBpZiAoc3RhY2tfNzgyWzBdICYmIGlzTGVmdERlbGltaXRlcl82Nzgoc3RhY2tfNzgyWzBdLnRva2VuKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5leHBlY3RlZCh0b2spO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGlzTGVmdERlbGltaXRlcl82NzgodG9rKSkge1xuICAgICAgICBpZiAoaXNMZWZ0U3ludGF4XzY3Nih0b2spKSB7XG4gICAgICAgICAgdGhpcy5pbnNpZGVTeW50YXhUZW1wbGF0ZS5wdXNoKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gdG9rLnNsaWNlLnN0YXJ0TG9jYXRpb24ubGluZTtcbiAgICAgICAgbGV0IGlubmVyQiA9IGlzTGVmdEJyYWNlXzY2OSh0b2spID8gaXNFeHByUHJlZml4XzcwOShsaW5lLCBiXzc4MykocHJlZml4Xzc4NSkgOiB0cnVlO1xuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLnJlYWQoW25ldyBTeW50YXgodG9rLCB0aGlzLmNvbnRleHQpXSwgaW5uZXJCLCBmYWxzZSk7XG4gICAgICAgIGxldCBzdHggPSBuZXcgU3ludGF4KGlubmVyLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICBwcmVmaXhfNzg1ID0gcHJlZml4Xzc4NS5jb25jYXQoc3R4KTtcbiAgICAgICAgc3RhY2tfNzgyLnB1c2goc3R4KTtcbiAgICAgICAgaWYgKHNpbmdsZURlbGltaXRlcl83ODQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1JpZ2h0RGVsaW1pdGVyXzY3OSh0b2spKSB7XG4gICAgICAgIGlmIChzdGFja183ODJbMF0gJiYgIWlzTWF0Y2hpbmdEZWxpbWl0ZXJzXzY4MChzdGFja183ODJbMF0udG9rZW4sIHRvaykpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZVVuZXhwZWN0ZWQodG9rKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3R4ID0gbmV3IFN5bnRheCh0b2ssIHRoaXMuY29udGV4dCk7XG4gICAgICAgIHN0YWNrXzc4Mi5wdXNoKHN0eCk7XG4gICAgICAgIGlmIChsYXN0RWxfNzIwKHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUpICYmIGlzUmlnaHRTeW50YXhfNjc3KHRvaykpIHtcbiAgICAgICAgICB0aGlzLmluc2lkZVN5bnRheFRlbXBsYXRlLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHN0eCA9IG5ldyBTeW50YXgodG9rLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICBwcmVmaXhfNzg1ID0gcHJlZml4Xzc4NS5jb25jYXQoc3R4KTtcbiAgICAgICAgc3RhY2tfNzgyLnB1c2goc3R4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIExpc3Qoc3RhY2tfNzgyKTtcbiAgfVxuICBhZHZhbmNlKHByZWZpeF83ODYsIGJfNzg3KSB7XG4gICAgbGV0IHN0YXJ0TG9jYXRpb25fNzg4ID0gdGhpcy5nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMubGFzdEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmxhc3RMaW5lID0gdGhpcy5saW5lO1xuICAgIHRoaXMubGFzdExpbmVTdGFydCA9IHRoaXMubGluZVN0YXJ0O1xuICAgIHRoaXMuc2tpcENvbW1lbnQoKTtcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuc3RhcnRMaW5lID0gdGhpcy5saW5lO1xuICAgIHRoaXMuc3RhcnRMaW5lU3RhcnQgPSB0aGlzLmxpbmVTdGFydDtcbiAgICBpZiAodGhpcy5yZXBsYWNlbWVudEluZGV4ICYmIHRoaXMucmVwbGFjZW1lbnRJbmRleFswXSAmJiB0aGlzLmluZGV4ID49IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5pbmRleCkge1xuICAgICAgbGV0IHJlcCA9IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5yZXBsYWNlbWVudDtcbiAgICAgIHRoaXMucmVwbGFjZW1lbnRJbmRleC5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHJlcDtcbiAgICB9XG4gICAgbGV0IGNoYXJDb2RlXzc4OSA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG4gICAgaWYgKGNoYXJDb2RlXzc4OSA9PT0gOTYpIHtcbiAgICAgIGxldCBlbGVtZW50LCBpdGVtcyA9IFtdO1xuICAgICAgbGV0IHN0YXJ0TG9jYXRpb25fNzg4ID0gdGhpcy5nZXRMb2NhdGlvbigpO1xuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIGlmIChsYXN0RWxfNzIwKHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUpKSB7XG4gICAgICAgIGxldCBzbGljZSA9IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb25fNzg4KTtcbiAgICAgICAgcmV0dXJuIHt0eXBlOiBSU1lOVEFYXzY2NSwgdmFsdWU6IFwiYFwiLCBzbGljZTogc2xpY2V9O1xuICAgICAgfVxuICAgICAgZG8ge1xuICAgICAgICBlbGVtZW50ID0gdGhpcy5zY2FuVGVtcGxhdGVFbGVtZW50KCk7XG4gICAgICAgIGl0ZW1zLnB1c2goZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LmludGVycCkge1xuICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLnJlYWQoW10sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICBhc3NlcnQoZWxlbWVudC5zaXplID09PSAxLCBcInNob3VsZCBvbmx5IGhhdmUgcmVhZCBhIHNpbmdsZSBkZWxpbWl0ZXIgaW5zaWRlIGEgdGVtcGxhdGVcIik7XG4gICAgICAgICAgaXRlbXMucHVzaChlbGVtZW50LmdldCgwKSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKCFlbGVtZW50LnRhaWwpO1xuICAgICAgcmV0dXJuIHt0eXBlOiBUb2tlblR5cGUuVEVNUExBVEUsIGl0ZW1zOiBMaXN0KGl0ZW1zKSwgc2xpY2U6IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb25fNzg4KX07XG4gICAgfSBlbHNlIGlmIChjaGFyQ29kZV83ODkgPT09IDM1KSB7XG4gICAgICBsZXQgc3RhcnRMb2NhdGlvbl83ODggPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgICBsZXQgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbl83ODgpO1xuICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgaWYgKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgPT09IDk2KSB7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIHt0eXBlOiBMU1lOVEFYXzY2NCwgdmFsdWU6IFwiI2BcIiwgc2xpY2U6IHNsaWNlfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7dHlwZTogVG9rZW5UeXBlLklERU5USUZJRVIsIHZhbHVlOiBcIiNcIiwgc2xpY2U6IHNsaWNlfTtcbiAgICB9IGVsc2UgaWYgKGNoYXJDb2RlXzc4OSA9PT0gNjQpIHtcbiAgICAgIGxldCBzdGFydExvY2F0aW9uXzc4OCA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICBsZXQgc2xpY2UgPSB0aGlzLmdldFNsaWNlKHN0YXJ0LCBzdGFydExvY2F0aW9uXzc4OCk7XG4gICAgICB0aGlzLmluZGV4Kys7XG4gICAgICByZXR1cm4ge3R5cGU6IEFUXzY2NiwgdmFsdWU6IFwiQFwiLCBzbGljZTogc2xpY2V9O1xuICAgIH1cbiAgICBsZXQgbG9va2FoZWFkXzc5MCA9IHN1cGVyLmFkdmFuY2UoKTtcbiAgICBpZiAobG9va2FoZWFkXzc5MC50eXBlID09PSBUb2tlblR5cGUuRElWICYmIGlzUmVnZXhQcmVmaXhfNzE5KGJfNzg3KShwcmVmaXhfNzg2KSkge1xuICAgICAgcmV0dXJuIHN1cGVyLnNjYW5SZWdFeHAoXCIvXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbG9va2FoZWFkXzc5MDtcbiAgfVxuICBzY2FuVGVtcGxhdGVFbGVtZW50KCkge1xuICAgIGxldCBzdGFydExvY2F0aW9uXzc5MSA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcbiAgICBsZXQgc3RhcnRfNzkyID0gdGhpcy5pbmRleDtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCkge1xuICAgICAgbGV0IGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcbiAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgY2FzZSA5NjpcbiAgICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLmdldFNsaWNlKHN0YXJ0Xzc5Miwgc3RhcnRMb2NhdGlvbl83OTEpO1xuICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgICByZXR1cm4ge3R5cGU6IFRva2VuVHlwZS5URU1QTEFURSwgdGFpbDogdHJ1ZSwgaW50ZXJwOiBmYWxzZSwgc2xpY2U6IHNsaWNlfTtcbiAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMSkgPT09IDEyMykge1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydF83OTIsIHN0YXJ0TG9jYXRpb25fNzkxKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgICAgICAgIHJldHVybiB7dHlwZTogVG9rZW5UeXBlLlRFTVBMQVRFLCB0YWlsOiBmYWxzZSwgaW50ZXJwOiB0cnVlLCBzbGljZTogc2xpY2V9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgbGV0IG9jdGFsID0gdGhpcy5zY2FuU3RyaW5nRXNjYXBlKFwiXCIsIG51bGwpWzFdO1xuICAgICAgICAgICAgaWYgKG9jdGFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVJTExFR0FMKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyB0aGlzLmNyZWF0ZUlMTEVHQUwoKTtcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGlmdC1yZWFkZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7QUFFQTs7QUFDQTs7OztBQUNBOztJQUFZLEM7O0FBQ1o7O0FBQ0E7O0FBR0E7Ozs7Ozs7O0FBRkEsTUFBTSxPQUFPLG9CQUFNLElBQW5CO0FBQ0EsTUFBTSxVQUFVLG9CQUFNLE9BQXRCOzs7QUFHQSxNQUFNLFVBQVUsRUFBRSxNQUFNLGFBQVIsRUFBaEI7QUFDQSxNQUFNLFVBQVUsRUFBRSxNQUFNLGNBQVIsRUFBaEI7QUFDQSxNQUFNLEtBQUssRUFBRSxPQUFPLHNCQUFXLFVBQXBCLEVBQWdDLE1BQU0sR0FBdEMsRUFBWDs7QUFHQTtBQUNBLE1BQU0sa0JBQWtCLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsTUFBakIsRUFBeUIsT0FBekIsQ0FBeEI7O0FBRUE7QUFDQSxNQUFNLGdCQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0scUJBQVUsTUFBbEIsRUFBVixDQUF2QjtBQUNBLE1BQU0sY0FBaUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFVLE1BQWxCLEVBQVYsQ0FBdkI7QUFDQSxNQUFNLGNBQWlCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxxQkFBVSxNQUFsQixFQUFWLENBQXZCO0FBQ0EsTUFBTSxpQkFBaUIsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFVLE1BQWxCLEVBQVYsQ0FBdkI7QUFDQSxNQUFNLGVBQWlCLEVBQUUsT0FBRixDQUFVLEVBQUUsTUFBTSxxQkFBVSxNQUFsQixFQUFWLENBQXZCO0FBQ0EsTUFBTSxlQUFpQixFQUFFLE9BQUYsQ0FBVSxFQUFFLE1BQU0scUJBQVUsTUFBbEIsRUFBVixDQUF2Qjs7QUFFQSxNQUFNLFFBQVEsRUFBRSxPQUFGLENBQVUsRUFBRSxNQUFNLHFCQUFVLEdBQWxCLEVBQVYsQ0FBZDs7QUFFQTtBQUNBLE1BQU0sZUFBZSxFQUFFLE9BQUYsQ0FBVSxFQUFFLE1B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anMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVG9rZW5pemVyIGZyb20gXCJzaGlmdC1wYXJzZXIvZGlzdC90b2tlbml6ZXJcIjtcbmltcG9ydCB7IFRva2VuQ2xhc3MsIFRva2VuVHlwZSB9IGZyb20gXCJzaGlmdC1wYXJzZXIvZGlzdC90b2tlbml6ZXJcIjtcbmltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0ICogYXMgUiBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBNYXliZSB9IGZyb20gJ3JhbWRhLWZhbnRhc3knO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi9lcnJvcnMnO1xuY29uc3QgSnVzdCA9IE1heWJlLkp1c3Q7XG5jb25zdCBOb3RoaW5nID0gTWF5YmUuTm90aGluZztcbmltcG9ydCBUZXJtIGZyb20gJy4vdGVybXMnO1xuXG5jb25zdCBMU1lOVEFYID0geyBuYW1lOiAnbGVmdC1zeW50YXgnIH07XG5jb25zdCBSU1lOVEFYID0geyBuYW1lOiAncmlnaHQtc3ludGF4JyB9O1xuY29uc3QgQVQgPSB7IGtsYXNzOiBUb2tlbkNsYXNzLlB1bmN0dWF0b3IsIG5hbWU6IFwiQFwiIH07XG5cblxuLy8gVE9ETzogYWxzbywgbmVlZCB0byBoYW5kbGUgY29udGV4dHVhbCB5aWVsZFxuY29uc3QgbGl0ZXJhbEtleXdvcmRzID0gWyd0aGlzJywgJ251bGwnLCAndHJ1ZScsICdmYWxzZSddO1xuXG4vLyBUb2tlbiAtPiBCb29sZWFuXG5jb25zdCBpc0xlZnRCcmFja2V0ICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5MQlJBQ0sgfSk7XG5jb25zdCBpc0xlZnRCcmFjZSAgICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5MQlJBQ0UgfSk7XG5jb25zdCBpc0xlZnRQYXJlbiAgICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5MUEFSRU4gfSk7XG5jb25zdCBpc1JpZ2h0QnJhY2tldCA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5SQlJBQ0sgfSk7XG5jb25zdCBpc1JpZ2h0QnJhY2UgICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5SQlJBQ0UgfSk7XG5jb25zdCBpc1JpZ2h0UGFyZW4gICA9IFIud2hlcmVFcSh7IHR5cGU6IFRva2VuVHlwZS5SUEFSRU4gfSk7XG5cbmNvbnN0IGlzRU9TID0gUi53aGVyZUVxKHsgdHlwZTogVG9rZW5UeXBlLkVPUyB9KTtcblxuLy8gY29uc3QgaXNIYXNoID0gUi53aGVyZUVxKHsgdHlwZTogVG9rZW5UeXBlLklERU5USUZJRVIsIHZhbHVlOiAnIyd9KTtcbmNvbnN0IGlzTGVmdFN5bnRheCA9IFIud2hlcmVFcSh7IHR5cGU6IExTWU5UQVggfSk7XG5jb25zdCBpc1JpZ2h0U3ludGF4ID0gUi53aGVyZUVxKHsgdHlwZTogUlNZTlRBWCB9KTtcblxuY29uc3QgaXNMZWZ0RGVsaW1pdGVyID0gUi5hbnlQYXNzKFtpc0xlZnRCcmFja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xlZnRCcmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMZWZ0UGFyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVmdFN5bnRheF0pO1xuXG5jb25zdCBpc1JpZ2h0RGVsaW1pdGVyID0gUi5hbnlQYXNzKFtpc1JpZ2h0QnJhY2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmlnaHRCcmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmlnaHRQYXJlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmlnaHRTeW50YXhdKTtcblxuY29uc3QgaXNNYXRjaGluZ0RlbGltaXRlcnMgPSBSLmNvbmQoW1xuICBbaXNMZWZ0QnJhY2tldCwgKF8sIGIpID0+IGlzUmlnaHRCcmFja2V0KGIpXSxcbiAgW2lzTGVmdEJyYWNlLCAoXywgYikgPT4gaXNSaWdodEJyYWNlKGIpXSxcbiAgW2lzTGVmdFBhcmVuLCAoXywgYikgPT4gaXNSaWdodFBhcmVuKGIpXSxcbiAgW2lzTGVmdFN5bnRheCwgKF8sIGIpID0+IGlzUmlnaHRTeW50YXgoYildLFxuICBbUi5ULCBSLkZdXG5dKTtcblxuY29uc3QgYXNzaWduT3BzID0gIFtcIj1cIiwgXCIrPVwiLCBcIi09XCIsIFwiKj1cIiwgXCIvPVwiLCBcIiU9XCIsIFwiPDw9XCIsIFwiPj49XCIsIFwiPj4+PVwiLFxuICAgICAgICAgICAgICAgICAgXCImPVwiLCBcInw9XCIsIFwiXj1cIiwgXCIsXCJdO1xuXG5jb25zdCBiaW5hcnlPcHMgPSBbXCIrXCIsIFwiLVwiLCBcIipcIiwgXCIvXCIsIFwiJVwiLFwiPDxcIiwgXCI+PlwiLCBcIj4+PlwiLCBcIiZcIiwgXCJ8XCIsIFwiXlwiLFxuICAgICAgICAgICAgICAgICBcIiYmXCIsIFwifHxcIiwgXCI/XCIsIFwiOlwiLFxuICAgICAgICAgICAgICAgICBcIj09PVwiLCBcIj09XCIsIFwiPj1cIiwgXCI8PVwiLCBcIjxcIiwgXCI+XCIsIFwiIT1cIiwgXCIhPT1cIiwgXCJpbnN0YW5jZW9mXCJdO1xuXG5jb25zdCB1bmFyeU9wcyA9IFtcIisrXCIsIFwiLS1cIiwgXCJ+XCIsIFwiIVwiLCBcImRlbGV0ZVwiLCBcInZvaWRcIiwgXCJ0eXBlb2ZcIiwgXCJ5aWVsZFwiLCBcInRocm93XCIsIFwibmV3XCJdO1xuXG4vLyBMaXN0IC0+IEJvb2xlYW5cbmNvbnN0IGlzRW1wdHkgPSBSLndoZXJlRXEoe3NpemU6IDB9KTtcblxuLy8gU3ludGF4IC0+IEJvb2xlYW5cbmNvbnN0IGlzUHVuY3R1YXRvciA9IHMgPT4gcy5tYXRjaChcInB1bmN0dWF0b3JcIik7XG5jb25zdCBpc0tleXdvcmQgPSBzID0+IHMubWF0Y2goXCJrZXl3b3JkXCIpO1xuY29uc3QgaXNQYXJlbnMgPSBzID0+IHMubWF0Y2goXCJwYXJlbnNcIik7XG5jb25zdCBpc0JyYWNlcyA9IHMgPT4gcy5tYXRjaChcImJyYWNlc1wiKTtcbmNvbnN0IGlzSWRlbnRpZmllciA9IHMgPT4gcy5tYXRjaChcImlkZW50aWZpZXJcIik7XG5cbi8vIEFueSAtPiBTeW50YXggLT4gQm9vbGVhblxuY29uc3QgaXNWYWwgPSBSLmN1cnJ5KCh2LCBzKSA9PiBzLnZhbCgpID09PSB2KTtcblxuLy8gU3ludGF4IC0+IEJvb2xlYW5cbmNvbnN0IGlzRG90ID0gUi5hbGxQYXNzKFtpc1B1bmN0dWF0b3IsIGlzVmFsKCcuJyldKTtcbmNvbnN0IGlzQ29sb24gPSBSLmFsbFBhc3MoW2lzUHVuY3R1YXRvciwgaXNWYWwoJzonKV0pO1xuY29uc3QgaXNGdW5jdGlvbktleXdvcmQgPSBSLmFsbFBhc3MoW2lzS2V5d29yZCwgaXNWYWwoJ2Z1bmN0aW9uJyldKTtcbmNvbnN0IGlzT3BlcmF0b3IgPSBzID0+IChzLm1hdGNoKFwicHVuY3R1YXRvclwiKSB8fCBzLm1hdGNoKFwia2V5d29yZFwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hbnkoUi5lcXVhbHMocy52YWwoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbk9wcy5jb25jYXQoYmluYXJ5T3BzKS5jb25jYXQodW5hcnlPcHMpKTtcbmNvbnN0IGlzTm9uTGl0ZXJhbEtleXdvcmQgPSBSLmFsbFBhc3MoW2lzS2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPT4gUi5ub25lKFIuZXF1YWxzKHMudmFsKCkpLCBsaXRlcmFsS2V5d29yZHMpXSk7XG5jb25zdCBpc0tleXdvcmRFeHByUHJlZml4ID0gUi5hbGxQYXNzKFtpc0tleXdvcmQsXG4gIHMgPT4gUi5hbnkoUi5lcXVhbHMocy52YWwoKSksIFsnaW5zdGFuY2VvZicsICd0eXBlb2YnLCAnZGVsZXRlJywgJ3ZvaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5aWVsZCcsICd0aHJvdycsICduZXcnLCAnY2FzZSddKV0pO1xuLy8gTGlzdCBhIC0+IGE/XG5sZXQgbGFzdCA9IHAgPT4gcC5sYXN0KCk7XG4vLyBMaXN0IGEgLT4gTWF5YmUgYVxubGV0IHNhZmVMYXN0ID0gUi5waXBlKFIuY29uZChbXG4gIFtpc0VtcHR5LCBSLmFsd2F5cyhOb3RoaW5nKCkpXSxcbiAgW1IuVCwgUi5jb21wb3NlKE1heWJlLm9mLCBsYXN0KV1cbl0pKTtcblxuLy8gVE9ETzogYmV0dGVyIG5hbWVcbi8vIExpc3QgLT4gQm9vbGVhbiAtPiBNYXliZSBMaXN0XG5sZXQgc3R1ZmZUcnVlID0gUi5jdXJyeSgocCwgYikgPT4gYiA/IEp1c3QocCkgOiBOb3RoaW5nKCkpO1xubGV0IHN0dWZmRmFsc2UgPSBSLmN1cnJ5KChwLCBiKSA9PiAhYiA/IEp1c3QocCkgOiBOb3RoaW5nKCkpO1xuXG4vLyBMaXN0IGEgLT4gQm9vbGVhblxubGV0IGlzVG9wQ29sb24gPSBSLnBpcGUoXG4gIHNhZmVMYXN0LFxuICBSLm1hcChpc0NvbG9uKSxcbiAgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpXG4pO1xuLy8gTGlzdCBhIC0+IEJvb2xlYW5cbmxldCBpc1RvcFB1bmN0dWF0b3IgPSBSLnBpcGUoXG4gIHNhZmVMYXN0LFxuICBSLm1hcChpc1B1bmN0dWF0b3IpLFxuICBNYXliZS5tYXliZShmYWxzZSwgUi5pZGVudGl0eSlcbik7XG5cbi8vIE51bWJlciAtPiBMaXN0IC0+IEJvb2xlYW5cbmxldCBpc0V4cHJSZXR1cm4gPSBSLmN1cnJ5KChsLCBwKSA9PiB7XG4gIGxldCByZXRLd2QgPSBzYWZlTGFzdChwKTtcbiAgbGV0IG1heWJlRG90ID0gcG9wKHApLmNoYWluKHNhZmVMYXN0KTtcblxuICBpZiAobWF5YmVEb3QubWFwKGlzRG90KS5nZXRPckVsc2UoZmFsc2UpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHJldEt3ZC5tYXAocyA9PiB7XG4gICAgcmV0dXJuIHMubWF0Y2goXCJrZXl3b3JkXCIpICYmIHMudmFsKCkgPT09ICdyZXR1cm4nICYmIHMubGluZU51bWJlcigpID09PSBsO1xuICB9KS5nZXRPckVsc2UoZmFsc2UpO1xufSk7XG5cbmNvbnN0IGlzVG9wT3BlcmF0b3IgPSBSLnBpcGUoXG4gIHNhZmVMYXN0LFxuICBSLm1hcChpc09wZXJhdG9yKSxcbiAgTWF5YmUubWF5YmUoZmFsc2UsIFIuaWRlbnRpdHkpXG4pO1xuXG5jb25zdCBpc1RvcEtleXdvcmRFeHByUHJlZml4ID0gUi5waXBlKFxuICBzYWZlTGFzdCxcbiAgUi5tYXAoaXNLZXl3b3JkRXhwclByZWZpeCksXG4gIE1heWJlLm1heWJlKGZhbHNlLCBSLmlkZW50aXR5KVxuKTtcblxuLy8gTnVtYmVyIC0+IEJvb2xlYW4gLT4gTGlzdCAtPiBCb29sZWFuXG5sZXQgaXNFeHByUHJlZml4ID0gUi5jdXJyeSgobCwgYikgPT4gUi5jb25kKFtcbiAgLy8gLi4uICh7eDogNDJ9IC9yL2kpXG4gIFtpc0VtcHR5LCBSLmFsd2F5cyhiKV0sXG4gIC8vIC4uLiAoe3g6IHt4OiA0Mn0gL3IvaSB9KVxuICBbaXNUb3BDb2xvbiwgUi5hbHdheXMoYildLFxuICAvLyAuLi4gdGhyb3cge3g6IDQyfSAvci9pXG4gIFtpc1RvcEtleXdvcmRFeHByUHJlZml4LCBSLlRdLFxuICAvLyAuLi4gNDIgKyB7eDogNDJ9IC9yL2lcbiAgW2lzVG9wT3BlcmF0b3IsIFIuVF0sXG4gIC8vIC4uLiBmb3IgKCA7IHt4OiA0Mn0vci9pKVxuICBbaXNUb3BQdW5jdHVhdG9yLCBSLmFsd2F5cyhiKV0sXG4gIC8vIC4uLiByZXR1cm4ge3g6IDQyfSAvciAvaVxuICAvLyAuLi4gcmV0dXJuXFxue3g6IDQyfSAvciAvaVxuICBbaXNFeHByUmV0dXJuKGwpLCBSLlRdLFxuICBbUi5ULCBSLkZdLFxuXSkpO1xuXG4vLyBMaXN0IGEgLT4gTWF5YmUgTGlzdCBhXG5sZXQgY3VybHkgPSBwID0+IHNhZmVMYXN0KHApLm1hcChpc0JyYWNlcykuY2hhaW4oc3R1ZmZUcnVlKHApKTtcbmxldCBwYXJlbiA9IHAgPT4gc2FmZUxhc3QocCkubWFwKGlzUGFyZW5zKS5jaGFpbihzdHVmZlRydWUocCkpO1xubGV0IGZ1bmMgPSBwID0+IHNhZmVMYXN0KHApLm1hcChpc0Z1bmN0aW9uS2V5d29yZCkuY2hhaW4oc3R1ZmZUcnVlKHApKTtcbmxldCBpZGVudCA9IHAgPT4gc2FmZUxhc3QocCkubWFwKGlzSWRlbnRpZmllcikuY2hhaW4oc3R1ZmZUcnVlKHApKTtcbmxldCBub25MaXRlcmFsS2V5d29yZCA9IHAgPT4gc2FmZUxhc3QocCkubWFwKGlzTm9uTGl0ZXJhbEtleXdvcmQpLmNoYWluKHN0dWZmVHJ1ZShwKSk7XG5cbmxldCBvcHQgPSBSLmN1cnJ5KChhLCBiLCBwKSA9PiB7XG4gIGxldCByZXN1bHQgPSBSLnBpcGVLKGEsIGIpKE1heWJlLm9mKHApKTtcbiAgcmV0dXJuIE1heWJlLmlzSnVzdChyZXN1bHQpID8gcmVzdWx0IDogTWF5YmUub2YocCk7XG59KTtcblxubGV0IG5vdERvdCA9IFIuaWZFbHNlKFxuICBSLndoZXJlRXEoe3NpemU6IDB9KSxcbiAgSnVzdCxcbiAgcCA9PiBzYWZlTGFzdChwKS5tYXAocyA9PiAhKHMubWF0Y2goXCJwdW5jdHVhdG9yXCIpICYmIHMudmFsKCkgPT09ICcuJykpLmNoYWluKHN0dWZmVHJ1ZShwKSlcbik7XG5cbi8vIExpc3QgYSAtPiBNYXliZSBMaXN0IGFcbmxldCBwb3AgPSBSLmNvbXBvc2UoSnVzdCwgcCA9PiBwLnBvcCgpKTtcblxuLy8gTWF5YmUgTGlzdCBhIC0+IE1heWJlIExpc3QgYVxuY29uc3QgZnVuY3Rpb25QcmVmaXggPSBSLnBpcGVLKFxuICAgIGN1cmx5LFxuICAgIHBvcCxcbiAgICBwYXJlbixcbiAgICBwb3AsXG4gICAgb3B0KGlkZW50LCBwb3ApLFxuICAgIGZ1bmMpO1xuXG4vLyBCb29sZWFuIC0+IExpc3QgYSAtPiBCb29sZWFuXG5jb25zdCBpc1JlZ2V4UHJlZml4ID0gYiA9PiBSLmFueVBhc3MoW1xuICAvLyDOtVxuICBpc0VtcHR5LFxuICAvLyBQIC4gdCAgIHdoZXJlIHQg4oiIIFB1bmN0dWF0b3JcbiAgaXNUb3BQdW5jdHVhdG9yLFxuICAvLyBQIC4gdCAuIHQnICB3aGVyZSB0IFxcbm90ID0gXCIuXCIgYW5kIHQnIOKIiCAoS2V5d29yZCBcXHNldG1pbnVzICBMaXRlcmFsS2V5d29yZClcbiAgUi5waXBlKFxuICAgIE1heWJlLm9mLFxuICAgIFIucGlwZUsoXG4gICAgICBub25MaXRlcmFsS2V5d29yZCxcbiAgICAgIHBvcCxcbiAgICAgIG5vdERvdFxuICAgICksXG4gICAgTWF5YmUuaXNKdXN0XG4gICksXG4gIC8vIFAgLiB0IC4gdCcgLiAoVCkgIHdoZXJlIHQgXFxub3QgPSBcIi5cIiBhbmQgdCcg4oiIIChLZXl3b3JkIFxcc2V0bWludXMgTGl0ZXJhbEtleXdvcmQpXG4gIFIucGlwZShcbiAgICBNYXliZS5vZixcbiAgICBSLnBpcGVLKFxuICAgICAgcGFyZW4sXG4gICAgICBwb3AsXG4gICAgICBub25MaXRlcmFsS2V5d29yZCxcbiAgICAgIHBvcCxcbiAgICAgIG5vdERvdFxuICAgICksXG4gICAgTWF5YmUuaXNKdXN0XG4gICksXG4gIC8vIFAgLiBmdW5jdGlvbl5sIC4geD8gLiAoKSAuIHt9ICAgICB3aGVyZSBpc0V4cHJQcmVmaXgoUCwgYiwgbCkgPSBmYWxzZVxuICBSLnBpcGUoXG4gICAgTWF5YmUub2YsXG4gICAgZnVuY3Rpb25QcmVmaXgsXG4gICAgUi5jaGFpbihwID0+IHtcbiAgICAgICAgcmV0dXJuIHNhZmVMYXN0KHApXG4gICAgICAgICAgLm1hcChzID0+IHMubGluZU51bWJlcigpKVxuICAgICAgICAgIC5jaGFpbihmbkxpbmUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHBvcChwKS5tYXAoaXNFeHByUHJlZml4KGZuTGluZSwgYikpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNoYWluKHN0dWZmRmFsc2UocCkpO1xuICAgICAgfVxuICAgICksXG4gICAgTWF5YmUuaXNKdXN0XG4gICksXG4gIC8vIFAgLiB7VH1ebCAgd2hlcmUgaXNFeHByUHJlZml4KFAsIGIsIGwpID0gZmFsc2VcbiAgcCA9PiB7XG4gICAgbGV0IGFscmVhZHlDaGVja2VkRnVuY3Rpb24gPSBSLnBpcGUoXG4gICAgICBNYXliZS5vZixcbiAgICAgIGZ1bmN0aW9uUHJlZml4LFxuICAgICAgTWF5YmUuaXNKdXN0XG4gICAgKShwKTtcbiAgICBpZiAoYWxyZWFkeUNoZWNrZWRGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gUi5waXBlKFxuICAgICAgTWF5YmUub2YsXG4gICAgICBSLmNoYWluKGN1cmx5KSxcbiAgICAgIFIuY2hhaW4ocCA9PiB7XG4gICAgICAgIHJldHVybiBzYWZlTGFzdChwKVxuICAgICAgICAubWFwKHMgPT4gcy5saW5lTnVtYmVyKCkpXG4gICAgICAgIC5jaGFpbihjdXJseUxpbmUgPT4ge1xuICAgICAgICAgIHJldHVybiBwb3AocCkubWFwKGlzRXhwclByZWZpeChjdXJseUxpbmUsIGIpKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNoYWluKHN0dWZmRmFsc2UocCkpO1xuICAgICAgfSksXG4gICAgICBNYXliZS5pc0p1c3RcbiAgICApKHApO1xuICB9XG5cblxuXSk7XG5cbmZ1bmN0aW9uIGxhc3RFbChsKSB7XG4gIHJldHVybiBsW2wubGVuZ3RoIC0gMV07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlYWRlciBleHRlbmRzIFRva2VuaXplciB7XG4gIGNvbnN0cnVjdG9yKHN0cmluZ3MsIGNvbnRleHQsIHJlcGxhY2VtZW50cykge1xuICAgIHN1cGVyKEFycmF5LmlzQXJyYXkoc3RyaW5ncykgPyBzdHJpbmdzLmpvaW4oJycpIDogc3RyaW5ncyk7XG4gICAgdGhpcy5kZWxpbVN0YWNrID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUgPSBbZmFsc2VdO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICAvLyBzZXR1cCBzcGxpY2luZyByZXBsYWNlbWVudCBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KHN0cmluZ3MpKSB7XG4gICAgICBsZXQgdG90YWxJbmRleCA9IDA7XG4gICAgICB0aGlzLnJlcGxhY2VtZW50SW5kZXggPSBSLnJlZHVjZSgoYWNjLCBzdHJSZXApID0+IHtcbiAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgIGluZGV4OiB0b3RhbEluZGV4ICsgc3RyUmVwWzBdLmxlbmd0aCxcbiAgICAgICAgICByZXBsYWNlbWVudDogc3RyUmVwWzFdXG4gICAgICAgIH0pO1xuICAgICAgICB0b3RhbEluZGV4ICs9IHN0clJlcFswXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSwgUi56aXAoc3RyaW5ncywgcmVwbGFjZW1lbnRzKSk7XG4gICAgfVxuICB9XG5cbiAgcmVhZChzdGFjayA9IFtdLCBiID0gZmFsc2UsIHNpbmdsZURlbGltaXRlciA9IGZhbHNlKSB7XG4gICAgbGV0IHByZWZpeCA9IExpc3QoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IHRvayA9IHRoaXMuYWR2YW5jZShwcmVmaXgsIGIpO1xuXG4gICAgICAvLyBzcGxpY2luZyBhbGxvd3Mgc3ludGF4IGFuZCB0ZXJtc1xuICAgICAgaWYgKHRvay5zY29wZXNldHMgfHwgdG9rIGluc3RhbmNlb2YgVGVybSkge1xuICAgICAgICBzdGFjay5wdXNoKHRvayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9rKSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzdGFjaywgdG9rKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoTGlzdC5pc0xpc3QodG9rKSkge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzdGFjaywgdG9rLnRvQXJyYXkoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFT1ModG9rKSkge1xuICAgICAgICBpZiAoc3RhY2tbMF0gJiYgaXNMZWZ0RGVsaW1pdGVyKHN0YWNrWzBdLnRva2VuKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5leHBlY3RlZCh0b2spO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMZWZ0RGVsaW1pdGVyKHRvaykpIHtcbiAgICAgICAgaWYgKGlzTGVmdFN5bnRheCh0b2spKSB7XG4gICAgICAgICAgdGhpcy5pbnNpZGVTeW50YXhUZW1wbGF0ZS5wdXNoKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gdG9rLnNsaWNlLnN0YXJ0TG9jYXRpb24ubGluZTtcbiAgICAgICAgbGV0IGlubmVyQiA9IGlzTGVmdEJyYWNlKHRvaykgPyBpc0V4cHJQcmVmaXgobGluZSwgYikocHJlZml4KSA6IHRydWU7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMucmVhZChbbmV3IFN5bnRheCh0b2ssIHRoaXMuY29udGV4dCldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJCLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpO1xuICAgICAgICBsZXQgc3R4ID0gbmV3IFN5bnRheChpbm5lciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgcHJlZml4ID0gcHJlZml4LmNvbmNhdChzdHgpO1xuICAgICAgICBzdGFjay5wdXNoKHN0eCk7XG4gICAgICAgIGlmIChzaW5nbGVEZWxpbWl0ZXIpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1JpZ2h0RGVsaW1pdGVyKHRvaykpIHtcbiAgICAgICAgaWYgKHN0YWNrWzBdICYmICFpc01hdGNoaW5nRGVsaW1pdGVycyhzdGFja1swXS50b2tlbiwgdG9rKSkge1xuICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5leHBlY3RlZCh0b2spO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdHggPSBuZXcgU3ludGF4KHRvaywgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgc3RhY2sucHVzaChzdHgpO1xuICAgICAgICBpZiAobGFzdEVsKHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUpICYmIGlzUmlnaHRTeW50YXgodG9rKSkge1xuICAgICAgICAgIHRoaXMuaW5zaWRlU3ludGF4VGVtcGxhdGUucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgc3R4ID0gbmV3IFN5bnRheCh0b2ssIHRoaXMuY29udGV4dCk7XG4gICAgICAgIHByZWZpeCA9IHByZWZpeC5jb25jYXQoc3R4KTtcbiAgICAgICAgc3RhY2sucHVzaChzdHgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTGlzdChzdGFjayk7XG4gIH1cblxuICBhZHZhbmNlKHByZWZpeCwgYikge1xuICAgIHRoaXMubGFzdEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmxhc3RMaW5lID0gdGhpcy5saW5lO1xuICAgIHRoaXMubGFzdExpbmVTdGFydCA9IHRoaXMubGluZVN0YXJ0O1xuXG4gICAgdGhpcy5za2lwQ29tbWVudCgpO1xuXG4gICAgdGhpcy5zdGFydEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLnN0YXJ0TGluZSA9IHRoaXMubGluZTtcbiAgICB0aGlzLnN0YXJ0TGluZVN0YXJ0ID0gdGhpcy5saW5lU3RhcnQ7XG5cbiAgICBpZiAodGhpcy5yZXBsYWNlbWVudEluZGV4ICYmIHRoaXMucmVwbGFjZW1lbnRJbmRleFswXSAmJiB0aGlzLmluZGV4ID49IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5pbmRleCkge1xuICAgICAgbGV0IHJlcCA9IHRoaXMucmVwbGFjZW1lbnRJbmRleFswXS5yZXBsYWNlbWVudDtcbiAgICAgIHRoaXMucmVwbGFjZW1lbnRJbmRleC5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHJlcDtcbiAgICB9XG5cbiAgICBsZXQgY2hhckNvZGUgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJDb2RlID09PSAweDYwKSB7IC8vIGBcbiAgICAgIGxldCBlbGVtZW50LCBpdGVtcyA9IFtdO1xuICAgICAgbGV0IHN0YXJ0TG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgICBsZXQgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgaWYgKGxhc3RFbCh0aGlzLmluc2lkZVN5bnRheFRlbXBsYXRlKSkge1xuXG4gICAgICAgIGxldCBzbGljZSA9IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb24pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFJTWU5UQVgsXG4gICAgICAgICAgdmFsdWU6ICdgJyxcbiAgICAgICAgICBzbGljZTogc2xpY2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGRvIHtcbiAgICAgICAgZWxlbWVudCA9IHRoaXMuc2NhblRlbXBsYXRlRWxlbWVudCgpO1xuICAgICAgICBpdGVtcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICBpZiAoZWxlbWVudC5pbnRlcnApIHtcbiAgICAgICAgICAvLyBvbmx5IHJlYWQgdGhlIHNpbmdsZSBkZWxpbWl0ZXJcbiAgICAgICAgICBlbGVtZW50ID0gdGhpcy5yZWFkKFtdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgYXNzZXJ0KGVsZW1lbnQuc2l6ZSA9PT0gMSwgXCJzaG91bGQgb25seSBoYXZlIHJlYWQgYSBzaW5nbGUgZGVsaW1pdGVyIGluc2lkZSBhIHRlbXBsYXRlXCIpO1xuICAgICAgICAgIGl0ZW1zLnB1c2goZWxlbWVudC5nZXQoMCkpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICghZWxlbWVudC50YWlsKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFRva2VuVHlwZS5URU1QTEFURSxcbiAgICAgICAgaXRlbXM6IExpc3QoaXRlbXMpLFxuICAgICAgICBzbGljZTogdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbilcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjaGFyQ29kZSA9PT0gMzUpIHsgLy8gI1xuICAgICAgbGV0IHN0YXJ0TG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgICBsZXQgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbik7XG4gICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAvLyBUT0RPOiBoYW5kbGUgYCBpbnNpZGUgb2Ygc3ludGF4IHRlbXBsYXRlIGludGVycG9sYXRpb25zXG4gICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSA9PT0gMHg2MCkgeyAvLyBgXG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBMU1lOVEFYLFxuICAgICAgICAgIHZhbHVlOiAnI2AnLFxuICAgICAgICAgIHNsaWNlOiBzbGljZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLklERU5USUZJRVIsXG4gICAgICAgIHZhbHVlOiAnIycsXG4gICAgICAgIHNsaWNlOiBzbGljZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09PSA2NCkgeyAvLyBAXG4gICAgICBsZXQgc3RhcnRMb2NhdGlvbiA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICBsZXQgc2xpY2UgPSB0aGlzLmdldFNsaWNlKHN0YXJ0LCBzdGFydExvY2F0aW9uKTtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IEFULFxuICAgICAgICB2YWx1ZTogJ0AnLFxuICAgICAgICBzbGljZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgbG9va2FoZWFkID0gc3VwZXIuYWR2YW5jZSgpO1xuICAgIGlmIChsb29rYWhlYWQudHlwZSA9PT0gVG9rZW5UeXBlLkRJViAmJiBpc1JlZ2V4UHJlZml4KGIpKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiBzdXBlci5zY2FuUmVnRXhwKFwiL1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2thaGVhZDtcbiAgfVxuXG4gIC8vIG5lZWQgdG8gb3ZlcnJpZGUgaG93IHRlbXBsYXRlcyBhcmUgbGV4ZWQgYmVjYXVzZSBvZiBkZWxpbWl0ZXJzXG4gIHNjYW5UZW1wbGF0ZUVsZW1lbnQoKSB7XG4gICAgbGV0IHN0YXJ0TG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uKCk7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuc291cmNlLmxlbmd0aCkge1xuICAgICAgbGV0IGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcbiAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgY2FzZSAweDYwOiB7IC8vIGBcbiAgICAgICAgICAvLyBkb24ndCBpbmNsdWRlIHRoZSB0cmFsaW5nIFwiYFwiXG4gICAgICAgICAgbGV0IHNsaWNlID0gdGhpcy5nZXRTbGljZShzdGFydCwgc3RhcnRMb2NhdGlvbik7XG4gICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuVEVNUExBVEUsXG4gICAgICAgICAgICB0YWlsOiB0cnVlLFxuICAgICAgICAgICAgaW50ZXJwOiBmYWxzZSxcbiAgICAgICAgICAgIHNsaWNlOiBzbGljZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAweDI0OiAgLy8gJFxuICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSA9PT0gMHg3QikgeyAgLy8ge1xuICAgICAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSB0aGUgdHJhaWxpbmcgXCIkXCJcbiAgICAgICAgICAgIGxldCBzbGljZSA9IHRoaXMuZ2V0U2xpY2Uoc3RhcnQsIHN0YXJ0TG9jYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLlRFTVBMQVRFLFxuICAgICAgICAgICAgICB0YWlsOiBmYWxzZSxcbiAgICAgICAgICAgICAgaW50ZXJwOiB0cnVlLFxuICAgICAgICAgICAgICBzbGljZTogc2xpY2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDVDOiAgLy8gXFxcXFxuICAgICAgICB7XG4gICAgICAgICAgbGV0IG9jdGFsID0gdGhpcy5zY2FuU3RyaW5nRXNjYXBlKFwiXCIsIG51bGwpWzFdO1xuICAgICAgICAgIGlmIChvY3RhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUlMTEVHQUwoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgdGhpcy5jcmVhdGVJTExFR0FMKCk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/store.js b/dist/store.js index 4944c76b..c23a8b1f 100644 --- a/dist/store.js +++ b/dist/store.js @@ -1,10 +1,10 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var _vm = require("vm"); +var _vm = require('vm'); var _vm2 = _interopRequireDefault(_vm); @@ -15,19 +15,23 @@ class Store { this.map = new Map(); this.nodeContext = _vm2.default.createContext(); } - has(key_793) { - return this.map.has(key_793); + + has(key) { + return this.map.has(key); } - get(key_794) { - return this.map.get(key_794); + + get(key) { + return this.map.get(key); } - set(key_795, val_796) { - this.nodeContext[key_795] = val_796; - return this.map.set(key_795, val_796); + + set(key, val) { + this.nodeContext[key] = val; + return this.map.set(key, val); } + getNodeContext() { return this.nodeContext; } } exports.default = Store; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3N0b3JlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7Ozs7QUFDZSxNQUFNLEtBQU4sQ0FBWTtBQUN6QixnQkFBYztBQUNaLFNBQUssR0FBTCxHQUFXLElBQUksR0FBSixFQUFYO0FBQ0EsU0FBSyxXQUFMLEdBQW1CLGFBQUcsYUFBSCxFQUFuQjtBQUNEO0FBQ0QsTUFBSSxPQUFKLEVBQWE7QUFDWCxXQUFPLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxPQUFiLENBQVA7QUFDRDtBQUNELE1BQUksT0FBSixFQUFhO0FBQ1gsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsT0FBYixDQUFQO0FBQ0Q7QUFDRCxNQUFJLE9BQUosRUFBYSxPQUFiLEVBQXNCO0FBQ3BCLFNBQUssV0FBTCxDQUFpQixPQUFqQixJQUE0QixPQUE1QjtBQUNBLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLE9BQWIsRUFBc0IsT0FBdEIsQ0FBUDtBQUNEO0FBQ0QsbUJBQWlCO0FBQ2YsV0FBTyxLQUFLLFdBQVo7QUFDRDtBQWpCd0I7a0JBQU4sSyIsImZpbGUiOiJzdG9yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2bSBmcm9tIFwidm1cIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwO1xuICAgIHRoaXMubm9kZUNvbnRleHQgPSB2bS5jcmVhdGVDb250ZXh0KCk7XG4gIH1cbiAgaGFzKGtleV83OTMpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleV83OTMpO1xuICB9XG4gIGdldChrZXlfNzk0KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXlfNzk0KTtcbiAgfVxuICBzZXQoa2V5Xzc5NSwgdmFsXzc5Nikge1xuICAgIHRoaXMubm9kZUNvbnRleHRba2V5Xzc5NV0gPSB2YWxfNzk2O1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoa2V5Xzc5NSwgdmFsXzc5Nik7XG4gIH1cbiAgZ2V0Tm9kZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZUNvbnRleHQ7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7Ozs7O0FBRWUsTUFBTSxLQUFOLENBQVk7QUFDekIsZ0JBQWM7QUFDWixTQUFLLEdBQUwsR0FBVyxJQUFJLEdBQUosRUFBWDtBQUNBLFNBQUssV0FBTCxHQUFtQixhQUFHLGFBQUgsRUFBbkI7QUFDRDs7QUFFRCxNQUFJLEdBQUosRUFBUztBQUNQLFdBQU8sS0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhLEdBQWIsQ0FBUDtBQUNEOztBQUVELE1BQUksR0FBSixFQUFTO0FBQ1AsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsR0FBYixDQUFQO0FBQ0Q7O0FBRUQsTUFBSSxHQUFKLEVBQVMsR0FBVCxFQUFjO0FBQ1osU0FBSyxXQUFMLENBQWlCLEdBQWpCLElBQXdCLEdBQXhCO0FBQ0EsV0FBTyxLQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsR0FBYixFQUFrQixHQUFsQixDQUFQO0FBQ0Q7O0FBRUQsbUJBQWlCO0FBQ2YsV0FBTyxLQUFLLFdBQVo7QUFDRDtBQXJCd0I7a0JBQU4sSyIsImZpbGUiOiJzdG9yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2bSBmcm9tICd2bSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5ub2RlQ29udGV4dCA9IHZtLmNyZWF0ZUNvbnRleHQoKTtcbiAgfVxuXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleSk7XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXkpO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsKSB7XG4gICAgdGhpcy5ub2RlQ29udGV4dFtrZXldID0gdmFsO1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoa2V5LCB2YWwpO1xuICB9XG5cbiAgZ2V0Tm9kZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZUNvbnRleHQ7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/sweet.js b/dist/sweet.js index 5047e198..da6c2c37 100644 --- a/dist/sweet.js +++ b/dist/sweet.js @@ -3,22 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.compile = exports.parse = exports.expand = undefined; - -var _shiftReader = require("./shift-reader"); - -var _shiftReader2 = _interopRequireDefault(_shiftReader); +exports.expand = expand; +exports.parse = parse; +exports.compile = compile; var _immutable = require("immutable"); -var _syntax = require("./syntax"); - -var _syntax2 = _interopRequireDefault(_syntax); - -var _env = require("./env"); - -var _env2 = _interopRequireDefault(_env); - var _shiftReducer = require("shift-reducer"); var _shiftReducer2 = _interopRequireDefault(_shiftReducer); @@ -31,8 +21,6 @@ var _shiftCodegen = require("shift-codegen"); var _shiftCodegen2 = _interopRequireDefault(_shiftCodegen); -var _scope = require("./scope"); - var _bindingMap = require("./binding-map.js"); var _bindingMap2 = _interopRequireDefault(_bindingMap); @@ -55,30 +43,44 @@ var _nodeModuleLoader2 = _interopRequireDefault(_nodeModuleLoader); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function expand_797(source_800) { - let options_801 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - let bindings_802 = new _bindingMap2.default(); - let modules_803 = new _modules.Modules({ bindings: bindings_802, cwd: options_801.cwd || process.cwd(), filename: options_801.filename, transform: options_801.transform || _babelCore.transform || function (c_806) { - return { code: c_806 }; - }, moduleResolver: options_801.moduleResolver || _nodeModuleResolver2.default, moduleLoader: options_801.moduleLoader || _nodeModuleLoader2.default }); - let compiledMod_804 = modules_803.compileEntrypoint(source_800, options_801.filename, options_801.enforcePragma); - let nativeImports_805 = compiledMod_804.importEntries.filter(imp_807 => !modules_803.has(imp_807.moduleSpecifier.val())); - return new _terms2.default("Module", { directives: (0, _immutable.List)(), items: nativeImports_805.concat(compiledMod_804.body).concat(compiledMod_804.exportEntries.interpose(new _terms2.default("EmptyStatement", {}))) }); +function expand(source) { + let options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + let bindings = new _bindingMap2.default(); + let modules = new _modules.Modules({ + bindings: bindings, + cwd: options.cwd || process.cwd(), + filename: options.filename, + transform: options.transform || _babelCore.transform || function (c) { + return { code: c }; + }, + moduleResolver: options.moduleResolver || _nodeModuleResolver2.default, + moduleLoader: options.moduleLoader || _nodeModuleLoader2.default + }); + let compiledMod = modules.compileEntrypoint(source, options.filename, options.enforcePragma); + let nativeImports = compiledMod.importEntries.filter(imp => !modules.has(imp.moduleSpecifier.val())); + return new _terms2.default("Module", { + directives: (0, _immutable.List)(), + items: nativeImports.concat(compiledMod.body).concat(compiledMod.exportEntries.interpose(new _terms2.default('EmptyStatement', {}))) + }); } -function parse_798(source_808, options_809) { - let includeImports_810 = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; - return (0, _shiftReducer2.default)(new _parseReducer2.default({ phase: 0 }), expand_797(source_808, options_809).gen({ includeImports: includeImports_810 })); +// not available in browser + +function parse(source, options) { + let includeImports = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; + + return (0, _shiftReducer2.default)(new _parseReducer2.default({ phase: 0 }), expand(source, options).gen(includeImports)); } -function compile_799(source_811) { - let options_812 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - let ast_813 = parse_798(source_811, options_812, options_812.includeImports); - let gen_814 = (0, _shiftCodegen2.default)(ast_813, new _shiftCodegen.FormattedCodeGen()); - return options_812.transform && !options_812.noBabel ? options_812.transform(gen_814, { babelrc: true, filename: options_812.filename }) : { code: gen_814 }; +function compile(source) { + let options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + let ast = parse(source, options, options.includeImports); + let gen = (0, _shiftCodegen2.default)(ast, new _shiftCodegen.FormattedCodeGen()); + return options.transform && !options.noBabel ? options.transform(gen, { + babelrc: true, + filename: options.filename + }) : { code: gen }; } -exports.expand = expand_797; -exports.parse = parse_798; -exports.compile = compile_799; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3N3ZWV0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBQ0EsU0FBUyxVQUFULENBQW9CLFVBQXBCLEVBQWtEO0FBQUEsTUFBbEIsV0FBa0IseURBQUosRUFBSTs7QUFDaEQsTUFBSSxlQUFlLDBCQUFuQjtBQUNBLE1BQUksY0FBYyxxQkFBWSxFQUFDLFVBQVUsWUFBWCxFQUF5QixLQUFLLFlBQVksR0FBWixJQUFtQixRQUFRLEdBQVIsRUFBakQsRUFBZ0UsVUFBVSxZQUFZLFFBQXRGLEVBQWdHLFdBQVcsWUFBWSxTQUFaLDRCQUEyQyxVQUFVLEtBQVYsRUFBaUI7QUFDbk0sYUFBTyxFQUFDLE1BQU0sS0FBUCxFQUFQO0FBQ0QsS0FGNkIsRUFFM0IsZ0JBQWdCLFlBQVksY0FBWixnQ0FGVyxFQUVpQyxjQUFjLFlBQVksWUFBWiw4QkFGL0MsRUFBWixDQUFsQjtBQUdBLE1BQUksa0JBQWtCLFlBQVksaUJBQVosQ0FBOEIsVUFBOUIsRUFBMEMsWUFBWSxRQUF0RCxFQUFnRSxZQUFZLGFBQTVFLENBQXRCO0FBQ0EsTUFBSSxvQkFBb0IsZ0JBQWdCLGFBQWhCLENBQThCLE1BQTlCLENBQXFDLFdBQVcsQ0FBQyxZQUFZLEdBQVosQ0FBZ0IsUUFBUSxlQUFSLENBQXdCLEdBQXhCLEVBQWhCLENBQWpELENBQXhCO0FBQ0EsU0FBTyxvQkFBUyxRQUFULEVBQW1CLEVBQUMsWUFBWSxzQkFBYixFQUFxQixPQUFPLGtCQUFrQixNQUFsQixDQUF5QixnQkFBZ0IsSUFBekMsRUFBK0MsTUFBL0MsQ0FBc0QsZ0JBQWdCLGFBQWhCLENBQThCLFNBQTlCLENBQXdDLG9CQUFTLGdCQUFULEVBQTJCLEVBQTNCLENBQXhDLENBQXRELENBQTVCLEVBQW5CLENBQVA7QUFDRDtBQUNELFNBQVMsU0FBVCxDQUFtQixVQUFuQixFQUErQixXQUEvQixFQUF1RTtBQUFBLE1BQTNCLGtCQUEyQix5REFBTixJQUFNOztBQUNyRSxTQUFPLDRCQUFPLDJCQUFpQixFQUFDLE9BQU8sQ0FBUixFQUFqQixDQUFQLEVBQXFDLFdBQVcsVUFBWCxFQUF1QixXQUF2QixFQUFvQyxHQUFwQyxDQUF3QyxFQUFDLGdCQUFnQixrQkFBakIsRUFBeEMsQ0FBckMsQ0FBUDtBQUNEO0FBQ0QsU0FBUyxXQUFULENBQXFCLFVBQXJCLEVBQW1EO0FBQUEsTUFBbEIsV0FBa0IseURBQUosRUFBSTs7QUFDakQsTUFBSSxVQUFVLFVBQVUsVUFBVixFQUFzQixXQUF0QixFQUFtQyxZQUFZLGNBQS9DLENBQWQ7QUFDQSxNQUFJLFVBQVUsNEJBQVEsT0FBUixFQUFpQixvQ0FBakIsQ0FBZDtBQUNBLFNBQU8sWUFBWSxTQUFaLElBQXlCLENBQUMsWUFBWSxPQUF0QyxHQUFnRCxZQUFZLFNBQVosQ0FBc0IsT0FBdEIsRUFBK0IsRUFBQyxTQUFTLElBQVYsRUFBZ0IsVUFBVSxZQUFZLFFBQXRDLEVBQS9CLENBQWhELEdBQWtJLEVBQUMsTUFBTSxPQUFQLEVBQXpJO0FBQ0Q7UUFDcUIsTSxHQUFkLFU7UUFDYSxLLEdBQWIsUztRQUNlLE8sR0FBZixXIiwiZmlsZSI6InN3ZWV0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWRlciBmcm9tIFwiLi9zaGlmdC1yZWFkZXJcIjtcbmltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IFN5bnRheCBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBFbnYgZnJvbSBcIi4vZW52XCI7XG5pbXBvcnQgcmVkdWNlIGZyb20gXCJzaGlmdC1yZWR1Y2VyXCI7XG5pbXBvcnQgUGFyc2VSZWR1Y2VyIGZyb20gXCIuL3BhcnNlLXJlZHVjZXJcIjtcbmltcG9ydCBjb2RlZ2VuLCB7Rm9ybWF0dGVkQ29kZUdlbn0gZnJvbSBcInNoaWZ0LWNvZGVnZW5cIjtcbmltcG9ydCB7U2NvcGUsIGZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgQmluZGluZ01hcCBmcm9tIFwiLi9iaW5kaW5nLW1hcC5qc1wiO1xuaW1wb3J0IFRlcm0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7TW9kdWxlc30gZnJvbSBcIi4vbW9kdWxlc1wiO1xuaW1wb3J0IHt0cmFuc2Zvcm0gYXMgYmFiZWxUcmFuc2Zvcm19IGZyb20gXCJiYWJlbC1jb3JlXCI7XG5pbXBvcnQgbm9kZVJlc29sdmVyIGZyb20gXCIuL25vZGUtbW9kdWxlLXJlc29sdmVyXCI7XG5pbXBvcnQgbm9kZUxvYWRlciBmcm9tIFwiLi9ub2RlLW1vZHVsZS1sb2FkZXJcIjtcbmZ1bmN0aW9uIGV4cGFuZF83OTcoc291cmNlXzgwMCwgb3B0aW9uc184MDEgPSB7fSkge1xuICBsZXQgYmluZGluZ3NfODAyID0gbmV3IEJpbmRpbmdNYXA7XG4gIGxldCBtb2R1bGVzXzgwMyA9IG5ldyBNb2R1bGVzKHtiaW5kaW5nczogYmluZGluZ3NfODAyLCBjd2Q6IG9wdGlvbnNfODAxLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZTogb3B0aW9uc184MDEuZmlsZW5hbWUsIHRyYW5zZm9ybTogb3B0aW9uc184MDEudHJhbnNmb3JtIHx8IGJhYmVsVHJhbnNmb3JtIHx8IGZ1bmN0aW9uIChjXzgwNikge1xuICAgIHJldHVybiB7Y29kZTogY184MDZ9O1xuICB9LCBtb2R1bGVSZXNvbHZlcjogb3B0aW9uc184MDEubW9kdWxlUmVzb2x2ZXIgfHwgbm9kZVJlc29sdmVyLCBtb2R1bGVMb2FkZXI6IG9wdGlvbnNfODAxLm1vZHVsZUxvYWRlciB8fCBub2RlTG9hZGVyfSk7XG4gIGxldCBjb21waWxlZE1vZF84MDQgPSBtb2R1bGVzXzgwMy5jb21waWxlRW50cnlwb2ludChzb3VyY2VfODAwLCBvcHRpb25zXzgwMS5maWxlbmFtZSwgb3B0aW9uc184MDEuZW5mb3JjZVByYWdtYSk7XG4gIGxldCBuYXRpdmVJbXBvcnRzXzgwNSA9IGNvbXBpbGVkTW9kXzgwNC5pbXBvcnRFbnRyaWVzLmZpbHRlcihpbXBfODA3ID0+ICFtb2R1bGVzXzgwMy5oYXMoaW1wXzgwNy5tb2R1bGVTcGVjaWZpZXIudmFsKCkpKTtcbiAgcmV0dXJuIG5ldyBUZXJtKFwiTW9kdWxlXCIsIHtkaXJlY3RpdmVzOiBMaXN0KCksIGl0ZW1zOiBuYXRpdmVJbXBvcnRzXzgwNS5jb25jYXQoY29tcGlsZWRNb2RfODA0LmJvZHkpLmNvbmNhdChjb21waWxlZE1vZF84MDQuZXhwb3J0RW50cmllcy5pbnRlcnBvc2UobmV3IFRlcm0oXCJFbXB0eVN0YXRlbWVudFwiLCB7fSkpKX0pO1xufVxuZnVuY3Rpb24gcGFyc2VfNzk4KHNvdXJjZV84MDgsIG9wdGlvbnNfODA5LCBpbmNsdWRlSW1wb3J0c184MTAgPSB0cnVlKSB7XG4gIHJldHVybiByZWR1Y2UobmV3IFBhcnNlUmVkdWNlcih7cGhhc2U6IDB9KSwgZXhwYW5kXzc5Nyhzb3VyY2VfODA4LCBvcHRpb25zXzgwOSkuZ2VuKHtpbmNsdWRlSW1wb3J0czogaW5jbHVkZUltcG9ydHNfODEwfSkpO1xufVxuZnVuY3Rpb24gY29tcGlsZV83OTkoc291cmNlXzgxMSwgb3B0aW9uc184MTIgPSB7fSkge1xuICBsZXQgYXN0XzgxMyA9IHBhcnNlXzc5OChzb3VyY2VfODExLCBvcHRpb25zXzgxMiwgb3B0aW9uc184MTIuaW5jbHVkZUltcG9ydHMpO1xuICBsZXQgZ2VuXzgxNCA9IGNvZGVnZW4oYXN0XzgxMywgbmV3IEZvcm1hdHRlZENvZGVHZW4pO1xuICByZXR1cm4gb3B0aW9uc184MTIudHJhbnNmb3JtICYmICFvcHRpb25zXzgxMi5ub0JhYmVsID8gb3B0aW9uc184MTIudHJhbnNmb3JtKGdlbl84MTQsIHtiYWJlbHJjOiB0cnVlLCBmaWxlbmFtZTogb3B0aW9uc184MTIuZmlsZW5hbWV9KSA6IHtjb2RlOiBnZW5fODE0fTtcbn1cbmV4cG9ydCB7ZXhwYW5kXzc5NyBhcyBleHBhbmR9O1xuZXhwb3J0IHtwYXJzZV83OTggYXMgcGFyc2V9O1xuZXhwb3J0IHtjb21waWxlXzc5OSBhcyBjb21waWxlfSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zd2VldC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQTZCZ0IsTSxHQUFBLE07UUFvQkEsSyxHQUFBLEs7UUFJQSxPLEdBQUEsTzs7QUFwRGhCOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBRUE7Ozs7QUFDQTs7QUFJQTs7QUFDQTs7OztBQUNBOzs7Ozs7QUFjTyxTQUFTLE1BQVQsQ0FBZ0IsTUFBaEIsRUFBaUU7QUFBQSxNQUFqQyxPQUFpQyx5REFBVCxFQUFTOztBQUN0RSxNQUFJLFdBQVcsMEJBQWY7QUFDQSxNQUFJLFVBQVUscUJBQVk7QUFDeEIsc0JBRHdCO0FBRXhCLFNBQUssUUFBUSxHQUFSLElBQWUsUUFBUSxHQUFSLEVBRkk7QUFHeEIsY0FBVSxRQUFRLFFBSE07QUFJeEIsZUFBVyxRQUFRLFNBQVIsNEJBQXVDLFVBQVMsQ0FBVCxFQUFZO0FBQzVELGFBQU8sRUFBQyxNQUFNLENBQVAsRUFBUDtBQUNELEtBTnVCO0FBT3hCLG9CQUFnQixRQUFRLGNBQVIsZ0NBUFE7QUFReEIsa0JBQWMsUUFBUSxZQUFSO0FBUlUsR0FBWixDQUFkO0FBVUEsTUFBSSxjQUFjLFFBQVEsaUJBQVIsQ0FBMEIsTUFBMUIsRUFBa0MsUUFBUSxRQUExQyxFQUFvRCxRQUFRLGFBQTVELENBQWxCO0FBQ0EsTUFBSSxnQkFBZ0IsWUFBWSxhQUFaLENBQTBCLE1BQTFCLENBQWlDLE9BQU8sQ0FBQyxRQUFRLEdBQVIsQ0FBWSxJQUFJLGVBQUosQ0FBb0IsR0FBcEIsRUFBWixDQUF6QyxDQUFwQjtBQUNBLFNBQU8sb0JBQVMsUUFBVCxFQUFtQjtBQUN4QixnQkFBWSxzQkFEWTtBQUV4QixXQUFPLGNBQWMsTUFBZCxDQUFxQixZQUFZLElBQWpDLEVBQXVDLE1BQXZDLENBQThDLFlBQVksYUFBWixDQUEwQixTQUExQixDQUFvQyxvQkFBUyxnQkFBVCxFQUEyQixFQUEzQixDQUFwQyxDQUE5QztBQUZpQixHQUFuQixDQUFQO0FBSUQ7O0FBcENEOztBQXNDTyxTQUFTLEtBQVQsQ0FBZSxNQUFmLEVBQStCLE9BQS9CLEVBQTJGO0FBQUEsTUFBckMsY0FBcUMseURBQVgsSUFBVzs7QUFDaEcsU0FBTyw0QkFBTywyQkFBaUIsRUFBQyxPQUFPLENBQVIsRUFBakIsQ0FBUCxFQUFxQyxPQUFPLE1BQVAsRUFBZSxPQUFmLEVBQXdCLEdBQXhCLENBQTRCLGNBQTVCLENBQXJDLENBQVA7QUFDRDs7QUFFTSxTQUFTLE9BQVQsQ0FBaUIsTUFBakIsRUFBeUU7QUFBQSxNQUF4QyxPQUF3Qyx5REFBaEIsRUFBZ0I7O0FBQzlFLE1BQUksTUFBTSxNQUFNLE1BQU4sRUFBYyxPQUFkLEVBQXVCLFFBQVEsY0FBL0IsQ0FBVjtBQUNBLE1BQUksTUFBTSw0QkFBUSxHQUFSLEVBQWEsb0NBQWIsQ0FBVjtBQUNBLFNBQU8sUUFBUSxTQUFSLElBQXNCLENBQUMsUUFBUSxPQUEvQixHQUEwQyxRQUFRLFNBQVIsQ0FBa0IsR0FBbEIsRUFBdUI7QUFDdEUsYUFBUyxJQUQ2RDtBQUV0RSxjQUFVLFFBQVE7QUFGb0QsR0FBdkIsQ0FBMUMsR0FHRixFQUFFLE1BQU0sR0FBUixFQUhMO0FBSUQiLCJmaWxlIjoic3dlZXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCByZWR1Y2UgZnJvbSBcInNoaWZ0LXJlZHVjZXJcIjtcbmltcG9ydCBQYXJzZVJlZHVjZXIgZnJvbSBcIi4vcGFyc2UtcmVkdWNlclwiO1xuaW1wb3J0IGNvZGVnZW4sIHsgRm9ybWF0dGVkQ29kZUdlbiB9IGZyb20gXCJzaGlmdC1jb2RlZ2VuXCI7XG5cbmltcG9ydCBCaW5kaW5nTWFwIGZyb20gXCIuL2JpbmRpbmctbWFwLmpzXCI7XG5cbmltcG9ydCBUZXJtIGZyb20gXCIuL3Rlcm1zXCI7XG5pbXBvcnQgeyBNb2R1bGVzIH0gZnJvbSAnLi9tb2R1bGVzJztcblxuLy8gbm90IGF2YWlsYWJsZSBpbiBicm93c2VyXG5cbmltcG9ydCB7IHRyYW5zZm9ybSBhcyBiYWJlbFRyYW5zZm9ybSB9IGZyb20gXCJiYWJlbC1jb3JlXCI7XG5pbXBvcnQgbm9kZVJlc29sdmVyIGZyb20gXCIuL25vZGUtbW9kdWxlLXJlc29sdmVyXCI7XG5pbXBvcnQgbm9kZUxvYWRlciBmcm9tIFwiLi9ub2RlLW1vZHVsZS1sb2FkZXJcIjtcblxudHlwZSBDb2RlT3V0cHV0ID0ge1xuICBjb2RlOiBzdHJpbmdcbn1cblxudHlwZSBTd2VldE9wdGlvbnMgPSB7XG4gIGluY2x1ZGVJbXBvcnRzPzogYm9vbGVhbjtcbiAgY3dkPzogc3RyaW5nO1xuICBlbmZvcmNlUHJhZ21hPzogYm9vbGVhbjtcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHRyYW5zZm9ybT86IChzOiBzdHJpbmcpID0+IHsgY29kZTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmQoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFN3ZWV0T3B0aW9ucyA9IHt9KTogYW55IHtcbiAgbGV0IGJpbmRpbmdzID0gbmV3IEJpbmRpbmdNYXAoKTtcbiAgbGV0IG1vZHVsZXMgPSBuZXcgTW9kdWxlcyh7XG4gICAgYmluZGluZ3MsXG4gICAgY3dkOiBvcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgIGZpbGVuYW1lOiBvcHRpb25zLmZpbGVuYW1lLFxuICAgIHRyYW5zZm9ybTogb3B0aW9ucy50cmFuc2Zvcm0gfHwgYmFiZWxUcmFuc2Zvcm0gfHwgZnVuY3Rpb24oYykge1xuICAgICAgcmV0dXJuIHtjb2RlOiBjfTtcbiAgICB9LFxuICAgIG1vZHVsZVJlc29sdmVyOiBvcHRpb25zLm1vZHVsZVJlc29sdmVyIHx8IG5vZGVSZXNvbHZlcixcbiAgICBtb2R1bGVMb2FkZXI6IG9wdGlvbnMubW9kdWxlTG9hZGVyIHx8IG5vZGVMb2FkZXJcbiAgfSk7XG4gIGxldCBjb21waWxlZE1vZCA9IG1vZHVsZXMuY29tcGlsZUVudHJ5cG9pbnQoc291cmNlLCBvcHRpb25zLmZpbGVuYW1lLCBvcHRpb25zLmVuZm9yY2VQcmFnbWEpO1xuICBsZXQgbmF0aXZlSW1wb3J0cyA9IGNvbXBpbGVkTW9kLmltcG9ydEVudHJpZXMuZmlsdGVyKGltcCA9PiAhbW9kdWxlcy5oYXMoaW1wLm1vZHVsZVNwZWNpZmllci52YWwoKSkpO1xuICByZXR1cm4gbmV3IFRlcm0oXCJNb2R1bGVcIiwge1xuICAgIGRpcmVjdGl2ZXM6IExpc3QoKSxcbiAgICBpdGVtczogbmF0aXZlSW1wb3J0cy5jb25jYXQoY29tcGlsZWRNb2QuYm9keSkuY29uY2F0KGNvbXBpbGVkTW9kLmV4cG9ydEVudHJpZXMuaW50ZXJwb3NlKG5ldyBUZXJtKCdFbXB0eVN0YXRlbWVudCcsIHt9KSkpXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Uoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFN3ZWV0T3B0aW9ucywgaW5jbHVkZUltcG9ydHM6IGJvb2xlYW4gPSB0cnVlKTogYW55IHtcbiAgcmV0dXJuIHJlZHVjZShuZXcgUGFyc2VSZWR1Y2VyKHtwaGFzZTogMH0pLCBleHBhbmQoc291cmNlLCBvcHRpb25zKS5nZW4oaW5jbHVkZUltcG9ydHMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGUoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFN3ZWV0T3B0aW9ucyA9IHt9KTogQ29kZU91dHB1dCB7XG4gIGxldCBhc3QgPSBwYXJzZShzb3VyY2UsIG9wdGlvbnMsIG9wdGlvbnMuaW5jbHVkZUltcG9ydHMpO1xuICBsZXQgZ2VuID0gY29kZWdlbihhc3QsIG5ldyBGb3JtYXR0ZWRDb2RlR2VuKCkpO1xuICByZXR1cm4gb3B0aW9ucy50cmFuc2Zvcm0gJiYgKCFvcHRpb25zLm5vQmFiZWwpID8gb3B0aW9ucy50cmFuc2Zvcm0oZ2VuLCB7XG4gICAgYmFiZWxyYzogdHJ1ZSxcbiAgICBmaWxlbmFtZTogb3B0aW9ucy5maWxlbmFtZVxuICB9KSA6IHsgY29kZTogZ2VuIH07XG59XG4iXX0= \ No newline at end of file diff --git a/dist/symbol.js b/dist/symbol.js index 57dac680..6bb1e950 100644 --- a/dist/symbol.js +++ b/dist/symbol.js @@ -3,30 +3,35 @@ Object.defineProperty(exports, "__esModule", { value: true }); -let internedMap_815 = new Map(); -let counter_816 = 0; -function gensym_817(name_820) { - let prefix_821 = name_820 == null ? "s_" : name_820 + "_"; - let sym_822 = new Symbol_818(prefix_821 + counter_816); - counter_816++; - return sym_822; +exports.gensym = gensym; +let internedMap = new Map(); + +let counter = 0; + +function gensym(name) { + let prefix = name == null ? "s_" : name + "_"; + let sym = new Symbol(prefix + counter); + counter++; + return sym; } -function Symbol_818(name_823) { - this.name = name_823; + +function Symbol(name) { + this.name = name; } -Symbol_818.prototype.toString = function () { +Symbol.prototype.toString = function () { return this.name; }; -function makeSymbol_819(name_824) { - if (internedMap_815.has(name_824)) { - return internedMap_815.get(name_824); + +function makeSymbol(name) { + if (internedMap.has(name)) { + return internedMap.get(name); } else { - let sym = new Symbol_818(name_824); - internedMap_815.set(name_824, sym); + let sym = new Symbol(name); + internedMap.set(name, sym); return sym; } } -exports.Symbol = makeSymbol_819; -exports.SymbolClass = Symbol_818; -exports.gensym = gensym_817; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3N5bWJvbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUksa0JBQWtCLElBQUksR0FBSixFQUF0QjtBQUNBLElBQUksY0FBYyxDQUFsQjtBQUNBLFNBQVMsVUFBVCxDQUFvQixRQUFwQixFQUE4QjtBQUM1QixNQUFJLGFBQWEsWUFBWSxJQUFaLEdBQW1CLElBQW5CLEdBQTBCLFdBQVcsR0FBdEQ7QUFDQSxNQUFJLFVBQVUsSUFBSSxVQUFKLENBQWUsYUFBYSxXQUE1QixDQUFkO0FBQ0E7QUFDQSxTQUFPLE9BQVA7QUFDRDtBQUNELFNBQVMsVUFBVCxDQUFvQixRQUFwQixFQUE4QjtBQUM1QixPQUFLLElBQUwsR0FBWSxRQUFaO0FBQ0Q7QUFDRCxXQUFXLFNBQVgsQ0FBcUIsUUFBckIsR0FBZ0MsWUFBWTtBQUMxQyxTQUFPLEtBQUssSUFBWjtBQUNELENBRkQ7QUFHQSxTQUFTLGNBQVQsQ0FBd0IsUUFBeEIsRUFBa0M7QUFDaEMsTUFBSSxnQkFBZ0IsR0FBaEIsQ0FBb0IsUUFBcEIsQ0FBSixFQUFtQztBQUNqQyxXQUFPLGdCQUFnQixHQUFoQixDQUFvQixRQUFwQixDQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsUUFBSSxNQUFNLElBQUksVUFBSixDQUFlLFFBQWYsQ0FBVjtBQUNBLG9CQUFnQixHQUFoQixDQUFvQixRQUFwQixFQUE4QixHQUE5QjtBQUNBLFdBQU8sR0FBUDtBQUNEO0FBQ0Y7UUFDeUIsTSxHQUFsQixjO1FBQXdDLFcsR0FBZCxVO1FBQ1osTSxHQUFkLFUiLCJmaWxlIjoic3ltYm9sLmpzIiwic291cmNlc0NvbnRlbnQiOlsibGV0IGludGVybmVkTWFwXzgxNSA9IG5ldyBNYXA7XG5sZXQgY291bnRlcl84MTYgPSAwO1xuZnVuY3Rpb24gZ2Vuc3ltXzgxNyhuYW1lXzgyMCkge1xuICBsZXQgcHJlZml4XzgyMSA9IG5hbWVfODIwID09IG51bGwgPyBcInNfXCIgOiBuYW1lXzgyMCArIFwiX1wiO1xuICBsZXQgc3ltXzgyMiA9IG5ldyBTeW1ib2xfODE4KHByZWZpeF84MjEgKyBjb3VudGVyXzgxNik7XG4gIGNvdW50ZXJfODE2Kys7XG4gIHJldHVybiBzeW1fODIyO1xufVxuZnVuY3Rpb24gU3ltYm9sXzgxOChuYW1lXzgyMykge1xuICB0aGlzLm5hbWUgPSBuYW1lXzgyMztcbn1cblN5bWJvbF84MTgucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5uYW1lO1xufTtcbmZ1bmN0aW9uIG1ha2VTeW1ib2xfODE5KG5hbWVfODI0KSB7XG4gIGlmIChpbnRlcm5lZE1hcF84MTUuaGFzKG5hbWVfODI0KSkge1xuICAgIHJldHVybiBpbnRlcm5lZE1hcF84MTUuZ2V0KG5hbWVfODI0KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc3ltID0gbmV3IFN5bWJvbF84MTgobmFtZV84MjQpO1xuICAgIGludGVybmVkTWFwXzgxNS5zZXQobmFtZV84MjQsIHN5bSk7XG4gICAgcmV0dXJuIHN5bTtcbiAgfVxufVxuZXhwb3J0IHttYWtlU3ltYm9sXzgxOSBhcyBTeW1ib2wsIFN5bWJvbF84MTggYXMgU3ltYm9sQ2xhc3N9O1xuZXhwb3J0IHtnZW5zeW1fODE3IGFzIGdlbnN5bX0iXX0= \ No newline at end of file + +exports.Symbol = makeSymbol; +exports.SymbolClass = Symbol; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW1ib2wuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFJZ0IsTSxHQUFBLE07QUFKaEIsSUFBSSxjQUFjLElBQUksR0FBSixFQUFsQjs7QUFFQSxJQUFJLFVBQVUsQ0FBZDs7QUFFTyxTQUFTLE1BQVQsQ0FBZ0IsSUFBaEIsRUFBc0I7QUFDM0IsTUFBSSxTQUFTLFFBQVEsSUFBUixHQUFlLElBQWYsR0FBc0IsT0FBTyxHQUExQztBQUNBLE1BQUksTUFBTSxJQUFJLE1BQUosQ0FBVyxTQUFTLE9BQXBCLENBQVY7QUFDQTtBQUNBLFNBQU8sR0FBUDtBQUNEOztBQUVELFNBQVMsTUFBVCxDQUFnQixJQUFoQixFQUFzQjtBQUNwQixPQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0Q7QUFDRCxPQUFPLFNBQVAsQ0FBaUIsUUFBakIsR0FBNEIsWUFBWTtBQUN0QyxTQUFPLEtBQUssSUFBWjtBQUNELENBRkQ7O0FBSUEsU0FBUyxVQUFULENBQW9CLElBQXBCLEVBQTBCO0FBQ3hCLE1BQUksWUFBWSxHQUFaLENBQWdCLElBQWhCLENBQUosRUFBMkI7QUFDekIsV0FBTyxZQUFZLEdBQVosQ0FBZ0IsSUFBaEIsQ0FBUDtBQUNELEdBRkQsTUFFTztBQUNMLFFBQUksTUFBTSxJQUFJLE1BQUosQ0FBVyxJQUFYLENBQVY7QUFDQSxnQkFBWSxHQUFaLENBQWdCLElBQWhCLEVBQXNCLEdBQXRCO0FBQ0EsV0FBTyxHQUFQO0FBQ0Q7QUFDRjs7UUFHZSxNLEdBQWQsVTtRQUNVLFcsR0FBVixNIiwiZmlsZSI6InN5bWJvbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImxldCBpbnRlcm5lZE1hcCA9IG5ldyBNYXAoKTtcblxubGV0IGNvdW50ZXIgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2Vuc3ltKG5hbWUpIHtcbiAgbGV0IHByZWZpeCA9IG5hbWUgPT0gbnVsbCA/IFwic19cIiA6IG5hbWUgKyBcIl9cIjtcbiAgbGV0IHN5bSA9IG5ldyBTeW1ib2wocHJlZml4ICsgY291bnRlcik7XG4gIGNvdW50ZXIrKztcbiAgcmV0dXJuIHN5bTtcbn1cblxuZnVuY3Rpb24gU3ltYm9sKG5hbWUpIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbn1cblN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5hbWU7XG59O1xuXG5mdW5jdGlvbiBtYWtlU3ltYm9sKG5hbWUpIHtcbiAgaWYgKGludGVybmVkTWFwLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiBpbnRlcm5lZE1hcC5nZXQobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHN5bSA9IG5ldyBTeW1ib2wobmFtZSk7XG4gICAgaW50ZXJuZWRNYXAuc2V0KG5hbWUsIHN5bSk7XG4gICAgcmV0dXJuIHN5bTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBtYWtlU3ltYm9sIGFzIFN5bWJvbCxcbiAgU3ltYm9sIGFzIFN5bWJvbENsYXNzXG59O1xuIl19 \ No newline at end of file diff --git a/dist/syntax.js b/dist/syntax.js index 1bd5f661..1cf4aec1 100644 --- a/dist/syntax.js +++ b/dist/syntax.js @@ -15,49 +15,143 @@ var _bindingMap2 = _interopRequireDefault(_bindingMap); var _ramdaFantasy = require("ramda-fantasy"); -var _tokenizer = require("shift-parser/dist/tokenizer"); - var _ramda = require("ramda"); var _ = _interopRequireWildcard(_ramda); +var _tokenizer = require("shift-parser/dist/tokenizer"); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const Just_825 = _ramdaFantasy.Maybe.Just; -const Nothing_826 = _ramdaFantasy.Maybe.Nothing; -function getFirstSlice_827(stx_831) { - if (!stx_831 || typeof stx_831.isDelimiter !== "function") return null; - if (!stx_831.isDelimiter()) { - return stx_831.token.slice; +function getFirstSlice(stx) { + if (!stx || typeof stx.isDelimiter !== 'function') return null; // TODO: should not have to do this + if (!stx.isDelimiter()) { + return stx.token.slice; } - return stx_831.token.get(0).token.slice; + return stx.token.get(0).token.slice; } -function sizeDecending_828(a_832, b_833) { - if (a_832.scopes.size > b_833.scopes.size) { + +function sizeDecending(a, b) { + if (a.scopes.size > b.scopes.size) { return -1; - } else if (b_833.scopes.size > a_832.scopes.size) { + } else if (b.scopes.size > a.scopes.size) { return 1; } else { return 0; } } -let Types_829 = { null: { match: token_834 => !Types_829.delimiter.match(token_834) && token_834.type === _tokenizer.TokenType.NULL, create: (value_835, stx_836) => new Syntax({ type: _tokenizer.TokenType.NULL, value: null }, stx_836) }, number: { match: token_837 => !Types_829.delimiter.match(token_837) && token_837.type.klass === _tokenizer.TokenClass.NumericLiteral, create: (value_838, stx_839) => new Syntax({ type: _tokenizer.TokenType.NUMBER, value: value_838 }, stx_839) }, string: { match: token_840 => !Types_829.delimiter.match(token_840) && token_840.type.klass === _tokenizer.TokenClass.StringLiteral, create: (value_841, stx_842) => new Syntax({ type: _tokenizer.TokenType.STRING, str: value_841 }, stx_842) }, punctuator: { match: token_843 => !Types_829.delimiter.match(token_843) && token_843.type.klass === _tokenizer.TokenClass.Punctuator, create: (value_844, stx_845) => new Syntax({ type: { klass: _tokenizer.TokenClass.Punctuator, name: value_844 }, value: value_844 }, stx_845) }, keyword: { match: token_846 => !Types_829.delimiter.match(token_846) && token_846.type.klass === _tokenizer.TokenClass.Keyword, create: (value_847, stx_848) => new Syntax({ type: { klass: _tokenizer.TokenClass.Keyword, name: value_847 }, value: value_847 }, stx_848) }, identifier: { match: token_849 => !Types_829.delimiter.match(token_849) && token_849.type.klass === _tokenizer.TokenClass.Ident, create: (value_850, stx_851) => new Syntax({ type: _tokenizer.TokenType.IDENTIFIER, value: value_850 }, stx_851) }, regularExpression: { match: token_852 => !Types_829.delimiter.match(token_852) && token_852.type.klass === _tokenizer.TokenClass.RegularExpression, create: (value_853, stx_854) => new Syntax({ type: _tokenizer.TokenType.REGEXP, value: value_853 }, stx_854) }, braces: { match: token_855 => Types_829.delimiter.match(token_855) && token_855.get(0).token.type === _tokenizer.TokenType.LBRACE, create: (inner_856, stx_857) => { - let left_858 = new Syntax({ type: _tokenizer.TokenType.LBRACE, value: "{", slice: getFirstSlice_827(stx_857) }); - let right_859 = new Syntax({ type: _tokenizer.TokenType.RBRACE, value: "}", slice: getFirstSlice_827(stx_857) }); - return new Syntax(_immutable.List.of(left_858).concat(inner_856).push(right_859), stx_857); - } }, brackets: { match: token_860 => Types_829.delimiter.match(token_860) && token_860.get(0).token.type === _tokenizer.TokenType.LBRACK, create: (inner_861, stx_862) => { - let left_863 = new Syntax({ type: _tokenizer.TokenType.LBRACK, value: "[", slice: getFirstSlice_827(stx_862) }); - let right_864 = new Syntax({ type: _tokenizer.TokenType.RBRACK, value: "]", slice: getFirstSlice_827(stx_862) }); - return new Syntax(_immutable.List.of(left_863).concat(inner_861).push(right_864), stx_862); - } }, parens: { match: token_865 => Types_829.delimiter.match(token_865) && token_865.get(0).token.type === _tokenizer.TokenType.LPAREN, create: (inner_866, stx_867) => { - let left_868 = new Syntax({ type: _tokenizer.TokenType.LPAREN, value: "(", slice: getFirstSlice_827(stx_867) }); - let right_869 = new Syntax({ type: _tokenizer.TokenType.RPAREN, value: ")", slice: getFirstSlice_827(stx_867) }); - return new Syntax(_immutable.List.of(left_868).concat(inner_866).push(right_869), stx_867); - } }, assign: { match: token_870 => { - if (Types_829.punctuator.match(token_870)) { - switch (token_870.value) { + +let Types = exports.Types = { + null: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.NULL, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.NULL, + value: null + }, stx) + }, + number: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.NumericLiteral, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.NUMBER, + value: value + }, stx) + }, + string: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.StringLiteral, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.STRING, + str: value + }, stx) + }, + punctuator: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.Punctuator, + create: (value, stx) => new Syntax({ + type: { + klass: _tokenizer.TokenClass.Punctuator, + name: value + }, + value: value + }, stx) + }, + keyword: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.Keyword, + create: (value, stx) => new Syntax({ + type: { + klass: _tokenizer.TokenClass.Keyword, + name: value + }, + value: value + }, stx) + }, + identifier: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.Ident, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.IDENTIFIER, + value: value + }, stx) + }, + regularExpression: { + match: token => !Types.delimiter.match(token) && token.type.klass === _tokenizer.TokenClass.RegularExpression, + create: (value, stx) => new Syntax({ + type: _tokenizer.TokenType.REGEXP, + value: value + }, stx) + }, + braces: { + match: token => Types.delimiter.match(token) && token.get(0).token.type === _tokenizer.TokenType.LBRACE, + create: (inner, stx) => { + let left = new Syntax({ + type: _tokenizer.TokenType.LBRACE, + value: "{", + slice: getFirstSlice(stx) + }); + let right = new Syntax({ + type: _tokenizer.TokenType.RBRACE, + value: "}", + slice: getFirstSlice(stx) + }); + return new Syntax(_immutable.List.of(left).concat(inner).push(right), stx); + } + }, + brackets: { + match: token => Types.delimiter.match(token) && token.get(0).token.type === _tokenizer.TokenType.LBRACK, + create: (inner, stx) => { + let left = new Syntax({ + type: _tokenizer.TokenType.LBRACK, + value: "[", + slice: getFirstSlice(stx) + }); + let right = new Syntax({ + type: _tokenizer.TokenType.RBRACK, + value: "]", + slice: getFirstSlice(stx) + }); + return new Syntax(_immutable.List.of(left).concat(inner).push(right), stx); + } + }, + parens: { + match: token => Types.delimiter.match(token) && token.get(0).token.type === _tokenizer.TokenType.LPAREN, + create: (inner, stx) => { + let left = new Syntax({ + type: _tokenizer.TokenType.LPAREN, + value: "(", + slice: getFirstSlice(stx) + }); + let right = new Syntax({ + type: _tokenizer.TokenType.RPAREN, + value: ")", + slice: getFirstSlice(stx) + }); + return new Syntax(_immutable.List.of(left).concat(inner).push(right), stx); + } + }, + + assign: { + match: token => { + if (Types.punctuator.match(token)) { + switch (token.value) { case "=": case "|=": case "^=": @@ -76,153 +170,183 @@ let Types_829 = { null: { match: token_834 => !Types_829.delimiter.match(token_8 } } return false; - } }, boolean: { match: token_871 => !Types_829.delimiter.match(token_871) && token_871.type === _tokenizer.TokenType.TRUE || token_871.type === _tokenizer.TokenType.FALSE }, template: { match: token_872 => !Types_829.delimiter.match(token_872) && token_872.type === _tokenizer.TokenType.TEMPLATE }, delimiter: { match: token_873 => _immutable.List.isList(token_873) }, syntaxTemplate: { match: token_874 => Types_829.delimiter.match(token_874) && token_874.get(0).val() === "#`" }, eof: { match: token_875 => !Types_829.delimiter.match(token_875) && token_875.type === _tokenizer.TokenType.EOS } }; -; -const ALL_PHASES_830 = {}; -; + } + }, + + boolean: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.TRUE || token.type === _tokenizer.TokenType.FALSE + }, + + template: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.TEMPLATE + }, + + delimiter: { + match: token => _immutable.List.isList(token) + }, + + syntaxTemplate: { + match: token => Types.delimiter.match(token) && token.get(0).val() === '#`' + }, + + eof: { + match: token => !Types.delimiter.match(token) && token.type === _tokenizer.TokenType.EOS + } +}; +const ALL_PHASES = exports.ALL_PHASES = {}; + class Syntax { - constructor(token_876) { - let oldstx_877 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - this.token = token_876; - this.bindings = oldstx_877.bindings != null ? oldstx_877.bindings : new _bindingMap2.default(); - this.scopesets = oldstx_877.scopesets != null ? oldstx_877.scopesets : { all: (0, _immutable.List)(), phase: (0, _immutable.Map)() }; + constructor(token, oldstx) { + this.token = token; + this.bindings = oldstx && oldstx.bindings != null ? oldstx.bindings : new _bindingMap2.default(); + this.scopesets = oldstx && oldstx.scopesets != null ? oldstx.scopesets : { + all: (0, _immutable.List)(), + phase: (0, _immutable.Map)() + }; Object.freeze(this); } - static of(token_878) { - let stx_879 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + // token: Token | List; - return new Syntax(token_878, stx_879); + + static of(token, stx) { + return new Syntax(token, stx); } - static from(type_880, value_881) { - let stx_882 = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - if (!Types_829[type_880]) { - throw new Error(type_880 + " is not a valid type"); - } else if (!Types_829[type_880].create) { - throw new Error("Cannot create a syntax from type " + type_880); + static from(type, value, stx) { + if (!Types[type]) { + throw new Error(type + " is not a valid type"); + } else if (!Types[type].create) { + throw new Error("Cannot create a syntax from type " + type); } - let newstx_883 = Types_829[type_880].create(value_881, stx_882); - let slice_884 = getFirstSlice_827(stx_882); - if (slice_884 != null) { - newstx_883.token.slice = slice_884; + let newstx = Types[type].create(value, stx); + let slice = getFirstSlice(stx); + if (slice != null) { + newstx.token.slice = slice; } - return newstx_883; + return newstx; } - from(type_885, value_886) { - return Syntax.from(type_885, value_886, this); + + from(type, value) { + return Syntax.from(type, value, this); } + fromNull() { return this.from("null", null); } - fromNumber(value_887) { - return this.from("number", value_887); + + fromNumber(value) { + return this.from('number', value); } - fromString(value_888) { - return this.from("string", value_888); + + fromString(value) { + return this.from("string", value); } - fromPunctuator(value_889) { - return this.from("punctuator", value_889); + + fromPunctuator(value) { + return this.from("punctuator", value); } - fromKeyword(value_890) { - return this.from("keyword"); + + fromKeyword(value) { + return this.from("keyword", value); } - fromIdentifier(value_891) { - return this.from("identifier", value_891); + + fromIdentifier(value) { + return this.from("identifier", value); } - fromRegularExpression(value_892) { - return this.from("regularExpression", value_892); + + fromRegularExpression(value) { + return this.from("regularExpression", value); } - fromBraces(inner_893) { - return this.from("braces", inner_893); + + fromBraces(inner) { + return this.from("braces", inner); } - fromBrackets(inner_894) { - return this.from("brackets", inner_894); + + fromBrackets(inner) { + return this.from("brackets", inner); } - fromParens(inner_895) { - return this.from("parens", inner_895); + + fromParens(inner) { + return this.from("parens", inner); } - static fromNull() { - let stx_896 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - return Syntax.from("null", null, stx_896); + static fromNull(stx) { + return Syntax.from("null", null, stx); } - static fromNumber(value_897) { - let stx_898 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("number", value_897, stx_898); + static fromNumber(value, stx) { + return Syntax.from("number", value, stx); } - static fromString(value_899) { - let stx_900 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("string", value_899, stx_900); + static fromString(value, stx) { + return Syntax.from("string", value, stx); } - static fromPunctuator(value_901) { - let stx_902 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("punctuator", value_901, stx_902); + static fromPunctuator(value, stx) { + return Syntax.from("punctuator", value, stx); } - static fromKeyword(value_903) { - let stx_904 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("keyword", value_903, stx_904); + static fromKeyword(value, stx) { + return Syntax.from("keyword", value, stx); } - static fromIdentifier(value_905) { - let stx_906 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("identifier", value_905, stx_906); + static fromIdentifier(value, stx) { + return Syntax.from("identifier", value, stx); } - static fromRegularExpression(value_907) { - let stx_908 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("regularExpression", value_907, stx_908); + static fromRegularExpression(value, stx) { + return Syntax.from("regularExpression", value, stx); } - static fromBraces(inner_909) { - let stx_910 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("braces", inner_909, stx_910); + static fromBraces(inner, stx) { + return Syntax.from("braces", inner, stx); } - static fromBrackets(inner_911) { - let stx_912 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("brackets", inner_911, stx_912); + static fromBrackets(inner, stx) { + return Syntax.from("brackets", inner, stx); } - static fromParens(inner_913) { - let stx_914 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - return Syntax.from("parens", inner_913, stx_914); + static fromParens(inner, stx) { + return Syntax.from("parens", inner, stx); } - resolve(phase_915) { - (0, _errors.assert)(phase_915 != null, "must provide a phase to resolve"); - let allScopes_916 = this.scopesets.all; - let stxScopes_917 = this.scopesets.phase.has(phase_915) ? this.scopesets.phase.get(phase_915) : (0, _immutable.List)(); - stxScopes_917 = allScopes_916.concat(stxScopes_917); - if (stxScopes_917.size === 0 || !(this.match("identifier") || this.match("keyword"))) { + + // () -> string + resolve(phase) { + (0, _errors.assert)(phase != null, "must provide a phase to resolve"); + let allScopes = this.scopesets.all; + let stxScopes = this.scopesets.phase.has(phase) ? this.scopesets.phase.get(phase) : (0, _immutable.List)(); + stxScopes = allScopes.concat(stxScopes); + if (stxScopes.size === 0 || !(this.match('identifier') || this.match('keyword'))) { return this.token.value; } - let scope_918 = stxScopes_917.last(); - let bindings_919 = this.bindings; - if (scope_918) { - let scopesetBindingList = bindings_919.get(this); + let scope = stxScopes.last(); + let bindings = this.bindings; + if (scope) { + // List<{ scopes: List, binding: Symbol }> + let scopesetBindingList = bindings.get(this); + if (scopesetBindingList) { + // { scopes: List, binding: Symbol } let biggestBindingPair = scopesetBindingList.filter(_ref => { let scopes = _ref.scopes; - let binding = _ref.binding; - return scopes.isSubset(stxScopes_917); - }).sort(sizeDecending_828); + return scopes.isSubset(stxScopes); + }).sort(sizeDecending); + if (biggestBindingPair.size >= 2 && biggestBindingPair.get(0).scopes.size === biggestBindingPair.get(1).scopes.size) { - let debugBase = "{" + stxScopes_917.map(s_920 => s_920.toString()).join(", ") + "}"; + let debugBase = '{' + stxScopes.map(s => s.toString()).join(', ') + '}'; let debugAmbigousScopesets = biggestBindingPair.map(_ref2 => { let scopes = _ref2.scopes; - return "{" + scopes.map(s_921 => s_921.toString()).join(", ") + "}"; - }).join(", "); - throw new Error("Scopeset " + debugBase + " has ambiguous subsets " + debugAmbigousScopesets); + return '{' + scopes.map(s => s.toString()).join(', ') + '}'; + }).join(', '); + throw new Error('Scopeset ' + debugBase + ' has ambiguous subsets ' + debugAmbigousScopesets); } else if (biggestBindingPair.size !== 0) { let bindingStr = biggestBindingPair.get(0).binding.toString(); if (_ramdaFantasy.Maybe.isJust(biggestBindingPair.get(0).alias)) { - return biggestBindingPair.get(0).alias.getOrElse(null).resolve(phase_915); + // null never happens because we just checked if it is a Just + return biggestBindingPair.get(0).alias.getOrElse(null).resolve(phase); } return bindingStr; } @@ -230,21 +354,23 @@ class Syntax { } return this.token.value; } + val() { (0, _errors.assert)(!this.match("delimiter"), "cannot get the val of a delimiter"); if (this.match("string")) { return this.token.str; } if (this.match("template")) { - return this.token.items.map(el_922 => { - if (typeof el_922.match === "function" && el_922.match("delimiter")) { - return "${...}"; + return this.token.items.map(el => { + if (typeof el.match === 'function' && el.match("delimiter")) { + return '${...}'; } - return el_922.slice.text; - }).join(""); + return el.slice.text; + }).join(''); } return this.token.value; } + lineNumber() { if (!this.match("delimiter")) { return this.token.slice.startLocation.line; @@ -252,131 +378,170 @@ class Syntax { return this.token.get(0).lineNumber(); } } - setLineNumber(line_923) { - let newTok_924 = {}; + + setLineNumber(line) { + let newTok = {}; if (this.isDelimiter()) { - newTok_924 = this.token.map(s_925 => s_925.setLineNumber(line_923)); + newTok = this.token.map(s => s.setLineNumber(line)); } else { for (let key of Object.keys(this.token)) { - newTok_924[key] = this.token[key]; + newTok[key] = this.token[key]; } - (0, _errors.assert)(newTok_924.slice && newTok_924.slice.startLocation, "all tokens must have line info"); - newTok_924.slice.startLocation.line = line_923; + (0, _errors.assert)(newTok.slice && newTok.slice.startLocation, 'all tokens must have line info'); + newTok.slice.startLocation.line = line; } - return new Syntax(newTok_924, this); + return new Syntax(newTok, this); } + + // () -> List inner() { (0, _errors.assert)(this.match("delimiter"), "can only get the inner of a delimiter"); return this.token.slice(1, this.token.size - 1); } - addScope(scope_926, bindings_927, phase_928) { - let options_929 = arguments.length <= 3 || arguments[3] === undefined ? { flip: false } : arguments[3]; - let token_930 = this.match("delimiter") ? this.token.map(s_934 => s_934.addScope(scope_926, bindings_927, phase_928, options_929)) : this.token; - if (this.match("template")) { - token_930 = _.merge(token_930, { items: token_930.items.map(it_935 => { - if (it_935 instanceof Syntax && it_935.match("delimiter")) { - return it_935.addScope(scope_926, bindings_927, phase_928, options_929); + addScope(scope, bindings, phase) { + let options = arguments.length <= 3 || arguments[3] === undefined ? { flip: false } : arguments[3]; + + let token = this.match('delimiter') ? this.token.map(s => s.addScope(scope, bindings, phase, options)) : this.token; + if (this.match('template')) { + token = _.merge(token, { + items: token.items.map(it => { + if (it instanceof Syntax && it.match('delimiter')) { + return it.addScope(scope, bindings, phase, options); } - return it_935; - }) }); + return it; + }) + }); } - let oldScopeset_931; - if (phase_928 === ALL_PHASES_830) { - oldScopeset_931 = this.scopesets.all; + let oldScopeset; + if (phase === ALL_PHASES) { + oldScopeset = this.scopesets.all; } else { - oldScopeset_931 = this.scopesets.phase.has(phase_928) ? this.scopesets.phase.get(phase_928) : (0, _immutable.List)(); + oldScopeset = this.scopesets.phase.has(phase) ? this.scopesets.phase.get(phase) : (0, _immutable.List)(); } - let newScopeset_932; - if (options_929.flip) { - let index = oldScopeset_931.indexOf(scope_926); + let newScopeset; + if (options.flip) { + let index = oldScopeset.indexOf(scope); if (index !== -1) { - newScopeset_932 = oldScopeset_931.remove(index); + newScopeset = oldScopeset.remove(index); } else { - newScopeset_932 = oldScopeset_931.push(scope_926); + newScopeset = oldScopeset.push(scope); } } else { - newScopeset_932 = oldScopeset_931.push(scope_926); + newScopeset = oldScopeset.push(scope); } - let newstx_933 = { bindings: bindings_927, scopesets: { all: this.scopesets.all, phase: this.scopesets.phase } }; - if (phase_928 === ALL_PHASES_830) { - newstx_933.scopesets.all = newScopeset_932; + let newstx = { + bindings: bindings, + scopesets: { + all: this.scopesets.all, + phase: this.scopesets.phase + } + }; + + if (phase === ALL_PHASES) { + newstx.scopesets.all = newScopeset; } else { - newstx_933.scopesets.phase = newstx_933.scopesets.phase.set(phase_928, newScopeset_932); + newstx.scopesets.phase = newstx.scopesets.phase.set(phase, newScopeset); } - return new Syntax(token_930, newstx_933); - } - removeScope(scope_936, phase_937) { - let token_938 = this.match("delimiter") ? this.token.map(s_944 => s_944.removeScope(scope_936, phase_937)) : this.token; - let phaseScopeset_939 = this.scopesets.phase.has(phase_937) ? this.scopesets.phase.get(phase_937) : (0, _immutable.List)(); - let allScopeset_940 = this.scopesets.all; - let newstx_941 = { bindings: this.bindings, scopesets: { all: this.scopesets.all, phase: this.scopesets.phase } }; - let phaseIndex_942 = phaseScopeset_939.indexOf(scope_936); - let allIndex_943 = allScopeset_940.indexOf(scope_936); - if (phaseIndex_942 !== -1) { - newstx_941.scopesets.phase = this.scopesets.phase.set(phase_937, phaseScopeset_939.remove(phaseIndex_942)); - } else if (allIndex_943 !== -1) { - newstx_941.scopesets.all = allScopeset_940.remove(allIndex_943); + return new Syntax(token, newstx); + } + + removeScope(scope, phase) { + let token = this.match('delimiter') ? this.token.map(s => s.removeScope(scope, phase)) : this.token; + let phaseScopeset = this.scopesets.phase.has(phase) ? this.scopesets.phase.get(phase) : (0, _immutable.List)(); + let allScopeset = this.scopesets.all; + let newstx = { + bindings: this.bindings, + scopesets: { + all: this.scopesets.all, + phase: this.scopesets.phase + } + }; + + let phaseIndex = phaseScopeset.indexOf(scope); + let allIndex = allScopeset.indexOf(scope); + if (phaseIndex !== -1) { + newstx.scopesets.phase = this.scopesets.phase.set(phase, phaseScopeset.remove(phaseIndex)); + } else if (allIndex !== -1) { + newstx.scopesets.all = allScopeset.remove(allIndex); } - return new Syntax(token_938, newstx_941); + return new Syntax(token, newstx); } - match(type_945, value_946) { - if (!Types_829[type_945]) { - throw new Error(type_945 + " is an invalid type"); + + match(type, value) { + if (!Types[type]) { + throw new Error(type + " is an invalid type"); } - return Types_829[type_945].match(this.token) && (value_946 == null || (value_946 instanceof RegExp ? value_946.test(this.val()) : this.val() == value_946)); + return Types[type].match(this.token) && (value == null || (value instanceof RegExp ? value.test(this.val()) : this.val() == value)); } - isIdentifier(value_947) { - return this.match("identifier", value_947); + + isIdentifier(value) { + return this.match("identifier", value); } - isAssign(value_948) { - return this.match("assign", value_948); + + isAssign(value) { + return this.match("assign", value); } - isBooleanLiteral(value_949) { - return this.match("boolean", value_949); + + isBooleanLiteral(value) { + return this.match("boolean", value); } - isKeyword(value_950) { - return this.match("keyword", value_950); + + isKeyword(value) { + return this.match("keyword", value); } - isNullLiteral(value_951) { - return this.match("null", value_951); + + isNullLiteral(value) { + return this.match("null", value); } - isNumericLiteral(value_952) { - return this.match("number", value_952); + + isNumericLiteral(value) { + return this.match("number", value); } - isPunctuator(value_953) { - return this.match("punctuator", value_953); + + isPunctuator(value) { + return this.match("punctuator", value); } - isStringLiteral(value_954) { - return this.match("string", value_954); + + isStringLiteral(value) { + return this.match("string", value); } - isRegularExpression(value_955) { - return this.match("regularExpression", value_955); + + isRegularExpression(value) { + return this.match("regularExpression", value); } - isTemplate(value_956) { - return this.match("template", value_956); + + isTemplate(value) { + return this.match("template", value); } - isDelimiter(value_957) { - return this.match("delimiter", value_957); + + isDelimiter(value) { + return this.match("delimiter", value); } - isParens(value_958) { - return this.match("parens", value_958); + + isParens(value) { + return this.match("parens", value); } - isBraces(value_959) { - return this.match("braces", value_959); + + isBraces(value) { + return this.match("braces", value); } - isBrackets(value_960) { - return this.match("brackets", value_960); + + isBrackets(value) { + return this.match("brackets", value); } - isSyntaxTemplate(value_961) { - return this.match("syntaxTemplate", value_961); + + isSyntaxTemplate(value) { + return this.match("syntaxTemplate", value); } - isEOF(value_962) { - return this.match("eof", value_962); + + isEOF(value) { + return this.match("eof", value); } + toString() { if (this.match("delimiter")) { - return this.token.map(s_963 => s_963.toString()).join(" "); + return this.token.map(s => s.toString()).join(" "); } if (this.match("string")) { return "'" + this.token.str; @@ -388,6 +553,4 @@ class Syntax { } } exports.default = Syntax; -exports.Types = Types_829; -exports.ALL_PHASES = ALL_PHASES_830; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3N5bnRheC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7SUFBYSxDOzs7Ozs7QUFDYixNQUFNLFdBQVcsb0JBQU0sSUFBdkI7QUFDQSxNQUFNLGNBQWMsb0JBQU0sT0FBMUI7QUFDQSxTQUFTLGlCQUFULENBQTJCLE9BQTNCLEVBQW9DO0FBQ2xDLE1BQUksQ0FBQyxPQUFELElBQVksT0FBTyxRQUFRLFdBQWYsS0FBK0IsVUFBL0MsRUFBMkQsT0FBTyxJQUFQO0FBQzNELE1BQUksQ0FBQyxRQUFRLFdBQVIsRUFBTCxFQUE0QjtBQUMxQixXQUFPLFFBQVEsS0FBUixDQUFjLEtBQXJCO0FBQ0Q7QUFDRCxTQUFPLFFBQVEsS0FBUixDQUFjLEdBQWQsQ0FBa0IsQ0FBbEIsRUFBcUIsS0FBckIsQ0FBMkIsS0FBbEM7QUFDRDtBQUNELFNBQVMsaUJBQVQsQ0FBMkIsS0FBM0IsRUFBa0MsS0FBbEMsRUFBeUM7QUFDdkMsTUFBSSxNQUFNLE1BQU4sQ0FBYSxJQUFiLEdBQW9CLE1BQU0sTUFBTixDQUFhLElBQXJDLEVBQTJDO0FBQ3pDLFdBQU8sQ0FBQyxDQUFSO0FBQ0QsR0FGRCxNQUVPLElBQUksTUFBTSxNQUFOLENBQWEsSUFBYixHQUFvQixNQUFNLE1BQU4sQ0FBYSxJQUFyQyxFQUEyQztBQUNoRCxXQUFPLENBQVA7QUFDRCxHQUZNLE1BRUE7QUFDTCxXQUFPLENBQVA7QUFDRDtBQUNGO0FBQ0QsSUFBSSxZQUFZLEVBQUMsTUFBTSxFQUFDLE9BQU8sYUFBYSxDQUFDLFVBQVUsU0FBVixDQUFvQixLQUFwQixDQUEwQixTQUExQixDQUFELElBQXlDLFVBQVUsSUFBVixLQUFtQixxQkFBVSxJQUEzRixFQUFpRyxRQUFRLENBQUMsU0FBRCxFQUFZLE9BQVosS0FBd0IsSUFBSSxNQUFKLENBQVcsRUFBQyxNQUFNLHFCQUFVLElBQWpCLEVBQXVCLE9BQU8sSUFBOUIsRUFBWCxFQUFnRCxPQUFoRCxDQUFqSSxFQUFQLEVBQW1NLFFBQVEsRUFBQyxPQUFPLGFBQWEsQ0FBQyxVQUFVLFNBQVYsQ0FBb0IsS0FBcEIsQ0FBMEIsU0FBMUIsQ0FBRCxJQUF5QyxVQUFVLElBQVYsQ0FBZSxLQUFmLEtBQXlCLHNCQUFXLGNBQWxHLEVBQWtILFFBQVEsQ0FBQyxTQUFELEVBQVksT0FBWixLQUF3QixJQUFJLE1BQUosQ0FBVyxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBeUIsT0FBTyxTQUFoQyxFQUFYLEVBQXVELE9BQXZELENBQWxKLEVBQTNNLEVBQStaLFFBQVEsRUFBQyxPQUFPLGFBQWEsQ0FBQyxVQUFVLFNBQVYsQ0FBb0IsS0FBcEIsQ0FBMEIsU0FBMUIsQ0FBRCxJQUF5QyxVQUFVLElBQVYsQ0FBZSxLQUFmLEtBQXlCLHNCQUFXLGFBQWxHLEVBQWlILFFBQVEsQ0FBQyxTQUFELEVBQVksT0FBWixLQUF3QixJQUFJLE1BQUosQ0FBVyxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBeUIsS0FBSyxTQUE5QixFQUFYLEVBQXFELE9BQXJELENBQWpKLEVBQXZhLEVBQXduQixZQUFZLEVBQUMsT0FBTyxhQUFhLENBQUMsVUFBVSxTQUFWLENBQW9CLEtBQXBCLENBQTBCLFNBQTFCLENBQUQsSUFBeUMsVUFBVSxJQUFWLENBQWUsS0FBZixLQUF5QixzQkFBVyxVQUFsRyxFQUE4RyxRQUFRLENBQUMsU0FBRCxFQUFZLE9BQVosS0FBd0IsSUFBSSxNQUFKLENBQVcsRUFBQyxNQUFNLEVBQUMsT0FBTyxzQkFBVyxVQUFuQixFQUErQixNQUFNLFNBQXJDLEVBQVAsRUFBd0QsT0FBTyxTQUEvRCxFQUFYLEVBQXNGLE9BQXRGLENBQTlJLEVBQXBvQixFQUFtM0IsU0FBUyxFQUFDLE9BQU8sYUFBYSxDQUFDLFVBQVUsU0FBVixDQUFvQixLQUFwQixDQUEwQixTQUExQixDQUFELElBQXlDLFVBQVUsSUFBVixDQUFlLEtBQWYsS0FBeUIsc0JBQVcsT0FBbEcsRUFBMkcsUUFBUSxDQUFDLFNBQUQsRUFBWSxPQUFaLEtBQXdCLElBQUksTUFBSixDQUFXLEVBQUMsTUFBTSxFQUFDLE9BQU8sc0JBQVcsT0FBbkIsRUFBNEIsTUFBTSxTQUFsQyxFQUFQLEVBQXFELE9BQU8sU0FBNUQsRUFBWCxFQUFtRixPQUFuRixDQUEzSSxFQUE1M0IsRUFBcW1DLFlBQVksRUFBQyxPQUFPLGFBQWEsQ0FBQyxVQUFVLFNBQVYsQ0FBb0IsS0FBcEIsQ0FBMEIsU0FBMUIsQ0FBRCxJQUF5QyxVQUFVLElBQVYsQ0FBZSxLQUFmLEtBQXlCLHNCQUFXLEtBQWxHLEVBQXlHLFFBQVEsQ0FBQyxTQUFELEVBQVksT0FBWixLQUF3QixJQUFJLE1BQUosQ0FBVyxFQUFDLE1BQU0scUJBQVUsVUFBakIsRUFBNkIsT0FBTyxTQUFwQyxFQUFYLEVBQTJELE9BQTNELENBQXpJLEVBQWpuQyxFQUFnMEMsbUJBQW1CLEVBQUMsT0FBTyxhQUFhLENBQUMsVUFBVSxTQUFWLENBQW9CLEtBQXBCLENBQTBCLFNBQTFCLENBQUQsSUFBeUMsVUFBVSxJQUFWLENBQWUsS0FBZixLQUF5QixzQkFBVyxpQkFBbEcsRUFBcUgsUUFBUSxDQUFDLFNBQUQsRUFBWSxPQUFaLEtBQXdCLElBQUksTUFBSixDQUFXLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUF5QixPQUFPLFNBQWhDLEVBQVgsRUFBdUQsT0FBdkQsQ0FBckosRUFBbjFDLEVBQTBpRCxRQUFRLEVBQUMsT0FBTyxhQUFhLFVBQVUsU0FBVixDQUFvQixLQUFwQixDQUEwQixTQUExQixLQUF3QyxVQUFVLEdBQVYsQ0FBYyxDQUFkLEVBQWlCLEtBQWpCLENBQXVCLElBQXZCLEtBQWdDLHFCQUFVLE1BQXZHLEVBQStHLFFBQVEsQ0FBQyxTQUFELEVBQVksT0FBWixLQUF3QjtBQUMvc0QsVUFBSSxXQUFXLElBQUksTUFBSixDQUFXLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUF5QixPQUFPLEdBQWhDLEVBQXFDLE9BQU8sa0JBQWtCLE9BQWxCLENBQTVDLEVBQVgsQ0FBZjtBQUNBLFVBQUksWUFBWSxJQUFJLE1BQUosQ0FBVyxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBeUIsT0FBTyxHQUFoQyxFQUFxQyxPQUFPLGtCQUFrQixPQUFsQixDQUE1QyxFQUFYLENBQWhCO0FBQ0EsYUFBTyxJQUFJLE1BQUosQ0FBVyxnQkFBSyxFQUFMLENBQVEsUUFBUixFQUFrQixNQUFsQixDQUF5QixTQUF6QixFQUFvQyxJQUFwQyxDQUF5QyxTQUF6QyxDQUFYLEVBQWdFLE9BQWhFLENBQVA7QUFDRCxLQUppa0QsRUFBbGpELEVBSVosVUFBVSxFQUFDLE9BQU8sYUFBYSxVQUFVLFNBQVYsQ0FBb0IsS0FBcEIsQ0FBMEIsU0FBMUIsS0FBd0MsVUFBVSxHQUFWLENBQWMsQ0FBZCxFQUFpQixLQUFqQixDQUF1QixJQUF2QixLQUFnQyxxQkFBVSxNQUF2RyxFQUErRyxRQUFRLENBQUMsU0FBRCxFQUFZLE9BQVosS0FBd0I7QUFDM0osVUFBSSxXQUFXLElBQUksTUFBSixDQUFXLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUF5QixPQUFPLEdBQWhDLEVBQXFDLE9BQU8sa0JBQWtCLE9BQWxCLENBQTVDLEVBQVgsQ0FBZjtBQUNBLFVBQUksWUFBWSxJQUFJLE1BQUosQ0FBVyxFQUFDLE1BQU0scUJBQVUsTUFBakIsRUFBeUIsT0FBTyxHQUFoQyxFQUFxQyxPQUFPLGtCQUFrQixPQUFsQixDQUE1QyxFQUFYLENBQWhCO0FBQ0EsYUFBTyxJQUFJLE1BQUosQ0FBVyxnQkFBSyxFQUFMLENBQVEsUUFBUixFQUFrQixNQUFsQixDQUF5QixTQUF6QixFQUFvQyxJQUFwQyxDQUF5QyxTQUF6QyxDQUFYLEVBQWdFLE9BQWhFLENBQVA7QUFDRCxLQUphLEVBSkUsRUFRWixRQUFRLEVBQUMsT0FBTyxhQUFhLFVBQVUsU0FBVixDQUFvQixLQUFwQixDQUEwQixTQUExQixLQUF3QyxVQUFVLEdBQVYsQ0FBYyxDQUFkLEVBQWlCLEtBQWpCLENBQXVCLElBQXZCLEtBQWdDLHFCQUFVLE1BQXZHLEVBQStHLFFBQVEsQ0FBQyxTQUFELEVBQVksT0FBWixLQUF3QjtBQUN6SixVQUFJLFdBQVcsSUFBSSxNQUFKLENBQVcsRUFBQyxNQUFNLHFCQUFVLE1BQWpCLEVBQXlCLE9BQU8sR0FBaEMsRUFBcUMsT0FBTyxrQkFBa0IsT0FBbEIsQ0FBNUMsRUFBWCxDQUFmO0FBQ0EsVUFBSSxZQUFZLElBQUksTUFBSixDQUFXLEVBQUMsTUFBTSxxQkFBVSxNQUFqQixFQUF5QixPQUFPLEdBQWhDLEVBQXFDLE9BQU8sa0JBQWtCLE9BQWxCLENBQTVDLEVBQVgsQ0FBaEI7QUFDQSxhQUFPLElBQUksTUFBSixDQUFXLGdCQUFLLEVBQUwsQ0FBUSxRQUFSLEVBQWtCLE1BQWxCLENBQXlCLFNBQXpCLEVBQW9DLElBQXBDLENBQXlDLFNBQXpDLENBQVgsRUFBZ0UsT0FBaEUsQ0FBUDtBQUNELEtBSlcsRUFSSSxFQVlaLFFBQVEsRUFBQyxPQUFPLGFBQWE7QUFDL0IsVUFBSSxVQUFVLFVBQVYsQ0FBcUIsS0FBckIsQ0FBMkIsU0FBM0IsQ0FBSixFQUEyQztBQUN6QyxnQkFBUSxVQUFVLEtBQWxCO0FBQ0UsZUFBSyxHQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0EsZUFBSyxLQUFMO0FBQ0EsZUFBSyxLQUFMO0FBQ0EsZUFBSyxNQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0EsZUFBSyxJQUFMO0FBQ0UsbUJBQU8sSUFBUDtBQUNGO0FBQ0UsbUJBQU8sS0FBUDtBQWZKO0FBaUJEO0FBQ0QsYUFBTyxLQUFQO0FBQ0QsS0FyQlcsRUFaSSxFQWlDWixTQUFTLEVBQUMsT0FBTyxhQUFhLENBQUMsVUFBVSxTQUFWLENBQW9CLEtBQXBCLENBQTBCLFNBQTFCLENBQUQsSUFBeUMsVUFBVSxJQUFWLEtBQW1CLHFCQUFVLElBQXRFLElBQThFLFVBQVUsSUFBVixLQUFtQixxQkFBVSxLQUFoSSxFQWpDRyxFQWlDcUksVUFBVSxFQUFDLE9BQU8sYUFBYSxDQUFDLFVBQVUsU0FBVixDQUFvQixLQUFwQixDQUEwQixTQUExQixDQUFELElBQXlDLFVBQVUsSUFBVixLQUFtQixxQkFBVSxRQUEzRixFQWpDL0ksRUFpQ3FQLFdBQVcsRUFBQyxPQUFPLGFBQWEsZ0JBQUssTUFBTCxDQUFZLFNBQVosQ0FBckIsRUFqQ2hRLEVBaUM4UyxnQkFBZ0IsRUFBQyxPQUFPLGFBQWEsVUFBVSxTQUFWLENBQW9CLEtBQXBCLENBQTBCLFNBQTFCLEtBQXdDLFVBQVUsR0FBVixDQUFjLENBQWQsRUFBaUIsR0FBakIsT0FBMkIsSUFBeEYsRUFqQzlULEVBaUM2WixLQUFLLEVBQUMsT0FBTyxhQUFhLENBQUMsVUFBVSxTQUFWLENBQW9CLEtBQXBCLENBQTBCLFNBQTFCLENBQUQsSUFBeUMsVUFBVSxJQUFWLEtBQW1CLHFCQUFVLEdBQTNGLEVBakNsYSxFQUFoQjtBQWtDQTtBQUNBLE1BQU0saUJBQWlCLEVBQXZCO0FBQ0E7QUFDZSxNQUFNLE1BQU4sQ0FBYTtBQUMxQixjQUFZLFNBQVosRUFBd0M7QUFBQSxRQUFqQixVQUFpQix5REFBSixFQUFJOztBQUN0QyxTQUFLLEtBQUwsR0FBYSxTQUFiO0FBQ0EsU0FBSyxRQUFMLEdBQWdCLFdBQVcsUUFBWCxJQUF1QixJQUF2QixHQUE4QixXQUFXLFFBQXpDLEdBQW9ELDBCQUFwRTtBQUNBLFNBQUssU0FBTCxHQUFpQixXQUFXLFNBQVgsSUFBd0IsSUFBeEIsR0FBK0IsV0FBVyxTQUExQyxHQUFzRCxFQUFDLEtBQUssc0JBQU4sRUFBYyxPQUFPLHFCQUFyQixFQUF2RTtBQUNBLFdBQU8sTUFBUCxDQUFjLElBQWQ7QUFDRDtBQUNELFNBQU8sRUFBUCxDQUFVLFNBQVYsRUFBbUM7QUFBQSxRQUFkLE9BQWMseURBQUosRUFBSTs7QUFDakMsV0FBTyxJQUFJLE1BQUosQ0FBVyxTQUFYLEVBQXNCLE9BQXRCLENBQVA7QUFDRDtBQUNELFNBQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsU0FBdEIsRUFBK0M7QUFBQSxRQUFkLE9BQWMseURBQUosRUFBSTs7QUFDN0MsUUFBSSxDQUFDLFVBQVUsUUFBVixDQUFMLEVBQTBCO0FBQ3hCLFlBQU0sSUFBSSxLQUFKLENBQVUsV0FBVyxzQkFBckIsQ0FBTjtBQUNELEtBRkQsTUFFTyxJQUFJLENBQUMsVUFBVSxRQUFWLEVBQW9CLE1BQXpCLEVBQWlDO0FBQ3RDLFlBQU0sSUFBSSxLQUFKLENBQVUsc0NBQXNDLFFBQWhELENBQU47QUFDRDtBQUNELFFBQUksYUFBYSxVQUFVLFFBQVYsRUFBb0IsTUFBcEIsQ0FBMkIsU0FBM0IsRUFBc0MsT0FBdEMsQ0FBakI7QUFDQSxRQUFJLFlBQVksa0JBQWtCLE9BQWxCLENBQWhCO0FBQ0EsUUFBSSxhQUFhLElBQWpCLEVBQXVCO0FBQ3JCLGlCQUFXLEtBQVgsQ0FBaUIsS0FBakIsR0FBeUIsU0FBekI7QUFDRDtBQUNELFdBQU8sVUFBUDtBQUNEO0FBQ0QsT0FBSyxRQUFMLEVBQWUsU0FBZixFQUEwQjtBQUN4QixXQUFPLE9BQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsU0FBdEIsRUFBaUMsSUFBakMsQ0FBUDtBQUNEO0FBQ0QsYUFBVztBQUNULFdBQU8sS0FBSyxJQUFMLENBQVUsTUFBVixFQUFrQixJQUFsQixDQUFQO0FBQ0Q7QUFDRCxhQUFXLFNBQVgsRUFBc0I7QUFDcEIsV0FBTyxLQUFLLElBQUwsQ0FBVSxRQUFWLEVBQW9CLFNBQXBCLENBQVA7QUFDRDtBQUNELGFBQVcsU0FBWCxFQUFzQjtBQUNwQixXQUFPLEtBQUssSUFBTCxDQUFVLFFBQVYsRUFBb0IsU0FBcEIsQ0FBUDtBQUNEO0FBQ0QsaUJBQWUsU0FBZixFQUEwQjtBQUN4QixXQUFPLEtBQUssSUFBTCxDQUFVLFlBQVYsRUFBd0IsU0FBeEIsQ0FBUDtBQUNEO0FBQ0QsY0FBWSxTQUFaLEVBQXVCO0FBQ3JCLFdBQU8sS0FBSyxJQUFMLENBQVUsU0FBVixDQUFQO0FBQ0Q7QUFDRCxpQkFBZSxTQUFmLEVBQTBCO0FBQ3hCLFdBQU8sS0FBSyxJQUFMLENBQVUsWUFBVixFQUF3QixTQUF4QixDQUFQO0FBQ0Q7QUFDRCx3QkFBc0IsU0FBdEIsRUFBaUM7QUFDL0IsV0FBTyxLQUFLLElBQUwsQ0FBVSxtQkFBVixFQUErQixTQUEvQixDQUFQO0FBQ0Q7QUFDRCxhQUFXLFNBQVgsRUFBc0I7QUFDcEIsV0FBTyxLQUFLLElBQUwsQ0FBVSxRQUFWLEVBQW9CLFNBQXBCLENBQVA7QUFDRDtBQUNELGVBQWEsU0FBYixFQUF3QjtBQUN0QixXQUFPLEtBQUssSUFBTCxDQUFVLFVBQVYsRUFBc0IsU0FBdEIsQ0FBUDtBQUNEO0FBQ0QsYUFBVyxTQUFYLEVBQXNCO0FBQ3BCLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBVixFQUFvQixTQUFwQixDQUFQO0FBQ0Q7QUFDRCxTQUFPLFFBQVAsR0FBOEI7QUFBQSxRQUFkLE9BQWMseURBQUosRUFBSTs7QUFDNUIsV0FBTyxPQUFPLElBQVAsQ0FBWSxNQUFaLEVBQW9CLElBQXBCLEVBQTBCLE9BQTFCLENBQVA7QUFDRDtBQUNELFNBQU8sVUFBUCxDQUFrQixTQUFsQixFQUEyQztBQUFBLFFBQWQsT0FBYyx5REFBSixFQUFJOztBQUN6QyxXQUFPLE9BQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsU0FBdEIsRUFBaUMsT0FBakMsQ0FBUDtBQUNEO0FBQ0QsU0FBTyxVQUFQLENBQWtCLFNBQWxCLEVBQTJDO0FBQUEsUUFBZCxPQUFjLHlEQUFKLEVBQUk7O0FBQ3pDLFdBQU8sT0FBTyxJQUFQLENBQVksUUFBWixFQUFzQixTQUF0QixFQUFpQyxPQUFqQyxDQUFQO0FBQ0Q7QUFDRCxTQUFPLGNBQVAsQ0FBc0IsU0FBdEIsRUFBK0M7QUFBQSxRQUFkLE9BQWMseURBQUosRUFBSTs7QUFDN0MsV0FBTyxPQUFPLElBQVAsQ0FBWSxZQUFaLEVBQTBCLFNBQTFCLEVBQXFDLE9BQXJDLENBQVA7QUFDRDtBQUNELFNBQU8sV0FBUCxDQUFtQixTQUFuQixFQUE0QztBQUFBLFFBQWQsT0FBYyx5REFBSixFQUFJOztBQUMxQyxXQUFPLE9BQU8sSUFBUCxDQUFZLFNBQVosRUFBdUIsU0FBdkIsRUFBa0MsT0FBbEMsQ0FBUDtBQUNEO0FBQ0QsU0FBTyxjQUFQLENBQXNCLFNBQXRCLEVBQStDO0FBQUEsUUFBZCxPQUFjLHlEQUFKLEVBQUk7O0FBQzdDLFdBQU8sT0FBTyxJQUFQLENBQVksWUFBWixFQUEwQixTQUExQixFQUFxQyxPQUFyQyxDQUFQO0FBQ0Q7QUFDRCxTQUFPLHFCQUFQLENBQTZCLFNBQTdCLEVBQXNEO0FBQUEsUUFBZCxPQUFjLHlEQUFKLEVBQUk7O0FBQ3BELFdBQU8sT0FBTyxJQUFQLENBQVksbUJBQVosRUFBaUMsU0FBakMsRUFBNEMsT0FBNUMsQ0FBUDtBQUNEO0FBQ0QsU0FBTyxVQUFQLENBQWtCLFNBQWxCLEVBQTJDO0FBQUEsUUFBZCxPQUFjLHlEQUFKLEVBQUk7O0FBQ3pDLFdBQU8sT0FBTyxJQUFQLENBQVksUUFBWixFQUFzQixTQUF0QixFQUFpQyxPQUFqQyxDQUFQO0FBQ0Q7QUFDRCxTQUFPLFlBQVAsQ0FBb0IsU0FBcEIsRUFBNkM7QUFBQSxRQUFkLE9BQWMseURBQUosRUFBSTs7QUFDM0MsV0FBTyxPQUFPLElBQVAsQ0FBWSxVQUFaLEVBQXdCLFNBQXhCLEVBQW1DLE9BQW5DLENBQVA7QUFDRDtBQUNELFNBQU8sVUFBUCxDQUFrQixTQUFsQixFQUEyQztBQUFBLFFBQWQsT0FBYyx5REFBSixFQUFJOztBQUN6QyxXQUFPLE9BQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsU0FBdEIsRUFBaUMsT0FBakMsQ0FBUDtBQUNEO0FBQ0QsVUFBUSxTQUFSLEVBQW1CO0FBQ2pCLHdCQUFPLGFBQWEsSUFBcEIsRUFBMEIsaUNBQTFCO0FBQ0EsUUFBSSxnQkFBZ0IsS0FBSyxTQUFMLENBQWUsR0FBbkM7QUFDQSxRQUFJLGdCQUFnQixLQUFLLFNBQUwsQ0FBZSxLQUFmLENBQXFCLEdBQXJCLENBQXlCLFNBQXpCLElBQXNDLEtBQUssU0FBTCxDQUFlLEtBQWYsQ0FBcUIsR0FBckIsQ0FBeUIsU0FBekIsQ0FBdEMsR0FBNEUsc0JBQWhHO0FBQ0Esb0JBQWdCLGNBQWMsTUFBZCxDQUFxQixhQUFyQixDQUFoQjtBQUNBLFFBQUksY0FBYyxJQUFkLEtBQXVCLENBQXZCLElBQTRCLEVBQUUsS0FBSyxLQUFMLENBQVcsWUFBWCxLQUE0QixLQUFLLEtBQUwsQ0FBVyxTQUFYLENBQTlCLENBQWhDLEVBQXNGO0FBQ3BGLGFBQU8sS0FBSyxLQUFMLENBQVcsS0FBbEI7QUFDRDtBQUNELFFBQUksWUFBWSxjQUFjLElBQWQsRUFBaEI7QUFDQSxRQUFJLGVBQWUsS0FBSyxRQUF4QjtBQUNBLFFBQUksU0FBSixFQUFlO0FBQ2IsVUFBSSxzQkFBc0IsYUFBYSxHQUFiLENBQWlCLElBQWpCLENBQTFCO0FBQ0EsVUFBSSxtQkFBSixFQUF5QjtBQUN2QixZQUFJLHFCQUFxQixvQkFBb0IsTUFBcEIsQ0FBMkIsUUFBdUI7QUFBQSxjQUFyQixNQUFxQixRQUFyQixNQUFxQjtBQUFBLGNBQWIsT0FBYSxRQUFiLE9BQWE7O0FBQ3pFLGlCQUFPLE9BQU8sUUFBUCxDQUFnQixhQUFoQixDQUFQO0FBQ0QsU0FGd0IsRUFFdEIsSUFGc0IsQ0FFakIsaUJBRmlCLENBQXpCO0FBR0EsWUFBSSxtQkFBbUIsSUFBbkIsSUFBMkIsQ0FBM0IsSUFBZ0MsbUJBQW1CLEdBQW5CLENBQXVCLENBQXZCLEVBQTBCLE1BQTFCLENBQWlDLElBQWpDLEtBQTBDLG1CQUFtQixHQUFuQixDQUF1QixDQUF2QixFQUEwQixNQUExQixDQUFpQyxJQUEvRyxFQUFxSDtBQUNuSCxjQUFJLFlBQVksTUFBTSxjQUFjLEdBQWQsQ0FBa0IsU0FBUyxNQUFNLFFBQU4sRUFBM0IsRUFBNkMsSUFBN0MsQ0FBa0QsSUFBbEQsQ0FBTixHQUFnRSxHQUFoRjtBQUNBLGNBQUkseUJBQXlCLG1CQUFtQixHQUFuQixDQUF1QixTQUFjO0FBQUEsZ0JBQVosTUFBWSxTQUFaLE1BQVk7O0FBQ2hFLG1CQUFPLE1BQU0sT0FBTyxHQUFQLENBQVcsU0FBUyxNQUFNLFFBQU4sRUFBcEIsRUFBc0MsSUFBdEMsQ0FBMkMsSUFBM0MsQ0FBTixHQUF5RCxHQUFoRTtBQUNELFdBRjRCLEVBRTFCLElBRjBCLENBRXJCLElBRnFCLENBQTdCO0FBR0EsZ0JBQU0sSUFBSSxLQUFKLENBQVUsY0FBYyxTQUFkLEdBQTBCLHlCQUExQixHQUFzRCxzQkFBaEUsQ0FBTjtBQUNELFNBTkQsTUFNTyxJQUFJLG1CQUFtQixJQUFuQixLQUE0QixDQUFoQyxFQUFtQztBQUN4QyxjQUFJLGFBQWEsbUJBQW1CLEdBQW5CLENBQXVCLENBQXZCLEVBQTBCLE9BQTFCLENBQWtDLFFBQWxDLEVBQWpCO0FBQ0EsY0FBSSxvQkFBTSxNQUFOLENBQWEsbUJBQW1CLEdBQW5CLENBQXVCLENBQXZCLEVBQTBCLEtBQXZDLENBQUosRUFBbUQ7QUFDakQsbUJBQU8sbUJBQW1CLEdBQW5CLENBQXVCLENBQXZCLEVBQTBCLEtBQTFCLENBQWdDLFNBQWhDLENBQTBDLElBQTFDLEVBQWdELE9BQWhELENBQXdELFNBQXhELENBQVA7QUFDRDtBQUNELGlCQUFPLFVBQVA7QUFDRDtBQUNGO0FBQ0Y7QUFDRCxXQUFPLEtBQUssS0FBTCxDQUFXLEtBQWxCO0FBQ0Q7QUFDRCxRQUFNO0FBQ0osd0JBQU8sQ0FBQyxLQUFLLEtBQUwsQ0FBVyxXQUFYLENBQVIsRUFBaUMsbUNBQWpDO0FBQ0EsUUFBSSxLQUFLLEtBQUwsQ0FBVyxRQUFYLENBQUosRUFBMEI7QUFDeEIsYUFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFsQjtBQUNEO0FBQ0QsUUFBSSxLQUFLLEtBQUwsQ0FBVyxVQUFYLENBQUosRUFBNEI7QUFDMUIsYUFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLEdBQWpCLENBQXFCLFVBQVU7QUFDcEMsWUFBSSxPQUFPLE9BQU8sS0FBZCxLQUF3QixVQUF4QixJQUFzQyxPQUFPLEtBQVAsQ0FBYSxXQUFiLENBQTFDLEVBQXFFO0FBQ25FLGlCQUFPLFFBQVA7QUFDRDtBQUNELGVBQU8sT0FBTyxLQUFQLENBQWEsSUFBcEI7QUFDRCxPQUxNLEVBS0osSUFMSSxDQUtDLEVBTEQsQ0FBUDtBQU1EO0FBQ0QsV0FBTyxLQUFLLEtBQUwsQ0FBVyxLQUFsQjtBQUNEO0FBQ0QsZUFBYTtBQUNYLFFBQUksQ0FBQyxLQUFLLEtBQUwsQ0FBVyxXQUFYLENBQUwsRUFBOEI7QUFDNUIsYUFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQWlCLGFBQWpCLENBQStCLElBQXRDO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsYUFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsQ0FBZixFQUFrQixVQUFsQixFQUFQO0FBQ0Q7QUFDRjtBQUNELGdCQUFjLFFBQWQsRUFBd0I7QUFDdEIsUUFBSSxhQUFhLEVBQWpCO0FBQ0EsUUFBSSxLQUFLLFdBQUwsRUFBSixFQUF3QjtBQUN0QixtQkFBYSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsU0FBUyxNQUFNLGFBQU4sQ0FBb0IsUUFBcEIsQ0FBeEIsQ0FBYjtBQUNELEtBRkQsTUFFTztBQUNMLFdBQUssSUFBSSxHQUFULElBQWdCLE9BQU8sSUFBUCxDQUFZLEtBQUssS0FBakIsQ0FBaEIsRUFBeUM7QUFDdkMsbUJBQVcsR0FBWCxJQUFrQixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWxCO0FBQ0Q7QUFDRCwwQkFBTyxXQUFXLEtBQVgsSUFBb0IsV0FBVyxLQUFYLENBQWlCLGFBQTVDLEVBQTJELGdDQUEzRDtBQUNBLGlCQUFXLEtBQVgsQ0FBaUIsYUFBakIsQ0FBK0IsSUFBL0IsR0FBc0MsUUFBdEM7QUFDRDtBQUNELFdBQU8sSUFBSSxNQUFKLENBQVcsVUFBWCxFQUF1QixJQUF2QixDQUFQO0FBQ0Q7QUFDRCxVQUFRO0FBQ04sd0JBQU8sS0FBSyxLQUFMLENBQVcsV0FBWCxDQUFQLEVBQWdDLHVDQUFoQztBQUNBLFdBQU8sS0FBSyxLQUFMLENBQVcsS0FBWCxDQUFpQixDQUFqQixFQUFvQixLQUFLLEtBQUwsQ0FBVyxJQUFYLEdBQWtCLENBQXRDLENBQVA7QUFDRDtBQUNELFdBQVMsU0FBVCxFQUFvQixZQUFwQixFQUFrQyxTQUFsQyxFQUEwRTtBQUFBLFFBQTdCLFdBQTZCLHlEQUFmLEVBQUMsTUFBTSxLQUFQLEVBQWU7O0FBQ3hFLFFBQUksWUFBWSxLQUFLLEtBQUwsQ0FBVyxXQUFYLElBQTBCLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxTQUFTLE1BQU0sUUFBTixDQUFlLFNBQWYsRUFBMEIsWUFBMUIsRUFBd0MsU0FBeEMsRUFBbUQsV0FBbkQsQ0FBeEIsQ0FBMUIsR0FBcUgsS0FBSyxLQUExSTtBQUNBLFFBQUksS0FBSyxLQUFMLENBQVcsVUFBWCxDQUFKLEVBQTRCO0FBQzFCLGtCQUFZLEVBQUUsS0FBRixDQUFRLFNBQVIsRUFBbUIsRUFBQyxPQUFPLFVBQVUsS0FBVixDQUFnQixHQUFoQixDQUFvQixVQUFVO0FBQ25FLGNBQUksa0JBQWtCLE1BQWxCLElBQTRCLE9BQU8sS0FBUCxDQUFhLFdBQWIsQ0FBaEMsRUFBMkQ7QUFDekQsbUJBQU8sT0FBTyxRQUFQLENBQWdCLFNBQWhCLEVBQTJCLFlBQTNCLEVBQXlDLFNBQXpDLEVBQW9ELFdBQXBELENBQVA7QUFDRDtBQUNELGlCQUFPLE1BQVA7QUFDRCxTQUxzQyxDQUFSLEVBQW5CLENBQVo7QUFNRDtBQUNELFFBQUksZUFBSjtBQUNBLFFBQUksY0FBYyxjQUFsQixFQUFrQztBQUNoQyx3QkFBa0IsS0FBSyxTQUFMLENBQWUsR0FBakM7QUFDRCxLQUZELE1BRU87QUFDTCx3QkFBa0IsS0FBSyxTQUFMLENBQWUsS0FBZixDQUFxQixHQUFyQixDQUF5QixTQUF6QixJQUFzQyxLQUFLLFNBQUwsQ0FBZSxLQUFmLENBQXFCLEdBQXJCLENBQXlCLFNBQXpCLENBQXRDLEdBQTRFLHNCQUE5RjtBQUNEO0FBQ0QsUUFBSSxlQUFKO0FBQ0EsUUFBSSxZQUFZLElBQWhCLEVBQXNCO0FBQ3BCLFVBQUksUUFBUSxnQkFBZ0IsT0FBaEIsQ0FBd0IsU0FBeEIsQ0FBWjtBQUNBLFVBQUksVUFBVSxDQUFDLENBQWYsRUFBa0I7QUFDaEIsMEJBQWtCLGdCQUFnQixNQUFoQixDQUF1QixLQUF2QixDQUFsQjtBQUNELE9BRkQsTUFFTztBQUNMLDBCQUFrQixnQkFBZ0IsSUFBaEIsQ0FBcUIsU0FBckIsQ0FBbEI7QUFDRDtBQUNGLEtBUEQsTUFPTztBQUNMLHdCQUFrQixnQkFBZ0IsSUFBaEIsQ0FBcUIsU0FBckIsQ0FBbEI7QUFDRDtBQUNELFFBQUksYUFBYSxFQUFDLFVBQVUsWUFBWCxFQUF5QixXQUFXLEVBQUMsS0FBSyxLQUFLLFNBQUwsQ0FBZSxHQUFyQixFQUEwQixPQUFPLEtBQUssU0FBTCxDQUFlLEtBQWhELEVBQXBDLEVBQWpCO0FBQ0EsUUFBSSxjQUFjLGNBQWxCLEVBQWtDO0FBQ2hDLGlCQUFXLFNBQVgsQ0FBcUIsR0FBckIsR0FBMkIsZUFBM0I7QUFDRCxLQUZELE1BRU87QUFDTCxpQkFBVyxTQUFYLENBQXFCLEtBQXJCLEdBQTZCLFdBQVcsU0FBWCxDQUFxQixLQUFyQixDQUEyQixHQUEzQixDQUErQixTQUEvQixFQUEwQyxlQUExQyxDQUE3QjtBQUNEO0FBQ0QsV0FBTyxJQUFJLE1BQUosQ0FBVyxTQUFYLEVBQXNCLFVBQXRCLENBQVA7QUFDRDtBQUNELGNBQVksU0FBWixFQUF1QixTQUF2QixFQUFrQztBQUNoQyxRQUFJLFlBQVksS0FBSyxLQUFMLENBQVcsV0FBWCxJQUEwQixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsU0FBUyxNQUFNLFdBQU4sQ0FBa0IsU0FBbEIsRUFBNkIsU0FBN0IsQ0FBeEIsQ0FBMUIsR0FBNkYsS0FBSyxLQUFsSDtBQUNBLFFBQUksb0JBQW9CLEtBQUssU0FBTCxDQUFlLEtBQWYsQ0FBcUIsR0FBckIsQ0FBeUIsU0FBekIsSUFBc0MsS0FBSyxTQUFMLENBQWUsS0FBZixDQUFxQixHQUFyQixDQUF5QixTQUF6QixDQUF0QyxHQUE0RSxzQkFBcEc7QUFDQSxRQUFJLGtCQUFrQixLQUFLLFNBQUwsQ0FBZSxHQUFyQztBQUNBLFFBQUksYUFBYSxFQUFDLFVBQVUsS0FBSyxRQUFoQixFQUEwQixXQUFXLEVBQUMsS0FBSyxLQUFLLFNBQUwsQ0FBZSxHQUFyQixFQUEwQixPQUFPLEtBQUssU0FBTCxDQUFlLEtBQWhELEVBQXJDLEVBQWpCO0FBQ0EsUUFBSSxpQkFBaUIsa0JBQWtCLE9BQWxCLENBQTBCLFNBQTFCLENBQXJCO0FBQ0EsUUFBSSxlQUFlLGdCQUFnQixPQUFoQixDQUF3QixTQUF4QixDQUFuQjtBQUNBLFFBQUksbUJBQW1CLENBQUMsQ0FBeEIsRUFBMkI7QUFDekIsaUJBQVcsU0FBWCxDQUFxQixLQUFyQixHQUE2QixLQUFLLFNBQUwsQ0FBZSxLQUFmLENBQXFCLEdBQXJCLENBQXlCLFNBQXpCLEVBQW9DLGtCQUFrQixNQUFsQixDQUF5QixjQUF6QixDQUFwQyxDQUE3QjtBQUNELEtBRkQsTUFFTyxJQUFJLGlCQUFpQixDQUFDLENBQXRCLEVBQXlCO0FBQzlCLGlCQUFXLFNBQVgsQ0FBcUIsR0FBckIsR0FBMkIsZ0JBQWdCLE1BQWhCLENBQXVCLFlBQXZCLENBQTNCO0FBQ0Q7QUFDRCxXQUFPLElBQUksTUFBSixDQUFXLFNBQVgsRUFBc0IsVUFBdEIsQ0FBUDtBQUNEO0FBQ0QsUUFBTSxRQUFOLEVBQWdCLFNBQWhCLEVBQTJCO0FBQ3pCLFFBQUksQ0FBQyxVQUFVLFFBQVYsQ0FBTCxFQUEwQjtBQUN4QixZQUFNLElBQUksS0FBSixDQUFVLFdBQVcscUJBQXJCLENBQU47QUFDRDtBQUNELFdBQU8sVUFBVSxRQUFWLEVBQW9CLEtBQXBCLENBQTBCLEtBQUssS0FBL0IsTUFBMEMsYUFBYSxJQUFiLEtBQXNCLHFCQUFxQixNQUFyQixHQUE4QixVQUFVLElBQVYsQ0FBZSxLQUFLLEdBQUwsRUFBZixDQUE5QixHQUEyRCxLQUFLLEdBQUwsTUFBYyxTQUEvRixDQUExQyxDQUFQO0FBQ0Q7QUFDRCxlQUFhLFNBQWIsRUFBd0I7QUFDdEIsV0FBTyxLQUFLLEtBQUwsQ0FBVyxZQUFYLEVBQXlCLFNBQXpCLENBQVA7QUFDRDtBQUNELFdBQVMsU0FBVCxFQUFvQjtBQUNsQixXQUFPLEtBQUssS0FBTCxDQUFXLFFBQVgsRUFBcUIsU0FBckIsQ0FBUDtBQUNEO0FBQ0QsbUJBQWlCLFNBQWpCLEVBQTRCO0FBQzFCLFdBQU8sS0FBSyxLQUFMLENBQVcsU0FBWCxFQUFzQixTQUF0QixDQUFQO0FBQ0Q7QUFDRCxZQUFVLFNBQVYsRUFBcUI7QUFDbkIsV0FBTyxLQUFLLEtBQUwsQ0FBVyxTQUFYLEVBQXNCLFNBQXRCLENBQVA7QUFDRDtBQUNELGdCQUFjLFNBQWQsRUFBeUI7QUFDdkIsV0FBTyxLQUFLLEtBQUwsQ0FBVyxNQUFYLEVBQW1CLFNBQW5CLENBQVA7QUFDRDtBQUNELG1CQUFpQixTQUFqQixFQUE0QjtBQUMxQixXQUFPLEtBQUssS0FBTCxDQUFXLFFBQVgsRUFBcUIsU0FBckIsQ0FBUDtBQUNEO0FBQ0QsZUFBYSxTQUFiLEVBQXdCO0FBQ3RCLFdBQU8sS0FBSyxLQUFMLENBQVcsWUFBWCxFQUF5QixTQUF6QixDQUFQO0FBQ0Q7QUFDRCxrQkFBZ0IsU0FBaEIsRUFBMkI7QUFDekIsV0FBTyxLQUFLLEtBQUwsQ0FBVyxRQUFYLEVBQXFCLFNBQXJCLENBQVA7QUFDRDtBQUNELHNCQUFvQixTQUFwQixFQUErQjtBQUM3QixXQUFPLEtBQUssS0FBTCxDQUFXLG1CQUFYLEVBQWdDLFNBQWhDLENBQVA7QUFDRDtBQUNELGFBQVcsU0FBWCxFQUFzQjtBQUNwQixXQUFPLEtBQUssS0FBTCxDQUFXLFVBQVgsRUFBdUIsU0FBdkIsQ0FBUDtBQUNEO0FBQ0QsY0FBWSxTQUFaLEVBQXVCO0FBQ3JCLFdBQU8sS0FBSyxLQUFMLENBQVcsV0FBWCxFQUF3QixTQUF4QixDQUFQO0FBQ0Q7QUFDRCxXQUFTLFNBQVQsRUFBb0I7QUFDbEIsV0FBTyxLQUFLLEtBQUwsQ0FBVyxRQUFYLEVBQXFCLFNBQXJCLENBQVA7QUFDRDtBQUNELFdBQVMsU0FBVCxFQUFvQjtBQUNsQixXQUFPLEtBQUssS0FBTCxDQUFXLFFBQVgsRUFBcUIsU0FBckIsQ0FBUDtBQUNEO0FBQ0QsYUFBVyxTQUFYLEVBQXNCO0FBQ3BCLFdBQU8sS0FBSyxLQUFMLENBQVcsVUFBWCxFQUF1QixTQUF2QixDQUFQO0FBQ0Q7QUFDRCxtQkFBaUIsU0FBakIsRUFBNEI7QUFDMUIsV0FBTyxLQUFLLEtBQUwsQ0FBVyxnQkFBWCxFQUE2QixTQUE3QixDQUFQO0FBQ0Q7QUFDRCxRQUFNLFNBQU4sRUFBaUI7QUFDZixXQUFPLEtBQUssS0FBTCxDQUFXLEtBQVgsRUFBa0IsU0FBbEIsQ0FBUDtBQUNEO0FBQ0QsYUFBVztBQUNULFFBQUksS0FBSyxLQUFMLENBQVcsV0FBWCxDQUFKLEVBQTZCO0FBQzNCLGFBQU8sS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFNBQVMsTUFBTSxRQUFOLEVBQXhCLEVBQTBDLElBQTFDLENBQStDLEdBQS9DLENBQVA7QUFDRDtBQUNELFFBQUksS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFKLEVBQTBCO0FBQ3hCLGFBQU8sTUFBTSxLQUFLLEtBQUwsQ0FBVyxHQUF4QjtBQUNEO0FBQ0QsUUFBSSxLQUFLLEtBQUwsQ0FBVyxVQUFYLENBQUosRUFBNEI7QUFDMUIsYUFBTyxLQUFLLEdBQUwsRUFBUDtBQUNEO0FBQ0QsV0FBTyxLQUFLLEtBQUwsQ0FBVyxLQUFsQjtBQUNEO0FBaFJ5QjtrQkFBUCxNO1FBa1JBLEssR0FBYixTO1FBQ2tCLFUsR0FBbEIsYyIsImZpbGUiOiJzeW50YXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3QsIE1hcH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXBcIjtcbmltcG9ydCB7TWF5YmV9IGZyb20gXCJyYW1kYS1mYW50YXN5XCI7XG5pbXBvcnQge1Rva2VuVHlwZSwgVG9rZW5DbGFzc30gZnJvbSBcInNoaWZ0LXBhcnNlci9kaXN0L3Rva2VuaXplclwiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5jb25zdCBKdXN0XzgyNSA9IE1heWJlLkp1c3Q7XG5jb25zdCBOb3RoaW5nXzgyNiA9IE1heWJlLk5vdGhpbmc7XG5mdW5jdGlvbiBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODMxKSB7XG4gIGlmICghc3R4XzgzMSB8fCB0eXBlb2Ygc3R4XzgzMS5pc0RlbGltaXRlciAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFzdHhfODMxLmlzRGVsaW1pdGVyKCkpIHtcbiAgICByZXR1cm4gc3R4XzgzMS50b2tlbi5zbGljZTtcbiAgfVxuICByZXR1cm4gc3R4XzgzMS50b2tlbi5nZXQoMCkudG9rZW4uc2xpY2U7XG59XG5mdW5jdGlvbiBzaXplRGVjZW5kaW5nXzgyOChhXzgzMiwgYl84MzMpIHtcbiAgaWYgKGFfODMyLnNjb3Blcy5zaXplID4gYl84MzMuc2NvcGVzLnNpemUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYl84MzMuc2NvcGVzLnNpemUgPiBhXzgzMi5zY29wZXMuc2l6ZSkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5sZXQgVHlwZXNfODI5ID0ge251bGw6IHttYXRjaDogdG9rZW5fODM0ID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzgzNCkgJiYgdG9rZW5fODM0LnR5cGUgPT09IFRva2VuVHlwZS5OVUxMLCBjcmVhdGU6ICh2YWx1ZV84MzUsIHN0eF84MzYpID0+IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5OVUxMLCB2YWx1ZTogbnVsbH0sIHN0eF84MzYpfSwgbnVtYmVyOiB7bWF0Y2g6IHRva2VuXzgzNyA9PiAhVHlwZXNfODI5LmRlbGltaXRlci5tYXRjaCh0b2tlbl84MzcpICYmIHRva2VuXzgzNy50eXBlLmtsYXNzID09PSBUb2tlbkNsYXNzLk51bWVyaWNMaXRlcmFsLCBjcmVhdGU6ICh2YWx1ZV84MzgsIHN0eF84MzkpID0+IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5OVU1CRVIsIHZhbHVlOiB2YWx1ZV84Mzh9LCBzdHhfODM5KX0sIHN0cmluZzoge21hdGNoOiB0b2tlbl84NDAgPT4gIVR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODQwKSAmJiB0b2tlbl84NDAudHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5TdHJpbmdMaXRlcmFsLCBjcmVhdGU6ICh2YWx1ZV84NDEsIHN0eF84NDIpID0+IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5TVFJJTkcsIHN0cjogdmFsdWVfODQxfSwgc3R4Xzg0Mil9LCBwdW5jdHVhdG9yOiB7bWF0Y2g6IHRva2VuXzg0MyA9PiAhVHlwZXNfODI5LmRlbGltaXRlci5tYXRjaCh0b2tlbl84NDMpICYmIHRva2VuXzg0My50eXBlLmtsYXNzID09PSBUb2tlbkNsYXNzLlB1bmN0dWF0b3IsIGNyZWF0ZTogKHZhbHVlXzg0NCwgc3R4Xzg0NSkgPT4gbmV3IFN5bnRheCh7dHlwZToge2tsYXNzOiBUb2tlbkNsYXNzLlB1bmN0dWF0b3IsIG5hbWU6IHZhbHVlXzg0NH0sIHZhbHVlOiB2YWx1ZV84NDR9LCBzdHhfODQ1KX0sIGtleXdvcmQ6IHttYXRjaDogdG9rZW5fODQ2ID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg0NikgJiYgdG9rZW5fODQ2LnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuS2V5d29yZCwgY3JlYXRlOiAodmFsdWVfODQ3LCBzdHhfODQ4KSA9PiBuZXcgU3ludGF4KHt0eXBlOiB7a2xhc3M6IFRva2VuQ2xhc3MuS2V5d29yZCwgbmFtZTogdmFsdWVfODQ3fSwgdmFsdWU6IHZhbHVlXzg0N30sIHN0eF84NDgpfSwgaWRlbnRpZmllcjoge21hdGNoOiB0b2tlbl84NDkgPT4gIVR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODQ5KSAmJiB0b2tlbl84NDkudHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5JZGVudCwgY3JlYXRlOiAodmFsdWVfODUwLCBzdHhfODUxKSA9PiBuZXcgU3ludGF4KHt0eXBlOiBUb2tlblR5cGUuSURFTlRJRklFUiwgdmFsdWU6IHZhbHVlXzg1MH0sIHN0eF84NTEpfSwgcmVndWxhckV4cHJlc3Npb246IHttYXRjaDogdG9rZW5fODUyID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg1MikgJiYgdG9rZW5fODUyLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuUmVndWxhckV4cHJlc3Npb24sIGNyZWF0ZTogKHZhbHVlXzg1Mywgc3R4Xzg1NCkgPT4gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLlJFR0VYUCwgdmFsdWU6IHZhbHVlXzg1M30sIHN0eF84NTQpfSwgYnJhY2VzOiB7bWF0Y2g6IHRva2VuXzg1NSA9PiBUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg1NSkgJiYgdG9rZW5fODU1LmdldCgwKS50b2tlbi50eXBlID09PSBUb2tlblR5cGUuTEJSQUNFLCBjcmVhdGU6IChpbm5lcl84NTYsIHN0eF84NTcpID0+IHtcbiAgbGV0IGxlZnRfODU4ID0gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLkxCUkFDRSwgdmFsdWU6IFwie1wiLCBzbGljZTogZ2V0Rmlyc3RTbGljZV84Mjcoc3R4Xzg1Nyl9KTtcbiAgbGV0IHJpZ2h0Xzg1OSA9IG5ldyBTeW50YXgoe3R5cGU6IFRva2VuVHlwZS5SQlJBQ0UsIHZhbHVlOiBcIn1cIiwgc2xpY2U6IGdldEZpcnN0U2xpY2VfODI3KHN0eF84NTcpfSk7XG4gIHJldHVybiBuZXcgU3ludGF4KExpc3Qub2YobGVmdF84NTgpLmNvbmNhdChpbm5lcl84NTYpLnB1c2gocmlnaHRfODU5KSwgc3R4Xzg1Nyk7XG59fSwgYnJhY2tldHM6IHttYXRjaDogdG9rZW5fODYwID0+IFR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODYwKSAmJiB0b2tlbl84NjAuZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MQlJBQ0ssIGNyZWF0ZTogKGlubmVyXzg2MSwgc3R4Xzg2MikgPT4ge1xuICBsZXQgbGVmdF84NjMgPSBuZXcgU3ludGF4KHt0eXBlOiBUb2tlblR5cGUuTEJSQUNLLCB2YWx1ZTogXCJbXCIsIHNsaWNlOiBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODYyKX0pO1xuICBsZXQgcmlnaHRfODY0ID0gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLlJCUkFDSywgdmFsdWU6IFwiXVwiLCBzbGljZTogZ2V0Rmlyc3RTbGljZV84Mjcoc3R4Xzg2Mil9KTtcbiAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0Xzg2MykuY29uY2F0KGlubmVyXzg2MSkucHVzaChyaWdodF84NjQpLCBzdHhfODYyKTtcbn19LCBwYXJlbnM6IHttYXRjaDogdG9rZW5fODY1ID0+IFR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODY1KSAmJiB0b2tlbl84NjUuZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MUEFSRU4sIGNyZWF0ZTogKGlubmVyXzg2Niwgc3R4Xzg2NykgPT4ge1xuICBsZXQgbGVmdF84NjggPSBuZXcgU3ludGF4KHt0eXBlOiBUb2tlblR5cGUuTFBBUkVOLCB2YWx1ZTogXCIoXCIsIHNsaWNlOiBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODY3KX0pO1xuICBsZXQgcmlnaHRfODY5ID0gbmV3IFN5bnRheCh7dHlwZTogVG9rZW5UeXBlLlJQQVJFTiwgdmFsdWU6IFwiKVwiLCBzbGljZTogZ2V0Rmlyc3RTbGljZV84Mjcoc3R4Xzg2Nyl9KTtcbiAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0Xzg2OCkuY29uY2F0KGlubmVyXzg2NikucHVzaChyaWdodF84NjkpLCBzdHhfODY3KTtcbn19LCBhc3NpZ246IHttYXRjaDogdG9rZW5fODcwID0+IHtcbiAgaWYgKFR5cGVzXzgyOS5wdW5jdHVhdG9yLm1hdGNoKHRva2VuXzg3MCkpIHtcbiAgICBzd2l0Y2ggKHRva2VuXzg3MC52YWx1ZSkge1xuICAgICAgY2FzZSBcIj1cIjpcbiAgICAgIGNhc2UgXCJ8PVwiOlxuICAgICAgY2FzZSBcIl49XCI6XG4gICAgICBjYXNlIFwiJj1cIjpcbiAgICAgIGNhc2UgXCI8PD1cIjpcbiAgICAgIGNhc2UgXCI+Pj1cIjpcbiAgICAgIGNhc2UgXCI+Pj49XCI6XG4gICAgICBjYXNlIFwiKz1cIjpcbiAgICAgIGNhc2UgXCItPVwiOlxuICAgICAgY2FzZSBcIio9XCI6XG4gICAgICBjYXNlIFwiLz1cIjpcbiAgICAgIGNhc2UgXCIlPVwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufX0sIGJvb2xlYW46IHttYXRjaDogdG9rZW5fODcxID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg3MSkgJiYgdG9rZW5fODcxLnR5cGUgPT09IFRva2VuVHlwZS5UUlVFIHx8IHRva2VuXzg3MS50eXBlID09PSBUb2tlblR5cGUuRkFMU0V9LCB0ZW1wbGF0ZToge21hdGNoOiB0b2tlbl84NzIgPT4gIVR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODcyKSAmJiB0b2tlbl84NzIudHlwZSA9PT0gVG9rZW5UeXBlLlRFTVBMQVRFfSwgZGVsaW1pdGVyOiB7bWF0Y2g6IHRva2VuXzg3MyA9PiBMaXN0LmlzTGlzdCh0b2tlbl84NzMpfSwgc3ludGF4VGVtcGxhdGU6IHttYXRjaDogdG9rZW5fODc0ID0+IFR5cGVzXzgyOS5kZWxpbWl0ZXIubWF0Y2godG9rZW5fODc0KSAmJiB0b2tlbl84NzQuZ2V0KDApLnZhbCgpID09PSBcIiNgXCJ9LCBlb2Y6IHttYXRjaDogdG9rZW5fODc1ID0+ICFUeXBlc184MjkuZGVsaW1pdGVyLm1hdGNoKHRva2VuXzg3NSkgJiYgdG9rZW5fODc1LnR5cGUgPT09IFRva2VuVHlwZS5FT1N9fTtcbjtcbmNvbnN0IEFMTF9QSEFTRVNfODMwID0ge307XG47XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW50YXgge1xuICBjb25zdHJ1Y3Rvcih0b2tlbl84NzYsIG9sZHN0eF84NzcgPSB7fSkge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbl84NzY7XG4gICAgdGhpcy5iaW5kaW5ncyA9IG9sZHN0eF84NzcuYmluZGluZ3MgIT0gbnVsbCA/IG9sZHN0eF84NzcuYmluZGluZ3MgOiBuZXcgQmluZGluZ01hcDtcbiAgICB0aGlzLnNjb3Blc2V0cyA9IG9sZHN0eF84Nzcuc2NvcGVzZXRzICE9IG51bGwgPyBvbGRzdHhfODc3LnNjb3Blc2V0cyA6IHthbGw6IExpc3QoKSwgcGhhc2U6IE1hcCgpfTtcbiAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICB9XG4gIHN0YXRpYyBvZih0b2tlbl84NzgsIHN0eF84NzkgPSB7fSkge1xuICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuXzg3OCwgc3R4Xzg3OSk7XG4gIH1cbiAgc3RhdGljIGZyb20odHlwZV84ODAsIHZhbHVlXzg4MSwgc3R4Xzg4MiA9IHt9KSB7XG4gICAgaWYgKCFUeXBlc184MjlbdHlwZV84ODBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZV84ODAgKyBcIiBpcyBub3QgYSB2YWxpZCB0eXBlXCIpO1xuICAgIH0gZWxzZSBpZiAoIVR5cGVzXzgyOVt0eXBlXzg4MF0uY3JlYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGEgc3ludGF4IGZyb20gdHlwZSBcIiArIHR5cGVfODgwKTtcbiAgICB9XG4gICAgbGV0IG5ld3N0eF84ODMgPSBUeXBlc184MjlbdHlwZV84ODBdLmNyZWF0ZSh2YWx1ZV84ODEsIHN0eF84ODIpO1xuICAgIGxldCBzbGljZV84ODQgPSBnZXRGaXJzdFNsaWNlXzgyNyhzdHhfODgyKTtcbiAgICBpZiAoc2xpY2VfODg0ICE9IG51bGwpIHtcbiAgICAgIG5ld3N0eF84ODMudG9rZW4uc2xpY2UgPSBzbGljZV84ODQ7XG4gICAgfVxuICAgIHJldHVybiBuZXdzdHhfODgzO1xuICB9XG4gIGZyb20odHlwZV84ODUsIHZhbHVlXzg4Nikge1xuICAgIHJldHVybiBTeW50YXguZnJvbSh0eXBlXzg4NSwgdmFsdWVfODg2LCB0aGlzKTtcbiAgfVxuICBmcm9tTnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwibnVsbFwiLCBudWxsKTtcbiAgfVxuICBmcm9tTnVtYmVyKHZhbHVlXzg4Nykge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJudW1iZXJcIiwgdmFsdWVfODg3KTtcbiAgfVxuICBmcm9tU3RyaW5nKHZhbHVlXzg4OCkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJzdHJpbmdcIiwgdmFsdWVfODg4KTtcbiAgfVxuICBmcm9tUHVuY3R1YXRvcih2YWx1ZV84ODkpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZV84ODkpO1xuICB9XG4gIGZyb21LZXl3b3JkKHZhbHVlXzg5MCkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJrZXl3b3JkXCIpO1xuICB9XG4gIGZyb21JZGVudGlmaWVyKHZhbHVlXzg5MSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlXzg5MSk7XG4gIH1cbiAgZnJvbVJlZ3VsYXJFeHByZXNzaW9uKHZhbHVlXzg5Mikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZV84OTIpO1xuICB9XG4gIGZyb21CcmFjZXMoaW5uZXJfODkzKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImJyYWNlc1wiLCBpbm5lcl84OTMpO1xuICB9XG4gIGZyb21CcmFja2V0cyhpbm5lcl84OTQpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXJfODk0KTtcbiAgfVxuICBmcm9tUGFyZW5zKGlubmVyXzg5NSkge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJwYXJlbnNcIiwgaW5uZXJfODk1KTtcbiAgfVxuICBzdGF0aWMgZnJvbU51bGwoc3R4Xzg5NiA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwibnVsbFwiLCBudWxsLCBzdHhfODk2KTtcbiAgfVxuICBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZV84OTcsIHN0eF84OTggPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcIm51bWJlclwiLCB2YWx1ZV84OTcsIHN0eF84OTgpO1xuICB9XG4gIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlXzg5OSwgc3R4XzkwMCA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwic3RyaW5nXCIsIHZhbHVlXzg5OSwgc3R4XzkwMCk7XG4gIH1cbiAgc3RhdGljIGZyb21QdW5jdHVhdG9yKHZhbHVlXzkwMSwgc3R4XzkwMiA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZV85MDEsIHN0eF85MDIpO1xuICB9XG4gIHN0YXRpYyBmcm9tS2V5d29yZCh2YWx1ZV85MDMsIHN0eF85MDQgPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcImtleXdvcmRcIiwgdmFsdWVfOTAzLCBzdHhfOTA0KTtcbiAgfVxuICBzdGF0aWMgZnJvbUlkZW50aWZpZXIodmFsdWVfOTA1LCBzdHhfOTA2ID0ge30pIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlXzkwNSwgc3R4XzkwNik7XG4gIH1cbiAgc3RhdGljIGZyb21SZWd1bGFyRXhwcmVzc2lvbih2YWx1ZV85MDcsIHN0eF85MDggPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInJlZ3VsYXJFeHByZXNzaW9uXCIsIHZhbHVlXzkwNywgc3R4XzkwOCk7XG4gIH1cbiAgc3RhdGljIGZyb21CcmFjZXMoaW5uZXJfOTA5LCBzdHhfOTEwID0ge30pIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20oXCJicmFjZXNcIiwgaW5uZXJfOTA5LCBzdHhfOTEwKTtcbiAgfVxuICBzdGF0aWMgZnJvbUJyYWNrZXRzKGlubmVyXzkxMSwgc3R4XzkxMiA9IHt9KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXJfOTExLCBzdHhfOTEyKTtcbiAgfVxuICBzdGF0aWMgZnJvbVBhcmVucyhpbm5lcl85MTMsIHN0eF85MTQgPSB7fSkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInBhcmVuc1wiLCBpbm5lcl85MTMsIHN0eF85MTQpO1xuICB9XG4gIHJlc29sdmUocGhhc2VfOTE1KSB7XG4gICAgYXNzZXJ0KHBoYXNlXzkxNSAhPSBudWxsLCBcIm11c3QgcHJvdmlkZSBhIHBoYXNlIHRvIHJlc29sdmVcIik7XG4gICAgbGV0IGFsbFNjb3Blc185MTYgPSB0aGlzLnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHN0eFNjb3Blc185MTcgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2VfOTE1KSA/IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmdldChwaGFzZV85MTUpIDogTGlzdCgpO1xuICAgIHN0eFNjb3Blc185MTcgPSBhbGxTY29wZXNfOTE2LmNvbmNhdChzdHhTY29wZXNfOTE3KTtcbiAgICBpZiAoc3R4U2NvcGVzXzkxNy5zaXplID09PSAwIHx8ICEodGhpcy5tYXRjaChcImlkZW50aWZpZXJcIikgfHwgdGhpcy5tYXRjaChcImtleXdvcmRcIikpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi52YWx1ZTtcbiAgICB9XG4gICAgbGV0IHNjb3BlXzkxOCA9IHN0eFNjb3Blc185MTcubGFzdCgpO1xuICAgIGxldCBiaW5kaW5nc185MTkgPSB0aGlzLmJpbmRpbmdzO1xuICAgIGlmIChzY29wZV85MTgpIHtcbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gYmluZGluZ3NfOTE5LmdldCh0aGlzKTtcbiAgICAgIGlmIChzY29wZXNldEJpbmRpbmdMaXN0KSB7XG4gICAgICAgIGxldCBiaWdnZXN0QmluZGluZ1BhaXIgPSBzY29wZXNldEJpbmRpbmdMaXN0LmZpbHRlcigoe3Njb3BlcywgYmluZGluZ30pID0+IHtcbiAgICAgICAgICByZXR1cm4gc2NvcGVzLmlzU3Vic2V0KHN0eFNjb3Blc185MTcpO1xuICAgICAgICB9KS5zb3J0KHNpemVEZWNlbmRpbmdfODI4KTtcbiAgICAgICAgaWYgKGJpZ2dlc3RCaW5kaW5nUGFpci5zaXplID49IDIgJiYgYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgwKS5zY29wZXMuc2l6ZSA9PT0gYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgxKS5zY29wZXMuc2l6ZSkge1xuICAgICAgICAgIGxldCBkZWJ1Z0Jhc2UgPSBcIntcIiArIHN0eFNjb3Blc185MTcubWFwKHNfOTIwID0+IHNfOTIwLnRvU3RyaW5nKCkpLmpvaW4oXCIsIFwiKSArIFwifVwiO1xuICAgICAgICAgIGxldCBkZWJ1Z0FtYmlnb3VzU2NvcGVzZXRzID0gYmlnZ2VzdEJpbmRpbmdQYWlyLm1hcCgoe3Njb3Blc30pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBcIntcIiArIHNjb3Blcy5tYXAoc185MjEgPT4gc185MjEudG9TdHJpbmcoKSkuam9pbihcIiwgXCIpICsgXCJ9XCI7XG4gICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3Blc2V0IFwiICsgZGVidWdCYXNlICsgXCIgaGFzIGFtYmlndW91cyBzdWJzZXRzIFwiICsgZGVidWdBbWJpZ291c1Njb3Blc2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlnZ2VzdEJpbmRpbmdQYWlyLnNpemUgIT09IDApIHtcbiAgICAgICAgICBsZXQgYmluZGluZ1N0ciA9IGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMCkuYmluZGluZy50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChNYXliZS5pc0p1c3QoYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgwKS5hbGlhcykpIHtcbiAgICAgICAgICAgIHJldHVybiBiaWdnZXN0QmluZGluZ1BhaXIuZ2V0KDApLmFsaWFzLmdldE9yRWxzZShudWxsKS5yZXNvbHZlKHBoYXNlXzkxNSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBiaW5kaW5nU3RyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuICB9XG4gIHZhbCgpIHtcbiAgICBhc3NlcnQoIXRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2Fubm90IGdldCB0aGUgdmFsIG9mIGEgZGVsaW1pdGVyXCIpO1xuICAgIGlmICh0aGlzLm1hdGNoKFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5zdHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFwidGVtcGxhdGVcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLml0ZW1zLm1hcChlbF85MjIgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGVsXzkyMi5tYXRjaCA9PT0gXCJmdW5jdGlvblwiICYmIGVsXzkyMi5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgICAgICAgIHJldHVybiBcIiR7Li4ufVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbF85MjIuc2xpY2UudGV4dDtcbiAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuICB9XG4gIGxpbmVOdW1iZXIoKSB7XG4gICAgaWYgKCF0aGlzLm1hdGNoKFwiZGVsaW1pdGVyXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5zbGljZS5zdGFydExvY2F0aW9uLmxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLmdldCgwKS5saW5lTnVtYmVyKCk7XG4gICAgfVxuICB9XG4gIHNldExpbmVOdW1iZXIobGluZV85MjMpIHtcbiAgICBsZXQgbmV3VG9rXzkyNCA9IHt9O1xuICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKCkpIHtcbiAgICAgIG5ld1Rva185MjQgPSB0aGlzLnRva2VuLm1hcChzXzkyNSA9PiBzXzkyNS5zZXRMaW5lTnVtYmVyKGxpbmVfOTIzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnRva2VuKSkge1xuICAgICAgICBuZXdUb2tfOTI0W2tleV0gPSB0aGlzLnRva2VuW2tleV07XG4gICAgICB9XG4gICAgICBhc3NlcnQobmV3VG9rXzkyNC5zbGljZSAmJiBuZXdUb2tfOTI0LnNsaWNlLnN0YXJ0TG9jYXRpb24sIFwiYWxsIHRva2VucyBtdXN0IGhhdmUgbGluZSBpbmZvXCIpO1xuICAgICAgbmV3VG9rXzkyNC5zbGljZS5zdGFydExvY2F0aW9uLmxpbmUgPSBsaW5lXzkyMztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTeW50YXgobmV3VG9rXzkyNCwgdGhpcyk7XG4gIH1cbiAgaW5uZXIoKSB7XG4gICAgYXNzZXJ0KHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2FuIG9ubHkgZ2V0IHRoZSBpbm5lciBvZiBhIGRlbGltaXRlclwiKTtcbiAgICByZXR1cm4gdGhpcy50b2tlbi5zbGljZSgxLCB0aGlzLnRva2VuLnNpemUgLSAxKTtcbiAgfVxuICBhZGRTY29wZShzY29wZV85MjYsIGJpbmRpbmdzXzkyNywgcGhhc2VfOTI4LCBvcHRpb25zXzkyOSA9IHtmbGlwOiBmYWxzZX0pIHtcbiAgICBsZXQgdG9rZW5fOTMwID0gdGhpcy5tYXRjaChcImRlbGltaXRlclwiKSA/IHRoaXMudG9rZW4ubWFwKHNfOTM0ID0+IHNfOTM0LmFkZFNjb3BlKHNjb3BlXzkyNiwgYmluZGluZ3NfOTI3LCBwaGFzZV85MjgsIG9wdGlvbnNfOTI5KSkgOiB0aGlzLnRva2VuO1xuICAgIGlmICh0aGlzLm1hdGNoKFwidGVtcGxhdGVcIikpIHtcbiAgICAgIHRva2VuXzkzMCA9IF8ubWVyZ2UodG9rZW5fOTMwLCB7aXRlbXM6IHRva2VuXzkzMC5pdGVtcy5tYXAoaXRfOTM1ID0+IHtcbiAgICAgICAgaWYgKGl0XzkzNSBpbnN0YW5jZW9mIFN5bnRheCAmJiBpdF85MzUubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgICAgICByZXR1cm4gaXRfOTM1LmFkZFNjb3BlKHNjb3BlXzkyNiwgYmluZGluZ3NfOTI3LCBwaGFzZV85MjgsIG9wdGlvbnNfOTI5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRfOTM1O1xuICAgICAgfSl9KTtcbiAgICB9XG4gICAgbGV0IG9sZFNjb3Blc2V0XzkzMTtcbiAgICBpZiAocGhhc2VfOTI4ID09PSBBTExfUEhBU0VTXzgzMCkge1xuICAgICAgb2xkU2NvcGVzZXRfOTMxID0gdGhpcy5zY29wZXNldHMuYWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbGRTY29wZXNldF85MzEgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2VfOTI4KSA/IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmdldChwaGFzZV85MjgpIDogTGlzdCgpO1xuICAgIH1cbiAgICBsZXQgbmV3U2NvcGVzZXRfOTMyO1xuICAgIGlmIChvcHRpb25zXzkyOS5mbGlwKSB7XG4gICAgICBsZXQgaW5kZXggPSBvbGRTY29wZXNldF85MzEuaW5kZXhPZihzY29wZV85MjYpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBuZXdTY29wZXNldF85MzIgPSBvbGRTY29wZXNldF85MzEucmVtb3ZlKGluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1Njb3Blc2V0XzkzMiA9IG9sZFNjb3Blc2V0XzkzMS5wdXNoKHNjb3BlXzkyNik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1Njb3Blc2V0XzkzMiA9IG9sZFNjb3Blc2V0XzkzMS5wdXNoKHNjb3BlXzkyNik7XG4gICAgfVxuICAgIGxldCBuZXdzdHhfOTMzID0ge2JpbmRpbmdzOiBiaW5kaW5nc185MjcsIHNjb3Blc2V0czoge2FsbDogdGhpcy5zY29wZXNldHMuYWxsLCBwaGFzZTogdGhpcy5zY29wZXNldHMucGhhc2V9fTtcbiAgICBpZiAocGhhc2VfOTI4ID09PSBBTExfUEhBU0VTXzgzMCkge1xuICAgICAgbmV3c3R4XzkzMy5zY29wZXNldHMuYWxsID0gbmV3U2NvcGVzZXRfOTMyO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdzdHhfOTMzLnNjb3Blc2V0cy5waGFzZSA9IG5ld3N0eF85MzMuc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZV85MjgsIG5ld1Njb3Blc2V0XzkzMik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuXzkzMCwgbmV3c3R4XzkzMyk7XG4gIH1cbiAgcmVtb3ZlU2NvcGUoc2NvcGVfOTM2LCBwaGFzZV85MzcpIHtcbiAgICBsZXQgdG9rZW5fOTM4ID0gdGhpcy5tYXRjaChcImRlbGltaXRlclwiKSA/IHRoaXMudG9rZW4ubWFwKHNfOTQ0ID0+IHNfOTQ0LnJlbW92ZVNjb3BlKHNjb3BlXzkzNiwgcGhhc2VfOTM3KSkgOiB0aGlzLnRva2VuO1xuICAgIGxldCBwaGFzZVNjb3Blc2V0XzkzOSA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmhhcyhwaGFzZV85MzcpID8gdGhpcy5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlXzkzNykgOiBMaXN0KCk7XG4gICAgbGV0IGFsbFNjb3Blc2V0Xzk0MCA9IHRoaXMuc2NvcGVzZXRzLmFsbDtcbiAgICBsZXQgbmV3c3R4Xzk0MSA9IHtiaW5kaW5nczogdGhpcy5iaW5kaW5ncywgc2NvcGVzZXRzOiB7YWxsOiB0aGlzLnNjb3Blc2V0cy5hbGwsIHBoYXNlOiB0aGlzLnNjb3Blc2V0cy5waGFzZX19O1xuICAgIGxldCBwaGFzZUluZGV4Xzk0MiA9IHBoYXNlU2NvcGVzZXRfOTM5LmluZGV4T2Yoc2NvcGVfOTM2KTtcbiAgICBsZXQgYWxsSW5kZXhfOTQzID0gYWxsU2NvcGVzZXRfOTQwLmluZGV4T2Yoc2NvcGVfOTM2KTtcbiAgICBpZiAocGhhc2VJbmRleF85NDIgIT09IC0xKSB7XG4gICAgICBuZXdzdHhfOTQxLnNjb3Blc2V0cy5waGFzZSA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZV85MzcsIHBoYXNlU2NvcGVzZXRfOTM5LnJlbW92ZShwaGFzZUluZGV4Xzk0MikpO1xuICAgIH0gZWxzZSBpZiAoYWxsSW5kZXhfOTQzICE9PSAtMSkge1xuICAgICAgbmV3c3R4Xzk0MS5zY29wZXNldHMuYWxsID0gYWxsU2NvcGVzZXRfOTQwLnJlbW92ZShhbGxJbmRleF85NDMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbl85MzgsIG5ld3N0eF85NDEpO1xuICB9XG4gIG1hdGNoKHR5cGVfOTQ1LCB2YWx1ZV85NDYpIHtcbiAgICBpZiAoIVR5cGVzXzgyOVt0eXBlXzk0NV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlXzk0NSArIFwiIGlzIGFuIGludmFsaWQgdHlwZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFR5cGVzXzgyOVt0eXBlXzk0NV0ubWF0Y2godGhpcy50b2tlbikgJiYgKHZhbHVlXzk0NiA9PSBudWxsIHx8ICh2YWx1ZV85NDYgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWx1ZV85NDYudGVzdCh0aGlzLnZhbCgpKSA6IHRoaXMudmFsKCkgPT0gdmFsdWVfOTQ2KSk7XG4gIH1cbiAgaXNJZGVudGlmaWVyKHZhbHVlXzk0Nykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiaWRlbnRpZmllclwiLCB2YWx1ZV85NDcpO1xuICB9XG4gIGlzQXNzaWduKHZhbHVlXzk0OCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYXNzaWduXCIsIHZhbHVlXzk0OCk7XG4gIH1cbiAgaXNCb29sZWFuTGl0ZXJhbCh2YWx1ZV85NDkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJvb2xlYW5cIiwgdmFsdWVfOTQ5KTtcbiAgfVxuICBpc0tleXdvcmQodmFsdWVfOTUwKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJrZXl3b3JkXCIsIHZhbHVlXzk1MCk7XG4gIH1cbiAgaXNOdWxsTGl0ZXJhbCh2YWx1ZV85NTEpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcIm51bGxcIiwgdmFsdWVfOTUxKTtcbiAgfVxuICBpc051bWVyaWNMaXRlcmFsKHZhbHVlXzk1Mikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwibnVtYmVyXCIsIHZhbHVlXzk1Mik7XG4gIH1cbiAgaXNQdW5jdHVhdG9yKHZhbHVlXzk1Mykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwicHVuY3R1YXRvclwiLCB2YWx1ZV85NTMpO1xuICB9XG4gIGlzU3RyaW5nTGl0ZXJhbCh2YWx1ZV85NTQpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInN0cmluZ1wiLCB2YWx1ZV85NTQpO1xuICB9XG4gIGlzUmVndWxhckV4cHJlc3Npb24odmFsdWVfOTU1KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZV85NTUpO1xuICB9XG4gIGlzVGVtcGxhdGUodmFsdWVfOTU2KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJ0ZW1wbGF0ZVwiLCB2YWx1ZV85NTYpO1xuICB9XG4gIGlzRGVsaW1pdGVyKHZhbHVlXzk1Nykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZGVsaW1pdGVyXCIsIHZhbHVlXzk1Nyk7XG4gIH1cbiAgaXNQYXJlbnModmFsdWVfOTU4KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwYXJlbnNcIiwgdmFsdWVfOTU4KTtcbiAgfVxuICBpc0JyYWNlcyh2YWx1ZV85NTkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJyYWNlc1wiLCB2YWx1ZV85NTkpO1xuICB9XG4gIGlzQnJhY2tldHModmFsdWVfOTYwKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJicmFja2V0c1wiLCB2YWx1ZV85NjApO1xuICB9XG4gIGlzU3ludGF4VGVtcGxhdGUodmFsdWVfOTYxKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzeW50YXhUZW1wbGF0ZVwiLCB2YWx1ZV85NjEpO1xuICB9XG4gIGlzRU9GKHZhbHVlXzk2Mikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiZW9mXCIsIHZhbHVlXzk2Mik7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLm1hcChzXzk2MyA9PiBzXzk2My50b1N0cmluZygpKS5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBcIidcIiArIHRoaXMudG9rZW4uc3RyO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChcInRlbXBsYXRlXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWwoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9rZW4udmFsdWU7XG4gIH1cbn1cbmV4cG9ydCB7VHlwZXNfODI5IGFzIFR5cGVzfTtcbmV4cG9ydCB7QUxMX1BIQVNFU184MzAgYXMgQUxMX1BIQVNFU30iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,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R0FBTCxFQUFQO0FBQ0Q7QUFDRCxXQUFPLEtBQUssS0FBTCxDQUFXLEtBQWxCO0FBQ0Q7QUFsV3lCO2tCQUFQLE0iLCJmaWxlIjoic3ludGF4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbmltcG9ydCB7IExpc3QsIE1hcCB9IGZyb20gXCJpbW11dGFibGVcIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXBcIjtcbmltcG9ydCB7IE1heWJlIH0gZnJvbSBcInJhbWRhLWZhbnRhc3lcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQgeyBUb2tlblR5cGUsIFRva2VuQ2xhc3MgfSBmcm9tIFwic2hpZnQtcGFyc2VyL2Rpc3QvdG9rZW5pemVyXCI7XG5cbnR5cGUgVG9rZW4gPSB7XG4gIHR5cGU6IGFueTtcbiAgdmFsdWU6IGFueTtcbiAgc2xpY2U6IGFueTtcbn07XG5cbnR5cGUgVG9rZW5UYWcgPVxuICAnbnVsbCcgfFxuICAnbnVtYmVyJyB8XG4gICdzdHJpbmcnIHxcbiAgJ3B1bmN0dWF0b3InIHxcbiAgJ2tleXdvcmQnIHxcbiAgJ2lkZW50aWZpZXInIHxcbiAgJ3JlZ3VsYXJFeHByZXNzaW9uJyB8XG4gICdib29sZWFuJyB8XG4gICdicmFjZXMnIHxcbiAgJ3BhcmVucycgfFxuICAnZGVsaW1pdGVyJyB8XG4gICdlb2YnIHxcbiAgJ3RlbXBsYXRlJyB8XG4gICdhc3NpZ24nIHxcbiAgJ3N5bnRheFRlbXBsYXRlJyB8XG4gICdicmFja2V0cydcblxuZnVuY3Rpb24gZ2V0Rmlyc3RTbGljZShzdHg6ID9TeW50YXgpIHtcbiAgaWYgKCghc3R4KSB8fCB0eXBlb2Ygc3R4LmlzRGVsaW1pdGVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDsgLy8gVE9ETzogc2hvdWxkIG5vdCBoYXZlIHRvIGRvIHRoaXNcbiAgaWYgKCFzdHguaXNEZWxpbWl0ZXIoKSkge1xuICAgIHJldHVybiBzdHgudG9rZW4uc2xpY2U7XG4gIH1cbiAgcmV0dXJuIHN0eC50b2tlbi5nZXQoMCkudG9rZW4uc2xpY2U7XG59XG5cbmZ1bmN0aW9uIHNpemVEZWNlbmRpbmcoYSwgYikge1xuICBpZiAoYS5zY29wZXMuc2l6ZSA+IGIuc2NvcGVzLnNpemUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYi5zY29wZXMuc2l6ZSA+IGEuc2NvcGVzLnNpemUpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG50eXBlIFR5cGVzSGVscGVyID0ge1xuICBba2V5OiBUb2tlblRhZ106IHtcbiAgICBtYXRjaCh0b2tlbjogYW55KTogYm9vbGVhbjtcbiAgICBjcmVhdGU/OiAodmFsdWU6IGFueSwgc3R4OiA/U3ludGF4KSA9PiBTeW50YXg7XG4gIH1cbn1cblxuZXhwb3J0IGxldCBUeXBlczogVHlwZXNIZWxwZXIgPSB7XG4gIG51bGw6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZSA9PT0gVG9rZW5UeXBlLk5VTEwsXG4gICAgY3JlYXRlOiAodmFsdWUsIHN0eCkgPT4gbmV3IFN5bnRheCh7XG4gICAgICB0eXBlOiBUb2tlblR5cGUuTlVMTCxcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfSwgc3R4KVxuICB9LFxuICBudW1iZXI6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5OdW1lcmljTGl0ZXJhbCxcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IFRva2VuVHlwZS5OVU1CRVIsXG4gICAgICB2YWx1ZVxuICAgIH0sIHN0eClcbiAgfSxcbiAgc3RyaW5nOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+ICFUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmIHRva2VuLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuU3RyaW5nTGl0ZXJhbCxcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IFRva2VuVHlwZS5TVFJJTkcsXG4gICAgICBzdHI6IHZhbHVlXG4gICAgfSwgc3R4KVxuICB9LFxuICBwdW5jdHVhdG9yOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+ICFUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmIHRva2VuLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuUHVuY3R1YXRvcixcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IHtcbiAgICAgICAga2xhc3M6IFRva2VuQ2xhc3MuUHVuY3R1YXRvcixcbiAgICAgICAgbmFtZTogdmFsdWVcbiAgICAgIH0sXG4gICAgICB2YWx1ZVxuICAgIH0sIHN0eClcbiAgfSxcbiAga2V5d29yZDoge1xuXHRcdG1hdGNoOiB0b2tlbiA9PiAhVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi50eXBlLmtsYXNzID09PSBUb2tlbkNsYXNzLktleXdvcmQsXG4gICAgY3JlYXRlOiAodmFsdWUsIHN0eCkgPT4gbmV3IFN5bnRheCh7XG4gICAgICB0eXBlOiB7XG4gICAgICAgIGtsYXNzOiBUb2tlbkNsYXNzLktleXdvcmQsXG4gICAgICAgIG5hbWU6IHZhbHVlXG4gICAgICB9LFxuICAgICAgdmFsdWVcbiAgICB9LCBzdHgpXG4gIH0sXG4gIGlkZW50aWZpZXI6IHtcblx0XHRtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZS5rbGFzcyA9PT0gVG9rZW5DbGFzcy5JZGVudCxcbiAgICBjcmVhdGU6ICh2YWx1ZSwgc3R4KSA9PiBuZXcgU3ludGF4KHtcbiAgICAgIHR5cGU6IFRva2VuVHlwZS5JREVOVElGSUVSLFxuICAgICAgdmFsdWVcbiAgICB9LCBzdHgpXG4gIH0sXG4gIHJlZ3VsYXJFeHByZXNzaW9uOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+ICFUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmIHRva2VuLnR5cGUua2xhc3MgPT09IFRva2VuQ2xhc3MuUmVndWxhckV4cHJlc3Npb24sXG4gICAgY3JlYXRlOiAodmFsdWUsIHN0eCkgPT4gbmV3IFN5bnRheCh7XG4gICAgICB0eXBlOiBUb2tlblR5cGUuUkVHRVhQLFxuICAgICAgdmFsdWVcbiAgICB9LCBzdHgpXG4gIH0sXG4gIGJyYWNlczoge1xuXHRcdG1hdGNoOiB0b2tlbiA9PiBUeXBlcy5kZWxpbWl0ZXIubWF0Y2godG9rZW4pICYmXG4gICAgICAgICAgIHRva2VuLmdldCgwKS50b2tlbi50eXBlID09PSBUb2tlblR5cGUuTEJSQUNFLFxuICAgIGNyZWF0ZTogKGlubmVyLCBzdHgpID0+IHtcbiAgICAgIGxldCBsZWZ0ID0gbmV3IFN5bnRheCh7XG4gICAgICAgIHR5cGU6IFRva2VuVHlwZS5MQlJBQ0UsXG4gICAgICAgIHZhbHVlOiBcIntcIixcbiAgICAgICAgc2xpY2U6IGdldEZpcnN0U2xpY2Uoc3R4KVxuICAgICAgfSk7XG4gICAgICBsZXQgcmlnaHQgPSBuZXcgU3ludGF4KHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLlJCUkFDRSxcbiAgICAgICAgdmFsdWU6IFwifVwiLFxuICAgICAgICBzbGljZTogZ2V0Rmlyc3RTbGljZShzdHgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgU3ludGF4KExpc3Qub2YobGVmdCkuY29uY2F0KGlubmVyKS5wdXNoKHJpZ2h0KSwgc3R4KTtcbiAgICB9XG4gIH0sXG4gIGJyYWNrZXRzOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+IFR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiZcbiAgICAgICAgICAgdG9rZW4uZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MQlJBQ0ssXG4gICAgY3JlYXRlOiAoaW5uZXIsIHN0eCkgPT4ge1xuICAgICAgbGV0IGxlZnQgPSBuZXcgU3ludGF4KHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLkxCUkFDSyxcbiAgICAgICAgdmFsdWU6IFwiW1wiLFxuICAgICAgICBzbGljZTogZ2V0Rmlyc3RTbGljZShzdHgpXG4gICAgICB9KTtcbiAgICAgIGxldCByaWdodCA9IG5ldyBTeW50YXgoe1xuICAgICAgICB0eXBlOiBUb2tlblR5cGUuUkJSQUNLLFxuICAgICAgICB2YWx1ZTogXCJdXCIsXG4gICAgICAgIHNsaWNlOiBnZXRGaXJzdFNsaWNlKHN0eClcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0KS5jb25jYXQoaW5uZXIpLnB1c2gocmlnaHQpLCBzdHgpO1xuICAgIH1cbiAgfSxcbiAgcGFyZW5zOiB7XG5cdFx0bWF0Y2g6IHRva2VuID0+IFR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiZcbiAgICAgICAgICAgdG9rZW4uZ2V0KDApLnRva2VuLnR5cGUgPT09IFRva2VuVHlwZS5MUEFSRU4sXG4gICAgY3JlYXRlOiAoaW5uZXIsIHN0eCkgPT4ge1xuICAgICAgbGV0IGxlZnQgPSBuZXcgU3ludGF4KHtcbiAgICAgICAgdHlwZTogVG9rZW5UeXBlLkxQQVJFTixcbiAgICAgICAgdmFsdWU6IFwiKFwiLFxuICAgICAgICBzbGljZTogZ2V0Rmlyc3RTbGljZShzdHgpXG4gICAgICB9KTtcbiAgICAgIGxldCByaWdodCA9IG5ldyBTeW50YXgoe1xuICAgICAgICB0eXBlOiBUb2tlblR5cGUuUlBBUkVOLFxuICAgICAgICB2YWx1ZTogXCIpXCIsXG4gICAgICAgIHNsaWNlOiBnZXRGaXJzdFNsaWNlKHN0eClcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBTeW50YXgoTGlzdC5vZihsZWZ0KS5jb25jYXQoaW5uZXIpLnB1c2gocmlnaHQpLCBzdHgpO1xuICAgIH1cbiAgfSxcblxuICBhc3NpZ246IHtcbiAgICBtYXRjaDogdG9rZW4gPT4ge1xuICAgICAgaWYgKFR5cGVzLnB1bmN0dWF0b3IubWF0Y2godG9rZW4pKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiPVwiOlxuICAgICAgICAgIGNhc2UgXCJ8PVwiOlxuICAgICAgICAgIGNhc2UgXCJePVwiOlxuICAgICAgICAgIGNhc2UgXCImPVwiOlxuICAgICAgICAgIGNhc2UgXCI8PD1cIjpcbiAgICAgICAgICBjYXNlIFwiPj49XCI6XG4gICAgICAgICAgY2FzZSBcIj4+Pj1cIjpcbiAgICAgICAgICBjYXNlIFwiKz1cIjpcbiAgICAgICAgICBjYXNlIFwiLT1cIjpcbiAgICAgICAgICBjYXNlIFwiKj1cIjpcbiAgICAgICAgICBjYXNlIFwiLz1cIjpcbiAgICAgICAgICBjYXNlIFwiJT1cIjpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgYm9vbGVhbjoge1xuICAgIG1hdGNoOiB0b2tlbiA9PiAhVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi50eXBlID09PSBUb2tlblR5cGUuVFJVRSB8fFxuICAgICAgICAgICB0b2tlbi50eXBlID09PSBUb2tlblR5cGUuRkFMU0VcbiAgfSxcblxuICB0ZW1wbGF0ZToge1xuICAgIG1hdGNoOiB0b2tlbiA9PiAhVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi50eXBlID09PSBUb2tlblR5cGUuVEVNUExBVEVcbiAgfSxcblxuICBkZWxpbWl0ZXI6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gTGlzdC5pc0xpc3QodG9rZW4pXG4gIH0sXG5cbiAgc3ludGF4VGVtcGxhdGU6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gVHlwZXMuZGVsaW1pdGVyLm1hdGNoKHRva2VuKSAmJiB0b2tlbi5nZXQoMCkudmFsKCkgPT09ICcjYCdcbiAgfSxcblxuICBlb2Y6IHtcbiAgICBtYXRjaDogdG9rZW4gPT4gIVR5cGVzLmRlbGltaXRlci5tYXRjaCh0b2tlbikgJiYgdG9rZW4udHlwZSA9PT0gVG9rZW5UeXBlLkVPU1xuICB9LFxufTtcbmV4cG9ydCBjb25zdCBBTExfUEhBU0VTID0ge307XG5cbnR5cGUgU2NvcGVzZXQgPSB7XG4gIGFsbDogTGlzdDxhbnk+O1xuICBwaGFzZTogTWFwPG51bWJlciwgYW55Pjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3ludGF4IHtcbiAgLy8gdG9rZW46IFRva2VuIHwgTGlzdDxUb2tlbj47XG4gIHRva2VuOiBhbnk7XG4gIGJpbmRpbmdzOiBCaW5kaW5nTWFwO1xuICBzY29wZXNldHM6IFNjb3Blc2V0O1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuOiBhbnksIG9sZHN0eDogP3sgYmluZGluZ3M6IGFueTsgc2NvcGVzZXRzOiBhbnl9KSB7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuYmluZGluZ3MgPSBvbGRzdHggJiYgKG9sZHN0eC5iaW5kaW5ncyAhPSBudWxsKSA/IG9sZHN0eC5iaW5kaW5ncyA6IG5ldyBCaW5kaW5nTWFwKCk7XG4gICAgdGhpcy5zY29wZXNldHMgPSBvbGRzdHggJiYgKG9sZHN0eC5zY29wZXNldHMgIT0gbnVsbCkgPyBvbGRzdHguc2NvcGVzZXRzIDoge1xuICAgICAgYWxsOiBMaXN0KCksXG4gICAgICBwaGFzZTogTWFwKClcbiAgICB9O1xuICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gIH1cblxuICBzdGF0aWMgb2YodG9rZW46IFRva2VuLCBzdHg6ID9TeW50YXgpIHtcbiAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbiwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHR5cGUsIHZhbHVlLCBzdHg6ID9TeW50YXgpIHtcbiAgICBpZiAoIVR5cGVzW3R5cGVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIG5vdCBhIHZhbGlkIHR5cGVcIik7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFUeXBlc1t0eXBlXS5jcmVhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjcmVhdGUgYSBzeW50YXggZnJvbSB0eXBlIFwiICsgdHlwZSk7XG4gICAgfVxuICAgIGxldCBuZXdzdHggPSBUeXBlc1t0eXBlXS5jcmVhdGUodmFsdWUsIHN0eCk7XG4gICAgbGV0IHNsaWNlID0gZ2V0Rmlyc3RTbGljZShzdHgpO1xuICAgIGlmIChzbGljZSAhPSBudWxsKSB7XG4gICAgICBuZXdzdHgudG9rZW4uc2xpY2UgPSBzbGljZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld3N0eDtcbiAgfVxuXG4gIGZyb20odHlwZTogVG9rZW5UYWcsIHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20odHlwZSwgdmFsdWUsIHRoaXMpO1xuICB9XG5cbiAgZnJvbU51bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcIm51bGxcIiwgbnVsbCk7XG4gIH1cblxuICBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKCdudW1iZXInLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwic3RyaW5nXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21QdW5jdHVhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZSk7XG4gIH1cblxuICBmcm9tS2V5d29yZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcImtleXdvcmRcIiwgdmFsdWUpO1xuICB9XG5cbiAgZnJvbUlkZW50aWZpZXIodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJpZGVudGlmaWVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21SZWd1bGFyRXhwcmVzc2lvbih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcInJlZ3VsYXJFeHByZXNzaW9uXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGZyb21CcmFjZXMoaW5uZXI6IExpc3Q8U3ludGF4Pikge1xuICAgIHJldHVybiB0aGlzLmZyb20oXCJicmFjZXNcIiwgaW5uZXIpO1xuICB9XG5cbiAgZnJvbUJyYWNrZXRzKGlubmVyOiBMaXN0PFN5bnRheD4pIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKFwiYnJhY2tldHNcIiwgaW5uZXIpO1xuICB9XG5cbiAgZnJvbVBhcmVucyhpbm5lcjogTGlzdDxTeW50YXg+KSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShcInBhcmVuc1wiLCBpbm5lcik7XG4gIH1cblxuICBzdGF0aWMgZnJvbU51bGwoc3R4OiBTeW50YXgpIHtcbiAgICByZXR1cm4gU3ludGF4LmZyb20oXCJudWxsXCIsIG51bGwsIHN0eCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwibnVtYmVyXCIsIHZhbHVlLCBzdHgpO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdHJpbmcodmFsdWUsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInN0cmluZ1wiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUHVuY3R1YXRvcih2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwicHVuY3R1YXRvclwiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tS2V5d29yZCh2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwia2V5d29yZFwiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSWRlbnRpZmllcih2YWx1ZSwgc3R4KSB7XG4gICAgcmV0dXJuIFN5bnRheC5mcm9tKFwiaWRlbnRpZmllclwiLCB2YWx1ZSwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUmVndWxhckV4cHJlc3Npb24odmFsdWUsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInJlZ3VsYXJFeHByZXNzaW9uXCIsIHZhbHVlLCBzdHgpO1xuICB9XG5cbiAgc3RhdGljIGZyb21CcmFjZXMoaW5uZXIsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcImJyYWNlc1wiLCBpbm5lciwgc3R4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQnJhY2tldHMoaW5uZXIsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcImJyYWNrZXRzXCIsIGlubmVyLCBzdHgpO1xuICB9XG5cbiAgc3RhdGljIGZyb21QYXJlbnMoaW5uZXIsIHN0eCkge1xuICAgIHJldHVybiBTeW50YXguZnJvbShcInBhcmVuc1wiLCBpbm5lciwgc3R4KTtcbiAgfVxuXG4gIC8vICgpIC0+IHN0cmluZ1xuICByZXNvbHZlKHBoYXNlOiBhbnkpIHtcbiAgICBhc3NlcnQocGhhc2UgIT0gbnVsbCwgXCJtdXN0IHByb3ZpZGUgYSBwaGFzZSB0byByZXNvbHZlXCIpO1xuICAgIGxldCBhbGxTY29wZXMgPSB0aGlzLnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IHN0eFNjb3BlcyA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLmhhcyhwaGFzZSkgPyB0aGlzLnNjb3Blc2V0cy5waGFzZS5nZXQocGhhc2UpIDogTGlzdCgpO1xuICAgIHN0eFNjb3BlcyA9IGFsbFNjb3Blcy5jb25jYXQoc3R4U2NvcGVzKTtcbiAgICBpZiAoc3R4U2NvcGVzLnNpemUgPT09IDAgfHwgISh0aGlzLm1hdGNoKCdpZGVudGlmaWVyJykgfHwgdGhpcy5tYXRjaCgna2V5d29yZCcpKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW4udmFsdWU7XG4gICAgfVxuICAgIGxldCBzY29wZSA9IHN0eFNjb3Blcy5sYXN0KCk7XG4gICAgbGV0IGJpbmRpbmdzID0gdGhpcy5iaW5kaW5ncztcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIC8vIExpc3Q8eyBzY29wZXM6IExpc3Q8U2NvcGU+LCBiaW5kaW5nOiBTeW1ib2wgfT5cbiAgICAgIGxldCBzY29wZXNldEJpbmRpbmdMaXN0ID0gYmluZGluZ3MuZ2V0KHRoaXMpO1xuXG4gICAgICBpZiAoc2NvcGVzZXRCaW5kaW5nTGlzdCkge1xuICAgICAgICAvLyB7IHNjb3BlczogTGlzdDxTY29wZT4sIGJpbmRpbmc6IFN5bWJvbCB9XG4gICAgICAgIGxldCBiaWdnZXN0QmluZGluZ1BhaXIgPSBzY29wZXNldEJpbmRpbmdMaXN0LmZpbHRlcigoe3Njb3Blc30pID0+IHtcbiAgICAgICAgICByZXR1cm4gc2NvcGVzLmlzU3Vic2V0KHN0eFNjb3Blcyk7XG4gICAgICAgIH0pLnNvcnQoc2l6ZURlY2VuZGluZyk7XG5cbiAgICAgICAgaWYgKGJpZ2dlc3RCaW5kaW5nUGFpci5zaXplID49IDIgJiZcbiAgICAgICAgICAgIGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMCkuc2NvcGVzLnNpemUgPT09IGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMSkuc2NvcGVzLnNpemUpIHtcbiAgICAgICAgICBsZXQgZGVidWdCYXNlID0gJ3snICsgc3R4U2NvcGVzLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbignLCAnKSArICd9JztcbiAgICAgICAgICBsZXQgZGVidWdBbWJpZ291c1Njb3Blc2V0cyA9IGJpZ2dlc3RCaW5kaW5nUGFpci5tYXAoKHtzY29wZXN9KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gJ3snICsgc2NvcGVzLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbignLCAnKSArICd9JztcbiAgICAgICAgICB9KS5qb2luKCcsICcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2NvcGVzZXQgJyArIGRlYnVnQmFzZSArICcgaGFzIGFtYmlndW91cyBzdWJzZXRzICcgKyBkZWJ1Z0FtYmlnb3VzU2NvcGVzZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaWdnZXN0QmluZGluZ1BhaXIuc2l6ZSAhPT0gMCkge1xuICAgICAgICAgIGxldCBiaW5kaW5nU3RyID0gYmlnZ2VzdEJpbmRpbmdQYWlyLmdldCgwKS5iaW5kaW5nLnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKE1heWJlLmlzSnVzdChiaWdnZXN0QmluZGluZ1BhaXIuZ2V0KDApLmFsaWFzKSkge1xuICAgICAgICAgICAgLy8gbnVsbCBuZXZlciBoYXBwZW5zIGJlY2F1c2Ugd2UganVzdCBjaGVja2VkIGlmIGl0IGlzIGEgSnVzdFxuICAgICAgICAgICAgcmV0dXJuIGJpZ2dlc3RCaW5kaW5nUGFpci5nZXQoMCkuYWxpYXMuZ2V0T3JFbHNlKG51bGwpLnJlc29sdmUocGhhc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYmluZGluZ1N0cjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlbi52YWx1ZTtcbiAgfVxuXG4gIHZhbCgpIHtcbiAgICBhc3NlcnQoIXRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2Fubm90IGdldCB0aGUgdmFsIG9mIGEgZGVsaW1pdGVyXCIpO1xuICAgIGlmICh0aGlzLm1hdGNoKFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5zdHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFwidGVtcGxhdGVcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLml0ZW1zLm1hcChlbCA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZWwubWF0Y2ggPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgICAgICByZXR1cm4gJyR7Li4ufSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsLnNsaWNlLnRleHQ7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9rZW4udmFsdWU7XG4gIH1cblxuICBsaW5lTnVtYmVyKCkge1xuICAgIGlmICghdGhpcy5tYXRjaChcImRlbGltaXRlclwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW4uc2xpY2Uuc3RhcnRMb2NhdGlvbi5saW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbi5nZXQoMCkubGluZU51bWJlcigpO1xuICAgIH1cbiAgfVxuXG4gIHNldExpbmVOdW1iZXIobGluZTogbnVtYmVyKSB7XG4gICAgbGV0IG5ld1RvayA9IHt9O1xuICAgIGlmICh0aGlzLmlzRGVsaW1pdGVyKCkpIHtcbiAgICAgIG5ld1RvayA9IHRoaXMudG9rZW4ubWFwKHMgPT4gcy5zZXRMaW5lTnVtYmVyKGxpbmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMudG9rZW4pKSB7XG4gICAgICAgIG5ld1Rva1trZXldID0gdGhpcy50b2tlbltrZXldO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KG5ld1Rvay5zbGljZSAmJiBuZXdUb2suc2xpY2Uuc3RhcnRMb2NhdGlvbiwgJ2FsbCB0b2tlbnMgbXVzdCBoYXZlIGxpbmUgaW5mbycpO1xuICAgICAgbmV3VG9rLnNsaWNlLnN0YXJ0TG9jYXRpb24ubGluZSA9IGxpbmU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3ludGF4KG5ld1RvaywgdGhpcyk7XG4gIH1cblxuICAvLyAoKSAtPiBMaXN0PFN5bnRheD5cbiAgaW5uZXIoKSB7XG4gICAgYXNzZXJ0KHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIiksIFwiY2FuIG9ubHkgZ2V0IHRoZSBpbm5lciBvZiBhIGRlbGltaXRlclwiKTtcbiAgICByZXR1cm4gdGhpcy50b2tlbi5zbGljZSgxLCB0aGlzLnRva2VuLnNpemUgLSAxKTtcbiAgfVxuXG4gIGFkZFNjb3BlKHNjb3BlOiBhbnksIGJpbmRpbmdzOiBhbnksIHBoYXNlOiBudW1iZXIsIG9wdGlvbnM6IGFueSA9IHsgZmxpcDogZmFsc2UgfSkge1xuICAgIGxldCB0b2tlbiA9IHRoaXMubWF0Y2goJ2RlbGltaXRlcicpID8gdGhpcy50b2tlbi5tYXAocyA9PiBzLmFkZFNjb3BlKHNjb3BlLCBiaW5kaW5ncywgcGhhc2UsIG9wdGlvbnMpKSA6IHRoaXMudG9rZW47XG4gICAgaWYgKHRoaXMubWF0Y2goJ3RlbXBsYXRlJykpIHtcbiAgICAgIHRva2VuID0gXy5tZXJnZSh0b2tlbiwge1xuICAgICAgICBpdGVtczogdG9rZW4uaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBTeW50YXggJiYgaXQubWF0Y2goJ2RlbGltaXRlcicpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXQuYWRkU2NvcGUoc2NvcGUsIGJpbmRpbmdzLCBwaGFzZSwgb3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgb2xkU2NvcGVzZXQ7XG4gICAgaWYgKHBoYXNlID09PSBBTExfUEhBU0VTKSB7XG4gICAgICBvbGRTY29wZXNldCA9IHRoaXMuc2NvcGVzZXRzLmFsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkU2NvcGVzZXQgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2UpID8gdGhpcy5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlKSA6IExpc3QoKTtcbiAgICB9XG4gICAgbGV0IG5ld1Njb3Blc2V0O1xuICAgIGlmIChvcHRpb25zLmZsaXApIHtcbiAgICAgIGxldCBpbmRleCA9IG9sZFNjb3Blc2V0LmluZGV4T2Yoc2NvcGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBuZXdTY29wZXNldCA9IG9sZFNjb3Blc2V0LnJlbW92ZShpbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTY29wZXNldCA9IG9sZFNjb3Blc2V0LnB1c2goc2NvcGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTY29wZXNldCA9IG9sZFNjb3Blc2V0LnB1c2goc2NvcGUpO1xuICAgIH1cbiAgICBsZXQgbmV3c3R4ID0ge1xuICAgICAgYmluZGluZ3MsXG4gICAgICBzY29wZXNldHM6IHtcbiAgICAgICAgYWxsOiB0aGlzLnNjb3Blc2V0cy5hbGwsXG4gICAgICAgIHBoYXNlOiB0aGlzLnNjb3Blc2V0cy5waGFzZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocGhhc2UgPT09IEFMTF9QSEFTRVMpIHtcbiAgICAgIG5ld3N0eC5zY29wZXNldHMuYWxsID0gbmV3U2NvcGVzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld3N0eC5zY29wZXNldHMucGhhc2UgPSBuZXdzdHguc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZSwgbmV3U2NvcGVzZXQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN5bnRheCh0b2tlbiwgbmV3c3R4KTtcbiAgfVxuXG4gIHJlbW92ZVNjb3BlKHNjb3BlOiBhbnksIHBoYXNlOiBudW1iZXIpIHtcbiAgICBsZXQgdG9rZW4gPSB0aGlzLm1hdGNoKCdkZWxpbWl0ZXInKSA/IHRoaXMudG9rZW4ubWFwKHMgPT4gcy5yZW1vdmVTY29wZShzY29wZSwgcGhhc2UpKSA6IHRoaXMudG9rZW47XG4gICAgbGV0IHBoYXNlU2NvcGVzZXQgPSB0aGlzLnNjb3Blc2V0cy5waGFzZS5oYXMocGhhc2UpID8gdGhpcy5zY29wZXNldHMucGhhc2UuZ2V0KHBoYXNlKSA6IExpc3QoKTtcbiAgICBsZXQgYWxsU2NvcGVzZXQgPSB0aGlzLnNjb3Blc2V0cy5hbGw7XG4gICAgbGV0IG5ld3N0eCA9IHtcbiAgICAgIGJpbmRpbmdzOiB0aGlzLmJpbmRpbmdzLFxuICAgICAgc2NvcGVzZXRzOiB7XG4gICAgICAgIGFsbDogdGhpcy5zY29wZXNldHMuYWxsLFxuICAgICAgICBwaGFzZTogdGhpcy5zY29wZXNldHMucGhhc2VcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHBoYXNlSW5kZXggPSBwaGFzZVNjb3Blc2V0LmluZGV4T2Yoc2NvcGUpO1xuICAgIGxldCBhbGxJbmRleCA9IGFsbFNjb3Blc2V0LmluZGV4T2Yoc2NvcGUpO1xuICAgIGlmIChwaGFzZUluZGV4ICE9PSAtMSkge1xuICAgICAgbmV3c3R4LnNjb3Blc2V0cy5waGFzZSA9IHRoaXMuc2NvcGVzZXRzLnBoYXNlLnNldChwaGFzZSwgcGhhc2VTY29wZXNldC5yZW1vdmUocGhhc2VJbmRleCkpO1xuICAgIH0gZWxzZSBpZiAoYWxsSW5kZXggIT09IC0xKSB7XG4gICAgICBuZXdzdHguc2NvcGVzZXRzLmFsbCA9IGFsbFNjb3Blc2V0LnJlbW92ZShhbGxJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3ludGF4KHRva2VuLCBuZXdzdHgpO1xuICB9XG5cbiAgbWF0Y2godHlwZTogVG9rZW5UYWcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIVR5cGVzW3R5cGVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIGFuIGludmFsaWQgdHlwZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFR5cGVzW3R5cGVdLm1hdGNoKHRoaXMudG9rZW4pICYmICh2YWx1ZSA9PSBudWxsIHx8XG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWx1ZS50ZXN0KHRoaXMudmFsKCkpIDogdGhpcy52YWwoKSA9PSB2YWx1ZSkpO1xuICB9XG5cbiAgaXNJZGVudGlmaWVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImlkZW50aWZpZXJcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNBc3NpZ24odmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYXNzaWduXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzQm9vbGVhbkxpdGVyYWwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImJvb2xlYW5cIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNLZXl3b3JkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImtleXdvcmRcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNOdWxsTGl0ZXJhbCh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJudWxsXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzTnVtZXJpY0xpdGVyYWwodmFsdWU6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwibnVtYmVyXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzUHVuY3R1YXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwdW5jdHVhdG9yXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzU3RyaW5nTGl0ZXJhbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzdHJpbmdcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNSZWd1bGFyRXhwcmVzc2lvbih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJyZWd1bGFyRXhwcmVzc2lvblwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1RlbXBsYXRlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcInRlbXBsYXRlXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzRGVsaW1pdGVyKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChcImRlbGltaXRlclwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc1BhcmVucyh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJwYXJlbnNcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNCcmFjZXModmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYnJhY2VzXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGlzQnJhY2tldHModmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKFwiYnJhY2tldHNcIiwgdmFsdWUpO1xuICB9XG5cbiAgaXNTeW50YXhUZW1wbGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJzeW50YXhUZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBpc0VPRih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goXCJlb2ZcIiwgdmFsdWUpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJkZWxpbWl0ZXJcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbihcIiBcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gXCInXCIgKyB0aGlzLnRva2VuLnN0cjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goXCJ0ZW1wbGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/template-processor.js b/dist/template-processor.js index aea95698..732c156f 100644 --- a/dist/template-processor.js +++ b/dist/template-processor.js @@ -1,75 +1,111 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.replaceTemplate = exports.processTemplate = undefined; +exports.processTemplate = processTemplate; +exports.replaceTemplate = replaceTemplate; -var _immutable = require("immutable"); +var _immutable = require('immutable'); -var _ramdaFantasy = require("ramda-fantasy"); - -var _ramda = require("ramda"); +var _ramda = require('ramda'); var _ramda2 = _interopRequireDefault(_ramda); -var _syntax = require("./syntax"); +var _syntax = require('./syntax'); var _syntax2 = _interopRequireDefault(_syntax); -var _errors = require("./errors"); +var _errors = require('./errors'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const isDolar_964 = s_975 => s_975 && typeof s_975.match === "function" && s_975.match("identifier") && s_975.val() === "$"; -const isDelimiter_965 = s_976 => s_976 && typeof s_976.match === "function" && s_976.match("delimiter"); -const isBraces_966 = s_977 => s_977 && typeof s_977.match === "function" && s_977.match("braces"); -const isParens_967 = s_978 => s_978 && typeof s_978.match === "function" && s_978.match("parens"); -const isBrackets_968 = s_979 => s_979 && typeof s_979.match === "function" && s_979.match("brackets"); -const insertIntoDelimiter_969 = _ramda2.default.cond([[isBraces_966, (s_980, r_981) => _syntax2.default.from("braces", r_981, s_980)], [isParens_967, (s_982, r_983) => _syntax2.default.from("parens", r_983, s_982)], [isBrackets_968, (s_984, r_985) => _syntax2.default.from("brackets", r_985, s_984)]]); -const process_970 = (acc_986, s_987) => { - if (isBraces_966(s_987) && isDolar_964(acc_986.template.last())) { - return { template: acc_986.template.push(_syntax2.default.from("braces", _immutable.List.of(_syntax2.default.from("number", acc_986.interp.size)), s_987)), interp: acc_986.interp.push(s_987.inner()) }; - } else if (isDelimiter_965(s_987)) { - let innerResult = processTemplate_973(s_987.inner(), acc_986.interp); - return { template: acc_986.template.push(insertIntoDelimiter_969(s_987, innerResult.template)), interp: innerResult.interp }; +/* +Given a syntax list like: + + [foo, bar, $, { 42, +, 24 }, baz] + +convert it to: + + [foo, bar, $, { 0 }, baz] + +and return another list with the interpolated values at the corresponding +positions. + +Requires either lookahead/lookbehind of one (to see the $). +*/ + +const isDolar = s => s && typeof s.match === 'function' && s.match("identifier") && s.val() === '$'; +const isDelimiter = s => s && typeof s.match === 'function' && s.match("delimiter"); +const isBraces = s => s && typeof s.match === 'function' && s.match("braces"); +const isParens = s => s && typeof s.match === 'function' && s.match("parens"); +const isBrackets = s => s && typeof s.match === 'function' && s.match("brackets"); + +const insertIntoDelimiter = _ramda2.default.cond([[isBraces, (s, r) => _syntax2.default.from("braces", r, s)], [isParens, (s, r) => _syntax2.default.from("parens", r, s)], [isBrackets, (s, r) => _syntax2.default.from("brackets", r, s)]]); + +const process = (acc, s) => { + if (isBraces(s) && isDolar(acc.template.last())) { + return { + template: acc.template.push(_syntax2.default.from("braces", _immutable.List.of(_syntax2.default.from("number", acc.interp.size)), s)), + interp: acc.interp.push(s.inner()) + }; + } else if (isDelimiter(s)) { + let innerResult = processTemplate(s.inner(), acc.interp); + return { + template: acc.template.push(insertIntoDelimiter(s, innerResult.template)), + interp: innerResult.interp + }; } else { - return { template: acc_986.template.push(s_987), interp: acc_986.interp }; + return { + template: acc.template.push(s), + interp: acc.interp + }; } }; -function cloneLineNumber_971(to_988, from_989) { - if (from_989 && to_988) { - if (typeof to_988.setLineNumber === "function") { - return to_988.setLineNumber(from_989.lineNumber()); - } else if (_immutable.List.isList(to_988)) { - return to_988.map(x_990 => cloneLineNumber_971(x_990, from_989)); + +function cloneLineNumber(to, from) { + if (from && to) { + if (typeof to.setLineNumber === 'function') { + return to.setLineNumber(from.lineNumber()); + } else if (_immutable.List.isList(to)) { + return to.map(x => cloneLineNumber(x, from)); } } - return to_988; + return to; } -const replace_972 = (acc_991, s_992) => { - let last_993 = acc_991.template.get(-1); - let beforeLast_994 = acc_991.template.get(-2); - if (isBraces_966(s_992) && isDolar_964(last_993)) { - let index = s_992.inner().first().val(); - (0, _errors.assert)(acc_991.rep.size > index, "unknown replacement value"); - let replacement = cloneLineNumber_971(acc_991.rep.get(index), beforeLast_994); - return { template: acc_991.template.pop().concat(replacement), rep: acc_991.rep }; - } else if (isDelimiter_965(s_992)) { - let innerResult = replaceTemplate_974(s_992.inner(), acc_991.rep); - return { template: acc_991.template.push(insertIntoDelimiter_969(s_992, innerResult)), rep: acc_991.rep }; + +const replace = (acc, s) => { + let last = acc.template.get(-1); + let beforeLast = acc.template.get(-2); + if (isBraces(s) && isDolar(last)) { + let index = s.inner().first().val(); + (0, _errors.assert)(acc.rep.size > index, "unknown replacement value"); + let replacement = cloneLineNumber(acc.rep.get(index), beforeLast); + return { + template: acc.template.pop().concat(replacement), + rep: acc.rep + }; + } else if (isDelimiter(s)) { + let innerResult = replaceTemplate(s.inner(), acc.rep); + return { + template: acc.template.push(insertIntoDelimiter(s, innerResult)), + rep: acc.rep + }; } else { - return { template: acc_991.template.push(s_992), rep: acc_991.rep }; + return { + template: acc.template.push(s), + rep: acc.rep + }; } }; -function processTemplate_973(temp_995) { - let interp_996 = arguments.length <= 1 || arguments[1] === undefined ? (0, _immutable.List)() : arguments[1]; - return temp_995.reduce(process_970, { template: (0, _immutable.List)(), interp: interp_996 }); +function processTemplate(temp) { + let interp = arguments.length <= 1 || arguments[1] === undefined ? (0, _immutable.List)() : arguments[1]; + + return temp.reduce(process, { template: (0, _immutable.List)(), interp: interp }); } -function replaceTemplate_974(temp_997, rep_998) { - return temp_997.reduce(replace_972, { template: (0, _immutable.List)(), rep: rep_998 }).template; + +function replaceTemplate(temp, rep) { + return temp.reduce(replace, { template: (0, _immutable.List)(), rep: rep }).template; } -exports.processTemplate = processTemplate_973; -exports.replaceTemplate = replaceTemplate_974; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3RlbXBsYXRlLXByb2Nlc3Nvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0EsTUFBTSxjQUFjLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxZQUFaLENBQTlDLElBQTJFLE1BQU0sR0FBTixPQUFnQixHQUF4SDtBQUNBLE1BQU0sa0JBQWtCLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxXQUFaLENBQS9FO0FBQ0EsTUFBTSxlQUFlLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxRQUFaLENBQTVFO0FBQ0EsTUFBTSxlQUFlLFNBQVMsU0FBUyxPQUFPLE1BQU0sS0FBYixLQUF1QixVQUFoQyxJQUE4QyxNQUFNLEtBQU4sQ0FBWSxRQUFaLENBQTVFO0FBQ0EsTUFBTSxpQkFBaUIsU0FBUyxTQUFTLE9BQU8sTUFBTSxLQUFiLEtBQXVCLFVBQWhDLElBQThDLE1BQU0sS0FBTixDQUFZLFVBQVosQ0FBOUU7QUFDQSxNQUFNLDBCQUEwQixnQkFBRSxJQUFGLENBQU8sQ0FBQyxDQUFDLFlBQUQsRUFBZSxDQUFDLEtBQUQsRUFBUSxLQUFSLEtBQWtCLGlCQUFPLElBQVAsQ0FBWSxRQUFaLEVBQXNCLEtBQXRCLEVBQTZCLEtBQTdCLENBQWpDLENBQUQsRUFBd0UsQ0FBQyxZQUFELEVBQWUsQ0FBQyxLQUFELEVBQVEsS0FBUixLQUFrQixpQkFBTyxJQUFQLENBQVksUUFBWixFQUFzQixLQUF0QixFQUE2QixLQUE3QixDQUFqQyxDQUF4RSxFQUErSSxDQUFDLGNBQUQsRUFBaUIsQ0FBQyxLQUFELEVBQVEsS0FBUixLQUFrQixpQkFBTyxJQUFQLENBQVksVUFBWixFQUF3QixLQUF4QixFQUEr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QWpCLENBQXNCLEtBQXRCLENBQVgsRUFBeUMsS0FBSyxRQUFRLEdBQXRELEVBQVA7QUFDRDtBQUNGLENBZEQ7QUFlQSxTQUFTLG1CQUFULENBQTZCLFFBQTdCLEVBQTREO0FBQUEsTUFBckIsVUFBcUIseURBQVIsc0JBQVE7O0FBQzFELFNBQU8sU0FBUyxNQUFULENBQWdCLFdBQWhCLEVBQTZCLEVBQUMsVUFBVSxzQkFBWCxFQUFtQixRQUFRLFVBQTNCLEVBQTdCLENBQVA7QUFDRDtBQUNELFNBQVMsbUJBQVQsQ0FBNkIsUUFBN0IsRUFBdUMsT0FBdkMsRUFBZ0Q7QUFDOUMsU0FBTyxTQUFTLE1BQVQsQ0FBZ0IsV0FBaEIsRUFBNkIsRUFBQyxVQUFVLHNCQUFYLEVBQW1CLEtBQUssT0FBeEIsRUFBN0IsRUFBK0QsUUFBdEU7QUFDRDtRQUM4QixlLEdBQXZCLG1CO1FBQ3VCLGUsR0FBdkIsbUIiLCJmaWxlIjoidGVtcGxhdGUtcHJvY2Vzc29yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQge01heWJlfSBmcm9tIFwicmFtZGEtZmFudGFzeVwiO1xuaW1wb3J0IF8gZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgU3ludGF4IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gXCIuL2Vycm9yc1wiO1xuY29uc3QgaXNEb2xhcl85NjQgPSBzXzk3NSA9PiBzXzk3NSAmJiB0eXBlb2Ygc185NzUubWF0Y2ggPT09IFwiZnVuY3Rpb25cIiAmJiBzXzk3NS5tYXRjaChcImlkZW50aWZpZXJcIikgJiYgc185NzUudmFsKCkgPT09IFwiJFwiO1xuY29uc3QgaXNEZWxpbWl0ZXJfOTY1ID0gc185NzYgPT4gc185NzYgJiYgdHlwZW9mIHNfOTc2Lm1hdGNoID09PSBcImZ1bmN0aW9uXCIgJiYgc185NzYubWF0Y2goXCJkZWxpbWl0ZXJcIik7XG5jb25zdCBpc0JyYWNlc185NjYgPSBzXzk3NyA9PiBzXzk3NyAmJiB0eXBlb2Ygc185NzcubWF0Y2ggPT09IFwiZnVuY3Rpb25cIiAmJiBzXzk3Ny5tYXRjaChcImJyYWNlc1wiKTtcbmNvbnN0IGlzUGFyZW5zXzk2NyA9IHNfOTc4ID0+IHNfOTc4ICYmIHR5cGVvZiBzXzk3OC5tYXRjaCA9PT0gXCJmdW5jdGlvblwiICYmIHNfOTc4Lm1hdGNoKFwicGFyZW5zXCIpO1xuY29uc3QgaXNCcmFja2V0c185NjggPSBzXzk3OSA9PiBzXzk3OSAmJiB0eXBlb2Ygc185NzkubWF0Y2ggPT09IFwiZnVuY3Rpb25cIiAmJiBzXzk3OS5tYXRjaChcImJyYWNrZXRzXCIpO1xuY29uc3QgaW5zZXJ0SW50b0RlbGltaXRlcl85NjkgPSBfLmNvbmQoW1tpc0JyYWNlc185NjYsIChzXzk4MCwgcl85ODEpID0+IFN5bnRheC5mcm9tKFwiYnJhY2VzXCIsIHJfOTgxLCBzXzk4MCldLCBbaXNQYXJlbnNfOTY3LCAoc185ODIsIHJfOTgzKSA9PiBTeW50YXguZnJvbShcInBhcmVuc1wiLCByXzk4Mywgc185ODIpXSwgW2lzQnJhY2tldHNfOTY4LCAoc185ODQsIHJfOTg1KSA9PiBTeW50YXguZnJvbShcImJyYWNrZXRzXCIsIHJfOTg1LCBzXzk4NCldXSk7XG5jb25zdCBwcm9jZXNzXzk3MCA9IChhY2NfOTg2LCBzXzk4NykgPT4ge1xuICBpZiAoaXNCcmFjZXNfOTY2KHNfOTg3KSAmJiBpc0RvbGFyXzk2NChhY2NfOTg2LnRlbXBsYXRlLmxhc3QoKSkpIHtcbiAgICByZXR1cm4ge3RlbXBsYXRlOiBhY2NfOTg2LnRlbXBsYXRlLnB1c2goU3ludGF4LmZyb20oXCJicmFjZXNcIiwgTGlzdC5vZihTeW50YXguZnJvbShcIm51bWJlclwiLCBhY2NfOTg2LmludGVycC5zaXplKSksIHNfOTg3KSksIGludGVycDogYWNjXzk4Ni5pbnRlcnAucHVzaChzXzk4Ny5pbm5lcigpKX07XG4gIH0gZWxzZSBpZiAoaXNEZWxpbWl0ZXJfOTY1KHNfOTg3KSkge1xuICAgIGxldCBpbm5lclJlc3VsdCA9IHByb2Nlc3NUZW1wbGF0ZV85NzMoc185ODcuaW5uZXIoKSwgYWNjXzk4Ni5pbnRlcnApO1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185ODYudGVtcGxhdGUucHVzaChpbnNlcnRJbnRvRGVsaW1pdGVyXzk2OShzXzk4NywgaW5uZXJSZXN1bHQudGVtcGxhdGUpKSwgaW50ZXJwOiBpbm5lclJlc3VsdC5pbnRlcnB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185ODYudGVtcGxhdGUucHVzaChzXzk4NyksIGludGVycDogYWNjXzk4Ni5pbnRlcnB9O1xuICB9XG59O1xuZnVuY3Rpb24gY2xvbmVMaW5lTnVtYmVyXzk3MSh0b185ODgsIGZyb21fOTg5KSB7XG4gIGlmIChmcm9tXzk4OSAmJiB0b185ODgpIHtcbiAgICBpZiAodHlwZW9mIHRvXzk4OC5zZXRMaW5lTnVtYmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0b185ODguc2V0TGluZU51bWJlcihmcm9tXzk4OS5saW5lTnVtYmVyKCkpO1xuICAgIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodG9fOTg4KSkge1xuICAgICAgcmV0dXJuIHRvXzk4OC5tYXAoeF85OTAgPT4gY2xvbmVMaW5lTnVtYmVyXzk3MSh4Xzk5MCwgZnJvbV85ODkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvXzk4ODtcbn1cbmNvbnN0IHJlcGxhY2VfOTcyID0gKGFjY185OTEsIHNfOTkyKSA9PiB7XG4gIGxldCBsYXN0Xzk5MyA9IGFjY185OTEudGVtcGxhdGUuZ2V0KC0xKTtcbiAgbGV0IGJlZm9yZUxhc3RfOTk0ID0gYWNjXzk5MS50ZW1wbGF0ZS5nZXQoLTIpO1xuICBpZiAoaXNCcmFjZXNfOTY2KHNfOTkyKSAmJiBpc0RvbGFyXzk2NChsYXN0Xzk5MykpIHtcbiAgICBsZXQgaW5kZXggPSBzXzk5Mi5pbm5lcigpLmZpcnN0KCkudmFsKCk7XG4gICAgYXNzZXJ0KGFjY185OTEucmVwLnNpemUgPiBpbmRleCwgXCJ1bmtub3duIHJlcGxhY2VtZW50IHZhbHVlXCIpO1xuICAgIGxldCByZXBsYWNlbWVudCA9IGNsb25lTGluZU51bWJlcl85NzEoYWNjXzk5MS5yZXAuZ2V0KGluZGV4KSwgYmVmb3JlTGFzdF85OTQpO1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185OTEudGVtcGxhdGUucG9wKCkuY29uY2F0KHJlcGxhY2VtZW50KSwgcmVwOiBhY2NfOTkxLnJlcH07XG4gIH0gZWxzZSBpZiAoaXNEZWxpbWl0ZXJfOTY1KHNfOTkyKSkge1xuICAgIGxldCBpbm5lclJlc3VsdCA9IHJlcGxhY2VUZW1wbGF0ZV85NzQoc185OTIuaW5uZXIoKSwgYWNjXzk5MS5yZXApO1xuICAgIHJldHVybiB7dGVtcGxhdGU6IGFjY185OTEudGVtcGxhdGUucHVzaChpbnNlcnRJbnRvRGVsaW1pdGVyXzk2OShzXzk5MiwgaW5uZXJSZXN1bHQpKSwgcmVwOiBhY2NfOTkxLnJlcH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHt0ZW1wbGF0ZTogYWNjXzk5MS50ZW1wbGF0ZS5wdXNoKHNfOTkyKSwgcmVwOiBhY2NfOTkxLnJlcH07XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzVGVtcGxhdGVfOTczKHRlbXBfOTk1LCBpbnRlcnBfOTk2ID0gTGlzdCgpKSB7XG4gIHJldHVybiB0ZW1wXzk5NS5yZWR1Y2UocHJvY2Vzc185NzAsIHt0ZW1wbGF0ZTogTGlzdCgpLCBpbnRlcnA6IGludGVycF85OTZ9KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUZW1wbGF0ZV85NzQodGVtcF85OTcsIHJlcF85OTgpIHtcbiAgcmV0dXJuIHRlbXBfOTk3LnJlZHVjZShyZXBsYWNlXzk3Miwge3RlbXBsYXRlOiBMaXN0KCksIHJlcDogcmVwXzk5OH0pLnRlbXBsYXRlO1xufVxuZXhwb3J0IHtwcm9jZXNzVGVtcGxhdGVfOTczIGFzIHByb2Nlc3NUZW1wbGF0ZX07XG5leHBvcnQge3JlcGxhY2VUZW1wbGF0ZV85NzQgYXMgcmVwbGFjZVRlbXBsYXRlfSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS1wcm9jZXNzb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7UUF3RmdCLGUsR0FBQSxlO1FBSUEsZSxHQUFBLGU7O0FBNUZoQjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsTUFBTSxVQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxZQUFSLENBQXRDLElBQStELEVBQUUsR0FBRixPQUFZLEdBQXBHO0FBQ0EsTUFBTSxjQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxXQUFSLENBQS9EO0FBQ0EsTUFBTSxXQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQS9EO0FBQ0EsTUFBTSxXQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQS9EO0FBQ0EsTUFBTSxhQUFjLEtBQUssS0FBSyxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF4QixJQUFzQyxFQUFFLEtBQUYsQ0FBUSxVQUFSLENBQS9EOztBQUVBLE1BQU0sc0JBQXNCLGdCQUFFLElBQUYsQ0FBTyxDQUNqQyxDQUFDLFFBQUQsRUFBVyxDQUFDLENBQUQsRUFBSSxDQUFKLEtBQVUsaUJBQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsQ0FBckIsQ0FEaUMsRUFFakMsQ0FBQyxRQUFELEVBQVcsQ0FBQyxDQUFELEVBQUksQ0FBSixLQUFVLGlCQUFPLElBQVAsQ0FBWSxRQUFaLEVBQXNCLENBQXRCLEVBQXlCLENBQXpCLENBQXJCLENBRmlDLEVBR2pDLENBQUMsVUFBRCxFQUFhLENBQUMsQ0FBRCxFQUFJLENBQUosS0FB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YSxJQUFiLENBQWtCLENBQWxCLENBREw7QUFFTCxXQUFLLElBQUk7QUFGSixLQUFQO0FBSUQ7QUFDRixDQXZCRDs7QUF5Qk8sU0FBUyxlQUFULENBQXlCLElBQXpCLEVBQWdEO0FBQUEsTUFBakIsTUFBaUIseURBQVIsc0JBQVE7O0FBQ3JELFNBQU8sS0FBSyxNQUFMLENBQVksT0FBWixFQUFxQixFQUFFLFVBQVUsc0JBQVosRUFBb0IsY0FBcEIsRUFBckIsQ0FBUDtBQUNEOztBQUVNLFNBQVMsZUFBVCxDQUF5QixJQUF6QixFQUErQixHQUEvQixFQUFvQztBQUN6QyxTQUFPLEtBQUssTUFBTCxDQUFZLE9BQVosRUFBcUIsRUFBRSxVQUFVLHNCQUFaLEVBQW9CLFFBQXBCLEVBQXJCLEVBQWdELFFBQXZEO0FBQ0QiLCJmaWxlIjoidGVtcGxhdGUtcHJvY2Vzc29yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlzdCB9IGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgXyBmcm9tICdyYW1kYSc7XG5pbXBvcnQgU3ludGF4IGZyb20gJy4vc3ludGF4JztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vZXJyb3JzJztcblxuLypcbkdpdmVuIGEgc3ludGF4IGxpc3QgbGlrZTpcblxuICBbZm9vLCBiYXIsICQsIHsgNDIsICssIDI0IH0sIGJhel1cblxuY29udmVydCBpdCB0bzpcblxuICBbZm9vLCBiYXIsICQsIHsgMCB9LCBiYXpdXG5cbmFuZCByZXR1cm4gYW5vdGhlciBsaXN0IHdpdGggdGhlIGludGVycG9sYXRlZCB2YWx1ZXMgYXQgdGhlIGNvcnJlc3BvbmRpbmdcbnBvc2l0aW9ucy5cblxuUmVxdWlyZXMgZWl0aGVyIGxvb2thaGVhZC9sb29rYmVoaW5kIG9mIG9uZSAodG8gc2VlIHRoZSAkKS5cbiovXG5cbmNvbnN0IGlzRG9sYXIgICAgID0gcyA9PiBzICYmIHR5cGVvZiBzLm1hdGNoID09PSAnZnVuY3Rpb24nICYmIHMubWF0Y2goXCJpZGVudGlmaWVyXCIpICYmIHMudmFsKCkgPT09ICckJztcbmNvbnN0IGlzRGVsaW1pdGVyID0gcyA9PiBzICYmIHR5cGVvZiBzLm1hdGNoID09PSAnZnVuY3Rpb24nICYmIHMubWF0Y2goXCJkZWxpbWl0ZXJcIik7XG5jb25zdCBpc0JyYWNlcyAgICA9IHMgPT4gcyAmJiB0eXBlb2Ygcy5tYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiBzLm1hdGNoKFwiYnJhY2VzXCIpO1xuY29uc3QgaXNQYXJlbnMgICAgPSBzID0+IHMgJiYgdHlwZW9mIHMubWF0Y2ggPT09ICdmdW5jdGlvbicgJiYgcy5tYXRjaChcInBhcmVuc1wiKTtcbmNvbnN0IGlzQnJhY2tldHMgID0gcyA9PiBzICYmIHR5cGVvZiBzLm1hdGNoID09PSAnZnVuY3Rpb24nICYmIHMubWF0Y2goXCJicmFja2V0c1wiKTtcblxuY29uc3QgaW5zZXJ0SW50b0RlbGltaXRlciA9IF8uY29uZChbXG4gIFtpc0JyYWNlcywgKHMsIHIpID0+IFN5bnRheC5mcm9tKFwiYnJhY2VzXCIsIHIsIHMpXSxcbiAgW2lzUGFyZW5zLCAocywgcikgPT4gU3ludGF4LmZyb20oXCJwYXJlbnNcIiwgciwgcyldLFxuICBbaXNCcmFja2V0cywgKHMsIHIpID0+IFN5bnRheC5mcm9tKFwiYnJhY2tldHNcIiwgciwgcyldXG5dKTtcblxuY29uc3QgcHJvY2VzcyA9IChhY2MsIHMpID0+IHtcbiAgaWYgKGlzQnJhY2VzKHMpICYmIGlzRG9sYXIoYWNjLnRlbXBsYXRlLmxhc3QoKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6IGFjYy50ZW1wbGF0ZS5wdXNoKFN5bnRheC5mcm9tKFwiYnJhY2VzXCIsIExpc3Qub2YoU3ludGF4LmZyb20oXCJudW1iZXJcIiwgYWNjLmludGVycC5zaXplKSksIHMpKSxcbiAgICAgIGludGVycDogYWNjLmludGVycC5wdXNoKHMuaW5uZXIoKSlcbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzRGVsaW1pdGVyKHMpKSB7XG4gICAgbGV0IGlubmVyUmVzdWx0ID0gcHJvY2Vzc1RlbXBsYXRlKHMuaW5uZXIoKSwgYWNjLmludGVycCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbXBsYXRlOiBhY2MudGVtcGxhdGUucHVzaChpbnNlcnRJbnRvRGVsaW1pdGVyKHMsIGlubmVyUmVzdWx0LnRlbXBsYXRlKSksXG4gICAgICBpbnRlcnA6IGlubmVyUmVzdWx0LmludGVycFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbXBsYXRlOiBhY2MudGVtcGxhdGUucHVzaChzKSxcbiAgICAgIGludGVycDogYWNjLmludGVycFxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsb25lTGluZU51bWJlcih0bywgZnJvbSkge1xuICBpZiAoZnJvbSAmJiB0byApIHtcbiAgICBpZiAodHlwZW9mIHRvLnNldExpbmVOdW1iZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0by5zZXRMaW5lTnVtYmVyKGZyb20ubGluZU51bWJlcigpKTtcbiAgICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHRvKSkge1xuICAgICAgcmV0dXJuIHRvLm1hcCh4ID0+IGNsb25lTGluZU51bWJlcih4LCBmcm9tKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cblxuY29uc3QgcmVwbGFjZSA9IChhY2MsIHMpID0+IHtcbiAgbGV0IGxhc3QgPSBhY2MudGVtcGxhdGUuZ2V0KC0xKTtcbiAgbGV0IGJlZm9yZUxhc3QgPSBhY2MudGVtcGxhdGUuZ2V0KC0yKTtcbiAgaWYgKGlzQnJhY2VzKHMpICYmIGlzRG9sYXIobGFzdCkpIHtcbiAgICBsZXQgaW5kZXggPSBzLmlubmVyKCkuZmlyc3QoKS52YWwoKTtcbiAgICBhc3NlcnQoYWNjLnJlcC5zaXplID4gaW5kZXgsIFwidW5rbm93biByZXBsYWNlbWVudCB2YWx1ZVwiKTtcbiAgICBsZXQgcmVwbGFjZW1lbnQgPSBjbG9uZUxpbmVOdW1iZXIoYWNjLnJlcC5nZXQoaW5kZXgpLCBiZWZvcmVMYXN0KTtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6IGFjYy50ZW1wbGF0ZS5wb3AoKS5jb25jYXQocmVwbGFjZW1lbnQpLFxuICAgICAgcmVwOiBhY2MucmVwXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc0RlbGltaXRlcihzKSkge1xuICAgIGxldCBpbm5lclJlc3VsdCA9IHJlcGxhY2VUZW1wbGF0ZShzLmlubmVyKCksIGFjYy5yZXApO1xuICAgIHJldHVybiB7XG4gICAgICB0ZW1wbGF0ZTogYWNjLnRlbXBsYXRlLnB1c2goaW5zZXJ0SW50b0RlbGltaXRlcihzLCBpbm5lclJlc3VsdCkpLFxuICAgICAgcmVwOiBhY2MucmVwXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6IGFjYy50ZW1wbGF0ZS5wdXNoKHMpLFxuICAgICAgcmVwOiBhY2MucmVwXG4gICAgfTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUZW1wbGF0ZSh0ZW1wLCBpbnRlcnAgPSBMaXN0KCkpIHtcbiAgcmV0dXJuIHRlbXAucmVkdWNlKHByb2Nlc3MsIHsgdGVtcGxhdGU6IExpc3QoKSwgaW50ZXJwIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVRlbXBsYXRlKHRlbXAsIHJlcCkge1xuICByZXR1cm4gdGVtcC5yZWR1Y2UocmVwbGFjZSwgeyB0ZW1wbGF0ZTogTGlzdCgpLCByZXAgfSkudGVtcGxhdGU7XG59XG4iXX0= \ No newline at end of file diff --git a/dist/term-expander.js b/dist/term-expander.js index b8e54c6f..97e03903 100644 --- a/dist/term-expander.js +++ b/dist/term-expander.js @@ -16,10 +16,6 @@ var _applyScopeInParamsReducer = require("./apply-scope-in-params-reducer"); var _applyScopeInParamsReducer2 = _interopRequireDefault(_applyScopeInParamsReducer); -var _shiftReducer = require("shift-reducer"); - -var _shiftReducer2 = _interopRequireDefault(_shiftReducer); - var _compiler = require("./compiler"); var _compiler2 = _interopRequireDefault(_compiler); @@ -32,8 +28,6 @@ var _serializer = require("./serializer"); var _enforester = require("./enforester"); -var _errors = require("./errors"); - var _templateProcessor = require("./template-processor.js"); var _astDispatcher = require("./ast-dispatcher"); @@ -43,346 +37,626 @@ var _astDispatcher2 = _interopRequireDefault(_astDispatcher); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class TermExpander extends _astDispatcher2.default { - constructor(context_999) { - super("expand", true); - this.context = context_999; + constructor(context) { + super('expand', true); + this.context = context; } - expand(term_1000) { - return this.dispatch(term_1000); + + expand(term) { + return this.dispatch(term); } - expandPragma(term_1001) { - return term_1001; + + expandPragma(term) { + return term; } - expandTemplateExpression(term_1002) { - return new _terms2.default("TemplateExpression", { tag: term_1002.tag == null ? null : this.expand(term_1002.tag), elements: term_1002.elements.toArray() }); + + expandTemplateExpression(term) { + return new _terms2.default('TemplateExpression', { + tag: term.tag == null ? null : this.expand(term.tag), + elements: term.elements.toArray() + }); } - expandBreakStatement(term_1003) { - return new _terms2.default("BreakStatement", { label: term_1003.label ? term_1003.label.val() : null }); + + expandBreakStatement(term) { + return new _terms2.default('BreakStatement', { + label: term.label ? term.label.val() : null + }); } - expandDoWhileStatement(term_1004) { - return new _terms2.default("DoWhileStatement", { body: this.expand(term_1004.body), test: this.expand(term_1004.test) }); + + expandDoWhileStatement(term) { + return new _terms2.default('DoWhileStatement', { + body: this.expand(term.body), + test: this.expand(term.test) + }); } - expandWithStatement(term_1005) { - return new _terms2.default("WithStatement", { body: this.expand(term_1005.body), object: this.expand(term_1005.object) }); + + expandWithStatement(term) { + return new _terms2.default('WithStatement', { + body: this.expand(term.body), + object: this.expand(term.object) + }); } - expandDebuggerStatement(term_1006) { - return term_1006; + + expandDebuggerStatement(term) { + return term; } - expandContinueStatement(term_1007) { - return new _terms2.default("ContinueStatement", { label: term_1007.label ? term_1007.label.val() : null }); + + expandContinueStatement(term) { + return new _terms2.default('ContinueStatement', { + label: term.label ? term.label.val() : null + }); } - expandSwitchStatementWithDefault(term_1008) { - return new _terms2.default("SwitchStatementWithDefault", { discriminant: this.expand(term_1008.discriminant), preDefaultCases: term_1008.preDefaultCases.map(c_1009 => this.expand(c_1009)).toArray(), defaultCase: this.expand(term_1008.defaultCase), postDefaultCases: term_1008.postDefaultCases.map(c_1010 => this.expand(c_1010)).toArray() }); + + expandSwitchStatementWithDefault(term) { + return new _terms2.default('SwitchStatementWithDefault', { + discriminant: this.expand(term.discriminant), + preDefaultCases: term.preDefaultCases.map(c => this.expand(c)).toArray(), + defaultCase: this.expand(term.defaultCase), + postDefaultCases: term.postDefaultCases.map(c => this.expand(c)).toArray() + }); } - expandComputedMemberExpression(term_1011) { - return new _terms2.default("ComputedMemberExpression", { object: this.expand(term_1011.object), expression: this.expand(term_1011.expression) }); + + expandComputedMemberExpression(term) { + return new _terms2.default('ComputedMemberExpression', { + object: this.expand(term.object), + expression: this.expand(term.expression) + }); } - expandSwitchStatement(term_1012) { - return new _terms2.default("SwitchStatement", { discriminant: this.expand(term_1012.discriminant), cases: term_1012.cases.map(c_1013 => this.expand(c_1013)).toArray() }); + + expandSwitchStatement(term) { + return new _terms2.default('SwitchStatement', { + discriminant: this.expand(term.discriminant), + cases: term.cases.map(c => this.expand(c)).toArray() + }); } - expandFormalParameters(term_1014) { - let rest_1015 = term_1014.rest == null ? null : this.expand(term_1014.rest); - return new _terms2.default("FormalParameters", { items: term_1014.items.map(i_1016 => this.expand(i_1016)), rest: rest_1015 }); + + expandFormalParameters(term) { + let rest = term.rest == null ? null : this.expand(term.rest); + return new _terms2.default('FormalParameters', { + items: term.items.map(i => this.expand(i)), + rest: rest + }); } - expandArrowExpression(term_1017) { - return this.doFunctionExpansion(term_1017, "ArrowExpression"); + + expandArrowExpression(term) { + return this.doFunctionExpansion(term, 'ArrowExpression'); } - expandSwitchDefault(term_1018) { - return new _terms2.default("SwitchDefault", { consequent: term_1018.consequent.map(c_1019 => this.expand(c_1019)).toArray() }); + + expandSwitchDefault(term) { + return new _terms2.default('SwitchDefault', { + consequent: term.consequent.map(c => this.expand(c)).toArray() + }); } - expandSwitchCase(term_1020) { - return new _terms2.default("SwitchCase", { test: this.expand(term_1020.test), consequent: term_1020.consequent.map(c_1021 => this.expand(c_1021)).toArray() }); + + expandSwitchCase(term) { + return new _terms2.default('SwitchCase', { + test: this.expand(term.test), + consequent: term.consequent.map(c => this.expand(c)).toArray() + }); } - expandForInStatement(term_1022) { - return new _terms2.default("ForInStatement", { left: this.expand(term_1022.left), right: this.expand(term_1022.right), body: this.expand(term_1022.body) }); + + expandForInStatement(term) { + return new _terms2.default('ForInStatement', { + left: this.expand(term.left), + right: this.expand(term.right), + body: this.expand(term.body) + }); } - expandTryCatchStatement(term_1023) { - return new _terms2.default("TryCatchStatement", { body: this.expand(term_1023.body), catchClause: this.expand(term_1023.catchClause) }); + + expandTryCatchStatement(term) { + return new _terms2.default('TryCatchStatement', { + body: this.expand(term.body), + catchClause: this.expand(term.catchClause) + }); } - expandTryFinallyStatement(term_1024) { - let catchClause_1025 = term_1024.catchClause == null ? null : this.expand(term_1024.catchClause); - return new _terms2.default("TryFinallyStatement", { body: this.expand(term_1024.body), catchClause: catchClause_1025, finalizer: this.expand(term_1024.finalizer) }); + + expandTryFinallyStatement(term) { + let catchClause = term.catchClause == null ? null : this.expand(term.catchClause); + return new _terms2.default('TryFinallyStatement', { + body: this.expand(term.body), + catchClause: catchClause, + finalizer: this.expand(term.finalizer) + }); } - expandCatchClause(term_1026) { - return new _terms2.default("CatchClause", { binding: this.expand(term_1026.binding), body: this.expand(term_1026.body) }); + + expandCatchClause(term) { + return new _terms2.default('CatchClause', { + binding: this.expand(term.binding), + body: this.expand(term.body) + }); } - expandThrowStatement(term_1027) { - return new _terms2.default("ThrowStatement", { expression: this.expand(term_1027.expression) }); + + expandThrowStatement(term) { + return new _terms2.default('ThrowStatement', { + expression: this.expand(term.expression) + }); } - expandForOfStatement(term_1028) { - return new _terms2.default("ForOfStatement", { left: this.expand(term_1028.left), right: this.expand(term_1028.right), body: this.expand(term_1028.body) }); + + expandForOfStatement(term) { + return new _terms2.default('ForOfStatement', { + left: this.expand(term.left), + right: this.expand(term.right), + body: this.expand(term.body) + }); } - expandBindingIdentifier(term_1029) { - return term_1029; + + expandBindingIdentifier(term) { + return term; } - expandBindingPropertyIdentifier(term_1030) { - return term_1030; + + expandBindingPropertyIdentifier(term) { + return term; } - expandBindingPropertyProperty(term_1031) { - return new _terms2.default("BindingPropertyProperty", { name: this.expand(term_1031.name), binding: this.expand(term_1031.binding) }); + expandBindingPropertyProperty(term) { + return new _terms2.default('BindingPropertyProperty', { + name: this.expand(term.name), + binding: this.expand(term.binding) + }); } - expandComputedPropertyName(term_1032) { - return new _terms2.default("ComputedPropertyName", { expression: this.expand(term_1032.expression) }); + + expandComputedPropertyName(term) { + return new _terms2.default('ComputedPropertyName', { + expression: this.expand(term.expression) + }); } - expandObjectBinding(term_1033) { - return new _terms2.default("ObjectBinding", { properties: term_1033.properties.map(t_1034 => this.expand(t_1034)).toArray() }); + + expandObjectBinding(term) { + return new _terms2.default('ObjectBinding', { + properties: term.properties.map(t => this.expand(t)).toArray() + }); } - expandArrayBinding(term_1035) { - let restElement_1036 = term_1035.restElement == null ? null : this.expand(term_1035.restElement); - return new _terms2.default("ArrayBinding", { elements: term_1035.elements.map(t_1037 => t_1037 == null ? null : this.expand(t_1037)).toArray(), restElement: restElement_1036 }); + + expandArrayBinding(term) { + let restElement = term.restElement == null ? null : this.expand(term.restElement); + return new _terms2.default('ArrayBinding', { + elements: term.elements.map(t => t == null ? null : this.expand(t)).toArray(), + restElement: restElement + }); } - expandBindingWithDefault(term_1038) { - return new _terms2.default("BindingWithDefault", { binding: this.expand(term_1038.binding), init: this.expand(term_1038.init) }); + + expandBindingWithDefault(term) { + return new _terms2.default('BindingWithDefault', { + binding: this.expand(term.binding), + init: this.expand(term.init) + }); } - expandShorthandProperty(term_1039) { - return new _terms2.default("DataProperty", { name: new _terms2.default("StaticPropertyName", { value: term_1039.name }), expression: new _terms2.default("IdentifierExpression", { name: term_1039.name }) }); + + expandShorthandProperty(term) { + // because hygiene, shorthand properties must turn into DataProperties + return new _terms2.default('DataProperty', { + name: new _terms2.default('StaticPropertyName', { + value: term.name + }), + expression: new _terms2.default('IdentifierExpression', { + name: term.name + }) + }); } - expandForStatement(term_1040) { - let init_1041 = term_1040.init == null ? null : this.expand(term_1040.init); - let test_1042 = term_1040.test == null ? null : this.expand(term_1040.test); - let update_1043 = term_1040.update == null ? null : this.expand(term_1040.update); - let body_1044 = this.expand(term_1040.body); - return new _terms2.default("ForStatement", { init: init_1041, test: test_1042, update: update_1043, body: body_1044 }); + + expandForStatement(term) { + let init = term.init == null ? null : this.expand(term.init); + let test = term.test == null ? null : this.expand(term.test); + let update = term.update == null ? null : this.expand(term.update); + let body = this.expand(term.body); + return new _terms2.default('ForStatement', { init: init, test: test, update: update, body: body }); } - expandYieldExpression(term_1045) { - let expr_1046 = term_1045.expression == null ? null : this.expand(term_1045.expression); - return new _terms2.default("YieldExpression", { expression: expr_1046 }); + + expandYieldExpression(term) { + let expr = term.expression == null ? null : this.expand(term.expression); + return new _terms2.default('YieldExpression', { + expression: expr + }); } - expandYieldGeneratorExpression(term_1047) { - let expr_1048 = term_1047.expression == null ? null : this.expand(term_1047.expression); - return new _terms2.default("YieldGeneratorExpression", { expression: expr_1048 }); + + expandYieldGeneratorExpression(term) { + let expr = term.expression == null ? null : this.expand(term.expression); + return new _terms2.default('YieldGeneratorExpression', { + expression: expr + }); } - expandWhileStatement(term_1049) { - return new _terms2.default("WhileStatement", { test: this.expand(term_1049.test), body: this.expand(term_1049.body) }); + + expandWhileStatement(term) { + return new _terms2.default('WhileStatement', { + test: this.expand(term.test), + body: this.expand(term.body) + }); } - expandIfStatement(term_1050) { - let consequent_1051 = term_1050.consequent == null ? null : this.expand(term_1050.consequent); - let alternate_1052 = term_1050.alternate == null ? null : this.expand(term_1050.alternate); - return new _terms2.default("IfStatement", { test: this.expand(term_1050.test), consequent: consequent_1051, alternate: alternate_1052 }); + + expandIfStatement(term) { + let consequent = term.consequent == null ? null : this.expand(term.consequent); + let alternate = term.alternate == null ? null : this.expand(term.alternate); + return new _terms2.default('IfStatement', { + test: this.expand(term.test), + consequent: consequent, + alternate: alternate + }); } - expandBlockStatement(term_1053) { - return new _terms2.default("BlockStatement", { block: this.expand(term_1053.block) }); + + expandBlockStatement(term) { + return new _terms2.default('BlockStatement', { + block: this.expand(term.block) + }); } - expandBlock(term_1054) { - let scope_1055 = (0, _scope.freshScope)("block"); - this.context.currentScope.push(scope_1055); - let compiler_1056 = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); - let markedBody_1057, bodyTerm_1058; - markedBody_1057 = term_1054.statements.map(b_1059 => b_1059.addScope(scope_1055, this.context.bindings, _syntax.ALL_PHASES)); - bodyTerm_1058 = new _terms2.default("Block", { statements: compiler_1056.compile(markedBody_1057) }); + + expandBlock(term) { + let scope = (0, _scope.freshScope)('block'); + this.context.currentScope.push(scope); + let compiler = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); + + let markedBody, bodyTerm; + markedBody = term.statements.map(b => b.addScope(scope, this.context.bindings, _syntax.ALL_PHASES)); + bodyTerm = new _terms2.default('Block', { + statements: compiler.compile(markedBody) + }); this.context.currentScope.pop(); - return bodyTerm_1058; + return bodyTerm; } - expandVariableDeclarationStatement(term_1060) { - return new _terms2.default("VariableDeclarationStatement", { declaration: this.expand(term_1060.declaration) }); + + expandVariableDeclarationStatement(term) { + return new _terms2.default('VariableDeclarationStatement', { + declaration: this.expand(term.declaration) + }); } - expandReturnStatement(term_1061) { - if (term_1061.expression == null) { - return term_1061; + expandReturnStatement(term) { + if (term.expression == null) { + return term; } - return new _terms2.default("ReturnStatement", { expression: this.expand(term_1061.expression) }); + return new _terms2.default("ReturnStatement", { + expression: this.expand(term.expression) + }); } - expandClassDeclaration(term_1062) { - return new _terms2.default("ClassDeclaration", { name: term_1062.name == null ? null : this.expand(term_1062.name), super: term_1062.super == null ? null : this.expand(term_1062.super), elements: term_1062.elements.map(el_1063 => this.expand(el_1063)).toArray() }); + + expandClassDeclaration(term) { + return new _terms2.default('ClassDeclaration', { + name: term.name == null ? null : this.expand(term.name), + super: term.super == null ? null : this.expand(term.super), + elements: term.elements.map(el => this.expand(el)).toArray() + }); } - expandClassExpression(term_1064) { - return new _terms2.default("ClassExpression", { name: term_1064.name == null ? null : this.expand(term_1064.name), super: term_1064.super == null ? null : this.expand(term_1064.super), elements: term_1064.elements.map(el_1065 => this.expand(el_1065)).toArray() }); + + expandClassExpression(term) { + return new _terms2.default('ClassExpression', { + name: term.name == null ? null : this.expand(term.name), + super: term.super == null ? null : this.expand(term.super), + elements: term.elements.map(el => this.expand(el)).toArray() + }); } - expandClassElement(term_1066) { - return new _terms2.default("ClassElement", { isStatic: term_1066.isStatic, method: this.expand(term_1066.method) }); + + expandClassElement(term) { + return new _terms2.default('ClassElement', { + isStatic: term.isStatic, + method: this.expand(term.method) + }); } - expandThisExpression(term_1067) { - return term_1067; + + expandThisExpression(term) { + return term; } - expandSyntaxTemplate(term_1068) { - let r_1069 = (0, _templateProcessor.processTemplate)(term_1068.template.inner()); - let str_1070 = _syntax2.default.from("string", _serializer.serializer.write(r_1069.template)); - let callee_1071 = new _terms2.default("IdentifierExpression", { name: _syntax2.default.from("identifier", "syntaxTemplate") }); - let expandedInterps_1072 = r_1069.interp.map(i_1074 => { - let enf_1075 = new _enforester.Enforester(i_1074, (0, _immutable.List)(), this.context); - return this.expand(enf_1075.enforest("expression")); + + expandSyntaxTemplate(term) { + let r = (0, _templateProcessor.processTemplate)(term.template.inner()); + let str = _syntax2.default.from("string", _serializer.serializer.write(r.template)); + let callee = new _terms2.default('IdentifierExpression', { name: _syntax2.default.from("identifier", 'syntaxTemplate') }); + + let expandedInterps = r.interp.map(i => { + let enf = new _enforester.Enforester(i, (0, _immutable.List)(), this.context); + return this.expand(enf.enforest('expression')); + }); + + let args = _immutable.List.of(new _terms2.default('LiteralStringExpression', { value: str })).concat(expandedInterps); + + return new _terms2.default('CallExpression', { + callee: callee, arguments: args }); - let args_1073 = _immutable.List.of(new _terms2.default("LiteralStringExpression", { value: str_1070 })).concat(expandedInterps_1072); - return new _terms2.default("CallExpression", { callee: callee_1071, arguments: args_1073 }); } - expandSyntaxQuote(term_1076) { - let str_1077 = new _terms2.default("LiteralStringExpression", { value: _syntax2.default.from("string", _serializer.serializer.write(term_1076.name)) }); - return new _terms2.default("TemplateExpression", { tag: term_1076.template.tag, elements: term_1076.template.elements.push(str_1077).push(new _terms2.default("TemplateElement", { rawValue: "" })).toArray() }); + + expandSyntaxQuote(term) { + let str = new _terms2.default("LiteralStringExpression", { + value: _syntax2.default.from("string", _serializer.serializer.write(term.name)) + }); + + return new _terms2.default("TemplateExpression", { + tag: term.template.tag, + elements: term.template.elements.push(str).push(new _terms2.default('TemplateElement', { + rawValue: '' + })).toArray() + }); } - expandStaticMemberExpression(term_1078) { - return new _terms2.default("StaticMemberExpression", { object: this.expand(term_1078.object), property: term_1078.property }); + + expandStaticMemberExpression(term) { + return new _terms2.default("StaticMemberExpression", { + object: this.expand(term.object), + property: term.property + }); } - expandArrayExpression(term_1079) { - return new _terms2.default("ArrayExpression", { elements: term_1079.elements.map(t_1080 => t_1080 == null ? t_1080 : this.expand(t_1080)) }); + + expandArrayExpression(term) { + return new _terms2.default("ArrayExpression", { + elements: term.elements.map(t => t == null ? t : this.expand(t)) + }); } - expandImport(term_1081) { - return term_1081; + + expandImport(term) { + return term; } - expandImportNamespace(term_1082) { - return term_1082; + + expandImportNamespace(term) { + return term; } - expandExport(term_1083) { - return new _terms2.default("Export", { declaration: this.expand(term_1083.declaration) }); + + expandExport(term) { + return new _terms2.default('Export', { + declaration: this.expand(term.declaration) + }); } - expandExportDefault(term_1084) { - return new _terms2.default("ExportDefault", { body: this.expand(term_1084.body) }); + + expandExportDefault(term) { + return new _terms2.default('ExportDefault', { + body: this.expand(term.body) + }); } - expandExportFrom(term_1085) { - return term_1085; + + expandExportFrom(term) { + return term; } - expandExportAllFrom(term_1086) { - return term_1086; + + expandExportAllFrom(term) { + return term; } - expandExportSpecifier(term_1087) { - return term_1087; + + expandExportSpecifier(term) { + return term; } - expandStaticPropertyName(term_1088) { - return term_1088; + + expandStaticPropertyName(term) { + return term; } - expandDataProperty(term_1089) { - return new _terms2.default("DataProperty", { name: this.expand(term_1089.name), expression: this.expand(term_1089.expression) }); + + expandDataProperty(term) { + return new _terms2.default("DataProperty", { + name: this.expand(term.name), + expression: this.expand(term.expression) + }); } - expandObjectExpression(term_1090) { - return new _terms2.default("ObjectExpression", { properties: term_1090.properties.map(t_1091 => this.expand(t_1091)) }); + + expandObjectExpression(term) { + return new _terms2.default("ObjectExpression", { + properties: term.properties.map(t => this.expand(t)) + }); } - expandVariableDeclarator(term_1092) { - let init_1093 = term_1092.init == null ? null : this.expand(term_1092.init); - return new _terms2.default("VariableDeclarator", { binding: this.expand(term_1092.binding), init: init_1093 }); + + expandVariableDeclarator(term) { + let init = term.init == null ? null : this.expand(term.init); + return new _terms2.default("VariableDeclarator", { + binding: this.expand(term.binding), + init: init + }); } - expandVariableDeclaration(term_1094) { - if (term_1094.kind === "syntax" || term_1094.kind === "syntaxrec") { - return term_1094; + + expandVariableDeclaration(term) { + if (term.kind === 'syntax' || term.kind === 'syntaxrec') { + return term; } - return new _terms2.default("VariableDeclaration", { kind: term_1094.kind, declarators: term_1094.declarators.map(d_1095 => this.expand(d_1095)) }); + return new _terms2.default("VariableDeclaration", { + kind: term.kind, + declarators: term.declarators.map(d => this.expand(d)) + }); } - expandParenthesizedExpression(term_1096) { - if (term_1096.inner.size === 0) { + + expandParenthesizedExpression(term) { + if (term.inner.size === 0) { throw new Error("unexpected end of input"); } - let enf_1097 = new _enforester.Enforester(term_1096.inner, (0, _immutable.List)(), this.context); - let lookahead_1098 = enf_1097.peek(); - let t_1099 = enf_1097.enforestExpression(); - if (t_1099 == null || enf_1097.rest.size > 0) { - throw enf_1097.createError(lookahead_1098, "unexpected syntax"); + let enf = new _enforester.Enforester(term.inner, (0, _immutable.List)(), this.context); + let lookahead = enf.peek(); + let t = enf.enforestExpression(); + if (t == null || enf.rest.size > 0) { + throw enf.createError(lookahead, "unexpected syntax"); } - return this.expand(t_1099); + return this.expand(t); } - expandUnaryExpression(term_1100) { - return new _terms2.default("UnaryExpression", { operator: term_1100.operator, operand: this.expand(term_1100.operand) }); + + expandUnaryExpression(term) { + return new _terms2.default('UnaryExpression', { + operator: term.operator, + operand: this.expand(term.operand) + }); } - expandUpdateExpression(term_1101) { - return new _terms2.default("UpdateExpression", { isPrefix: term_1101.isPrefix, operator: term_1101.operator, operand: this.expand(term_1101.operand) }); + + expandUpdateExpression(term) { + return new _terms2.default('UpdateExpression', { + isPrefix: term.isPrefix, + operator: term.operator, + operand: this.expand(term.operand) + }); } - expandBinaryExpression(term_1102) { - let left_1103 = this.expand(term_1102.left); - let right_1104 = this.expand(term_1102.right); - return new _terms2.default("BinaryExpression", { left: left_1103, operator: term_1102.operator, right: right_1104 }); + + expandBinaryExpression(term) { + let left = this.expand(term.left); + let right = this.expand(term.right); + return new _terms2.default("BinaryExpression", { + left: left, + operator: term.operator, + right: right + }); } - expandConditionalExpression(term_1105) { - return new _terms2.default("ConditionalExpression", { test: this.expand(term_1105.test), consequent: this.expand(term_1105.consequent), alternate: this.expand(term_1105.alternate) }); + + expandConditionalExpression(term) { + return new _terms2.default('ConditionalExpression', { + test: this.expand(term.test), + consequent: this.expand(term.consequent), + alternate: this.expand(term.alternate) + }); } - expandNewTargetExpression(term_1106) { - return term_1106; + + expandNewTargetExpression(term) { + return term; } - expandNewExpression(term_1107) { - let callee_1108 = this.expand(term_1107.callee); - let enf_1109 = new _enforester.Enforester(term_1107.arguments, (0, _immutable.List)(), this.context); - let args_1110 = enf_1109.enforestArgumentList().map(arg_1111 => this.expand(arg_1111)); - return new _terms2.default("NewExpression", { callee: callee_1108, arguments: args_1110.toArray() }); + + expandNewExpression(term) { + let callee = this.expand(term.callee); + let enf = new _enforester.Enforester(term.arguments, (0, _immutable.List)(), this.context); + let args = enf.enforestArgumentList().map(arg => this.expand(arg)); + return new _terms2.default('NewExpression', { + callee: callee, + arguments: args.toArray() + }); } - expandSuper(term_1112) { - return term_1112; + + expandSuper(term) { + return term; } - expandCallExpression(term_1113) { - let callee_1114 = this.expand(term_1113.callee); - let enf_1115 = new _enforester.Enforester(term_1113.arguments, (0, _immutable.List)(), this.context); - let args_1116 = enf_1115.enforestArgumentList().map(arg_1117 => this.expand(arg_1117)); - return new _terms2.default("CallExpression", { callee: callee_1114, arguments: args_1116 }); + + expandCallExpression(term) { + let callee = this.expand(term.callee); + let enf = new _enforester.Enforester(term.arguments, (0, _immutable.List)(), this.context); + let args = enf.enforestArgumentList().map(arg => this.expand(arg)); + return new _terms2.default("CallExpression", { + callee: callee, + arguments: args + }); } - expandSpreadElement(term_1118) { - return new _terms2.default("SpreadElement", { expression: this.expand(term_1118.expression) }); + + expandSpreadElement(term) { + return new _terms2.default('SpreadElement', { + expression: this.expand(term.expression) + }); } - expandExpressionStatement(term_1119) { - let child_1120 = this.expand(term_1119.expression); - return new _terms2.default("ExpressionStatement", { expression: child_1120 }); + + expandExpressionStatement(term) { + let child = this.expand(term.expression); + return new _terms2.default("ExpressionStatement", { + expression: child + }); } - expandLabeledStatement(term_1121) { - return new _terms2.default("LabeledStatement", { label: term_1121.label.val(), body: this.expand(term_1121.body) }); + + expandLabeledStatement(term) { + return new _terms2.default('LabeledStatement', { + label: term.label.val(), + body: this.expand(term.body) + }); } - doFunctionExpansion(term_1122, type_1123) { - let scope_1124 = (0, _scope.freshScope)("fun"); - let red_1125 = new _applyScopeInParamsReducer2.default(scope_1124, this.context); - let params_1126; - if (type_1123 !== "Getter" && type_1123 !== "Setter") { - params_1126 = red_1125.transform(term_1122.params); - params_1126 = this.expand(params_1126); + + doFunctionExpansion(term, type) { + let scope = (0, _scope.freshScope)("fun"); + let red = new _applyScopeInParamsReducer2.default(scope, this.context); + let params; + if (type !== 'Getter' && type !== 'Setter') { + params = red.transform(term.params); + params = this.expand(params); } - this.context.currentScope.push(scope_1124); - let compiler_1127 = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); - let markedBody_1128, bodyTerm_1129; - if (term_1122.body instanceof _terms2.default) { - bodyTerm_1129 = this.expand(term_1122.body.addScope(scope_1124, this.context.bindings, _syntax.ALL_PHASES)); + this.context.currentScope.push(scope); + let compiler = new _compiler2.default(this.context.phase, this.context.env, this.context.store, this.context); + + let markedBody, bodyTerm; + if (term.body instanceof _terms2.default) { + // Arrow functions have a single term as their body + bodyTerm = this.expand(term.body.addScope(scope, this.context.bindings, _syntax.ALL_PHASES)); } else { - markedBody_1128 = term_1122.body.map(b_1130 => b_1130.addScope(scope_1124, this.context.bindings, _syntax.ALL_PHASES)); - bodyTerm_1129 = new _terms2.default("FunctionBody", { directives: (0, _immutable.List)(), statements: compiler_1127.compile(markedBody_1128) }); + markedBody = term.body.map(b => b.addScope(scope, this.context.bindings, _syntax.ALL_PHASES)); + bodyTerm = new _terms2.default("FunctionBody", { + directives: (0, _immutable.List)(), + statements: compiler.compile(markedBody) + }); } this.context.currentScope.pop(); - if (type_1123 === "Getter") { - return new _terms2.default(type_1123, { name: this.expand(term_1122.name), body: bodyTerm_1129 }); - } else if (type_1123 === "Setter") { - return new _terms2.default(type_1123, { name: this.expand(term_1122.name), param: term_1122.param, body: bodyTerm_1129 }); + + if (type === 'Getter') { + return new _terms2.default(type, { + name: this.expand(term.name), + body: bodyTerm + }); + } else if (type === 'Setter') { + return new _terms2.default(type, { + name: this.expand(term.name), + param: term.param, + body: bodyTerm + }); + } else if (type === 'ArrowExpression') { + return new _terms2.default(type, { + params: params, + body: bodyTerm + }); } - return new _terms2.default(type_1123, { name: term_1122.name, isGenerator: term_1122.isGenerator, params: params_1126, body: bodyTerm_1129 }); + return new _terms2.default(type, { + name: term.name, + isGenerator: term.isGenerator, + params: params, + body: bodyTerm + }); } - expandMethod(term_1131) { - return this.doFunctionExpansion(term_1131, "Method"); + + expandMethod(term) { + return this.doFunctionExpansion(term, 'Method'); } - expandSetter(term_1132) { - return this.doFunctionExpansion(term_1132, "Setter"); + + expandSetter(term) { + return this.doFunctionExpansion(term, 'Setter'); } - expandGetter(term_1133) { - return this.doFunctionExpansion(term_1133, "Getter"); + + expandGetter(term) { + return this.doFunctionExpansion(term, 'Getter'); } - expandFunctionDeclaration(term_1134) { - return this.doFunctionExpansion(term_1134, "FunctionDeclaration"); + + expandFunctionDeclaration(term) { + return this.doFunctionExpansion(term, "FunctionDeclaration"); } - expandFunctionExpression(term_1135) { - return this.doFunctionExpansion(term_1135, "FunctionExpression"); + + expandFunctionExpression(term) { + return this.doFunctionExpansion(term, "FunctionExpression"); } - expandCompoundAssignmentExpression(term_1136) { - return new _terms2.default("CompoundAssignmentExpression", { binding: this.expand(term_1136.binding), operator: term_1136.operator, expression: this.expand(term_1136.expression) }); + + expandCompoundAssignmentExpression(term) { + return new _terms2.default("CompoundAssignmentExpression", { + binding: this.expand(term.binding), + operator: term.operator, + expression: this.expand(term.expression) + }); } - expandAssignmentExpression(term_1137) { - return new _terms2.default("AssignmentExpression", { binding: this.expand(term_1137.binding), expression: this.expand(term_1137.expression) }); + + expandAssignmentExpression(term) { + return new _terms2.default("AssignmentExpression", { + binding: this.expand(term.binding), + expression: this.expand(term.expression) + }); } - expandEmptyStatement(term_1138) { - return term_1138; + + expandEmptyStatement(term) { + return term; } - expandLiteralBooleanExpression(term_1139) { - return term_1139; + + expandLiteralBooleanExpression(term) { + return term; } - expandLiteralNumericExpression(term_1140) { - return term_1140; + + expandLiteralNumericExpression(term) { + return term; } - expandLiteralInfinityExpression(term_1141) { - return term_1141; + expandLiteralInfinityExpression(term) { + return term; } - expandIdentifierExpression(term_1142) { - let trans_1143 = this.context.env.get(term_1142.name.resolve(this.context.phase)); - if (trans_1143) { - return new _terms2.default("IdentifierExpression", { name: trans_1143.id }); + + expandIdentifierExpression(term) { + let trans = this.context.env.get(term.name.resolve(this.context.phase)); + if (trans) { + return new _terms2.default("IdentifierExpression", { + name: trans.id + }); } - return term_1142; + return term; } - expandLiteralNullExpression(term_1144) { - return term_1144; + + expandLiteralNullExpression(term) { + return term; } - expandLiteralStringExpression(term_1145) { - return term_1145; + + expandLiteralStringExpression(term) { + return term; } - expandLiteralRegExpExpression(term_1146) { - return term_1146; + + expandLiteralRegExpExpression(term) { + return term; } } exports.default = TermExpander; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3Rlcm0tZXhwYW5kZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFDZSxNQUFNLFlBQU4saUNBQXlDO0FBQ3RELGNBQVksV0FBWixFQUF5QjtBQUN2QixVQUFNLFFBQU4sRUFBZ0IsSUFBaEI7QUFDQSxTQUFLLE9BQUwsR0FBZSxXQUFmO0FBQ0Q7QUFDRCxTQUFPLFNBQVAsRUFBa0I7QUFDaEIsV0FBTyxLQUFLLFFBQUwsQ0FBYyxTQUFkLENBQVA7QUFDRDtBQUNELGVBQWEsU0FBYixFQUF3QjtBQUN0QixXQUFPLFNBQVA7QUFDRDtBQUNELDJCQUF5QixTQUF6QixFQUFvQztBQUNsQyxXQUFPLG9CQUFTLG9CQUFULEVBQStCLEVBQUMsS0FBSyxVQUFVLEdBQVYsSUFBaUIsSUFBakIsR0FBd0IsSUFBeEIsR0FBK0IsS0FBSyxNQUFMLENBQVksVUFBVSxHQUF0QixDQUFyQyxFQUFpRSxVQUFVLFVBQVUsUUFBVixDQUFtQixPQUFuQixFQUEzRSxFQUEvQixDQUFQO0FBQ0Q7QUFDRCx1QkFBcUIsU0FBckIsRUFBZ0M7QUFDOUIsV0FBTyxvQkFBUyxnQkFBVCxFQUEyQixFQUFDLE9BQU8sVUFBVSxLQUFWLEdBQWtCLFVBQVUsS0FBVixDQUFnQixHQUFoQixFQUFsQixHQUEwQyxJQUFsRCxFQUEzQixDQUFQO0FBQ0Q7QUFDRCx5QkFBdUIsU0FBdkIsRUFBa0M7QUFDaEMsV0FBTyxvQkFBUyxrQkFBVCxFQUE2QixFQUFDLE1BQU0sS0FBSyxNQUFMLENBQVksVUFBVSxJQUF0QixDQUFQLEVBQW9DLE1BQU0sS0FBSyxNQUFMLENBQVksVUFBVSxJQUF0QixDQUExQyxFQUE3QixDQUFQO0FBQ0Q7QUFDRCxzQkFBb0IsU0FBcEIsRUFBK0I7QUFDN0IsV0FBTyxvQkFBUyxlQUFULEVB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RDtBQUNELHVCQUFxQixTQUFyQixFQUFnQztBQUM5QixXQUFPLFNBQVA7QUFDRDtBQUNELGlDQUErQixTQUEvQixFQUEwQztBQUN4QyxXQUFPLFNBQVA7QUFDRDtBQUNELGlDQUErQixTQUEvQixFQUEwQztBQUN4QyxXQUFPLFNBQVA7QUFDRDtBQUNELGtDQUFnQyxTQUFoQyxFQUEyQztBQUN6QyxXQUFPLFNBQVA7QUFDRDtBQUNELDZCQUEyQixTQUEzQixFQUFzQztBQUNwQyxRQUFJLGFBQWEsS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixVQUFVLElBQVYsQ0FBZSxPQUFmLENBQXVCLEtBQUssT0FBTCxDQUFhLEtBQXBDLENBQXJCLENBQWpCO0FBQ0EsUUFBSSxVQUFKLEVBQWdCO0FBQ2QsYUFBTyxvQkFBUyxzQkFBVCxFQUFpQyxFQUFDLE1BQU0sV0FBVyxFQUFsQixFQUFqQyxDQUFQO0FBQ0Q7QUFDRCxXQUFPLFNBQVA7QUFDRDtBQUNELDhCQUE0QixTQUE1QixFQUF1QztBQUNyQyxXQUFPLFNBQVA7QUFDRDtBQUNELGdDQUE4QixTQUE5QixFQUF5QztBQUN2QyxXQUFPLFNBQVA7QUFDRDtBQUNELGdDQUE4QixTQUE5QixFQUF5QztBQUN2QyxXQUFPLFNBQVA7QUFDRDtBQXBWcUQ7a0JBQW5DLFkiLCJmaWxlIjoidGVybS1leHBhbmRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IFRlcm0sIHtpc0VPRiwgaXNCaW5kaW5nSWRlbnRpZmllciwgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLCBpc0Z1bmN0aW9uRXhwcmVzc2lvbiwgaXNGdW5jdGlvblRlcm0sIGlzRnVuY3Rpb25XaXRoTmFtZSwgaXNTeW50YXhEZWNsYXJhdGlvbiwgaXNWYXJpYWJsZURlY2xhcmF0aW9uLCBpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQsIGlzSW1wb3J0LCBpc0V4cG9ydH0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7U2NvcGUsIGZyZXNoU2NvcGV9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgQXBwbHlTY29wZUluUGFyYW1zUmVkdWNlciBmcm9tIFwiLi9hcHBseS1zY29wZS1pbi1wYXJhbXMtcmVkdWNlclwiO1xuaW1wb3J0IHJlZHVjZXIsIHtNb25vaWRhbFJlZHVjZXJ9IGZyb20gXCJzaGlmdC1yZWR1Y2VyXCI7XG5pbXBvcnQgQ29tcGlsZXIgZnJvbSBcIi4vY29tcGlsZXJcIjtcbmltcG9ydCBTeW50YXgsIHtBTExfUEhBU0VTfSBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCB7c2VyaWFsaXplciwgbWFrZURlc2VyaWFsaXplcn0gZnJvbSBcIi4vc2VyaWFsaXplclwiO1xuaW1wb3J0IHtlbmZvcmVzdEV4cHIsIEVuZm9yZXN0ZXJ9IGZyb20gXCIuL2VuZm9yZXN0ZXJcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7cHJvY2Vzc1RlbXBsYXRlfSBmcm9tIFwiLi90ZW1wbGF0ZS1wcm9jZXNzb3IuanNcIjtcbmltcG9ydCBBU1REaXNwYXRjaGVyIGZyb20gXCIuL2FzdC1kaXNwYXRjaGVyXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXJtRXhwYW5kZXIgZXh0ZW5kcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dF85OTkpIHtcbiAgICBzdXBlcihcImV4cGFuZFwiLCB0cnVlKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Xzk5OTtcbiAgfVxuICBleHBhbmQodGVybV8xMDAwKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2godGVybV8xMDAwKTtcbiAgfVxuICBleHBhbmRQcmFnbWEodGVybV8xMDAxKSB7XG4gICAgcmV0dXJuIHRlcm1fMTAwMTtcbiAgfVxuICBleHBhbmRUZW1wbGF0ZUV4cHJlc3Npb24odGVybV8xMDAyKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVGVtcGxhdGVFeHByZXNzaW9uXCIsIHt0YWc6IHRlcm1fMTAwMi50YWcgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMDIudGFnKSwgZWxlbWVudHM6IHRlcm1fMTAwMi5lbGVtZW50cy50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRCcmVha1N0YXRlbWVudCh0ZXJtXzEwMDMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCcmVha1N0YXRlbWVudFwiLCB7bGFiZWw6IHRlcm1fMTAwMy5sYWJlbCA/IHRlcm1fMTAwMy5sYWJlbC52YWwoKSA6IG51bGx9KTtcbiAgfVxuICBleHBhbmREb1doaWxlU3RhdGVtZW50KHRlcm1fMTAwNCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkRvV2hpbGVTdGF0ZW1lbnRcIiwge2JvZHk6IHRoaXMuZXhwYW5kKHRlcm1fMTAwNC5ib2R5KSwgdGVzdDogdGhpcy5leHBhbmQodGVybV8xMDA0LnRlc3QpfSk7XG4gIH1cbiAgZXhwYW5kV2l0aFN0YXRlbWVudCh0ZXJtXzEwMDUpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJXaXRoU3RhdGVtZW50XCIsIHtib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMDUuYm9keSksIG9iamVjdDogdGhpcy5leHBhbmQodGVybV8xMDA1Lm9iamVjdCl9KTtcbiAgfVxuICBleHBhbmREZWJ1Z2dlclN0YXRlbWVudCh0ZXJtXzEwMDYpIHtcbiAgICByZXR1cm4gdGVybV8xMDA2O1xuICB9XG4gIGV4cGFuZENvbnRpbnVlU3RhdGVtZW50KHRlcm1fMTAwNykge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbnRpbnVlU3RhdGVtZW50XCIsIHtsYWJlbDogdGVybV8xMDA3LmxhYmVsID8gdGVybV8xMDA3LmxhYmVsLnZhbCgpIDogbnVsbH0pO1xuICB9XG4gIGV4cGFuZFN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0KHRlcm1fMTAwOCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlN3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0XCIsIHtkaXNjcmltaW5hbnQ6IHRoaXMuZXhwYW5kKHRlcm1fMTAwOC5kaXNjcmltaW5hbnQpLCBwcmVEZWZhdWx0Q2FzZXM6IHRlcm1fMTAwOC5wcmVEZWZhdWx0Q2FzZXMubWFwKGNfMTAwOSA9PiB0aGlzLmV4cGFuZChjXzEwMDkpKS50b0FycmF5KCksIGRlZmF1bHRDYXNlOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMDguZGVmYXVsdENhc2UpLCBwb3N0RGVmYXVsdENhc2VzOiB0ZXJtXzEwMDgucG9zdERlZmF1bHRDYXNlcy5tYXAoY18xMDEwID0+IHRoaXMuZXhwYW5kKGNfMTAxMCkpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbih0ZXJtXzEwMTEpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogdGhpcy5leHBhbmQodGVybV8xMDExLm9iamVjdCksIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm1fMTAxMS5leHByZXNzaW9uKX0pO1xuICB9XG4gIGV4cGFuZFN3aXRjaFN0YXRlbWVudCh0ZXJtXzEwMTIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTd2l0Y2hTdGF0ZW1lbnRcIiwge2Rpc2NyaW1pbmFudDogdGhpcy5leHBhbmQodGVybV8xMDEyLmRpc2NyaW1pbmFudCksIGNhc2VzOiB0ZXJtXzEwMTIuY2FzZXMubWFwKGNfMTAxMyA9PiB0aGlzLmV4cGFuZChjXzEwMTMpKS50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRGb3JtYWxQYXJhbWV0ZXJzKHRlcm1fMTAxNCkge1xuICAgIGxldCByZXN0XzEwMTUgPSB0ZXJtXzEwMTQucmVzdCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTAxNC5yZXN0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJGb3JtYWxQYXJhbWV0ZXJzXCIsIHtpdGVtczogdGVybV8xMDE0Lml0ZW1zLm1hcChpXzEwMTYgPT4gdGhpcy5leHBhbmQoaV8xMDE2KSksIHJlc3Q6IHJlc3RfMTAxNX0pO1xuICB9XG4gIGV4cGFuZEFycm93RXhwcmVzc2lvbih0ZXJtXzEwMTcpIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm1fMTAxNywgXCJBcnJvd0V4cHJlc3Npb25cIik7XG4gIH1cbiAgZXhwYW5kU3dpdGNoRGVmYXVsdCh0ZXJtXzEwMTgpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJTd2l0Y2hEZWZhdWx0XCIsIHtjb25zZXF1ZW50OiB0ZXJtXzEwMTguY29uc2VxdWVudC5tYXAoY18xMDE5ID0+IHRoaXMuZXhwYW5kKGNfMTAxOSkpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZFN3aXRjaENhc2UodGVybV8xMDIwKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3dpdGNoQ2FzZVwiLCB7dGVzdDogdGhpcy5leHBhbmQodGVybV8xMDIwLnRlc3QpLCBjb25zZXF1ZW50OiB0ZXJtXzEwMjAuY29uc2VxdWVudC5tYXAoY18xMDIxID0+IHRoaXMuZXhwYW5kKGNfMTAyMSkpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZEZvckluU3RhdGVtZW50KHRlcm1fMTAyMikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvckluU3RhdGVtZW50XCIsIHtsZWZ0OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjIubGVmdCksIHJpZ2h0OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjIucmlnaHQpLCBib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjIuYm9keSl9KTtcbiAgfVxuICBleHBhbmRUcnlDYXRjaFN0YXRlbWVudCh0ZXJtXzEwMjMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUcnlDYXRjaFN0YXRlbWVudFwiLCB7Ym9keTogdGhpcy5leHBhbmQodGVybV8xMDIzLmJvZHkpLCBjYXRjaENsYXVzZTogdGhpcy5leHBhbmQodGVybV8xMDIzLmNhdGNoQ2xhdXNlKX0pO1xuICB9XG4gIGV4cGFuZFRyeUZpbmFsbHlTdGF0ZW1lbnQodGVybV8xMDI0KSB7XG4gICAgbGV0IGNhdGNoQ2xhdXNlXzEwMjUgPSB0ZXJtXzEwMjQuY2F0Y2hDbGF1c2UgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjQuY2F0Y2hDbGF1c2UpO1xuICAgIHJldHVybiBuZXcgVGVybShcIlRyeUZpbmFsbHlTdGF0ZW1lbnRcIiwge2JvZHk6IHRoaXMuZXhwYW5kKHRlcm1fMTAyNC5ib2R5KSwgY2F0Y2hDbGF1c2U6IGNhdGNoQ2xhdXNlXzEwMjUsIGZpbmFsaXplcjogdGhpcy5leHBhbmQodGVybV8xMDI0LmZpbmFsaXplcil9KTtcbiAgfVxuICBleHBhbmRDYXRjaENsYXVzZSh0ZXJtXzEwMjYpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYXRjaENsYXVzZVwiLCB7YmluZGluZzogdGhpcy5leHBhbmQodGVybV8xMDI2LmJpbmRpbmcpLCBib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMjYuYm9keSl9KTtcbiAgfVxuICBleHBhbmRUaHJvd1N0YXRlbWVudCh0ZXJtXzEwMjcpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUaHJvd1N0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMDI3LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kRm9yT2ZTdGF0ZW1lbnQodGVybV8xMDI4KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRm9yT2ZTdGF0ZW1lbnRcIiwge2xlZnQ6IHRoaXMuZXhwYW5kKHRlcm1fMTAyOC5sZWZ0KSwgcmlnaHQ6IHRoaXMuZXhwYW5kKHRlcm1fMTAyOC5yaWdodCksIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm1fMTAyOC5ib2R5KX0pO1xuICB9XG4gIGV4cGFuZEJpbmRpbmdJZGVudGlmaWVyKHRlcm1fMTAyOSkge1xuICAgIHJldHVybiB0ZXJtXzEwMjk7XG4gIH1cbiAgZXhwYW5kQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcih0ZXJtXzEwMzApIHtcbiAgICByZXR1cm4gdGVybV8xMDMwO1xuICB9XG4gIGV4cGFuZEJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5KHRlcm1fMTAzMSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XCIsIHtuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMzEubmFtZSksIGJpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTAzMS5iaW5kaW5nKX0pO1xuICB9XG4gIGV4cGFuZENvbXB1dGVkUHJvcGVydHlOYW1lKHRlcm1fMTAzMikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbXB1dGVkUHJvcGVydHlOYW1lXCIsIHtleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtXzEwMzIuZXhwcmVzc2lvbil9KTtcbiAgfVxuICBleHBhbmRPYmplY3RCaW5kaW5nKHRlcm1fMTAzMykge1xuICAgIHJldHVybiBuZXcgVGVybShcIk9iamVjdEJpbmRpbmdcIiwge3Byb3BlcnRpZXM6IHRlcm1fMTAzMy5wcm9wZXJ0aWVzLm1hcCh0XzEwMzQgPT4gdGhpcy5leHBhbmQodF8xMDM0KSkudG9BcnJheSgpfSk7XG4gIH1cbiAgZXhwYW5kQXJyYXlCaW5kaW5nKHRlcm1fMTAzNSkge1xuICAgIGxldCByZXN0RWxlbWVudF8xMDM2ID0gdGVybV8xMDM1LnJlc3RFbGVtZW50ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDM1LnJlc3RFbGVtZW50KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJBcnJheUJpbmRpbmdcIiwge2VsZW1lbnRzOiB0ZXJtXzEwMzUuZWxlbWVudHMubWFwKHRfMTAzNyA9PiB0XzEwMzcgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0XzEwMzcpKS50b0FycmF5KCksIHJlc3RFbGVtZW50OiByZXN0RWxlbWVudF8xMDM2fSk7XG4gIH1cbiAgZXhwYW5kQmluZGluZ1dpdGhEZWZhdWx0KHRlcm1fMTAzOCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmRpbmdXaXRoRGVmYXVsdFwiLCB7YmluZGluZzogdGhpcy5leHBhbmQodGVybV8xMDM4LmJpbmRpbmcpLCBpbml0OiB0aGlzLmV4cGFuZCh0ZXJtXzEwMzguaW5pdCl9KTtcbiAgfVxuICBleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eSh0ZXJtXzEwMzkpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge25hbWU6IG5ldyBUZXJtKFwiU3RhdGljUHJvcGVydHlOYW1lXCIsIHt2YWx1ZTogdGVybV8xMDM5Lm5hbWV9KSwgZXhwcmVzc2lvbjogbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7bmFtZTogdGVybV8xMDM5Lm5hbWV9KX0pO1xuICB9XG4gIGV4cGFuZEZvclN0YXRlbWVudCh0ZXJtXzEwNDApIHtcbiAgICBsZXQgaW5pdF8xMDQxID0gdGVybV8xMDQwLmluaXQgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNDAuaW5pdCk7XG4gICAgbGV0IHRlc3RfMTA0MiA9IHRlcm1fMTA0MC50ZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDQwLnRlc3QpO1xuICAgIGxldCB1cGRhdGVfMTA0MyA9IHRlcm1fMTA0MC51cGRhdGUgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNDAudXBkYXRlKTtcbiAgICBsZXQgYm9keV8xMDQ0ID0gdGhpcy5leHBhbmQodGVybV8xMDQwLmJvZHkpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkZvclN0YXRlbWVudFwiLCB7aW5pdDogaW5pdF8xMDQxLCB0ZXN0OiB0ZXN0XzEwNDIsIHVwZGF0ZTogdXBkYXRlXzEwNDMsIGJvZHk6IGJvZHlfMTA0NH0pO1xuICB9XG4gIGV4cGFuZFlpZWxkRXhwcmVzc2lvbih0ZXJtXzEwNDUpIHtcbiAgICBsZXQgZXhwcl8xMDQ2ID0gdGVybV8xMDQ1LmV4cHJlc3Npb24gPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNDUuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiWWllbGRFeHByZXNzaW9uXCIsIHtleHByZXNzaW9uOiBleHByXzEwNDZ9KTtcbiAgfVxuICBleHBhbmRZaWVsZEdlbmVyYXRvckV4cHJlc3Npb24odGVybV8xMDQ3KSB7XG4gICAgbGV0IGV4cHJfMTA0OCA9IHRlcm1fMTA0Ny5leHByZXNzaW9uID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDQ3LmV4cHJlc3Npb24pO1xuICAgIHJldHVybiBuZXcgVGVybShcIllpZWxkR2VuZXJhdG9yRXhwcmVzc2lvblwiLCB7ZXhwcmVzc2lvbjogZXhwcl8xMDQ4fSk7XG4gIH1cbiAgZXhwYW5kV2hpbGVTdGF0ZW1lbnQodGVybV8xMDQ5KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiV2hpbGVTdGF0ZW1lbnRcIiwge3Rlc3Q6IHRoaXMuZXhwYW5kKHRlcm1fMTA0OS50ZXN0KSwgYm9keTogdGhpcy5leHBhbmQodGVybV8xMDQ5LmJvZHkpfSk7XG4gIH1cbiAgZXhwYW5kSWZTdGF0ZW1lbnQodGVybV8xMDUwKSB7XG4gICAgbGV0IGNvbnNlcXVlbnRfMTA1MSA9IHRlcm1fMTA1MC5jb25zZXF1ZW50ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDUwLmNvbnNlcXVlbnQpO1xuICAgIGxldCBhbHRlcm5hdGVfMTA1MiA9IHRlcm1fMTA1MC5hbHRlcm5hdGUgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNTAuYWx0ZXJuYXRlKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJJZlN0YXRlbWVudFwiLCB7dGVzdDogdGhpcy5leHBhbmQodGVybV8xMDUwLnRlc3QpLCBjb25zZXF1ZW50OiBjb25zZXF1ZW50XzEwNTEsIGFsdGVybmF0ZTogYWx0ZXJuYXRlXzEwNTJ9KTtcbiAgfVxuICBleHBhbmRCbG9ja1N0YXRlbWVudCh0ZXJtXzEwNTMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJCbG9ja1N0YXRlbWVudFwiLCB7YmxvY2s6IHRoaXMuZXhwYW5kKHRlcm1fMTA1My5ibG9jayl9KTtcbiAgfVxuICBleHBhbmRCbG9jayh0ZXJtXzEwNTQpIHtcbiAgICBsZXQgc2NvcGVfMTA1NSA9IGZyZXNoU2NvcGUoXCJibG9ja1wiKTtcbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnB1c2goc2NvcGVfMTA1NSk7XG4gICAgbGV0IGNvbXBpbGVyXzEwNTYgPSBuZXcgQ29tcGlsZXIodGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuZW52LCB0aGlzLmNvbnRleHQuc3RvcmUsIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IG1hcmtlZEJvZHlfMTA1NywgYm9keVRlcm1fMTA1ODtcbiAgICBtYXJrZWRCb2R5XzEwNTcgPSB0ZXJtXzEwNTQuc3RhdGVtZW50cy5tYXAoYl8xMDU5ID0+IGJfMTA1OS5hZGRTY29wZShzY29wZV8xMDU1LCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpKTtcbiAgICBib2R5VGVybV8xMDU4ID0gbmV3IFRlcm0oXCJCbG9ja1wiLCB7c3RhdGVtZW50czogY29tcGlsZXJfMTA1Ni5jb21waWxlKG1hcmtlZEJvZHlfMTA1Nyl9KTtcbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnBvcCgpO1xuICAgIHJldHVybiBib2R5VGVybV8xMDU4O1xuICB9XG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybV8xMDYwKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudFwiLCB7ZGVjbGFyYXRpb246IHRoaXMuZXhwYW5kKHRlcm1fMTA2MC5kZWNsYXJhdGlvbil9KTtcbiAgfVxuICBleHBhbmRSZXR1cm5TdGF0ZW1lbnQodGVybV8xMDYxKSB7XG4gICAgaWYgKHRlcm1fMTA2MS5leHByZXNzaW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0ZXJtXzEwNjE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlJldHVyblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMDYxLmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kQ2xhc3NEZWNsYXJhdGlvbih0ZXJtXzEwNjIpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDbGFzc0RlY2xhcmF0aW9uXCIsIHtuYW1lOiB0ZXJtXzEwNjIubmFtZSA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTA2Mi5uYW1lKSwgc3VwZXI6IHRlcm1fMTA2Mi5zdXBlciA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTA2Mi5zdXBlciksIGVsZW1lbnRzOiB0ZXJtXzEwNjIuZWxlbWVudHMubWFwKGVsXzEwNjMgPT4gdGhpcy5leHBhbmQoZWxfMTA2MykpLnRvQXJyYXkoKX0pO1xuICB9XG4gIGV4cGFuZENsYXNzRXhwcmVzc2lvbih0ZXJtXzEwNjQpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDbGFzc0V4cHJlc3Npb25cIiwge25hbWU6IHRlcm1fMTA2NC5uYW1lID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDY0Lm5hbWUpLCBzdXBlcjogdGVybV8xMDY0LnN1cGVyID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybV8xMDY0LnN1cGVyKSwgZWxlbWVudHM6IHRlcm1fMTA2NC5lbGVtZW50cy5tYXAoZWxfMTA2NSA9PiB0aGlzLmV4cGFuZChlbF8xMDY1KSkudG9BcnJheSgpfSk7XG4gIH1cbiAgZXhwYW5kQ2xhc3NFbGVtZW50KHRlcm1fMTA2Nikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNsYXNzRWxlbWVudFwiLCB7aXNTdGF0aWM6IHRlcm1fMTA2Ni5pc1N0YXRpYywgbWV0aG9kOiB0aGlzLmV4cGFuZCh0ZXJtXzEwNjYubWV0aG9kKX0pO1xuICB9XG4gIGV4cGFuZFRoaXNFeHByZXNzaW9uKHRlcm1fMTA2Nykge1xuICAgIHJldHVybiB0ZXJtXzEwNjc7XG4gIH1cbiAgZXhwYW5kU3ludGF4VGVtcGxhdGUodGVybV8xMDY4KSB7XG4gICAgbGV0IHJfMTA2OSA9IHByb2Nlc3NUZW1wbGF0ZSh0ZXJtXzEwNjgudGVtcGxhdGUuaW5uZXIoKSk7XG4gICAgbGV0IHN0cl8xMDcwID0gU3ludGF4LmZyb20oXCJzdHJpbmdcIiwgc2VyaWFsaXplci53cml0ZShyXzEwNjkudGVtcGxhdGUpKTtcbiAgICBsZXQgY2FsbGVlXzEwNzEgPSBuZXcgVGVybShcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIHtuYW1lOiBTeW50YXguZnJvbShcImlkZW50aWZpZXJcIiwgXCJzeW50YXhUZW1wbGF0ZVwiKX0pO1xuICAgIGxldCBleHBhbmRlZEludGVycHNfMTA3MiA9IHJfMTA2OS5pbnRlcnAubWFwKGlfMTA3NCA9PiB7XG4gICAgICBsZXQgZW5mXzEwNzUgPSBuZXcgRW5mb3Jlc3RlcihpXzEwNzQsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICAgIHJldHVybiB0aGlzLmV4cGFuZChlbmZfMTA3NS5lbmZvcmVzdChcImV4cHJlc3Npb25cIikpO1xuICAgIH0pO1xuICAgIGxldCBhcmdzXzEwNzMgPSBMaXN0Lm9mKG5ldyBUZXJtKFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIiwge3ZhbHVlOiBzdHJfMTA3MH0pKS5jb25jYXQoZXhwYW5kZWRJbnRlcnBzXzEwNzIpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNhbGxFeHByZXNzaW9uXCIsIHtjYWxsZWU6IGNhbGxlZV8xMDcxLCBhcmd1bWVudHM6IGFyZ3NfMTA3M30pO1xuICB9XG4gIGV4cGFuZFN5bnRheFF1b3RlKHRlcm1fMTA3Nikge1xuICAgIGxldCBzdHJfMTA3NyA9IG5ldyBUZXJtKFwiTGl0ZXJhbFN0cmluZ0V4cHJlc3Npb25cIiwge3ZhbHVlOiBTeW50YXguZnJvbShcInN0cmluZ1wiLCBzZXJpYWxpemVyLndyaXRlKHRlcm1fMTA3Ni5uYW1lKSl9KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiwge3RhZzogdGVybV8xMDc2LnRlbXBsYXRlLnRhZywgZWxlbWVudHM6IHRlcm1fMTA3Ni50ZW1wbGF0ZS5lbGVtZW50cy5wdXNoKHN0cl8xMDc3KS5wdXNoKG5ldyBUZXJtKFwiVGVtcGxhdGVFbGVtZW50XCIsIHtyYXdWYWx1ZTogXCJcIn0pKS50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRTdGF0aWNNZW1iZXJFeHByZXNzaW9uKHRlcm1fMTA3OCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlN0YXRpY01lbWJlckV4cHJlc3Npb25cIiwge29iamVjdDogdGhpcy5leHBhbmQodGVybV8xMDc4Lm9iamVjdCksIHByb3BlcnR5OiB0ZXJtXzEwNzgucHJvcGVydHl9KTtcbiAgfVxuICBleHBhbmRBcnJheUV4cHJlc3Npb24odGVybV8xMDc5KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQXJyYXlFeHByZXNzaW9uXCIsIHtlbGVtZW50czogdGVybV8xMDc5LmVsZW1lbnRzLm1hcCh0XzEwODAgPT4gdF8xMDgwID09IG51bGwgPyB0XzEwODAgOiB0aGlzLmV4cGFuZCh0XzEwODApKX0pO1xuICB9XG4gIGV4cGFuZEltcG9ydCh0ZXJtXzEwODEpIHtcbiAgICByZXR1cm4gdGVybV8xMDgxO1xuICB9XG4gIGV4cGFuZEltcG9ydE5hbWVzcGFjZSh0ZXJtXzEwODIpIHtcbiAgICByZXR1cm4gdGVybV8xMDgyO1xuICB9XG4gIGV4cGFuZEV4cG9ydCh0ZXJtXzEwODMpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnRcIiwge2RlY2xhcmF0aW9uOiB0aGlzLmV4cGFuZCh0ZXJtXzEwODMuZGVjbGFyYXRpb24pfSk7XG4gIH1cbiAgZXhwYW5kRXhwb3J0RGVmYXVsdCh0ZXJtXzEwODQpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJFeHBvcnREZWZhdWx0XCIsIHtib2R5OiB0aGlzLmV4cGFuZCh0ZXJtXzEwODQuYm9keSl9KTtcbiAgfVxuICBleHBhbmRFeHBvcnRGcm9tKHRlcm1fMTA4NSkge1xuICAgIHJldHVybiB0ZXJtXzEwODU7XG4gIH1cbiAgZXhwYW5kRXhwb3J0QWxsRnJvbSh0ZXJtXzEwODYpIHtcbiAgICByZXR1cm4gdGVybV8xMDg2O1xuICB9XG4gIGV4cGFuZEV4cG9ydFNwZWNpZmllcih0ZXJtXzEwODcpIHtcbiAgICByZXR1cm4gdGVybV8xMDg3O1xuICB9XG4gIGV4cGFuZFN0YXRpY1Byb3BlcnR5TmFtZSh0ZXJtXzEwODgpIHtcbiAgICByZXR1cm4gdGVybV8xMDg4O1xuICB9XG4gIGV4cGFuZERhdGFQcm9wZXJ0eSh0ZXJtXzEwODkpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge25hbWU6IHRoaXMuZXhwYW5kKHRlcm1fMTA4OS5uYW1lKSwgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMDg5LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kT2JqZWN0RXhwcmVzc2lvbih0ZXJtXzEwOTApIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJPYmplY3RFeHByZXNzaW9uXCIsIHtwcm9wZXJ0aWVzOiB0ZXJtXzEwOTAucHJvcGVydGllcy5tYXAodF8xMDkxID0+IHRoaXMuZXhwYW5kKHRfMTA5MSkpfSk7XG4gIH1cbiAgZXhwYW5kVmFyaWFibGVEZWNsYXJhdG9yKHRlcm1fMTA5Mikge1xuICAgIGxldCBpbml0XzEwOTMgPSB0ZXJtXzEwOTIuaW5pdCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm1fMTA5Mi5pbml0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0b3JcIiwge2JpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTA5Mi5iaW5kaW5nKSwgaW5pdDogaW5pdF8xMDkzfSk7XG4gIH1cbiAgZXhwYW5kVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtXzEwOTQpIHtcbiAgICBpZiAodGVybV8xMDk0LmtpbmQgPT09IFwic3ludGF4XCIgfHwgdGVybV8xMDk0LmtpbmQgPT09IFwic3ludGF4cmVjXCIpIHtcbiAgICAgIHJldHVybiB0ZXJtXzEwOTQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybShcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiwge2tpbmQ6IHRlcm1fMTA5NC5raW5kLCBkZWNsYXJhdG9yczogdGVybV8xMDk0LmRlY2xhcmF0b3JzLm1hcChkXzEwOTUgPT4gdGhpcy5leHBhbmQoZF8xMDk1KSl9KTtcbiAgfVxuICBleHBhbmRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbih0ZXJtXzEwOTYpIHtcbiAgICBpZiAodGVybV8xMDk2LmlubmVyLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0XCIpO1xuICAgIH1cbiAgICBsZXQgZW5mXzEwOTcgPSBuZXcgRW5mb3Jlc3Rlcih0ZXJtXzEwOTYuaW5uZXIsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgbG9va2FoZWFkXzEwOTggPSBlbmZfMTA5Ny5wZWVrKCk7XG4gICAgbGV0IHRfMTA5OSA9IGVuZl8xMDk3LmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGlmICh0XzEwOTkgPT0gbnVsbCB8fCBlbmZfMTA5Ny5yZXN0LnNpemUgPiAwKSB7XG4gICAgICB0aHJvdyBlbmZfMTA5Ny5jcmVhdGVFcnJvcihsb29rYWhlYWRfMTA5OCwgXCJ1bmV4cGVjdGVkIHN5bnRheFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kKHRfMTA5OSk7XG4gIH1cbiAgZXhwYW5kVW5hcnlFeHByZXNzaW9uKHRlcm1fMTEwMCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlVuYXJ5RXhwcmVzc2lvblwiLCB7b3BlcmF0b3I6IHRlcm1fMTEwMC5vcGVyYXRvciwgb3BlcmFuZDogdGhpcy5leHBhbmQodGVybV8xMTAwLm9wZXJhbmQpfSk7XG4gIH1cbiAgZXhwYW5kVXBkYXRlRXhwcmVzc2lvbih0ZXJtXzExMDEpIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJVcGRhdGVFeHByZXNzaW9uXCIsIHtpc1ByZWZpeDogdGVybV8xMTAxLmlzUHJlZml4LCBvcGVyYXRvcjogdGVybV8xMTAxLm9wZXJhdG9yLCBvcGVyYW5kOiB0aGlzLmV4cGFuZCh0ZXJtXzExMDEub3BlcmFuZCl9KTtcbiAgfVxuICBleHBhbmRCaW5hcnlFeHByZXNzaW9uKHRlcm1fMTEwMikge1xuICAgIGxldCBsZWZ0XzExMDMgPSB0aGlzLmV4cGFuZCh0ZXJtXzExMDIubGVmdCk7XG4gICAgbGV0IHJpZ2h0XzExMDQgPSB0aGlzLmV4cGFuZCh0ZXJtXzExMDIucmlnaHQpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkJpbmFyeUV4cHJlc3Npb25cIiwge2xlZnQ6IGxlZnRfMTEwMywgb3BlcmF0b3I6IHRlcm1fMTEwMi5vcGVyYXRvciwgcmlnaHQ6IHJpZ2h0XzExMDR9KTtcbiAgfVxuICBleHBhbmRDb25kaXRpb25hbEV4cHJlc3Npb24odGVybV8xMTA1KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsIHt0ZXN0OiB0aGlzLmV4cGFuZCh0ZXJtXzExMDUudGVzdCksIGNvbnNlcXVlbnQ6IHRoaXMuZXhwYW5kKHRlcm1fMTEwNS5jb25zZXF1ZW50KSwgYWx0ZXJuYXRlOiB0aGlzLmV4cGFuZCh0ZXJtXzExMDUuYWx0ZXJuYXRlKX0pO1xuICB9XG4gIGV4cGFuZE5ld1RhcmdldEV4cHJlc3Npb24odGVybV8xMTA2KSB7XG4gICAgcmV0dXJuIHRlcm1fMTEwNjtcbiAgfVxuICBleHBhbmROZXdFeHByZXNzaW9uKHRlcm1fMTEwNykge1xuICAgIGxldCBjYWxsZWVfMTEwOCA9IHRoaXMuZXhwYW5kKHRlcm1fMTEwNy5jYWxsZWUpO1xuICAgIGxldCBlbmZfMTEwOSA9IG5ldyBFbmZvcmVzdGVyKHRlcm1fMTEwNy5hcmd1bWVudHMsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYXJnc18xMTEwID0gZW5mXzExMDkuZW5mb3Jlc3RBcmd1bWVudExpc3QoKS5tYXAoYXJnXzExMTEgPT4gdGhpcy5leHBhbmQoYXJnXzExMTEpKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJOZXdFeHByZXNzaW9uXCIsIHtjYWxsZWU6IGNhbGxlZV8xMTA4LCBhcmd1bWVudHM6IGFyZ3NfMTExMC50b0FycmF5KCl9KTtcbiAgfVxuICBleHBhbmRTdXBlcih0ZXJtXzExMTIpIHtcbiAgICByZXR1cm4gdGVybV8xMTEyO1xuICB9XG4gIGV4cGFuZENhbGxFeHByZXNzaW9uKHRlcm1fMTExMykge1xuICAgIGxldCBjYWxsZWVfMTExNCA9IHRoaXMuZXhwYW5kKHRlcm1fMTExMy5jYWxsZWUpO1xuICAgIGxldCBlbmZfMTExNSA9IG5ldyBFbmZvcmVzdGVyKHRlcm1fMTExMy5hcmd1bWVudHMsIExpc3QoKSwgdGhpcy5jb250ZXh0KTtcbiAgICBsZXQgYXJnc18xMTE2ID0gZW5mXzExMTUuZW5mb3Jlc3RBcmd1bWVudExpc3QoKS5tYXAoYXJnXzExMTcgPT4gdGhpcy5leHBhbmQoYXJnXzExMTcpKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJDYWxsRXhwcmVzc2lvblwiLCB7Y2FsbGVlOiBjYWxsZWVfMTExNCwgYXJndW1lbnRzOiBhcmdzXzExMTZ9KTtcbiAgfVxuICBleHBhbmRTcHJlYWRFbGVtZW50KHRlcm1fMTExOCkge1xuICAgIHJldHVybiBuZXcgVGVybShcIlNwcmVhZEVsZW1lbnRcIiwge2V4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm1fMTExOC5leHByZXNzaW9uKX0pO1xuICB9XG4gIGV4cGFuZEV4cHJlc3Npb25TdGF0ZW1lbnQodGVybV8xMTE5KSB7XG4gICAgbGV0IGNoaWxkXzExMjAgPSB0aGlzLmV4cGFuZCh0ZXJtXzExMTkuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCB7ZXhwcmVzc2lvbjogY2hpbGRfMTEyMH0pO1xuICB9XG4gIGV4cGFuZExhYmVsZWRTdGF0ZW1lbnQodGVybV8xMTIxKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiTGFiZWxlZFN0YXRlbWVudFwiLCB7bGFiZWw6IHRlcm1fMTEyMS5sYWJlbC52YWwoKSwgYm9keTogdGhpcy5leHBhbmQodGVybV8xMTIxLmJvZHkpfSk7XG4gIH1cbiAgZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtXzExMjIsIHR5cGVfMTEyMykge1xuICAgIGxldCBzY29wZV8xMTI0ID0gZnJlc2hTY29wZShcImZ1blwiKTtcbiAgICBsZXQgcmVkXzExMjUgPSBuZXcgQXBwbHlTY29wZUluUGFyYW1zUmVkdWNlcihzY29wZV8xMTI0LCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBwYXJhbXNfMTEyNjtcbiAgICBpZiAodHlwZV8xMTIzICE9PSBcIkdldHRlclwiICYmIHR5cGVfMTEyMyAhPT0gXCJTZXR0ZXJcIikge1xuICAgICAgcGFyYW1zXzExMjYgPSByZWRfMTEyNS50cmFuc2Zvcm0odGVybV8xMTIyLnBhcmFtcyk7XG4gICAgICBwYXJhbXNfMTEyNiA9IHRoaXMuZXhwYW5kKHBhcmFtc18xMTI2KTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZS5wdXNoKHNjb3BlXzExMjQpO1xuICAgIGxldCBjb21waWxlcl8xMTI3ID0gbmV3IENvbXBpbGVyKHRoaXMuY29udGV4dC5waGFzZSwgdGhpcy5jb250ZXh0LmVudiwgdGhpcy5jb250ZXh0LnN0b3JlLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBtYXJrZWRCb2R5XzExMjgsIGJvZHlUZXJtXzExMjk7XG4gICAgaWYgKHRlcm1fMTEyMi5ib2R5IGluc3RhbmNlb2YgVGVybSkge1xuICAgICAgYm9keVRlcm1fMTEyOSA9IHRoaXMuZXhwYW5kKHRlcm1fMTEyMi5ib2R5LmFkZFNjb3BlKHNjb3BlXzExMjQsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrZWRCb2R5XzExMjggPSB0ZXJtXzExMjIuYm9keS5tYXAoYl8xMTMwID0+IGJfMTEzMC5hZGRTY29wZShzY29wZV8xMTI0LCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpKTtcbiAgICAgIGJvZHlUZXJtXzExMjkgPSBuZXcgVGVybShcIkZ1bmN0aW9uQm9keVwiLCB7ZGlyZWN0aXZlczogTGlzdCgpLCBzdGF0ZW1lbnRzOiBjb21waWxlcl8xMTI3LmNvbXBpbGUobWFya2VkQm9keV8xMTI4KX0pO1xuICAgIH1cbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnBvcCgpO1xuICAgIGlmICh0eXBlXzExMjMgPT09IFwiR2V0dGVyXCIpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlXzExMjMsIHtuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtXzExMjIubmFtZSksIGJvZHk6IGJvZHlUZXJtXzExMjl9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVfMTEyMyA9PT0gXCJTZXR0ZXJcIikge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKHR5cGVfMTEyMywge25hbWU6IHRoaXMuZXhwYW5kKHRlcm1fMTEyMi5uYW1lKSwgcGFyYW06IHRlcm1fMTEyMi5wYXJhbSwgYm9keTogYm9keVRlcm1fMTEyOX0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odHlwZV8xMTIzLCB7bmFtZTogdGVybV8xMTIyLm5hbWUsIGlzR2VuZXJhdG9yOiB0ZXJtXzExMjIuaXNHZW5lcmF0b3IsIHBhcmFtczogcGFyYW1zXzExMjYsIGJvZHk6IGJvZHlUZXJtXzExMjl9KTtcbiAgfVxuICBleHBhbmRNZXRob2QodGVybV8xMTMxKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtXzExMzEsIFwiTWV0aG9kXCIpO1xuICB9XG4gIGV4cGFuZFNldHRlcih0ZXJtXzExMzIpIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm1fMTEzMiwgXCJTZXR0ZXJcIik7XG4gIH1cbiAgZXhwYW5kR2V0dGVyKHRlcm1fMTEzMykge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybV8xMTMzLCBcIkdldHRlclwiKTtcbiAgfVxuICBleHBhbmRGdW5jdGlvbkRlY2xhcmF0aW9uKHRlcm1fMTEzNCkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybV8xMTM0LCBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIik7XG4gIH1cbiAgZXhwYW5kRnVuY3Rpb25FeHByZXNzaW9uKHRlcm1fMTEzNSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybV8xMTM1LCBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKTtcbiAgfVxuICBleHBhbmRDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uKHRlcm1fMTEzNikge1xuICAgIHJldHVybiBuZXcgVGVybShcIkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb25cIiwge2JpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTEzNi5iaW5kaW5nKSwgb3BlcmF0b3I6IHRlcm1fMTEzNi5vcGVyYXRvciwgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMTM2LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kQXNzaWdubWVudEV4cHJlc3Npb24odGVybV8xMTM3KSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiwge2JpbmRpbmc6IHRoaXMuZXhwYW5kKHRlcm1fMTEzNy5iaW5kaW5nKSwgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybV8xMTM3LmV4cHJlc3Npb24pfSk7XG4gIH1cbiAgZXhwYW5kRW1wdHlTdGF0ZW1lbnQodGVybV8xMTM4KSB7XG4gICAgcmV0dXJuIHRlcm1fMTEzODtcbiAgfVxuICBleHBhbmRMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb24odGVybV8xMTM5KSB7XG4gICAgcmV0dXJuIHRlcm1fMTEzOTtcbiAgfVxuICBleHBhbmRMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24odGVybV8xMTQwKSB7XG4gICAgcmV0dXJuIHRlcm1fMTE0MDtcbiAgfVxuICBleHBhbmRMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uKHRlcm1fMTE0MSkge1xuICAgIHJldHVybiB0ZXJtXzExNDE7XG4gIH1cbiAgZXhwYW5kSWRlbnRpZmllckV4cHJlc3Npb24odGVybV8xMTQyKSB7XG4gICAgbGV0IHRyYW5zXzExNDMgPSB0aGlzLmNvbnRleHQuZW52LmdldCh0ZXJtXzExNDIubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkpO1xuICAgIGlmICh0cmFuc18xMTQzKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0oXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiLCB7bmFtZTogdHJhbnNfMTE0My5pZH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVybV8xMTQyO1xuICB9XG4gIGV4cGFuZExpdGVyYWxOdWxsRXhwcmVzc2lvbih0ZXJtXzExNDQpIHtcbiAgICByZXR1cm4gdGVybV8xMTQ0O1xuICB9XG4gIGV4cGFuZExpdGVyYWxTdHJpbmdFeHByZXNzaW9uKHRlcm1fMTE0NSkge1xuICAgIHJldHVybiB0ZXJtXzExNDU7XG4gIH1cbiAgZXhwYW5kTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb24odGVybV8xMTQ2KSB7XG4gICAgcmV0dXJuIHRlcm1fMTE0NjtcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXJtLWV4cGFuZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVlLE1BQU0sWUFBTixpQ0FBeUM7QUFDdEQsY0FBWSxPQUFaLEVBQXFCO0FBQ25CLFVBQU0sUUFBTixFQUFnQixJQUFoQjtBQUNBLFNBQUssT0FBTCxHQUFlLE9BQWY7QUFDRDs7QUFFRCxTQUFPLElBQVAsRUFBYTtBQUNYLFdBQU8sS0FBSyxRQUFMLENBQWMsSUFBZCxDQUFQO0FBQ0Q7O0FBRUQsZUFBYSxJQUFiLEVBQW1CO0FBQ2pCLFdBQU8sSUFBUDtBQUNEOztBQUVELDJCQUF5QixJQUF6QixFQUErQjtBQUM3QixXQUFPLG9CQUFTLG9CQUFULEVBQStCO0FBQ3BDLFdBQUssS0FBSyxHQUFMLElBQVksSUFBWixHQUFtQixJQUFuQixHQUEwQixLQUFLLE1BQUwsQ0FBWSxLQUFLLEdBQWpCLENBREs7QUFFcEMsZ0JBQVUsS0FBSyxRQUFMLENBQWMsT0FBZDtBQUYwQixLQUEvQixDQUFQO0FBSUQ7O0FBRUQsdUJBQXFCLElBQXJCLEVBQTJCO0FBQ3pCLFdBQU8sb0JBQVMsZ0JBQVQsRUFBMkI7QUFDaEMsYUFBTyxLQUFLLEtBQUwsR0FBYSxLQUFLLEtBQUwsQ0FBVyxHQUFYLEVBQWIsR0FBZ0M7QUFEUCxLQUEzQixDQUFQO0FBR0Q7O0FBRUQseUJBQXVCLElBQXZCLEVBQTZCO0FBQzNCLFdBQU8sb0JBQVMsa0JBQVQsRUFBNkI7QUFDbEMsWUFBTSxLQUFLLE1BQUwsQ0FBWSxLQUFLLElBQWpCLENBRDRCO0FBRWxDLFlBQU0sS0FBSyxNQUFMLENBQVksS0FBSyxJQUFqQjtBQUY0QixLQUE3QixDQUFQO0FBSUQ7O0FBRUQsc0JBQW9CLElBQXBCLEVBQTBCO0FBQ3hCLFdBQU8sb0JBQVMsZUFBVCxFQUEwQjtBQUMvQixZQUFN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RUQsNkJBQTJCLElBQTNCLEVBQWlDO0FBQy9CLFdBQU8sb0JBQVMsc0JBQVQsRUFBaUM7QUFDdEMsZUFBUyxLQUFLLE1BQUwsQ0FBWSxLQUFLLE9BQWpCLENBRDZCO0FBRXRDLGtCQUFZLEtBQUssTUFBTCxDQUFZLEtBQUssVUFBakI7QUFGMEIsS0FBakMsQ0FBUDtBQUlEOztBQUVELHVCQUFxQixJQUFyQixFQUEyQjtBQUN6QixXQUFPLElBQVA7QUFDRDs7QUFFRCxpQ0FBK0IsSUFBL0IsRUFBcUM7QUFDbkMsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsaUNBQStCLElBQS9CLEVBQXFDO0FBQ25DLFdBQU8sSUFBUDtBQUNEO0FBQ0Qsa0NBQWdDLElBQWhDLEVBQXNDO0FBQ3BDLFdBQU8sSUFBUDtBQUNEOztBQUVELDZCQUEyQixJQUEzQixFQUFpQztBQUMvQixRQUFJLFFBQVEsS0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixLQUFLLElBQUwsQ0FBVSxPQUFWLENBQWtCLEtBQUssT0FBTCxDQUFhLEtBQS9CLENBQXJCLENBQVo7QUFDQSxRQUFJLEtBQUosRUFBVztBQUNULGFBQU8sb0JBQVMsc0JBQVQsRUFBaUM7QUFDdEMsY0FBTSxNQUFNO0FBRDBCLE9BQWpDLENBQVA7QUFHRDtBQUNELFdBQU8sSUFBUDtBQUNEOztBQUVELDhCQUE0QixJQUE1QixFQUFrQztBQUNoQyxXQUFPLElBQVA7QUFDRDs7QUFFRCxnQ0FBOEIsSUFBOUIsRUFBb0M7QUFDbEMsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsZ0NBQThCLElBQTlCLEVBQW9DO0FBQ2xDLFdBQU8sSUFBUDtBQUNEO0FBMW1CcUQ7a0JBQW5DLFkiLCJmaWxlIjoidGVybS1leHBhbmRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpc3QgfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IFRlcm0gZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IGZyZXNoU2NvcGUgfSBmcm9tIFwiLi9zY29wZVwiO1xuaW1wb3J0IEFwcGx5U2NvcGVJblBhcmFtc1JlZHVjZXIgZnJvbSBcIi4vYXBwbHktc2NvcGUtaW4tcGFyYW1zLXJlZHVjZXJcIjtcbmltcG9ydCBDb21waWxlciBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCBTeW50YXgsIHsgQUxMX1BIQVNFUyB9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHsgc2VyaWFsaXplciB9IGZyb20gXCIuL3NlcmlhbGl6ZXJcIjtcbmltcG9ydCB7IEVuZm9yZXN0ZXIgfSBmcm9tIFwiLi9lbmZvcmVzdGVyXCI7XG5pbXBvcnQgeyBwcm9jZXNzVGVtcGxhdGUgfSBmcm9tICcuL3RlbXBsYXRlLXByb2Nlc3Nvci5qcyc7XG5pbXBvcnQgQVNURGlzcGF0Y2hlciBmcm9tICcuL2FzdC1kaXNwYXRjaGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVybUV4cGFuZGVyIGV4dGVuZHMgQVNURGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcbiAgICBzdXBlcignZXhwYW5kJywgdHJ1ZSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIGV4cGFuZCh0ZXJtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2godGVybSk7XG4gIH1cblxuICBleHBhbmRQcmFnbWEodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kVGVtcGxhdGVFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1RlbXBsYXRlRXhwcmVzc2lvbicsIHtcbiAgICAgIHRhZzogdGVybS50YWcgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmV4cGFuZCh0ZXJtLnRhZyksXG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEJyZWFrU3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0JyZWFrU3RhdGVtZW50Jywge1xuICAgICAgbGFiZWw6IHRlcm0ubGFiZWwgPyB0ZXJtLmxhYmVsLnZhbCgpIDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRG9XaGlsZVN0YXRlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdEb1doaWxlU3RhdGVtZW50Jywge1xuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KSxcbiAgICAgIHRlc3Q6IHRoaXMuZXhwYW5kKHRlcm0udGVzdClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFdpdGhTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnV2l0aFN0YXRlbWVudCcsIHtcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSksXG4gICAgICBvYmplY3Q6IHRoaXMuZXhwYW5kKHRlcm0ub2JqZWN0KVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRGVidWdnZXJTdGF0ZW1lbnQodGVybSkgeyByZXR1cm4gdGVybTt9XG5cbiAgZXhwYW5kQ29udGludWVTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ29udGludWVTdGF0ZW1lbnQnLCB7XG4gICAgICBsYWJlbDogdGVybS5sYWJlbCA/IHRlcm0ubGFiZWwudmFsKCkgOiBudWxsXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCcsIHtcbiAgICAgIGRpc2NyaW1pbmFudDogdGhpcy5leHBhbmQodGVybS5kaXNjcmltaW5hbnQpLFxuICAgICAgcHJlRGVmYXVsdENhc2VzOiB0ZXJtLnByZURlZmF1bHRDYXNlcy5tYXAoYyA9PiB0aGlzLmV4cGFuZChjKSkudG9BcnJheSgpLFxuICAgICAgZGVmYXVsdENhc2U6IHRoaXMuZXhwYW5kKHRlcm0uZGVmYXVsdENhc2UpLFxuICAgICAgcG9zdERlZmF1bHRDYXNlczogdGVybS5wb3N0RGVmYXVsdENhc2VzLm1hcChjID0+IHRoaXMuZXhwYW5kKGMpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDb21wdXRlZE1lbWJlckV4cHJlc3Npb24nLCB7XG4gICAgICBvYmplY3Q6IHRoaXMuZXhwYW5kKHRlcm0ub2JqZWN0KSxcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFN3aXRjaFN0YXRlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hTdGF0ZW1lbnQnLCB7XG4gICAgICBkaXNjcmltaW5hbnQ6IHRoaXMuZXhwYW5kKHRlcm0uZGlzY3JpbWluYW50KSxcbiAgICAgIGNhc2VzOiB0ZXJtLmNhc2VzLm1hcChjID0+IHRoaXMuZXhwYW5kKGMpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEZvcm1hbFBhcmFtZXRlcnModGVybSkge1xuICAgIGxldCByZXN0ID0gdGVybS5yZXN0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5yZXN0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0Zvcm1hbFBhcmFtZXRlcnMnLCB7XG4gICAgICBpdGVtczogdGVybS5pdGVtcy5tYXAoaSA9PiB0aGlzLmV4cGFuZChpKSksXG4gICAgICByZXN0XG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBcnJvd0V4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybSwgJ0Fycm93RXhwcmVzc2lvbicpO1xuICB9XG5cbiAgZXhwYW5kU3dpdGNoRGVmYXVsdCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdTd2l0Y2hEZWZhdWx0Jywge1xuICAgICAgY29uc2VxdWVudDogdGVybS5jb25zZXF1ZW50Lm1hcChjID0+IHRoaXMuZXhwYW5kKGMpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFN3aXRjaENhc2UodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnU3dpdGNoQ2FzZScsIHtcbiAgICAgIHRlc3Q6IHRoaXMuZXhwYW5kKHRlcm0udGVzdCksXG4gICAgICBjb25zZXF1ZW50OiB0ZXJtLmNvbnNlcXVlbnQubWFwKGMgPT4gdGhpcy5leHBhbmQoYykpLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRm9ySW5TdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRm9ySW5TdGF0ZW1lbnQnLCB7XG4gICAgICBsZWZ0OiB0aGlzLmV4cGFuZCh0ZXJtLmxlZnQpLFxuICAgICAgcmlnaHQ6IHRoaXMuZXhwYW5kKHRlcm0ucmlnaHQpLFxuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kVHJ5Q2F0Y2hTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVHJ5Q2F0Y2hTdGF0ZW1lbnQnLCB7XG4gICAgICBib2R5OiB0aGlzLmV4cGFuZCh0ZXJtLmJvZHkpLFxuICAgICAgY2F0Y2hDbGF1c2U6IHRoaXMuZXhwYW5kKHRlcm0uY2F0Y2hDbGF1c2UpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRUcnlGaW5hbGx5U3RhdGVtZW50KHRlcm0pIHtcbiAgICBsZXQgY2F0Y2hDbGF1c2UgPSB0ZXJtLmNhdGNoQ2xhdXNlID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5jYXRjaENsYXVzZSk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdUcnlGaW5hbGx5U3RhdGVtZW50Jywge1xuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KSxcbiAgICAgIGNhdGNoQ2xhdXNlLFxuICAgICAgZmluYWxpemVyOiB0aGlzLmV4cGFuZCh0ZXJtLmZpbmFsaXplcilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENhdGNoQ2xhdXNlKHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0NhdGNoQ2xhdXNlJywge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSlcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFRocm93U3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1Rocm93U3RhdGVtZW50Jywge1xuICAgICAgZXhwcmVzc2lvbjogdGhpcy5leHBhbmQodGVybS5leHByZXNzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kRm9yT2ZTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRm9yT2ZTdGF0ZW1lbnQnLCB7XG4gICAgICBsZWZ0OiB0aGlzLmV4cGFuZCh0ZXJtLmxlZnQpLFxuICAgICAgcmlnaHQ6IHRoaXMuZXhwYW5kKHRlcm0ucmlnaHQpLFxuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQmluZGluZ0lkZW50aWZpZXIodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllcih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cbiAgZXhwYW5kQmluZGluZ1Byb3BlcnR5UHJvcGVydHkodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1Byb3BlcnR5UHJvcGVydHknLCB7XG4gICAgICBuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtLm5hbWUpLFxuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQ29tcHV0ZWRQcm9wZXJ0eU5hbWUodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ29tcHV0ZWRQcm9wZXJ0eU5hbWUnLCB7XG4gICAgICBleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRPYmplY3RCaW5kaW5nKHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ09iamVjdEJpbmRpbmcnLCB7XG4gICAgICBwcm9wZXJ0aWVzOiB0ZXJtLnByb3BlcnRpZXMubWFwKHQgPT4gdGhpcy5leHBhbmQodCkpLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQXJyYXlCaW5kaW5nKHRlcm0pIHtcbiAgICBsZXQgcmVzdEVsZW1lbnQgPSB0ZXJtLnJlc3RFbGVtZW50ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5yZXN0RWxlbWVudCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdBcnJheUJpbmRpbmcnLCB7XG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5tYXAodCA9PiB0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodCkpLnRvQXJyYXkoKSxcbiAgICAgIHJlc3RFbGVtZW50XG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRCaW5kaW5nV2l0aERlZmF1bHQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQmluZGluZ1dpdGhEZWZhdWx0Jywge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGluaXQ6IHRoaXMuZXhwYW5kKHRlcm0uaW5pdClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFNob3J0aGFuZFByb3BlcnR5KHRlcm0pIHtcbiAgICAvLyBiZWNhdXNlIGh5Z2llbmUsIHNob3J0aGFuZCBwcm9wZXJ0aWVzIG11c3QgdHVybiBpbnRvIERhdGFQcm9wZXJ0aWVzXG4gICAgcmV0dXJuIG5ldyBUZXJtKCdEYXRhUHJvcGVydHknLCB7XG4gICAgICBuYW1lOiBuZXcgVGVybSgnU3RhdGljUHJvcGVydHlOYW1lJywge1xuICAgICAgICB2YWx1ZTogdGVybS5uYW1lXG4gICAgICB9KSxcbiAgICAgIGV4cHJlc3Npb246IG5ldyBUZXJtKCdJZGVudGlmaWVyRXhwcmVzc2lvbicsIHtcbiAgICAgICAgbmFtZTogdGVybS5uYW1lXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cblxuICBleHBhbmRGb3JTdGF0ZW1lbnQodGVybSkge1xuICAgIGxldCBpbml0ID0gdGVybS5pbml0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5pbml0KTtcbiAgICBsZXQgdGVzdCA9IHRlcm0udGVzdCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0udGVzdCk7XG4gICAgbGV0IHVwZGF0ZSA9IHRlcm0udXBkYXRlID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS51cGRhdGUpO1xuICAgIGxldCBib2R5ID0gdGhpcy5leHBhbmQodGVybS5ib2R5KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ0ZvclN0YXRlbWVudCcsIHsgaW5pdCwgdGVzdCwgdXBkYXRlLCBib2R5IH0pO1xuICB9XG5cbiAgZXhwYW5kWWllbGRFeHByZXNzaW9uKHRlcm0pIHtcbiAgICBsZXQgZXhwciA9IHRlcm0uZXhwcmVzc2lvbiA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdZaWVsZEV4cHJlc3Npb24nLCB7XG4gICAgICBleHByZXNzaW9uOiBleHByXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRZaWVsZEdlbmVyYXRvckV4cHJlc3Npb24odGVybSkge1xuICAgIGxldCBleHByID0gdGVybS5leHByZXNzaW9uID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5leHByZXNzaW9uKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1lpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbicsIHtcbiAgICAgIGV4cHJlc3Npb246IGV4cHJcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFdoaWxlU3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1doaWxlU3RhdGVtZW50Jywge1xuICAgICAgdGVzdDogdGhpcy5leHBhbmQodGVybS50ZXN0KSxcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSlcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZElmU3RhdGVtZW50KHRlcm0pIHtcbiAgICBsZXQgY29uc2VxdWVudCA9IHRlcm0uY29uc2VxdWVudCA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0uY29uc2VxdWVudCk7XG4gICAgbGV0IGFsdGVybmF0ZSA9IHRlcm0uYWx0ZXJuYXRlID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5hbHRlcm5hdGUpO1xuICAgIHJldHVybiBuZXcgVGVybSgnSWZTdGF0ZW1lbnQnLCB7XG4gICAgICB0ZXN0OiB0aGlzLmV4cGFuZCh0ZXJtLnRlc3QpLFxuICAgICAgY29uc2VxdWVudDogY29uc2VxdWVudCxcbiAgICAgIGFsdGVybmF0ZTogYWx0ZXJuYXRlXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRCbG9ja1N0YXRlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdCbG9ja1N0YXRlbWVudCcsIHtcbiAgICAgIGJsb2NrOiB0aGlzLmV4cGFuZCh0ZXJtLmJsb2NrKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kQmxvY2sodGVybSkge1xuICAgIGxldCBzY29wZSA9IGZyZXNoU2NvcGUoJ2Jsb2NrJyk7XG4gICAgdGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZS5wdXNoKHNjb3BlKTtcbiAgICBsZXQgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIodGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuZW52LCB0aGlzLmNvbnRleHQuc3RvcmUsIHRoaXMuY29udGV4dCk7XG5cbiAgICBsZXQgbWFya2VkQm9keSwgYm9keVRlcm07XG4gICAgbWFya2VkQm9keSA9IHRlcm0uc3RhdGVtZW50cy5tYXAoYiA9PiBiLmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpKTtcbiAgICBib2R5VGVybSA9IG5ldyBUZXJtKCdCbG9jaycsIHtcbiAgICAgIHN0YXRlbWVudHM6IGNvbXBpbGVyLmNvbXBpbGUobWFya2VkQm9keSlcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLnBvcCgpO1xuICAgIHJldHVybiBib2R5VGVybTtcbiAgfVxuXG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCcsIHtcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmRlY2xhcmF0aW9uKVxuICAgIH0pO1xuICB9XG4gIGV4cGFuZFJldHVyblN0YXRlbWVudCh0ZXJtKSB7XG4gICAgaWYgKHRlcm0uZXhwcmVzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiUmV0dXJuU3RhdGVtZW50XCIsIHtcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENsYXNzRGVjbGFyYXRpb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ2xhc3NEZWNsYXJhdGlvbicsIHtcbiAgICAgIG5hbWU6IHRlcm0ubmFtZSA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0ubmFtZSksXG4gICAgICBzdXBlcjogdGVybS5zdXBlciA9PSBudWxsID8gbnVsbCA6IHRoaXMuZXhwYW5kKHRlcm0uc3VwZXIpLFxuICAgICAgZWxlbWVudHM6IHRlcm0uZWxlbWVudHMubWFwKGVsID0+IHRoaXMuZXhwYW5kKGVsKSkudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRDbGFzc0V4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnQ2xhc3NFeHByZXNzaW9uJywge1xuICAgICAgbmFtZTogdGVybS5uYW1lID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5uYW1lKSxcbiAgICAgIHN1cGVyOiB0ZXJtLnN1cGVyID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5zdXBlciksXG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5tYXAoZWwgPT4gdGhpcy5leHBhbmQoZWwpKS50b0FycmF5KClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENsYXNzRWxlbWVudCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDbGFzc0VsZW1lbnQnLCB7XG4gICAgICBpc1N0YXRpYzogdGVybS5pc1N0YXRpYyxcbiAgICAgIG1ldGhvZDogdGhpcy5leHBhbmQodGVybS5tZXRob2QpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRUaGlzRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRTeW50YXhUZW1wbGF0ZSh0ZXJtKSB7XG4gICAgbGV0IHIgPSBwcm9jZXNzVGVtcGxhdGUodGVybS50ZW1wbGF0ZS5pbm5lcigpKTtcbiAgICBsZXQgc3RyID0gU3ludGF4LmZyb20oXCJzdHJpbmdcIiwgc2VyaWFsaXplci53cml0ZShyLnRlbXBsYXRlKSk7XG4gICAgbGV0IGNhbGxlZSA9IG5ldyBUZXJtKCdJZGVudGlmaWVyRXhwcmVzc2lvbicsIHsgbmFtZTogU3ludGF4LmZyb20oXCJpZGVudGlmaWVyXCIsICdzeW50YXhUZW1wbGF0ZScpIH0pO1xuXG4gICAgbGV0IGV4cGFuZGVkSW50ZXJwcyA9IHIuaW50ZXJwLm1hcChpID0+IHtcbiAgICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihpLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgICByZXR1cm4gdGhpcy5leHBhbmQoZW5mLmVuZm9yZXN0KCdleHByZXNzaW9uJykpO1xuICAgIH0pO1xuXG4gICAgbGV0IGFyZ3MgPSBMaXN0Lm9mKG5ldyBUZXJtKCdMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbicsIHt2YWx1ZTogc3RyIH0pKVxuICAgICAgICAgICAgICAgICAgIC5jb25jYXQoZXhwYW5kZWRJbnRlcnBzKTtcblxuICAgIHJldHVybiBuZXcgVGVybSgnQ2FsbEV4cHJlc3Npb24nLCB7XG4gICAgICBjYWxsZWUsIGFyZ3VtZW50czogYXJnc1xuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kU3ludGF4UXVvdGUodGVybSkge1xuICAgIGxldCBzdHIgPSBuZXcgVGVybShcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCIsIHtcbiAgICAgIHZhbHVlOiBTeW50YXguZnJvbShcInN0cmluZ1wiLCBzZXJpYWxpemVyLndyaXRlKHRlcm0ubmFtZSkpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiwge1xuICAgICAgdGFnOiB0ZXJtLnRlbXBsYXRlLnRhZyxcbiAgICAgIGVsZW1lbnRzOiB0ZXJtLnRlbXBsYXRlLmVsZW1lbnRzLnB1c2goc3RyKS5wdXNoKG5ldyBUZXJtKCdUZW1wbGF0ZUVsZW1lbnQnLCB7XG4gICAgICAgIHJhd1ZhbHVlOiAnJ1xuICAgICAgfSkpLnRvQXJyYXkoKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kU3RhdGljTWVtYmVyRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gICAgICBvYmplY3Q6IHRoaXMuZXhwYW5kKHRlcm0ub2JqZWN0KSxcbiAgICAgIHByb3BlcnR5OiB0ZXJtLnByb3BlcnR5XG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBcnJheUV4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybShcIkFycmF5RXhwcmVzc2lvblwiLCB7XG4gICAgICBlbGVtZW50czogdGVybS5lbGVtZW50cy5tYXAodCA9PiB0ID09IG51bGwgPyB0IDogdGhpcy5leHBhbmQodCkpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRJbXBvcnQodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kSW1wb3J0TmFtZXNwYWNlKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydCh0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdFeHBvcnQnLCB7XG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5leHBhbmQodGVybS5kZWNsYXJhdGlvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydERlZmF1bHQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnRXhwb3J0RGVmYXVsdCcsIHtcbiAgICAgIGJvZHk6IHRoaXMuZXhwYW5kKHRlcm0uYm9keSlcbiAgICB9KTtcbiAgfVxuXG5cbiAgZXhwYW5kRXhwb3J0RnJvbSh0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRFeHBvcnRBbGxGcm9tKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydFNwZWNpZmllcih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRTdGF0aWNQcm9wZXJ0eU5hbWUodGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kRGF0YVByb3BlcnR5KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJEYXRhUHJvcGVydHlcIiwge1xuICAgICAgbmFtZTogdGhpcy5leHBhbmQodGVybS5uYW1lKSxcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG5cbiAgZXhwYW5kT2JqZWN0RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7XG4gICAgICBwcm9wZXJ0aWVzOiB0ZXJtLnByb3BlcnRpZXMubWFwKHQgPT4gdGhpcy5leHBhbmQodCkpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRWYXJpYWJsZURlY2xhcmF0b3IodGVybSkge1xuICAgIGxldCBpbml0ID0gdGVybS5pbml0ID09IG51bGwgPyBudWxsIDogdGhpcy5leHBhbmQodGVybS5pbml0KTtcbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0b3JcIiwge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGluaXQ6IGluaXRcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb24odGVybSkge1xuICAgIGlmICh0ZXJtLmtpbmQgPT09ICdzeW50YXgnIHx8IHRlcm0ua2luZCA9PT0gJ3N5bnRheHJlYycpIHtcbiAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0oXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsIHtcbiAgICAgIGtpbmQ6IHRlcm0ua2luZCxcbiAgICAgIGRlY2xhcmF0b3JzOiB0ZXJtLmRlY2xhcmF0b3JzLm1hcChkID0+IHRoaXMuZXhwYW5kKGQpKVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kUGFyZW50aGVzaXplZEV4cHJlc3Npb24odGVybSkge1xuICAgIGlmICh0ZXJtLmlubmVyLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0XCIpO1xuICAgIH1cbiAgICBsZXQgZW5mID0gbmV3IEVuZm9yZXN0ZXIodGVybS5pbm5lciwgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBsb29rYWhlYWQgPSBlbmYucGVlaygpO1xuICAgIGxldCB0ID0gZW5mLmVuZm9yZXN0RXhwcmVzc2lvbigpO1xuICAgIGlmICh0ID09IG51bGwgfHwgZW5mLnJlc3Quc2l6ZSA+IDApIHtcbiAgICAgIHRocm93IGVuZi5jcmVhdGVFcnJvcihsb29rYWhlYWQsIFwidW5leHBlY3RlZCBzeW50YXhcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4cGFuZCh0KTtcbiAgfVxuXG4gIGV4cGFuZFVuYXJ5RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdVbmFyeUV4cHJlc3Npb24nLCB7XG4gICAgICBvcGVyYXRvcjogdGVybS5vcGVyYXRvcixcbiAgICAgIG9wZXJhbmQ6IHRoaXMuZXhwYW5kKHRlcm0ub3BlcmFuZClcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZFVwZGF0ZUV4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnVXBkYXRlRXhwcmVzc2lvbicsIHtcbiAgICAgIGlzUHJlZml4OiB0ZXJtLmlzUHJlZml4LFxuICAgICAgb3BlcmF0b3I6IHRlcm0ub3BlcmF0b3IsXG4gICAgICBvcGVyYW5kOiB0aGlzLmV4cGFuZCh0ZXJtLm9wZXJhbmQpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRCaW5hcnlFeHByZXNzaW9uKHRlcm0pIHtcbiAgICBsZXQgbGVmdCA9IHRoaXMuZXhwYW5kKHRlcm0ubGVmdCk7XG4gICAgbGV0IHJpZ2h0ID0gdGhpcy5leHBhbmQodGVybS5yaWdodCk7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQmluYXJ5RXhwcmVzc2lvblwiLCB7XG4gICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgb3BlcmF0b3I6IHRlcm0ub3BlcmF0b3IsXG4gICAgICByaWdodDogcmlnaHRcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZENvbmRpdGlvbmFsRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKCdDb25kaXRpb25hbEV4cHJlc3Npb24nLCB7XG4gICAgICB0ZXN0OiB0aGlzLmV4cGFuZCh0ZXJtLnRlc3QpLFxuICAgICAgY29uc2VxdWVudDogdGhpcy5leHBhbmQodGVybS5jb25zZXF1ZW50KSxcbiAgICAgIGFsdGVybmF0ZTogdGhpcy5leHBhbmQodGVybS5hbHRlcm5hdGUpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmROZXdUYXJnZXRFeHByZXNzaW9uKHRlcm0pIHsgcmV0dXJuIHRlcm07IH1cblxuICBleHBhbmROZXdFeHByZXNzaW9uKHRlcm0pIHtcbiAgICBsZXQgY2FsbGVlID0gdGhpcy5leHBhbmQodGVybS5jYWxsZWUpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3Rlcih0ZXJtLmFyZ3VtZW50cywgTGlzdCgpLCB0aGlzLmNvbnRleHQpO1xuICAgIGxldCBhcmdzID0gZW5mLmVuZm9yZXN0QXJndW1lbnRMaXN0KCkubWFwKGFyZyA9PiB0aGlzLmV4cGFuZChhcmcpKTtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ05ld0V4cHJlc3Npb24nLCB7XG4gICAgICBjYWxsZWUsXG4gICAgICBhcmd1bWVudHM6IGFyZ3MudG9BcnJheSgpXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRTdXBlcih0ZXJtKSB7IHJldHVybiB0ZXJtOyB9XG5cbiAgZXhwYW5kQ2FsbEV4cHJlc3Npb24odGVybSkge1xuICAgIGxldCBjYWxsZWUgPSB0aGlzLmV4cGFuZCh0ZXJtLmNhbGxlZSk7XG4gICAgbGV0IGVuZiA9IG5ldyBFbmZvcmVzdGVyKHRlcm0uYXJndW1lbnRzLCBMaXN0KCksIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IGFyZ3MgPSBlbmYuZW5mb3Jlc3RBcmd1bWVudExpc3QoKS5tYXAoYXJnID0+IHRoaXMuZXhwYW5kKGFyZykpO1xuICAgIHJldHVybiBuZXcgVGVybShcIkNhbGxFeHByZXNzaW9uXCIsIHtcbiAgICAgIGNhbGxlZTogY2FsbGVlLFxuICAgICAgYXJndW1lbnRzOiBhcmdzXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRTcHJlYWRFbGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gbmV3IFRlcm0oJ1NwcmVhZEVsZW1lbnQnLCB7XG4gICAgICBleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRFeHByZXNzaW9uU3RhdGVtZW50KHRlcm0pIHtcbiAgICBsZXQgY2hpbGQgPSB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pO1xuICAgIHJldHVybiBuZXcgVGVybShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge1xuICAgICAgZXhwcmVzc2lvbjogY2hpbGRcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZExhYmVsZWRTdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiBuZXcgVGVybSgnTGFiZWxlZFN0YXRlbWVudCcsIHtcbiAgICAgIGxhYmVsOiB0ZXJtLmxhYmVsLnZhbCgpLFxuICAgICAgYm9keTogdGhpcy5leHBhbmQodGVybS5ib2R5KVxuICAgIH0pO1xuICB9XG5cbiAgZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtLCB0eXBlKSB7XG4gICAgbGV0IHNjb3BlID0gZnJlc2hTY29wZShcImZ1blwiKTtcbiAgICBsZXQgcmVkID0gbmV3IEFwcGx5U2NvcGVJblBhcmFtc1JlZHVjZXIoc2NvcGUsIHRoaXMuY29udGV4dCk7XG4gICAgbGV0IHBhcmFtcztcbiAgICBpZiAodHlwZSAhPT0gJ0dldHRlcicgJiYgdHlwZSAhPT0gJ1NldHRlcicpIHtcbiAgICAgIHBhcmFtcyA9IHJlZC50cmFuc2Zvcm0odGVybS5wYXJhbXMpO1xuICAgICAgcGFyYW1zID0gdGhpcy5leHBhbmQocGFyYW1zKTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZS5wdXNoKHNjb3BlKTtcbiAgICBsZXQgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIodGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuZW52LCB0aGlzLmNvbnRleHQuc3RvcmUsIHRoaXMuY29udGV4dCk7XG5cbiAgICBsZXQgbWFya2VkQm9keSwgYm9keVRlcm07XG4gICAgaWYgKHRlcm0uYm9keSBpbnN0YW5jZW9mIFRlcm0pIHtcbiAgICAgIC8vIEFycm93IGZ1bmN0aW9ucyBoYXZlIGEgc2luZ2xlIHRlcm0gYXMgdGhlaXIgYm9keVxuICAgICAgYm9keVRlcm0gPSB0aGlzLmV4cGFuZCh0ZXJtLmJvZHkuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrZWRCb2R5ID0gdGVybS5ib2R5Lm1hcChiID0+IGIuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUykpO1xuICAgICAgYm9keVRlcm0gPSBuZXcgVGVybShcIkZ1bmN0aW9uQm9keVwiLCB7XG4gICAgICAgIGRpcmVjdGl2ZXM6IExpc3QoKSxcbiAgICAgICAgc3RhdGVtZW50czogY29tcGlsZXIuY29tcGlsZShtYXJrZWRCb2R5KVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udGV4dC5jdXJyZW50U2NvcGUucG9wKCk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ0dldHRlcicpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlLCB7XG4gICAgICAgIG5hbWU6IHRoaXMuZXhwYW5kKHRlcm0ubmFtZSksXG4gICAgICAgIGJvZHk6IGJvZHlUZXJtXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTZXR0ZXInKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm0odHlwZSwge1xuICAgICAgICBuYW1lOiB0aGlzLmV4cGFuZCh0ZXJtLm5hbWUpLFxuICAgICAgICBwYXJhbTogdGVybS5wYXJhbSxcbiAgICAgICAgYm9keTogYm9keVRlcm1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0Fycm93RXhwcmVzc2lvbicpIHtcbiAgICAgIHJldHVybiBuZXcgVGVybSh0eXBlLCB7XG4gICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICBib2R5OiBib2R5VGVybVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSh0eXBlLCB7XG4gICAgICBuYW1lOiB0ZXJtLm5hbWUsXG4gICAgICBpc0dlbmVyYXRvcjogdGVybS5pc0dlbmVyYXRvcixcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgYm9keTogYm9keVRlcm1cbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZE1ldGhvZCh0ZXJtKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9GdW5jdGlvbkV4cGFuc2lvbih0ZXJtLCAnTWV0aG9kJyk7XG4gIH1cblxuICBleHBhbmRTZXR0ZXIodGVybSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybSwgJ1NldHRlcicpO1xuICB9XG5cbiAgZXhwYW5kR2V0dGVyKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm0sICdHZXR0ZXInKTtcbiAgfVxuXG4gIGV4cGFuZEZ1bmN0aW9uRGVjbGFyYXRpb24odGVybSkge1xuICAgIHJldHVybiB0aGlzLmRvRnVuY3Rpb25FeHBhbnNpb24odGVybSwgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpO1xuICB9XG5cbiAgZXhwYW5kRnVuY3Rpb25FeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGhpcy5kb0Z1bmN0aW9uRXhwYW5zaW9uKHRlcm0sIFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgZXhwYW5kQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7XG4gICAgICBiaW5kaW5nOiB0aGlzLmV4cGFuZCh0ZXJtLmJpbmRpbmcpLFxuICAgICAgb3BlcmF0b3I6IHRlcm0ub3BlcmF0b3IsXG4gICAgICBleHByZXNzaW9uOiB0aGlzLmV4cGFuZCh0ZXJtLmV4cHJlc3Npb24pXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBc3NpZ25tZW50RXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIG5ldyBUZXJtKFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiwge1xuICAgICAgYmluZGluZzogdGhpcy5leHBhbmQodGVybS5iaW5kaW5nKSxcbiAgICAgIGV4cHJlc3Npb246IHRoaXMuZXhwYW5kKHRlcm0uZXhwcmVzc2lvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEVtcHR5U3RhdGVtZW50KHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZExpdGVyYWxCb29sZWFuRXhwcmVzc2lvbih0ZXJtKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBleHBhbmRMaXRlcmFsTnVtZXJpY0V4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG4gIGV4cGFuZExpdGVyYWxJbmZpbml0eUV4cHJlc3Npb24odGVybSkge1xuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kSWRlbnRpZmllckV4cHJlc3Npb24odGVybSkge1xuICAgIGxldCB0cmFucyA9IHRoaXMuY29udGV4dC5lbnYuZ2V0KHRlcm0ubmFtZS5yZXNvbHZlKHRoaXMuY29udGV4dC5waGFzZSkpO1xuICAgIGlmICh0cmFucykge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtKFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiwge1xuICAgICAgICBuYW1lOiB0cmFucy5pZFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZXhwYW5kTGl0ZXJhbE51bGxFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZExpdGVyYWxTdHJpbmdFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGV4cGFuZExpdGVyYWxSZWdFeHBFeHByZXNzaW9uKHRlcm0pIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/terms.js b/dist/terms.js index 462427a9..18455262 100644 --- a/dist/terms.js +++ b/dist/terms.js @@ -7,418 +7,249 @@ exports.isImportDeclaration = exports.isCompiletimeStatement = exports.isCompile var _immutable = require("immutable"); -var _errors = require("./errors"); - -var _utils = require("./utils"); - -var _syntax = require("./syntax"); +var _ramda = require("ramda"); -var _syntax2 = _interopRequireDefault(_syntax); +var R = _interopRequireWildcard(_ramda); -var _termSpec = require("./term-spec"); +var _sweetSpec = require("sweet-spec"); -var _termSpec2 = _interopRequireDefault(_termSpec); +var _sweetSpec2 = _interopRequireDefault(_sweetSpec); -var _ramda = require("ramda"); - -var R = _interopRequireWildcard(_ramda); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const attrName = a => a.attrName; class Term { - constructor(type_1349, props_1350) { - this.type = type_1349; + + constructor(type, props) { + let spec = _sweetSpec2.default.getDescendant(type); + if (spec == null) { + throw new Error(`Unknown term: ${ type }`); + } + this.type = type; this.loc = null; - for (let prop of Object.keys(props_1350)) { - this[prop] = props_1350[prop]; + this.spec = spec; + let propKeys = Object.keys(props); + let fieldNames = spec.getAttributes().map(attrName); + let diff = R.symmetricDifference(propKeys, fieldNames); + if (diff.length !== 0) { + throw new Error(`Unexpected properties for term ${ type }: ${ diff }`); } + Object.assign(this, props); } - extend(props_1351) { - let newProps_1352 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (props_1351.hasOwnProperty(field)) { - newProps_1352[field] = props_1351[field]; - } else { - newProps_1352[field] = this[field]; - } + + extend(props) { + let specAttrNames = this.spec.getAttributes().map(attrName); + let newProps = R.pick(specAttrNames, this); + + let invalidAttrs = R.difference(Object.keys(props), specAttrNames); + if (invalidAttrs.length > 0) { + throw new Error(`Unexpected properties for term ${ this.type }: ${ invalidAttrs }`); } - return new Term(this.type, newProps_1352); + + return new Term(this.type, Object.assign(newProps, props)); } - gen() { - var _ref = arguments.length <= 0 || arguments[0] === undefined ? { includeImports: true } : arguments[0]; - let includeImports = _ref.includeImports; + // TODO: remove + gen() { + let includeImports = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; - let next_1353 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (this[field] == null) { - next_1353[field] = null; - } else if (this[field] instanceof Term) { - next_1353[field] = this[field].gen(includeImports); - } else if (_immutable.List.isList(this[field])) { - let pred = includeImports ? R.complement(isCompiletimeStatement_1347) : R.both(R.complement(isImportDeclaration_1348), R.complement(isCompiletimeStatement_1347)); - next_1353[field] = this[field].filter(pred).map(term_1354 => term_1354 instanceof Term ? term_1354.gen(includeImports) : term_1354); + let next = {}; + for (let field of this.spec.getAttributes()) { + if (this[field.attrName] == null) { + next[field.attrName] = null; + } else if (this[field.attrName] instanceof Term) { + next[field.attrName] = this[field.attrName].gen(includeImports); + } else if (_immutable.List.isList(this[field.attrName])) { + let pred = includeImports ? R.complement(isCompiletimeStatement) : R.both(R.complement(isImportDeclaration), R.complement(isCompiletimeStatement)); + next[field.attrName] = this[field.attrName].filter(pred).map(term => term instanceof Term ? term.gen(includeImports) : term); } else { - next_1353[field] = this[field]; + next[field.attrName] = this[field.attrName]; } } - return new Term(this.type, next_1353); + return new Term(this.type, next); } - visit(f_1355) { - let next_1356 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (this[field] == null) { - next_1356[field] = null; - } else if (_immutable.List.isList(this[field])) { - next_1356[field] = this[field].map(field_1357 => field_1357 != null ? f_1355(field_1357) : null); + + // TODO: remove + visit(f) { + let next = {}; + for (let field of _sweetSpec2.default.getDescendant(this.type).getAttributes()) { + if (this[field.attrName] == null) { + next[field.attrName] = null; + } else if (_immutable.List.isList(this[field.attrName])) { + next[field.attrName] = this[field.attrName].map(field => field != null ? f(field) : null); } else { - next_1356[field] = f_1355(this[field]); + next[field.attrName] = f(this[field.attrName]); } } - return this.extend(next_1356); + return this.extend(next); } - addScope(scope_1358, bindings_1359, phase_1360, options_1361) { - return this.visit(term_1362 => { - if (typeof term_1362.addScope === "function") { - return term_1362.addScope(scope_1358, bindings_1359, phase_1360, options_1361); + + // TODO: remove + addScope(scope, bindings, phase, options) { + return this.visit(term => { + if (typeof term.addScope === 'function') { + return term.addScope(scope, bindings, phase, options); } - return term_1362; + return term; }); } - removeScope(scope_1363, phase_1364) { - return this.visit(term_1365 => { - if (typeof term_1365.removeScope === "function") { - return term_1365.removeScope(scope_1363, phase_1364); + + // TODO: remove + removeScope(scope, phase) { + return this.visit(term => { + if (typeof term.removeScope === 'function') { + return term.removeScope(scope, phase); } - return term_1365; + return term; }); } + + // TODO: this is very wrong lineNumber() { - for (let field of _termSpec2.default.spec[this.type].fields) { - if (typeof this[field] && this[field].lineNumber === "function") { - return this[field].lineNumber(); + for (let field of _sweetSpec2.default.getDescendant(this.type).getAttributes()) { + if (typeof this[field.attrName] && this[field.attrName].lineNumber === 'function') { + return this[field.attrName].lineNumber(); } } } - setLineNumber(line_1366) { - let next_1367 = {}; - for (let field of _termSpec2.default.spec[this.type].fields) { - if (this[field] == null) { - next_1367[field] = null; - } else if (typeof this[field].setLineNumber === "function") { - next_1367[field] = this[field].setLineNumber(line_1366); - } else if (_immutable.List.isList(this[field])) { - next_1367[field] = this[field].map(f_1368 => f_1368.setLineNumber(line_1366)); + + setLineNumber(line) { + let next = {}; + for (let field of _sweetSpec2.default.getDescendant(this.type).getAttributes()) { + if (this[field.attrName] == null) { + next[field.attrName] = null; + } else if (typeof this[field.attrName].setLineNumber === 'function') { + next[field.attrName] = this[field.attrName].setLineNumber(line); + } else if (_immutable.List.isList(this[field.attrName])) { + next[field.attrName] = this[field.attrName].map(f => f.setLineNumber(line)); } else { - next_1367[field] = this[field]; + next[field.attrName] = this[field.attrName]; } } - return new Term(this.type, next_1367); + return new Term(this.type, next); } } -exports.default = Term; -const isBindingWithDefault_1249 = R.whereEq({ type: "BindingWithDefault" }); -; -const isBindingIdentifier_1250 = R.whereEq({ type: "BindingIdentifier" }); -; -const isArrayBinding_1251 = R.whereEq({ type: "ArrayBinding" }); -; -const isObjectBinding_1252 = R.whereEq({ type: "ObjectBinding" }); -; -const isBindingPropertyIdentifier_1253 = R.whereEq({ type: "BindingPropertyIdentifier" }); -; -const isBindingPropertyProperty_1254 = R.whereEq({ type: "BindingPropertyIdentifier" }); -; -const isClassExpression_1255 = R.whereEq({ type: "ClassExpression" }); -; -const isClassDeclaration_1256 = R.whereEq({ type: "ClassDeclaration" }); -; -const isClassElement_1257 = R.whereEq({ type: "ClassElement" }); -; -const isModule_1258 = R.whereEq({ type: "Module" }); -; -const isImport_1259 = R.whereEq({ type: "Import" }); -; -const isImportNamespace_1260 = R.whereEq({ type: "ImportNamespace" }); -; -const isImportSpecifier_1261 = R.whereEq({ type: "ImportSpecifier" }); -; -const isExportAllFrom_1262 = R.whereEq({ type: "ExportAllFrom" }); -; -const isExportFrom_1263 = R.whereEq({ type: "ExportFrom" }); -; -const isExport_1264 = R.whereEq({ type: "Export" }); -; -const isExportDefault_1265 = R.whereEq({ type: "ExportDefault" }); -; -const isExportSpecifier_1266 = R.whereEq({ type: "ExportSpecifier" }); -; -const isMethod_1267 = R.whereEq({ type: "Method" }); -; -const isGetter_1268 = R.whereEq({ type: "Getter" }); -; -const isSetter_1269 = R.whereEq({ type: "Setter" }); -; -const isDataProperty_1270 = R.whereEq({ type: "DataProperty" }); -; -const isShorthandProperty_1271 = R.whereEq({ type: "ShorthandProperty" }); -; -const isComputedPropertyName_1272 = R.whereEq({ type: "ComputedPropertyName" }); -; -const isStaticPropertyName_1273 = R.whereEq({ type: "StaticPropertyName" }); -; -const isLiteralBooleanExpression_1274 = R.whereEq({ type: "LiteralBooleanExpression" }); -; -const isLiteralInfinityExpression_1275 = R.whereEq({ type: "LiteralInfinityExpression" }); -; -const isLiteralNullExpression_1276 = R.whereEq({ type: "LiteralNullExpression" }); -; -const isLiteralNumericExpression_1277 = R.whereEq({ type: "LiteralNumericExpression" }); -; -const isLiteralRegExpExpression_1278 = R.whereEq({ type: "LiteralRegExpExpression" }); -; -const isLiteralStringExpression_1279 = R.whereEq({ type: "LiteralStringExpression" }); -; -const isArrayExpression_1280 = R.whereEq({ type: "ArrayExpression" }); -; -const isArrowExpression_1281 = R.whereEq({ type: "ArrowExpression" }); -; -const isAssignmentExpression_1282 = R.whereEq({ type: "AssignmentExpression" }); -; -const isBinaryExpression_1283 = R.whereEq({ type: "BinaryExpression" }); -; -const isCallExpression_1284 = R.whereEq({ type: "CallExpression" }); -; -const isComputedAssignmentExpression_1285 = R.whereEq({ type: "ComputedAssignmentExpression" }); -; -const isComputedMemberExpression_1286 = R.whereEq({ type: "ComputedMemberExpression" }); -; -const isConditionalExpression_1287 = R.whereEq({ type: "ConditionalExpression" }); -; -const isFunctionExpression_1288 = R.whereEq({ type: "FunctionExpression" }); -; -const isIdentifierExpression_1289 = R.whereEq({ type: "IdentifierExpression" }); -; -const isNewExpression_1290 = R.whereEq({ type: "NewExpression" }); -; -const isNewTargetExpression_1291 = R.whereEq({ type: "NewTargetExpression" }); -; -const isObjectExpression_1292 = R.whereEq({ type: "ObjectExpression" }); -; -const isUnaryExpression_1293 = R.whereEq({ type: "UnaryExpression" }); -; -const isStaticMemberExpression_1294 = R.whereEq({ type: "StaticMemberExpression" }); -; -const isTemplateExpression_1295 = R.whereEq({ type: "TemplateExpression" }); -; -const isThisExpression_1296 = R.whereEq({ type: "ThisExpression" }); -; -const isUpdateExpression_1297 = R.whereEq({ type: "UpdateExpression" }); -; -const isYieldExpression_1298 = R.whereEq({ type: "YieldExpression" }); -; -const isYieldGeneratorExpression_1299 = R.whereEq({ type: "YieldGeneratorExpression" }); -; -const isBlockStatement_1300 = R.whereEq({ type: "BlockStatement" }); -; -const isBreakStatement_1301 = R.whereEq({ type: "BreakStatement" }); -; -const isContinueStatement_1302 = R.whereEq({ type: "ContinueStatement" }); -; -const isCompoundAssignmentExpression_1303 = R.whereEq({ type: "CompoundAssignmentExpression" }); -; -const isDebuggerStatement_1304 = R.whereEq({ type: "DebuggerStatement" }); -; -const isDoWhileStatement_1305 = R.whereEq({ type: "DoWhileStatement" }); -; -const isEmptyStatement_1306 = R.whereEq({ type: "EmptyStatement" }); -; -const isExpressionStatement_1307 = R.whereEq({ type: "ExpressionStatement" }); -; -const isForInStatement_1308 = R.whereEq({ type: "ForInStatement" }); -; -const isForOfStatement_1309 = R.whereEq({ type: "ForOfStatement" }); -; -const isForStatement_1310 = R.whereEq({ type: "ForStatement" }); -; -const isIfStatement_1311 = R.whereEq({ type: "IfStatement" }); -; -const isLabeledStatement_1312 = R.whereEq({ type: "LabeledStatement" }); -; -const isReturnStatement_1313 = R.whereEq({ type: "ReturnStatement" }); -; -const isSwitchStatement_1314 = R.whereEq({ type: "SwitchStatement" }); -; -const isSwitchStatementWithDefault_1315 = R.whereEq({ type: "SwitchStatementWithDefault" }); -; -const isThrowStatement_1316 = R.whereEq({ type: "ThrowStatement" }); -; -const isTryCatchStatement_1317 = R.whereEq({ type: "TryCatchStatement" }); -; -const isTryFinallyStatement_1318 = R.whereEq({ type: "TryFinallyStatement" }); -; -const isVariableDeclarationStatement_1319 = R.whereEq({ type: "VariableDeclarationStatement" }); -; -const isWhileStatement_1320 = R.whereEq({ type: "WhileStatement" }); -; -const isWithStatement_1321 = R.whereEq({ type: "WithStatement" }); -; -const isPragma_1322 = R.whereEq({ type: "Pragma" }); -; -const isBlock_1323 = R.whereEq({ type: "Block" }); -; -const isCatchClause_1324 = R.whereEq({ type: "CatchClause" }); -; -const isDirective_1325 = R.whereEq({ type: "Directive" }); -; -const isFormalParameters_1326 = R.whereEq({ type: "FormalParameters" }); -; -const isFunctionBody_1327 = R.whereEq({ type: "FunctionBody" }); -; -const isFunctionDeclaration_1328 = R.whereEq({ type: "FunctionDeclaration" }); -; -const isScript_1329 = R.whereEq({ type: "Script" }); -; -const isSpreadElement_1330 = R.whereEq({ type: "SpreadElement" }); -; -const isSuper_1331 = R.whereEq({ type: "Super" }); -; -const isSwitchCase_1332 = R.whereEq({ type: "SwitchCase" }); -; -const isSwitchDefault_1333 = R.whereEq({ type: "SwitchDefault" }); -; -const isTemplateElement_1334 = R.whereEq({ type: "TemplateElement" }); -; -const isSyntaxTemplate_1335 = R.whereEq({ type: "SyntaxTemplate" }); -; -const isVariableDeclaration_1336 = R.whereEq({ type: "VariableDeclaration" }); -; -const isVariableDeclarator_1337 = R.whereEq({ type: "VariableDeclarator" }); -; -const isEOF_1338 = R.whereEq({ type: "EOF" }); -; -const isSyntaxDeclaration_1339 = R.both(isVariableDeclaration_1336, R.whereEq({ kind: "syntax" })); -; -const isSyntaxrecDeclaration_1340 = R.both(isVariableDeclaration_1336, R.whereEq({ kind: "syntaxrec" })); -; -const isFunctionTerm_1341 = R.either(isFunctionDeclaration_1328, isFunctionExpression_1288); -; -const isFunctionWithName_1342 = R.and(isFunctionTerm_1341, R.complement(R.where({ name: R.isNil }))); -; -const isParenthesizedExpression_1343 = R.whereEq({ type: "ParenthesizedExpression" }); -; -const isExportSyntax_1344 = R.both(isExport_1264, exp_1369 => R.or(isSyntaxDeclaration_1339(exp_1369.declaration), isSyntaxrecDeclaration_1340(exp_1369.declaration))); -; -const isSyntaxDeclarationStatement_1345 = R.both(isVariableDeclarationStatement_1319, decl_1370 => isCompiletimeDeclaration_1346(decl_1370.declaration)); -; -const isCompiletimeDeclaration_1346 = R.either(isSyntaxDeclaration_1339, isSyntaxrecDeclaration_1340); -; -const isCompiletimeStatement_1347 = term_1371 => { - return term_1371 instanceof Term && isVariableDeclarationStatement_1319(term_1371) && isCompiletimeDeclaration_1346(term_1371.declaration); + +exports.default = Term; // bindings + +const isBindingWithDefault = exports.isBindingWithDefault = R.whereEq({ type: "BindingWithDefault" }); +const isBindingIdentifier = exports.isBindingIdentifier = R.whereEq({ type: "BindingIdentifier" }); +const isArrayBinding = exports.isArrayBinding = R.whereEq({ type: "ArrayBinding" }); +const isObjectBinding = exports.isObjectBinding = R.whereEq({ type: "ObjectBinding" }); +const isBindingPropertyIdentifier = exports.isBindingPropertyIdentifier = R.whereEq({ type: "BindingPropertyIdentifier" }); +const isBindingPropertyProperty = exports.isBindingPropertyProperty = R.whereEq({ type: "BindingPropertyIdentifier" }); + +// class +const isClassExpression = exports.isClassExpression = R.whereEq({ type: "ClassExpression" }); +const isClassDeclaration = exports.isClassDeclaration = R.whereEq({ type: "ClassDeclaration" }); +const isClassElement = exports.isClassElement = R.whereEq({ type: "ClassElement" }); + +// modules +const isModule = exports.isModule = R.whereEq({ type: "Module" }); +const isImport = exports.isImport = R.whereEq({ type: "Import" }); +const isImportNamespace = exports.isImportNamespace = R.whereEq({ type: "ImportNamespace" }); +const isImportSpecifier = exports.isImportSpecifier = R.whereEq({ type: "ImportSpecifier" }); +const isExportAllFrom = exports.isExportAllFrom = R.whereEq({ type: "ExportAllFrom" }); +const isExportFrom = exports.isExportFrom = R.whereEq({ type: "ExportFrom" }); +const isExport = exports.isExport = R.whereEq({ type: "Export" }); +const isExportDefault = exports.isExportDefault = R.whereEq({ type: "ExportDefault" }); +const isExportSpecifier = exports.isExportSpecifier = R.whereEq({ type: "ExportSpecifier" }); + +// property definition +const isMethod = exports.isMethod = R.whereEq({ type: "Method" }); +const isGetter = exports.isGetter = R.whereEq({ type: "Getter" }); +const isSetter = exports.isSetter = R.whereEq({ type: "Setter" }); +const isDataProperty = exports.isDataProperty = R.whereEq({ type: "DataProperty" }); +const isShorthandProperty = exports.isShorthandProperty = R.whereEq({ type: "ShorthandProperty" }); +const isComputedPropertyName = exports.isComputedPropertyName = R.whereEq({ type: "ComputedPropertyName" }); +const isStaticPropertyName = exports.isStaticPropertyName = R.whereEq({ type: "StaticPropertyName" }); + +// literals +const isLiteralBooleanExpression = exports.isLiteralBooleanExpression = R.whereEq({ type: "LiteralBooleanExpression" }); +const isLiteralInfinityExpression = exports.isLiteralInfinityExpression = R.whereEq({ type: "LiteralInfinityExpression" }); +const isLiteralNullExpression = exports.isLiteralNullExpression = R.whereEq({ type: "LiteralNullExpression" }); +const isLiteralNumericExpression = exports.isLiteralNumericExpression = R.whereEq({ type: "LiteralNumericExpression" }); +const isLiteralRegExpExpression = exports.isLiteralRegExpExpression = R.whereEq({ type: "LiteralRegExpExpression" }); +const isLiteralStringExpression = exports.isLiteralStringExpression = R.whereEq({ type: "LiteralStringExpression" }); + +// expressions +const isArrayExpression = exports.isArrayExpression = R.whereEq({ type: "ArrayExpression" }); +const isArrowExpression = exports.isArrowExpression = R.whereEq({ type: "ArrowExpression" }); +const isAssignmentExpression = exports.isAssignmentExpression = R.whereEq({ type: "AssignmentExpression" }); +const isBinaryExpression = exports.isBinaryExpression = R.whereEq({ type: "BinaryExpression" }); +const isCallExpression = exports.isCallExpression = R.whereEq({ type: "CallExpression" }); +const isComputedAssignmentExpression = exports.isComputedAssignmentExpression = R.whereEq({ type: "ComputedAssignmentExpression" }); +const isComputedMemberExpression = exports.isComputedMemberExpression = R.whereEq({ type: "ComputedMemberExpression" }); +const isConditionalExpression = exports.isConditionalExpression = R.whereEq({ type: "ConditionalExpression" }); +const isFunctionExpression = exports.isFunctionExpression = R.whereEq({ type: "FunctionExpression" }); +const isIdentifierExpression = exports.isIdentifierExpression = R.whereEq({ type: "IdentifierExpression" }); +const isNewExpression = exports.isNewExpression = R.whereEq({ type: "NewExpression" }); +const isNewTargetExpression = exports.isNewTargetExpression = R.whereEq({ type: "NewTargetExpression" }); +const isObjectExpression = exports.isObjectExpression = R.whereEq({ type: "ObjectExpression" }); +const isUnaryExpression = exports.isUnaryExpression = R.whereEq({ type: "UnaryExpression" }); +const isStaticMemberExpression = exports.isStaticMemberExpression = R.whereEq({ type: "StaticMemberExpression" }); +const isTemplateExpression = exports.isTemplateExpression = R.whereEq({ type: "TemplateExpression" }); +const isThisExpression = exports.isThisExpression = R.whereEq({ type: "ThisExpression" }); +const isUpdateExpression = exports.isUpdateExpression = R.whereEq({ type: "UpdateExpression" }); +const isYieldExpression = exports.isYieldExpression = R.whereEq({ type: "YieldExpression" }); +const isYieldGeneratorExpression = exports.isYieldGeneratorExpression = R.whereEq({ type: "YieldGeneratorExpression" }); + +// statements +const isBlockStatement = exports.isBlockStatement = R.whereEq({ type: "BlockStatement" }); +const isBreakStatement = exports.isBreakStatement = R.whereEq({ type: "BreakStatement" }); +const isContinueStatement = exports.isContinueStatement = R.whereEq({ type: "ContinueStatement" }); +const isCompoundAssignmentExpression = exports.isCompoundAssignmentExpression = R.whereEq({ type: "CompoundAssignmentExpression" }); +const isDebuggerStatement = exports.isDebuggerStatement = R.whereEq({ type: "DebuggerStatement" }); +const isDoWhileStatement = exports.isDoWhileStatement = R.whereEq({ type: "DoWhileStatement" }); +const isEmptyStatement = exports.isEmptyStatement = R.whereEq({ type: "EmptyStatement" }); +const isExpressionStatement = exports.isExpressionStatement = R.whereEq({ type: "ExpressionStatement" }); +const isForInStatement = exports.isForInStatement = R.whereEq({ type: "ForInStatement" }); +const isForOfStatement = exports.isForOfStatement = R.whereEq({ type: "ForOfStatement" }); +const isForStatement = exports.isForStatement = R.whereEq({ type: "ForStatement" }); +const isIfStatement = exports.isIfStatement = R.whereEq({ type: "IfStatement" }); +const isLabeledStatement = exports.isLabeledStatement = R.whereEq({ type: "LabeledStatement" }); +const isReturnStatement = exports.isReturnStatement = R.whereEq({ type: "ReturnStatement" }); +const isSwitchStatement = exports.isSwitchStatement = R.whereEq({ type: "SwitchStatement" }); +const isSwitchStatementWithDefault = exports.isSwitchStatementWithDefault = R.whereEq({ type: "SwitchStatementWithDefault" }); +const isThrowStatement = exports.isThrowStatement = R.whereEq({ type: "ThrowStatement" }); +const isTryCatchStatement = exports.isTryCatchStatement = R.whereEq({ type: "TryCatchStatement" }); +const isTryFinallyStatement = exports.isTryFinallyStatement = R.whereEq({ type: "TryFinallyStatement" }); +const isVariableDeclarationStatement = exports.isVariableDeclarationStatement = R.whereEq({ type: "VariableDeclarationStatement" }); +const isWhileStatement = exports.isWhileStatement = R.whereEq({ type: "WhileStatement" }); +const isWithStatement = exports.isWithStatement = R.whereEq({ type: "WithStatement" }); + +// other +const isPragma = exports.isPragma = R.whereEq({ type: 'Pragma' }); +const isBlock = exports.isBlock = R.whereEq({ type: "Block" }); +const isCatchClause = exports.isCatchClause = R.whereEq({ type: "CatchClause" }); +const isDirective = exports.isDirective = R.whereEq({ type: "Directive" }); +const isFormalParameters = exports.isFormalParameters = R.whereEq({ type: "FormalParameters" }); +const isFunctionBody = exports.isFunctionBody = R.whereEq({ type: "FunctionBody" }); +const isFunctionDeclaration = exports.isFunctionDeclaration = R.whereEq({ type: "FunctionDeclaration" }); +const isScript = exports.isScript = R.whereEq({ type: "Script" }); +const isSpreadElement = exports.isSpreadElement = R.whereEq({ type: "SpreadElement" }); +const isSuper = exports.isSuper = R.whereEq({ type: "Super" }); +const isSwitchCase = exports.isSwitchCase = R.whereEq({ type: "SwitchCase" }); +const isSwitchDefault = exports.isSwitchDefault = R.whereEq({ type: "SwitchDefault" }); +const isTemplateElement = exports.isTemplateElement = R.whereEq({ type: "TemplateElement" }); +const isSyntaxTemplate = exports.isSyntaxTemplate = R.whereEq({ type: "SyntaxTemplate" }); +const isVariableDeclaration = exports.isVariableDeclaration = R.whereEq({ type: "VariableDeclaration" }); +const isVariableDeclarator = exports.isVariableDeclarator = R.whereEq({ type: "VariableDeclarator" }); +const isEOF = exports.isEOF = R.whereEq({ type: 'EOF' }); +const isSyntaxDeclaration = exports.isSyntaxDeclaration = R.both(isVariableDeclaration, R.whereEq({ kind: 'syntax' })); +const isSyntaxrecDeclaration = exports.isSyntaxrecDeclaration = R.both(isVariableDeclaration, R.whereEq({ kind: 'syntaxrec' })); +const isFunctionTerm = exports.isFunctionTerm = R.either(isFunctionDeclaration, isFunctionExpression); +const isFunctionWithName = exports.isFunctionWithName = R.and(isFunctionTerm, R.complement(R.where({ name: R.isNil }))); +const isParenthesizedExpression = exports.isParenthesizedExpression = R.whereEq({ type: 'ParenthesizedExpression' }); +const isExportSyntax = exports.isExportSyntax = R.both(isExport, exp => R.or(isSyntaxDeclaration(exp.declaration), isSyntaxrecDeclaration(exp.declaration))); +const isSyntaxDeclarationStatement = exports.isSyntaxDeclarationStatement = R.both(isVariableDeclarationStatement, decl => isCompiletimeDeclaration(decl.declaration)); + +const isCompiletimeDeclaration = exports.isCompiletimeDeclaration = R.either(isSyntaxDeclaration, isSyntaxrecDeclaration); +const isCompiletimeStatement = exports.isCompiletimeStatement = term => { + return term instanceof Term && isVariableDeclarationStatement(term) && isCompiletimeDeclaration(term.declaration); }; -; -const isImportDeclaration_1348 = R.either(isImport_1259, isImportNamespace_1260); -; -exports.isBindingWithDefault = isBindingWithDefault_1249; -exports.isBindingIdentifier = isBindingIdentifier_1250; -exports.isArrayBinding = isArrayBinding_1251; -exports.isObjectBinding = isObjectBinding_1252; -exports.isBindingPropertyIdentifier = isBindingPropertyIdentifier_1253; -exports.isBindingPropertyProperty = isBindingPropertyProperty_1254; -exports.isClassExpression = isClassExpression_1255; -exports.isClassDeclaration = isClassDeclaration_1256; -exports.isClassElement = isClassElement_1257; -exports.isModule = isModule_1258; -exports.isImport = isImport_1259; -exports.isImportNamespace = isImportNamespace_1260; -exports.isImportSpecifier = isImportSpecifier_1261; -exports.isExportAllFrom = isExportAllFrom_1262; -exports.isExportFrom = isExportFrom_1263; -exports.isExport = isExport_1264; -exports.isExportDefault = isExportDefault_1265; -exports.isExportSpecifier = isExportSpecifier_1266; -exports.isMethod = isMethod_1267; -exports.isGetter = isGetter_1268; -exports.isSetter = isSetter_1269; -exports.isDataProperty = isDataProperty_1270; -exports.isShorthandProperty = isShorthandProperty_1271; -exports.isComputedPropertyName = isComputedPropertyName_1272; -exports.isStaticPropertyName = isStaticPropertyName_1273; -exports.isLiteralBooleanExpression = isLiteralBooleanExpression_1274; -exports.isLiteralInfinityExpression = isLiteralInfinityExpression_1275; -exports.isLiteralNullExpression = isLiteralNullExpression_1276; -exports.isLiteralNumericExpression = isLiteralNumericExpression_1277; -exports.isLiteralRegExpExpression = isLiteralRegExpExpression_1278; -exports.isLiteralStringExpression = isLiteralStringExpression_1279; -exports.isArrayExpression = isArrayExpression_1280; -exports.isArrowExpression = isArrowExpression_1281; -exports.isAssignmentExpression = isAssignmentExpression_1282; -exports.isBinaryExpression = isBinaryExpression_1283; -exports.isCallExpression = isCallExpression_1284; -exports.isComputedAssignmentExpression = isComputedAssignmentExpression_1285; -exports.isComputedMemberExpression = isComputedMemberExpression_1286; -exports.isConditionalExpression = isConditionalExpression_1287; -exports.isFunctionExpression = isFunctionExpression_1288; -exports.isIdentifierExpression = isIdentifierExpression_1289; -exports.isNewExpression = isNewExpression_1290; -exports.isNewTargetExpression = isNewTargetExpression_1291; -exports.isObjectExpression = isObjectExpression_1292; -exports.isUnaryExpression = isUnaryExpression_1293; -exports.isStaticMemberExpression = isStaticMemberExpression_1294; -exports.isTemplateExpression = isTemplateExpression_1295; -exports.isThisExpression = isThisExpression_1296; -exports.isUpdateExpression = isUpdateExpression_1297; -exports.isYieldExpression = isYieldExpression_1298; -exports.isYieldGeneratorExpression = isYieldGeneratorExpression_1299; -exports.isBlockStatement = isBlockStatement_1300; -exports.isBreakStatement = isBreakStatement_1301; -exports.isContinueStatement = isContinueStatement_1302; -exports.isCompoundAssignmentExpression = isCompoundAssignmentExpression_1303; -exports.isDebuggerStatement = isDebuggerStatement_1304; -exports.isDoWhileStatement = isDoWhileStatement_1305; -exports.isEmptyStatement = isEmptyStatement_1306; -exports.isExpressionStatement = isExpressionStatement_1307; -exports.isForInStatement = isForInStatement_1308; -exports.isForOfStatement = isForOfStatement_1309; -exports.isForStatement = isForStatement_1310; -exports.isIfStatement = isIfStatement_1311; -exports.isLabeledStatement = isLabeledStatement_1312; -exports.isReturnStatement = isReturnStatement_1313; -exports.isSwitchStatement = isSwitchStatement_1314; -exports.isSwitchStatementWithDefault = isSwitchStatementWithDefault_1315; -exports.isThrowStatement = isThrowStatement_1316; -exports.isTryCatchStatement = isTryCatchStatement_1317; -exports.isTryFinallyStatement = isTryFinallyStatement_1318; -exports.isVariableDeclarationStatement = isVariableDeclarationStatement_1319; -exports.isWhileStatement = isWhileStatement_1320; -exports.isWithStatement = isWithStatement_1321; -exports.isPragma = isPragma_1322; -exports.isBlock = isBlock_1323; -exports.isCatchClause = isCatchClause_1324; -exports.isDirective = isDirective_1325; -exports.isFormalParameters = isFormalParameters_1326; -exports.isFunctionBody = isFunctionBody_1327; -exports.isFunctionDeclaration = isFunctionDeclaration_1328; -exports.isScript = isScript_1329; -exports.isSpreadElement = isSpreadElement_1330; -exports.isSuper = isSuper_1331; -exports.isSwitchCase = isSwitchCase_1332; -exports.isSwitchDefault = isSwitchDefault_1333; -exports.isTemplateElement = isTemplateElement_1334; -exports.isSyntaxTemplate = isSyntaxTemplate_1335; -exports.isVariableDeclaration = isVariableDeclaration_1336; -exports.isVariableDeclarator = isVariableDeclarator_1337; -exports.isEOF = isEOF_1338; -exports.isSyntaxDeclaration = isSyntaxDeclaration_1339; -exports.isSyntaxrecDeclaration = isSyntaxrecDeclaration_1340; -exports.isFunctionTerm = isFunctionTerm_1341; -exports.isFunctionWithName = isFunctionWithName_1342; -exports.isParenthesizedExpression = isParenthesizedExpression_1343; -exports.isExportSyntax = isExportSyntax_1344; -exports.isSyntaxDeclarationStatement = isSyntaxDeclarationStatement_1345; -exports.isCompiletimeDeclaration = isCompiletimeDeclaration_1346; -exports.isCompiletimeStatement = isCompiletimeStatement_1347; -exports.isImportDeclaration = isImportDeclaration_1348; -//# sourceMappingURL=data:application/json;base64,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LEdBQTFCLHNCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDaUIsUSxHQUFqQixhO1FBQ2lCLFEsR0FBakIsYTtRQUMwQixpQixHQUExQixzQjtRQUMwQixpQixHQUExQixzQjtRQUN3QixlLEdBQXhCLG9CO1FBQ3FCLFksR0FBckIsaUI7UUFDaUIsUSxHQUFqQixhO1FBQ3dCLGUsR0FBeEIsb0I7UUFDMEIsaUIsR0FBMUIsc0I7UUFDaUIsUSxHQUFqQixhO1FBQ2lCLFEsR0FBakIsYTtRQUNpQixRLEdBQWpCLGE7UUFDdUIsYyxHQUF2QixtQjtRQUM0QixtQixHQUE1Qix3QjtRQUMrQixzQixHQUEvQiwyQjtRQUM2QixvQixHQUE3Qix5QjtRQUNtQywwQixHQUFuQywrQjtRQUNvQywyQixHQUFwQyxnQztRQUNnQyx1QixHQUFoQyw0QjtRQUNtQywwQixHQUFuQywrQjtRQUNrQyx5QixHQUFsQyw4QjtRQUNrQyx5QixHQUFsQyw4QjtRQUMwQixpQixHQUExQixzQjtRQUMwQixpQixHQUExQixzQjtRQUMrQixzQixHQUEvQiwyQjtRQUMyQixrQixHQUEzQix1QjtRQUN5QixnQixHQUF6QixxQjtRQUN1Qyw4QixHQUF2QyxtQztRQUNtQywwQixHQUFuQywrQjtRQUNnQyx1QixHQUFoQyw0QjtRQUM2QixvQixHQUE3Qix5QjtRQUMrQixzQixHQUEvQiwyQjtRQUN3QixlLEdBQXhCLG9CO1FBQzhCLHFCLEdBQTlCLDBCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQzBCLGlCLEdBQTFCLHNCO1FBQ2lDLHdCLEdBQWpDLDZCO1FBQzZCLG9CLEdBQTdCLHlCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQzBCLGlCLEdBQTFCLHNCO1FBQ21DLDBCLEdBQW5DLCtCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQzRCLG1CLEdBQTVCLHdCO1FBQ3VDLDhCLEdBQXZDLG1DO1FBQzRCLG1CLEdBQTVCLHdCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQzhCLHFCLEdBQTlCLDBCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQ3lCLGdCLEdBQXpCLHFCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDc0IsYSxHQUF0QixrQjtRQUMyQixrQixHQUEzQix1QjtRQUMwQixpQixHQUExQixzQjtRQUMwQixpQixHQUExQixzQjtRQUNxQyw0QixHQUFyQyxpQztRQUN5QixnQixHQUF6QixxQjtRQUM0QixtQixHQUE1Qix3QjtRQUM4QixxQixHQUE5QiwwQjtRQUN1Qyw4QixHQUF2QyxtQztRQUN5QixnQixHQUF6QixxQjtRQUN3QixlLEdBQXhCLG9CO1FBQ2lCLFEsR0FBakIsYTtRQUNnQixPLEdBQWhCLFk7UUFDc0IsYSxHQUF0QixrQjtRQUNvQixXLEdBQXBCLGdCO1FBQzJCLGtCLEdBQTNCLHVCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDOEIscUIsR0FBOUIsMEI7UUFDaUIsUSxHQUFqQixhO1FBQ3dCLGUsR0FBeEIsb0I7UUFDZ0IsTyxHQUFoQixZO1FBQ3FCLFksR0FBckIsaUI7UUFDd0IsZSxHQUF4QixvQjtRQUMwQixpQixHQUExQixzQjtRQUN5QixnQixHQUF6QixxQjtRQUM4QixxQixHQUE5QiwwQjtRQUM2QixvQixHQUE3Qix5QjtRQUNjLEssR0FBZCxVO1FBQzRCLG1CLEdBQTVCLHdCO1FBQytCLHNCLEdBQS9CLDJCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDMkIsa0IsR0FBM0IsdUI7UUFDa0MseUIsR0FBbEMsOEI7UUFDdUIsYyxHQUF2QixtQjtRQUNxQyw0QixHQUFyQyxpQztRQUNpQyx3QixHQUFqQyw2QjtRQUMrQixzQixHQUEvQiwyQjtRQUM0QixtQixHQUE1Qix3QiIsImZpbGUiOiJ0ZXJtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHthc3NlcnQsIGV4cGVjdH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQge21peGlufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IFN5bnRheCBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBUZXJtU3BlYyBmcm9tIFwiLi90ZXJtLXNwZWNcIjtcbmltcG9ydCAgKiBhcyBSIGZyb20gXCJyYW1kYVwiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVybSB7XG4gIGNvbnN0cnVjdG9yKHR5cGVfMTM0OSwgcHJvcHNfMTM1MCkge1xuICAgIHRoaXMudHlwZSA9IHR5cGVfMTM0OTtcbiAgICB0aGlzLmxvYyA9IG51bGw7XG4gICAgZm9yIChsZXQgcHJvcCBvZiBPYmplY3Qua2V5cyhwcm9wc18xMzUwKSkge1xuICAgICAgdGhpc1twcm9wXSA9IHByb3BzXzEzNTBbcHJvcF07XG4gICAgfVxuICB9XG4gIGV4dGVuZChwcm9wc18xMzUxKSB7XG4gICAgbGV0IG5ld1Byb3BzXzEzNTIgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5zcGVjW3RoaXMudHlwZV0uZmllbGRzKSB7XG4gICAgICBpZiAocHJvcHNfMTM1MS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgbmV3UHJvcHNfMTM1MltmaWVsZF0gPSBwcm9wc18xMzUxW2ZpZWxkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1Byb3BzXzEzNTJbZmllbGRdID0gdGhpc1tmaWVsZF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVybSh0aGlzLnR5cGUsIG5ld1Byb3BzXzEzNTIpO1xuICB9XG4gIGdlbih7aW5jbHVkZUltcG9ydHN9ID0ge2luY2x1ZGVJbXBvcnRzOiB0cnVlfSkge1xuICAgIGxldCBuZXh0XzEzNTMgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5zcGVjW3RoaXMudHlwZV0uZmllbGRzKSB7XG4gICAgICBpZiAodGhpc1tmaWVsZF0gPT0gbnVsbCkge1xuICAgICAgICBuZXh0XzEzNTNbZmllbGRdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpc1tmaWVsZF0gaW5zdGFuY2VvZiBUZXJtKSB7XG4gICAgICAgIG5leHRfMTM1M1tmaWVsZF0gPSB0aGlzW2ZpZWxkXS5nZW4oaW5jbHVkZUltcG9ydHMpO1xuICAgICAgfSBlbHNlIGlmIChMaXN0LmlzTGlzdCh0aGlzW2ZpZWxkXSkpIHtcbiAgICAgICAgbGV0IHByZWQgPSBpbmNsdWRlSW1wb3J0cyA/IFIuY29tcGxlbWVudChpc0NvbXBpbGV0aW1lU3RhdGVtZW50XzEzNDcpIDogUi5ib3RoKFIuY29tcGxlbWVudChpc0ltcG9ydERlY2xhcmF0aW9uXzEzNDgpLCBSLmNvbXBsZW1lbnQoaXNDb21waWxldGltZVN0YXRlbWVudF8xMzQ3KSk7XG4gICAgICAgIG5leHRfMTM1M1tmaWVsZF0gPSB0aGlzW2ZpZWxkXS5maWx0ZXIocHJlZCkubWFwKHRlcm1fMTM1NCA9PiB0ZXJtXzEzNTQgaW5zdGFuY2VvZiBUZXJtID8gdGVybV8xMzU0LmdlbihpbmNsdWRlSW1wb3J0cykgOiB0ZXJtXzEzNTQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dF8xMzUzW2ZpZWxkXSA9IHRoaXNbZmllbGRdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odGhpcy50eXBlLCBuZXh0XzEzNTMpO1xuICB9XG4gIHZpc2l0KGZfMTM1NSkge1xuICAgIGxldCBuZXh0XzEzNTYgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5zcGVjW3RoaXMudHlwZV0uZmllbGRzKSB7XG4gICAgICBpZiAodGhpc1tmaWVsZF0gPT0gbnVsbCkge1xuICAgICAgICBuZXh0XzEzNTZbZmllbGRdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodGhpc1tmaWVsZF0pKSB7XG4gICAgICAgIG5leHRfMTM1NltmaWVsZF0gPSB0aGlzW2ZpZWxkXS5tYXAoZmllbGRfMTM1NyA9PiBmaWVsZF8xMzU3ICE9IG51bGwgPyBmXzEzNTUoZmllbGRfMTM1NykgOiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRfMTM1NltmaWVsZF0gPSBmXzEzNTUodGhpc1tmaWVsZF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leHRlbmQobmV4dF8xMzU2KTtcbiAgfVxuICBhZGRTY29wZShzY29wZV8xMzU4LCBiaW5kaW5nc18xMzU5LCBwaGFzZV8xMzYwLCBvcHRpb25zXzEzNjEpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpdCh0ZXJtXzEzNjIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0ZXJtXzEzNjIuYWRkU2NvcGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gdGVybV8xMzYyLmFkZFNjb3BlKHNjb3BlXzEzNTgsIGJpbmRpbmdzXzEzNTksIHBoYXNlXzEzNjAsIG9wdGlvbnNfMTM2MSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybV8xMzYyO1xuICAgIH0pO1xuICB9XG4gIHJlbW92ZVNjb3BlKHNjb3BlXzEzNjMsIHBoYXNlXzEzNjQpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpdCh0ZXJtXzEzNjUgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0ZXJtXzEzNjUucmVtb3ZlU2NvcGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gdGVybV8xMzY1LnJlbW92ZVNjb3BlKHNjb3BlXzEzNjMsIHBoYXNlXzEzNjQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlcm1fMTM2NTtcbiAgICB9KTtcbiAgfVxuICBsaW5lTnVtYmVyKCkge1xuICAgIGZvciAobGV0IGZpZWxkIG9mIFRlcm1TcGVjLnNwZWNbdGhpcy50eXBlXS5maWVsZHMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpc1tmaWVsZF0gJiYgdGhpc1tmaWVsZF0ubGluZU51bWJlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ZpZWxkXS5saW5lTnVtYmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNldExpbmVOdW1iZXIobGluZV8xMzY2KSB7XG4gICAgbGV0IG5leHRfMTM2NyA9IHt9O1xuICAgIGZvciAobGV0IGZpZWxkIG9mIFRlcm1TcGVjLnNwZWNbdGhpcy50eXBlXS5maWVsZHMpIHtcbiAgICAgIGlmICh0aGlzW2ZpZWxkXSA9PSBudWxsKSB7XG4gICAgICAgIG5leHRfMTM2N1tmaWVsZF0gPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpc1tmaWVsZF0uc2V0TGluZU51bWJlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG5leHRfMTM2N1tmaWVsZF0gPSB0aGlzW2ZpZWxkXS5zZXRMaW5lTnVtYmVyKGxpbmVfMTM2Nik7XG4gICAgICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHRoaXNbZmllbGRdKSkge1xuICAgICAgICBuZXh0XzEzNjdbZmllbGRdID0gdGhpc1tmaWVsZF0ubWFwKGZfMTM2OCA9PiBmXzEzNjguc2V0TGluZU51bWJlcihsaW5lXzEzNjYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRfMTM2N1tmaWVsZF0gPSB0aGlzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKHRoaXMudHlwZSwgbmV4dF8xMzY3KTtcbiAgfVxufVxuY29uc3QgaXNCaW5kaW5nV2l0aERlZmF1bHRfMTI0OSA9IFIud2hlcmVFcSh7dHlwZTogXCJCaW5kaW5nV2l0aERlZmF1bHRcIn0pO1xuO1xuY29uc3QgaXNCaW5kaW5nSWRlbnRpZmllcl8xMjUwID0gUi53aGVyZUVxKHt0eXBlOiBcIkJpbmRpbmdJZGVudGlmaWVyXCJ9KTtcbjtcbmNvbnN0IGlzQXJyYXlCaW5kaW5nXzEyNTEgPSBSLndoZXJlRXEoe3R5cGU6IFwiQXJyYXlCaW5kaW5nXCJ9KTtcbjtcbmNvbnN0IGlzT2JqZWN0QmluZGluZ18xMjUyID0gUi53aGVyZUVxKHt0eXBlOiBcIk9iamVjdEJpbmRpbmdcIn0pO1xuO1xuY29uc3QgaXNCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXzEyNTMgPSBSLndoZXJlRXEoe3R5cGU6IFwiQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllclwifSk7XG47XG5jb25zdCBpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzEyNTQgPSBSLndoZXJlRXEoe3R5cGU6IFwiQmluZGluZ1Byb3BlcnR5SWRlbnRpZmllclwifSk7XG47XG5jb25zdCBpc0NsYXNzRXhwcmVzc2lvbl8xMjU1ID0gUi53aGVyZUVxKHt0eXBlOiBcIkNsYXNzRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0NsYXNzRGVjbGFyYXRpb25fMTI1NiA9IFIud2hlcmVFcSh7dHlwZTogXCJDbGFzc0RlY2xhcmF0aW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ2xhc3NFbGVtZW50XzEyNTcgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ2xhc3NFbGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzTW9kdWxlXzEyNTggPSBSLndoZXJlRXEoe3R5cGU6IFwiTW9kdWxlXCJ9KTtcbjtcbmNvbnN0IGlzSW1wb3J0XzEyNTkgPSBSLndoZXJlRXEoe3R5cGU6IFwiSW1wb3J0XCJ9KTtcbjtcbmNvbnN0IGlzSW1wb3J0TmFtZXNwYWNlXzEyNjAgPSBSLndoZXJlRXEoe3R5cGU6IFwiSW1wb3J0TmFtZXNwYWNlXCJ9KTtcbjtcbmNvbnN0IGlzSW1wb3J0U3BlY2lmaWVyXzEyNjEgPSBSLndoZXJlRXEoe3R5cGU6IFwiSW1wb3J0U3BlY2lmaWVyXCJ9KTtcbjtcbmNvbnN0IGlzRXhwb3J0QWxsRnJvbV8xMjYyID0gUi53aGVyZUVxKHt0eXBlOiBcIkV4cG9ydEFsbEZyb21cIn0pO1xuO1xuY29uc3QgaXNFeHBvcnRGcm9tXzEyNjMgPSBSLndoZXJlRXEoe3R5cGU6IFwiRXhwb3J0RnJvbVwifSk7XG47XG5jb25zdCBpc0V4cG9ydF8xMjY0ID0gUi53aGVyZUVxKHt0eXBlOiBcIkV4cG9ydFwifSk7XG47XG5jb25zdCBpc0V4cG9ydERlZmF1bHRfMTI2NSA9IFIud2hlcmVFcSh7dHlwZTogXCJFeHBvcnREZWZhdWx0XCJ9KTtcbjtcbmNvbnN0IGlzRXhwb3J0U3BlY2lmaWVyXzEyNjYgPSBSLndoZXJlRXEoe3R5cGU6IFwiRXhwb3J0U3BlY2lmaWVyXCJ9KTtcbjtcbmNvbnN0IGlzTWV0aG9kXzEyNjcgPSBSLndoZXJlRXEoe3R5cGU6IFwiTWV0aG9kXCJ9KTtcbjtcbmNvbnN0IGlzR2V0dGVyXzEyNjggPSBSLndoZXJlRXEoe3R5cGU6IFwiR2V0dGVyXCJ9KTtcbjtcbmNvbnN0IGlzU2V0dGVyXzEyNjkgPSBSLndoZXJlRXEoe3R5cGU6IFwiU2V0dGVyXCJ9KTtcbjtcbmNvbnN0IGlzRGF0YVByb3BlcnR5XzEyNzAgPSBSLndoZXJlRXEoe3R5cGU6IFwiRGF0YVByb3BlcnR5XCJ9KTtcbjtcbmNvbnN0IGlzU2hvcnRoYW5kUHJvcGVydHlfMTI3MSA9IFIud2hlcmVFcSh7dHlwZTogXCJTaG9ydGhhbmRQcm9wZXJ0eVwifSk7XG47XG5jb25zdCBpc0NvbXB1dGVkUHJvcGVydHlOYW1lXzEyNzIgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ29tcHV0ZWRQcm9wZXJ0eU5hbWVcIn0pO1xuO1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eU5hbWVfMTI3MyA9IFIud2hlcmVFcSh7dHlwZTogXCJTdGF0aWNQcm9wZXJ0eU5hbWVcIn0pO1xuO1xuY29uc3QgaXNMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25fMTI3NCA9IFIud2hlcmVFcSh7dHlwZTogXCJMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNMaXRlcmFsSW5maW5pdHlFeHByZXNzaW9uXzEyNzUgPSBSLndoZXJlRXEoe3R5cGU6IFwiTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0xpdGVyYWxOdWxsRXhwcmVzc2lvbl8xMjc2ID0gUi53aGVyZUVxKHt0eXBlOiBcIkxpdGVyYWxOdWxsRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0xpdGVyYWxOdW1lcmljRXhwcmVzc2lvbl8xMjc3ID0gUi53aGVyZUVxKHt0eXBlOiBcIkxpdGVyYWxOdW1lcmljRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0xpdGVyYWxSZWdFeHBFeHByZXNzaW9uXzEyNzggPSBSLndoZXJlRXEoe3R5cGU6IFwiTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbl8xMjc5ID0gUi53aGVyZUVxKHt0eXBlOiBcIkxpdGVyYWxTdHJpbmdFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQXJyYXlFeHByZXNzaW9uXzEyODAgPSBSLndoZXJlRXEoe3R5cGU6IFwiQXJyYXlFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQXJyb3dFeHByZXNzaW9uXzEyODEgPSBSLndoZXJlRXEoe3R5cGU6IFwiQXJyb3dFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQXNzaWdubWVudEV4cHJlc3Npb25fMTI4MiA9IFIud2hlcmVFcSh7dHlwZTogXCJBc3NpZ25tZW50RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0JpbmFyeUV4cHJlc3Npb25fMTI4MyA9IFIud2hlcmVFcSh7dHlwZTogXCJCaW5hcnlFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ2FsbEV4cHJlc3Npb25fMTI4NCA9IFIud2hlcmVFcSh7dHlwZTogXCJDYWxsRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc0NvbXB1dGVkQXNzaWdubWVudEV4cHJlc3Npb25fMTI4NSA9IFIud2hlcmVFcSh7dHlwZTogXCJDb21wdXRlZEFzc2lnbm1lbnRFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXzEyODYgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQ29uZGl0aW9uYWxFeHByZXNzaW9uXzEyODcgPSBSLndoZXJlRXEoe3R5cGU6IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzRnVuY3Rpb25FeHByZXNzaW9uXzEyODggPSBSLndoZXJlRXEoe3R5cGU6IFwiRnVuY3Rpb25FeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzSWRlbnRpZmllckV4cHJlc3Npb25fMTI4OSA9IFIud2hlcmVFcSh7dHlwZTogXCJJZGVudGlmaWVyRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc05ld0V4cHJlc3Npb25fMTI5MCA9IFIud2hlcmVFcSh7dHlwZTogXCJOZXdFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzTmV3VGFyZ2V0RXhwcmVzc2lvbl8xMjkxID0gUi53aGVyZUVxKHt0eXBlOiBcIk5ld1RhcmdldEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNPYmplY3RFeHByZXNzaW9uXzEyOTIgPSBSLndoZXJlRXEoe3R5cGU6IFwiT2JqZWN0RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc1VuYXJ5RXhwcmVzc2lvbl8xMjkzID0gUi53aGVyZUVxKHt0eXBlOiBcIlVuYXJ5RXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc1N0YXRpY01lbWJlckV4cHJlc3Npb25fMTI5NCA9IFIud2hlcmVFcSh7dHlwZTogXCJTdGF0aWNNZW1iZXJFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzVGVtcGxhdGVFeHByZXNzaW9uXzEyOTUgPSBSLndoZXJlRXEoe3R5cGU6IFwiVGVtcGxhdGVFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzVGhpc0V4cHJlc3Npb25fMTI5NiA9IFIud2hlcmVFcSh7dHlwZTogXCJUaGlzRXhwcmVzc2lvblwifSk7XG47XG5jb25zdCBpc1VwZGF0ZUV4cHJlc3Npb25fMTI5NyA9IFIud2hlcmVFcSh7dHlwZTogXCJVcGRhdGVFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzWWllbGRFeHByZXNzaW9uXzEyOTggPSBSLndoZXJlRXEoe3R5cGU6IFwiWWllbGRFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXzEyOTkgPSBSLndoZXJlRXEoe3R5cGU6IFwiWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXCJ9KTtcbjtcbmNvbnN0IGlzQmxvY2tTdGF0ZW1lbnRfMTMwMCA9IFIud2hlcmVFcSh7dHlwZTogXCJCbG9ja1N0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc0JyZWFrU3RhdGVtZW50XzEzMDEgPSBSLndoZXJlRXEoe3R5cGU6IFwiQnJlYWtTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNDb250aW51ZVN0YXRlbWVudF8xMzAyID0gUi53aGVyZUVxKHt0eXBlOiBcIkNvbnRpbnVlU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzQ29tcG91bmRBc3NpZ25tZW50RXhwcmVzc2lvbl8xMzAzID0gUi53aGVyZUVxKHt0eXBlOiBcIkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNEZWJ1Z2dlclN0YXRlbWVudF8xMzA0ID0gUi53aGVyZUVxKHt0eXBlOiBcIkRlYnVnZ2VyU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzRG9XaGlsZVN0YXRlbWVudF8xMzA1ID0gUi53aGVyZUVxKHt0eXBlOiBcIkRvV2hpbGVTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNFbXB0eVN0YXRlbWVudF8xMzA2ID0gUi53aGVyZUVxKHt0eXBlOiBcIkVtcHR5U3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzRXhwcmVzc2lvblN0YXRlbWVudF8xMzA3ID0gUi53aGVyZUVxKHt0eXBlOiBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNGb3JJblN0YXRlbWVudF8xMzA4ID0gUi53aGVyZUVxKHt0eXBlOiBcIkZvckluU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzRm9yT2ZTdGF0ZW1lbnRfMTMwOSA9IFIud2hlcmVFcSh7dHlwZTogXCJGb3JPZlN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc0ZvclN0YXRlbWVudF8xMzEwID0gUi53aGVyZUVxKHt0eXBlOiBcIkZvclN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc0lmU3RhdGVtZW50XzEzMTEgPSBSLndoZXJlRXEoe3R5cGU6IFwiSWZTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNMYWJlbGVkU3RhdGVtZW50XzEzMTIgPSBSLndoZXJlRXEoe3R5cGU6IFwiTGFiZWxlZFN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1JldHVyblN0YXRlbWVudF8xMzEzID0gUi53aGVyZUVxKHt0eXBlOiBcIlJldHVyblN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1N3aXRjaFN0YXRlbWVudF8xMzE0ID0gUi53aGVyZUVxKHt0eXBlOiBcIlN3aXRjaFN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1N3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0XzEzMTUgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRcIn0pO1xuO1xuY29uc3QgaXNUaHJvd1N0YXRlbWVudF8xMzE2ID0gUi53aGVyZUVxKHt0eXBlOiBcIlRocm93U3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzVHJ5Q2F0Y2hTdGF0ZW1lbnRfMTMxNyA9IFIud2hlcmVFcSh7dHlwZTogXCJUcnlDYXRjaFN0YXRlbWVudFwifSk7XG47XG5jb25zdCBpc1RyeUZpbmFsbHlTdGF0ZW1lbnRfMTMxOCA9IFIud2hlcmVFcSh7dHlwZTogXCJUcnlGaW5hbGx5U3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudF8xMzE5ID0gUi53aGVyZUVxKHt0eXBlOiBcIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNXaGlsZVN0YXRlbWVudF8xMzIwID0gUi53aGVyZUVxKHt0eXBlOiBcIldoaWxlU3RhdGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzV2l0aFN0YXRlbWVudF8xMzIxID0gUi53aGVyZUVxKHt0eXBlOiBcIldpdGhTdGF0ZW1lbnRcIn0pO1xuO1xuY29uc3QgaXNQcmFnbWFfMTMyMiA9IFIud2hlcmVFcSh7dHlwZTogXCJQcmFnbWFcIn0pO1xuO1xuY29uc3QgaXNCbG9ja18xMzIzID0gUi53aGVyZUVxKHt0eXBlOiBcIkJsb2NrXCJ9KTtcbjtcbmNvbnN0IGlzQ2F0Y2hDbGF1c2VfMTMyNCA9IFIud2hlcmVFcSh7dHlwZTogXCJDYXRjaENsYXVzZVwifSk7XG47XG5jb25zdCBpc0RpcmVjdGl2ZV8xMzI1ID0gUi53aGVyZUVxKHt0eXBlOiBcIkRpcmVjdGl2ZVwifSk7XG47XG5jb25zdCBpc0Zvcm1hbFBhcmFtZXRlcnNfMTMyNiA9IFIud2hlcmVFcSh7dHlwZTogXCJGb3JtYWxQYXJhbWV0ZXJzXCJ9KTtcbjtcbmNvbnN0IGlzRnVuY3Rpb25Cb2R5XzEzMjcgPSBSLndoZXJlRXEoe3R5cGU6IFwiRnVuY3Rpb25Cb2R5XCJ9KTtcbjtcbmNvbnN0IGlzRnVuY3Rpb25EZWNsYXJhdGlvbl8xMzI4ID0gUi53aGVyZUVxKHt0eXBlOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0pO1xuO1xuY29uc3QgaXNTY3JpcHRfMTMyOSA9IFIud2hlcmVFcSh7dHlwZTogXCJTY3JpcHRcIn0pO1xuO1xuY29uc3QgaXNTcHJlYWRFbGVtZW50XzEzMzAgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3ByZWFkRWxlbWVudFwifSk7XG47XG5jb25zdCBpc1N1cGVyXzEzMzEgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3VwZXJcIn0pO1xuO1xuY29uc3QgaXNTd2l0Y2hDYXNlXzEzMzIgPSBSLndoZXJlRXEoe3R5cGU6IFwiU3dpdGNoQ2FzZVwifSk7XG47XG5jb25zdCBpc1N3aXRjaERlZmF1bHRfMTMzMyA9IFIud2hlcmVFcSh7dHlwZTogXCJTd2l0Y2hEZWZhdWx0XCJ9KTtcbjtcbmNvbnN0IGlzVGVtcGxhdGVFbGVtZW50XzEzMzQgPSBSLndoZXJlRXEoe3R5cGU6IFwiVGVtcGxhdGVFbGVtZW50XCJ9KTtcbjtcbmNvbnN0IGlzU3ludGF4VGVtcGxhdGVfMTMzNSA9IFIud2hlcmVFcSh7dHlwZTogXCJTeW50YXhUZW1wbGF0ZVwifSk7XG47XG5jb25zdCBpc1ZhcmlhYmxlRGVjbGFyYXRpb25fMTMzNiA9IFIud2hlcmVFcSh7dHlwZTogXCJWYXJpYWJsZURlY2xhcmF0aW9uXCJ9KTtcbjtcbmNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdG9yXzEzMzcgPSBSLndoZXJlRXEoe3R5cGU6IFwiVmFyaWFibGVEZWNsYXJhdG9yXCJ9KTtcbjtcbmNvbnN0IGlzRU9GXzEzMzggPSBSLndoZXJlRXEoe3R5cGU6IFwiRU9GXCJ9KTtcbjtcbmNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb25fMTMzOSA9IFIuYm90aChpc1ZhcmlhYmxlRGVjbGFyYXRpb25fMTMzNiwgUi53aGVyZUVxKHtraW5kOiBcInN5bnRheFwifSkpO1xuO1xuY29uc3QgaXNTeW50YXhyZWNEZWNsYXJhdGlvbl8xMzQwID0gUi5ib3RoKGlzVmFyaWFibGVEZWNsYXJhdGlvbl8xMzM2LCBSLndoZXJlRXEoe2tpbmQ6IFwic3ludGF4cmVjXCJ9KSk7XG47XG5jb25zdCBpc0Z1bmN0aW9uVGVybV8xMzQxID0gUi5laXRoZXIoaXNGdW5jdGlvbkRlY2xhcmF0aW9uXzEzMjgsIGlzRnVuY3Rpb25FeHByZXNzaW9uXzEyODgpO1xuO1xuY29uc3QgaXNGdW5jdGlvbldpdGhOYW1lXzEzNDIgPSBSLmFuZChpc0Z1bmN0aW9uVGVybV8xMzQxLCBSLmNvbXBsZW1lbnQoUi53aGVyZSh7bmFtZTogUi5pc05pbH0pKSk7XG47XG5jb25zdCBpc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzEzNDMgPSBSLndoZXJlRXEoe3R5cGU6IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIn0pO1xuO1xuY29uc3QgaXNFeHBvcnRTeW50YXhfMTM0NCA9IFIuYm90aChpc0V4cG9ydF8xMjY0LCBleHBfMTM2OSA9PiBSLm9yKGlzU3ludGF4RGVjbGFyYXRpb25fMTMzOShleHBfMTM2OS5kZWNsYXJhdGlvbiksIGlzU3ludGF4cmVjRGVjbGFyYXRpb25fMTM0MChleHBfMTM2OS5kZWNsYXJhdGlvbikpKTtcbjtcbmNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb25TdGF0ZW1lbnRfMTM0NSA9IFIuYm90aChpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfMTMxOSwgZGVjbF8xMzcwID0+IGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbl8xMzQ2KGRlY2xfMTM3MC5kZWNsYXJhdGlvbikpO1xuO1xuY29uc3QgaXNDb21waWxldGltZURlY2xhcmF0aW9uXzEzNDYgPSBSLmVpdGhlcihpc1N5bnRheERlY2xhcmF0aW9uXzEzMzksIGlzU3ludGF4cmVjRGVjbGFyYXRpb25fMTM0MCk7XG47XG5jb25zdCBpc0NvbXBpbGV0aW1lU3RhdGVtZW50XzEzNDcgPSB0ZXJtXzEzNzEgPT4ge1xuICByZXR1cm4gdGVybV8xMzcxIGluc3RhbmNlb2YgVGVybSAmJiBpc1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRfMTMxOSh0ZXJtXzEzNzEpICYmIGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbl8xMzQ2KHRlcm1fMTM3MS5kZWNsYXJhdGlvbik7XG59O1xuO1xuY29uc3QgaXNJbXBvcnREZWNsYXJhdGlvbl8xMzQ4ID0gUi5laXRoZXIoaXNJbXBvcnRfMTI1OSwgaXNJbXBvcnROYW1lc3BhY2VfMTI2MCk7XG47XG5leHBvcnQge2lzQmluZGluZ1dpdGhEZWZhdWx0XzEyNDkgYXMgaXNCaW5kaW5nV2l0aERlZmF1bHR9O1xuZXhwb3J0IHtpc0JpbmRpbmdJZGVudGlmaWVyXzEyNTAgYXMgaXNCaW5kaW5nSWRlbnRpZmllcn07XG5leHBvcnQge2lzQXJyYXlCaW5kaW5nXzEyNTEgYXMgaXNBcnJheUJpbmRpbmd9O1xuZXhwb3J0IHtpc09iamVjdEJpbmRpbmdfMTI1MiBhcyBpc09iamVjdEJpbmRpbmd9O1xuZXhwb3J0IHtpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJfMTI1MyBhcyBpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJ9O1xuZXhwb3J0IHtpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5XzEyNTQgYXMgaXNCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eX07XG5leHBvcnQge2lzQ2xhc3NFeHByZXNzaW9uXzEyNTUgYXMgaXNDbGFzc0V4cHJlc3Npb259O1xuZXhwb3J0IHtpc0NsYXNzRGVjbGFyYXRpb25fMTI1NiBhcyBpc0NsYXNzRGVjbGFyYXRpb259O1xuZXhwb3J0IHtpc0NsYXNzRWxlbWVudF8xMjU3IGFzIGlzQ2xhc3NFbGVtZW50fTtcbmV4cG9ydCB7aXNNb2R1bGVfMTI1OCBhcyBpc01vZHVsZX07XG5leHBvcnQge2lzSW1wb3J0XzEyNTkgYXMgaXNJbXBvcnR9O1xuZXhwb3J0IHtpc0ltcG9ydE5hbWVzcGFjZV8xMjYwIGFzIGlzSW1wb3J0TmFtZXNwYWNlfTtcbmV4cG9ydCB7aXNJbXBvcnRTcGVjaWZpZXJfMTI2MSBhcyBpc0ltcG9ydFNwZWNpZmllcn07XG5leHBvcnQge2lzRXhwb3J0QWxsRnJvbV8xMjYyIGFzIGlzRXhwb3J0QWxsRnJvbX07XG5leHBvcnQge2lzRXhwb3J0RnJvbV8xMjYzIGFzIGlzRXhwb3J0RnJvbX07XG5leHBvcnQge2lzRXhwb3J0XzEyNjQgYXMgaXNFeHBvcnR9O1xuZXhwb3J0IHtpc0V4cG9ydERlZmF1bHRfMTI2NSBhcyBpc0V4cG9ydERlZmF1bHR9O1xuZXhwb3J0IHtpc0V4cG9ydFNwZWNpZmllcl8xMjY2IGFzIGlzRXhwb3J0U3BlY2lmaWVyfTtcbmV4cG9ydCB7aXNNZXRob2RfMTI2NyBhcyBpc01ldGhvZH07XG5leHBvcnQge2lzR2V0dGVyXzEyNjggYXMgaXNHZXR0ZXJ9O1xuZXhwb3J0IHtpc1NldHRlcl8xMjY5IGFzIGlzU2V0dGVyfTtcbmV4cG9ydCB7aXNEYXRhUHJvcGVydHlfMTI3MCBhcyBpc0RhdGFQcm9wZXJ0eX07XG5leHBvcnQge2lzU2hvcnRoYW5kUHJvcGVydHlfMTI3MSBhcyBpc1Nob3J0aGFuZFByb3BlcnR5fTtcbmV4cG9ydCB7aXNDb21wdXRlZFByb3BlcnR5TmFtZV8xMjcyIGFzIGlzQ29tcHV0ZWRQcm9wZXJ0eU5hbWV9O1xuZXhwb3J0IHtpc1N0YXRpY1Byb3BlcnR5TmFtZV8xMjczIGFzIGlzU3RhdGljUHJvcGVydHlOYW1lfTtcbmV4cG9ydCB7aXNMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb25fMTI3NCBhcyBpc0xpdGVyYWxCb29sZWFuRXhwcmVzc2lvbn07XG5leHBvcnQge2lzTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbl8xMjc1IGFzIGlzTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbn07XG5leHBvcnQge2lzTGl0ZXJhbE51bGxFeHByZXNzaW9uXzEyNzYgYXMgaXNMaXRlcmFsTnVsbEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0xpdGVyYWxOdW1lcmljRXhwcmVzc2lvbl8xMjc3IGFzIGlzTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNMaXRlcmFsUmVnRXhwRXhwcmVzc2lvbl8xMjc4IGFzIGlzTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0xpdGVyYWxTdHJpbmdFeHByZXNzaW9uXzEyNzkgYXMgaXNMaXRlcmFsU3RyaW5nRXhwcmVzc2lvbn07XG5leHBvcnQge2lzQXJyYXlFeHByZXNzaW9uXzEyODAgYXMgaXNBcnJheUV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0Fycm93RXhwcmVzc2lvbl8xMjgxIGFzIGlzQXJyb3dFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNBc3NpZ25tZW50RXhwcmVzc2lvbl8xMjgyIGFzIGlzQXNzaWdubWVudEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0JpbmFyeUV4cHJlc3Npb25fMTI4MyBhcyBpc0JpbmFyeUV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0NhbGxFeHByZXNzaW9uXzEyODQgYXMgaXNDYWxsRXhwcmVzc2lvbn07XG5leHBvcnQge2lzQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbl8xMjg1IGFzIGlzQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbn07XG5leHBvcnQge2lzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uXzEyODYgYXMgaXNDb21wdXRlZE1lbWJlckV4cHJlc3Npb259O1xuZXhwb3J0IHtpc0NvbmRpdGlvbmFsRXhwcmVzc2lvbl8xMjg3IGFzIGlzQ29uZGl0aW9uYWxFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNGdW5jdGlvbkV4cHJlc3Npb25fMTI4OCBhcyBpc0Z1bmN0aW9uRXhwcmVzc2lvbn07XG5leHBvcnQge2lzSWRlbnRpZmllckV4cHJlc3Npb25fMTI4OSBhcyBpc0lkZW50aWZpZXJFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNOZXdFeHByZXNzaW9uXzEyOTAgYXMgaXNOZXdFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNOZXdUYXJnZXRFeHByZXNzaW9uXzEyOTEgYXMgaXNOZXdUYXJnZXRFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNPYmplY3RFeHByZXNzaW9uXzEyOTIgYXMgaXNPYmplY3RFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNVbmFyeUV4cHJlc3Npb25fMTI5MyBhcyBpc1VuYXJ5RXhwcmVzc2lvbn07XG5leHBvcnQge2lzU3RhdGljTWVtYmVyRXhwcmVzc2lvbl8xMjk0IGFzIGlzU3RhdGljTWVtYmVyRXhwcmVzc2lvbn07XG5leHBvcnQge2lzVGVtcGxhdGVFeHByZXNzaW9uXzEyOTUgYXMgaXNUZW1wbGF0ZUV4cHJlc3Npb259O1xuZXhwb3J0IHtpc1RoaXNFeHByZXNzaW9uXzEyOTYgYXMgaXNUaGlzRXhwcmVzc2lvbn07XG5leHBvcnQge2lzVXBkYXRlRXhwcmVzc2lvbl8xMjk3IGFzIGlzVXBkYXRlRXhwcmVzc2lvbn07XG5leHBvcnQge2lzWWllbGRFeHByZXNzaW9uXzEyOTggYXMgaXNZaWVsZEV4cHJlc3Npb259O1xuZXhwb3J0IHtpc1lpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbl8xMjk5IGFzIGlzWWllbGRHZW5lcmF0b3JFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNCbG9ja1N0YXRlbWVudF8xMzAwIGFzIGlzQmxvY2tTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0JyZWFrU3RhdGVtZW50XzEzMDEgYXMgaXNCcmVha1N0YXRlbWVudH07XG5leHBvcnQge2lzQ29udGludWVTdGF0ZW1lbnRfMTMwMiBhcyBpc0NvbnRpbnVlU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9uXzEzMDMgYXMgaXNDb21wb3VuZEFzc2lnbm1lbnRFeHByZXNzaW9ufTtcbmV4cG9ydCB7aXNEZWJ1Z2dlclN0YXRlbWVudF8xMzA0IGFzIGlzRGVidWdnZXJTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0RvV2hpbGVTdGF0ZW1lbnRfMTMwNSBhcyBpc0RvV2hpbGVTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0VtcHR5U3RhdGVtZW50XzEzMDYgYXMgaXNFbXB0eVN0YXRlbWVudH07XG5leHBvcnQge2lzRXhwcmVzc2lvblN0YXRlbWVudF8xMzA3IGFzIGlzRXhwcmVzc2lvblN0YXRlbWVudH07XG5leHBvcnQge2lzRm9ySW5TdGF0ZW1lbnRfMTMwOCBhcyBpc0ZvckluU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNGb3JPZlN0YXRlbWVudF8xMzA5IGFzIGlzRm9yT2ZTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0ZvclN0YXRlbWVudF8xMzEwIGFzIGlzRm9yU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNJZlN0YXRlbWVudF8xMzExIGFzIGlzSWZTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc0xhYmVsZWRTdGF0ZW1lbnRfMTMxMiBhcyBpc0xhYmVsZWRTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc1JldHVyblN0YXRlbWVudF8xMzEzIGFzIGlzUmV0dXJuU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNTd2l0Y2hTdGF0ZW1lbnRfMTMxNCBhcyBpc1N3aXRjaFN0YXRlbWVudH07XG5leHBvcnQge2lzU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRfMTMxNSBhcyBpc1N3aXRjaFN0YXRlbWVudFdpdGhEZWZhdWx0fTtcbmV4cG9ydCB7aXNUaHJvd1N0YXRlbWVudF8xMzE2IGFzIGlzVGhyb3dTdGF0ZW1lbnR9O1xuZXhwb3J0IHtpc1RyeUNhdGNoU3RhdGVtZW50XzEzMTcgYXMgaXNUcnlDYXRjaFN0YXRlbWVudH07XG5leHBvcnQge2lzVHJ5RmluYWxseVN0YXRlbWVudF8xMzE4IGFzIGlzVHJ5RmluYWxseVN0YXRlbWVudH07XG5leHBvcnQge2lzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudF8xMzE5IGFzIGlzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudH07XG5leHBvcnQge2lzV2hpbGVTdGF0ZW1lbnRfMTMyMCBhcyBpc1doaWxlU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNXaXRoU3RhdGVtZW50XzEzMjEgYXMgaXNXaXRoU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNQcmFnbWFfMTMyMiBhcyBpc1ByYWdtYX07XG5leHBvcnQge2lzQmxvY2tfMTMyMyBhcyBpc0Jsb2NrfTtcbmV4cG9ydCB7aXNDYXRjaENsYXVzZV8xMzI0IGFzIGlzQ2F0Y2hDbGF1c2V9O1xuZXhwb3J0IHtpc0RpcmVjdGl2ZV8xMzI1IGFzIGlzRGlyZWN0aXZlfTtcbmV4cG9ydCB7aXNGb3JtYWxQYXJhbWV0ZXJzXzEzMjYgYXMgaXNGb3JtYWxQYXJhbWV0ZXJzfTtcbmV4cG9ydCB7aXNGdW5jdGlvbkJvZHlfMTMyNyBhcyBpc0Z1bmN0aW9uQm9keX07XG5leHBvcnQge2lzRnVuY3Rpb25EZWNsYXJhdGlvbl8xMzI4IGFzIGlzRnVuY3Rpb25EZWNsYXJhdGlvbn07XG5leHBvcnQge2lzU2NyaXB0XzEzMjkgYXMgaXNTY3JpcHR9O1xuZXhwb3J0IHtpc1NwcmVhZEVsZW1lbnRfMTMzMCBhcyBpc1NwcmVhZEVsZW1lbnR9O1xuZXhwb3J0IHtpc1N1cGVyXzEzMzEgYXMgaXNTdXBlcn07XG5leHBvcnQge2lzU3dpdGNoQ2FzZV8xMzMyIGFzIGlzU3dpdGNoQ2FzZX07XG5leHBvcnQge2lzU3dpdGNoRGVmYXVsdF8xMzMzIGFzIGlzU3dpdGNoRGVmYXVsdH07XG5leHBvcnQge2lzVGVtcGxhdGVFbGVtZW50XzEzMzQgYXMgaXNUZW1wbGF0ZUVsZW1lbnR9O1xuZXhwb3J0IHtpc1N5bnRheFRlbXBsYXRlXzEzMzUgYXMgaXNTeW50YXhUZW1wbGF0ZX07XG5leHBvcnQge2lzVmFyaWFibGVEZWNsYXJhdGlvbl8xMzM2IGFzIGlzVmFyaWFibGVEZWNsYXJhdGlvbn07XG5leHBvcnQge2lzVmFyaWFibGVEZWNsYXJhdG9yXzEzMzcgYXMgaXNWYXJpYWJsZURlY2xhcmF0b3J9O1xuZXhwb3J0IHtpc0VPRl8xMzM4IGFzIGlzRU9GfTtcbmV4cG9ydCB7aXNTeW50YXhEZWNsYXJhdGlvbl8xMzM5IGFzIGlzU3ludGF4RGVjbGFyYXRpb259O1xuZXhwb3J0IHtpc1N5bnRheHJlY0RlY2xhcmF0aW9uXzEzNDAgYXMgaXNTeW50YXhyZWNEZWNsYXJhdGlvbn07XG5leHBvcnQge2lzRnVuY3Rpb25UZXJtXzEzNDEgYXMgaXNGdW5jdGlvblRlcm19O1xuZXhwb3J0IHtpc0Z1bmN0aW9uV2l0aE5hbWVfMTM0MiBhcyBpc0Z1bmN0aW9uV2l0aE5hbWV9O1xuZXhwb3J0IHtpc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzEzNDMgYXMgaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbn07XG5leHBvcnQge2lzRXhwb3J0U3ludGF4XzEzNDQgYXMgaXNFeHBvcnRTeW50YXh9O1xuZXhwb3J0IHtpc1N5bnRheERlY2xhcmF0aW9uU3RhdGVtZW50XzEzNDUgYXMgaXNTeW50YXhEZWNsYXJhdGlvblN0YXRlbWVudH07XG5leHBvcnQge2lzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbl8xMzQ2IGFzIGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbn07XG5leHBvcnQge2lzQ29tcGlsZXRpbWVTdGF0ZW1lbnRfMTM0NyBhcyBpc0NvbXBpbGV0aW1lU3RhdGVtZW50fTtcbmV4cG9ydCB7aXNJbXBvcnREZWNsYXJhdGlvbl8xMzQ4IGFzIGlzSW1wb3J0RGVjbGFyYXRpb259Il19 \ No newline at end of file +const isImportDeclaration = exports.isImportDeclaration = R.either(isImport, isImportNamespace); +//# sourceMappingURL=data:application/json;base64,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LEVBQW1CLGlCQUFuQixDQUE1QiIsImZpbGUiOiJ0ZXJtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpc3QgfSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgKiBhcyBSIGZyb20gXCJyYW1kYVwiO1xuaW1wb3J0IFRlcm1TcGVjIGZyb20gJ3N3ZWV0LXNwZWMnO1xuXG5jb25zdCBhdHRyTmFtZSA9IGEgPT4gYS5hdHRyTmFtZTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVybSB7XG4gIHR5cGU6IHN0cmluZztcbiAgbG9jOiBudWxsO1xuICBzcGVjOiB0eXBlb2YgVGVybVNwZWM7XG5cbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBwcm9wczoge30pIHtcbiAgICBsZXQgc3BlYyA9IFRlcm1TcGVjLmdldERlc2NlbmRhbnQodHlwZSk7XG4gICAgaWYgKHNwZWMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRlcm06ICR7dHlwZX1gKTtcbiAgICB9XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmxvYyA9IG51bGw7XG4gICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICBsZXQgcHJvcEtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgbGV0IGZpZWxkTmFtZXMgPSBzcGVjLmdldEF0dHJpYnV0ZXMoKS5tYXAoYXR0ck5hbWUpO1xuICAgIGxldCBkaWZmID0gUi5zeW1tZXRyaWNEaWZmZXJlbmNlKHByb3BLZXlzLCBmaWVsZE5hbWVzKTtcbiAgICBpZiAoZGlmZi5sZW5ndGggIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIGZvciB0ZXJtICR7dHlwZX06ICR7ZGlmZn1gKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBwcm9wcyk7XG4gIH1cblxuICBleHRlbmQocHJvcHM6IHt9KSB7XG4gICAgbGV0IHNwZWNBdHRyTmFtZXMgPSB0aGlzLnNwZWMuZ2V0QXR0cmlidXRlcygpLm1hcChhdHRyTmFtZSk7XG4gICAgbGV0IG5ld1Byb3BzID0gUi5waWNrKHNwZWNBdHRyTmFtZXMsIHRoaXMpO1xuXG4gICAgbGV0IGludmFsaWRBdHRycyA9IFIuZGlmZmVyZW5jZShPYmplY3Qua2V5cyhwcm9wcyksIHNwZWNBdHRyTmFtZXMpO1xuICAgIGlmIChpbnZhbGlkQXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgZm9yIHRlcm0gJHt0aGlzLnR5cGV9OiAke2ludmFsaWRBdHRyc31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRlcm0odGhpcy50eXBlLCBPYmplY3QuYXNzaWduKG5ld1Byb3BzLCBwcm9wcykpO1xuICB9XG5cbiAgLy8gVE9ETzogcmVtb3ZlXG4gIGdlbihpbmNsdWRlSW1wb3J0czogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBsZXQgbmV4dCA9IHt9O1xuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuc3BlYy5nZXRBdHRyaWJ1dGVzKCkpIHtcbiAgICAgIGlmICh0aGlzW2ZpZWxkLmF0dHJOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpc1tmaWVsZC5hdHRyTmFtZV0gaW5zdGFuY2VvZiBUZXJtKSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gdGhpc1tmaWVsZC5hdHRyTmFtZV0uZ2VuKGluY2x1ZGVJbXBvcnRzKTtcbiAgICAgIH0gZWxzZSBpZiAoTGlzdC5pc0xpc3QodGhpc1tmaWVsZC5hdHRyTmFtZV0pKSB7XG4gICAgICAgIGxldCBwcmVkID0gaW5jbHVkZUltcG9ydHMgPyBSLmNvbXBsZW1lbnQoaXNDb21waWxldGltZVN0YXRlbWVudCkgOiBSLmJvdGgoUi5jb21wbGVtZW50KGlzSW1wb3J0RGVjbGFyYXRpb24pLCBSLmNvbXBsZW1lbnQoaXNDb21waWxldGltZVN0YXRlbWVudCkpO1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IHRoaXNbZmllbGQuYXR0ck5hbWVdLmZpbHRlcihwcmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBUZXJtID8gdGVybS5nZW4oaW5jbHVkZUltcG9ydHMpIDogdGVybSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IHRoaXNbZmllbGQuYXR0ck5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlcm0odGhpcy50eXBlLCBuZXh0KTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZVxuICB2aXNpdChmKSB7XG4gICAgbGV0IG5leHQgPSB7fTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5nZXREZXNjZW5kYW50KHRoaXMudHlwZSkuZ2V0QXR0cmlidXRlcygpKSB7XG4gICAgICBpZiAodGhpc1tmaWVsZC5hdHRyTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKExpc3QuaXNMaXN0KHRoaXNbZmllbGQuYXR0ck5hbWVdKSkge1xuICAgICAgICBuZXh0W2ZpZWxkLmF0dHJOYW1lXSA9IHRoaXNbZmllbGQuYXR0ck5hbWVdLm1hcChmaWVsZCA9PiBmaWVsZCAhPSBudWxsID8gZihmaWVsZCkgOiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gZih0aGlzW2ZpZWxkLmF0dHJOYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4dGVuZChuZXh0KTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZVxuICBhZGRTY29wZShzY29wZSwgYmluZGluZ3MsIHBoYXNlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXQodGVybSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRlcm0uYWRkU2NvcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRlcm0uYWRkU2NvcGUoc2NvcGUsIGJpbmRpbmdzLCBwaGFzZSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZVxuICByZW1vdmVTY29wZShzY29wZSwgcGhhc2UpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpdCh0ZXJtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGVybS5yZW1vdmVTY29wZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGVybS5yZW1vdmVTY29wZShzY29wZSwgcGhhc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfSk7XG4gIH1cblxuICAvLyBUT0RPOiB0aGlzIGlzIHZlcnkgd3JvbmdcbiAgbGluZU51bWJlcigpIHtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBUZXJtU3BlYy5nZXREZXNjZW5kYW50KHRoaXMudHlwZSkuZ2V0QXR0cmlidXRlcygpKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXNbZmllbGQuYXR0ck5hbWVdICYmIHRoaXNbZmllbGQuYXR0ck5hbWVdLmxpbmVOdW1iZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbZmllbGQuYXR0ck5hbWVdLmxpbmVOdW1iZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRMaW5lTnVtYmVyKGxpbmUpIHtcbiAgICBsZXQgbmV4dCA9IHt9O1xuICAgIGZvciAobGV0IGZpZWxkIG9mIFRlcm1TcGVjLmdldERlc2NlbmRhbnQodGhpcy50eXBlKS5nZXRBdHRyaWJ1dGVzKCkpIHtcbiAgICAgIGlmICh0aGlzW2ZpZWxkLmF0dHJOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIG5leHRbZmllbGQuYXR0ck5hbWVdID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXNbZmllbGQuYXR0ck5hbWVdLnNldExpbmVOdW1iZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmV4dFtmaWVsZC5hdHRyTmFtZV0gPSB0aGlzW2ZpZWxkLmF0dHJOYW1lXS5zZXRMaW5lTnVtYmVyKGxpbmUpO1xuICAgICAgfSBlbHNlIGlmIChMaXN0LmlzTGlzdCh0aGlzW2ZpZWxkLmF0dHJOYW1lXSkpIHtcbiAgICAgICAgbmV4dFtmaWVsZC5hdHRyTmFtZV0gPSB0aGlzW2ZpZWxkLmF0dHJOYW1lXS5tYXAoZiA9PiBmLnNldExpbmVOdW1iZXIobGluZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFtmaWVsZC5hdHRyTmFtZV0gPSB0aGlzW2ZpZWxkLmF0dHJOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXJtKHRoaXMudHlwZSwgbmV4dCk7XG4gIH1cbn1cblxuXG4vLyBiaW5kaW5nc1xuZXhwb3J0IGNvbnN0IGlzQmluZGluZ1dpdGhEZWZhdWx0ID0gUi53aGVyZUVxKHsgdHlwZTogXCJCaW5kaW5nV2l0aERlZmF1bHRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmRpbmdJZGVudGlmaWVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJCaW5kaW5nSWRlbnRpZmllclwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQXJyYXlCaW5kaW5nID0gUi53aGVyZUVxKHsgdHlwZTogXCJBcnJheUJpbmRpbmdcIiB9KTtcbmV4cG9ydCBjb25zdCBpc09iamVjdEJpbmRpbmcgPSBSLndoZXJlRXEoeyB0eXBlOiBcIk9iamVjdEJpbmRpbmdcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXIgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJpbmRpbmdQcm9wZXJ0eUlkZW50aWZpZXJcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmRpbmdQcm9wZXJ0eVByb3BlcnR5ID0gUi53aGVyZUVxKHsgdHlwZTogXCJCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyXCIgfSk7XG5cbi8vIGNsYXNzXG5leHBvcnQgY29uc3QgaXNDbGFzc0V4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkNsYXNzRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ2xhc3NEZWNsYXJhdGlvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ2xhc3NEZWNsYXJhdGlvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ2xhc3NFbGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJDbGFzc0VsZW1lbnRcIiB9KTtcblxuLy8gbW9kdWxlc1xuZXhwb3J0IGNvbnN0IGlzTW9kdWxlID0gUi53aGVyZUVxKHsgdHlwZTogXCJNb2R1bGVcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0ltcG9ydCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiSW1wb3J0XCIgfSk7XG5leHBvcnQgY29uc3QgaXNJbXBvcnROYW1lc3BhY2UgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkltcG9ydE5hbWVzcGFjZVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzSW1wb3J0U3BlY2lmaWVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJJbXBvcnRTcGVjaWZpZXJcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0V4cG9ydEFsbEZyb20gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkV4cG9ydEFsbEZyb21cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0V4cG9ydEZyb20gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkV4cG9ydEZyb21cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0V4cG9ydCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRXhwb3J0XCIgfSk7XG5leHBvcnQgY29uc3QgaXNFeHBvcnREZWZhdWx0ID0gUi53aGVyZUVxKHsgdHlwZTogXCJFeHBvcnREZWZhdWx0XCIgfSk7XG5leHBvcnQgY29uc3QgaXNFeHBvcnRTcGVjaWZpZXIgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkV4cG9ydFNwZWNpZmllclwiIH0pO1xuXG4vLyBwcm9wZXJ0eSBkZWZpbml0aW9uXG5leHBvcnQgY29uc3QgaXNNZXRob2QgPSBSLndoZXJlRXEoeyB0eXBlOiBcIk1ldGhvZFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzR2V0dGVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJHZXR0ZXJcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1NldHRlciA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU2V0dGVyXCIgfSk7XG5leHBvcnQgY29uc3QgaXNEYXRhUHJvcGVydHkgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkRhdGFQcm9wZXJ0eVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU2hvcnRoYW5kUHJvcGVydHkgPSBSLndoZXJlRXEoeyB0eXBlOiBcIlNob3J0aGFuZFByb3BlcnR5XCIgfSk7XG5leHBvcnQgY29uc3QgaXNDb21wdXRlZFByb3BlcnR5TmFtZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29tcHV0ZWRQcm9wZXJ0eU5hbWVcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N0YXRpY1Byb3BlcnR5TmFtZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3RhdGljUHJvcGVydHlOYW1lXCIgfSk7XG5cbi8vIGxpdGVyYWxzXG5leHBvcnQgY29uc3QgaXNMaXRlcmFsQm9vbGVhbkV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkxpdGVyYWxCb29sZWFuRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGl0ZXJhbEluZmluaXR5RXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzTGl0ZXJhbE51bGxFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJMaXRlcmFsTnVsbEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0xpdGVyYWxOdW1lcmljRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGl0ZXJhbE51bWVyaWNFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNMaXRlcmFsUmVnRXhwRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGl0ZXJhbFJlZ0V4cEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0xpdGVyYWxTdHJpbmdFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJMaXRlcmFsU3RyaW5nRXhwcmVzc2lvblwiIH0pO1xuXG4vLyBleHByZXNzaW9uc1xuZXhwb3J0IGNvbnN0IGlzQXJyYXlFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJBcnJheUV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0Fycm93RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQXJyb3dFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNBc3NpZ25tZW50RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0JpbmFyeUV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJpbmFyeUV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0NhbGxFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJDYWxsRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29tcHV0ZWRBc3NpZ25tZW50RXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJDb21wdXRlZE1lbWJlckV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0NvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNGdW5jdGlvbkV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzSWRlbnRpZmllckV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNOZXdFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJOZXdFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNOZXdUYXJnZXRFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJOZXdUYXJnZXRFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNPYmplY3RFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJPYmplY3RFeHByZXNzaW9uXCIgfSk7XG5leHBvcnQgY29uc3QgaXNVbmFyeUV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIlVuYXJ5RXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3RhdGljTWVtYmVyRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3RhdGljTWVtYmVyRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJUZW1wbGF0ZUV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc1RoaXNFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJUaGlzRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVXBkYXRlRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiVXBkYXRlRXhwcmVzc2lvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzWWllbGRFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogXCJZaWVsZEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc1lpZWxkR2VuZXJhdG9yRXhwcmVzc2lvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiWWllbGRHZW5lcmF0b3JFeHByZXNzaW9uXCIgfSk7XG5cbi8vIHN0YXRlbWVudHNcbmV4cG9ydCBjb25zdCBpc0Jsb2NrU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJCbG9ja1N0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzQnJlYWtTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJyZWFrU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNDb250aW51ZVN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ29udGludWVTdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0NvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb24gPSBSLndoZXJlRXEoeyB0eXBlOiBcIkNvbXBvdW5kQXNzaWdubWVudEV4cHJlc3Npb25cIiB9KTtcbmV4cG9ydCBjb25zdCBpc0RlYnVnZ2VyU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJEZWJ1Z2dlclN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRG9XaGlsZVN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRG9XaGlsZVN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRW1wdHlTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkVtcHR5U3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNFeHByZXNzaW9uU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNGb3JJblN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRm9ySW5TdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0Zvck9mU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJGb3JPZlN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRm9yU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJGb3JTdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0lmU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJJZlN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzTGFiZWxlZFN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiTGFiZWxlZFN0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzUmV0dXJuU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJSZXR1cm5TdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N3aXRjaFN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNTd2l0Y2hTdGF0ZW1lbnRXaXRoRGVmYXVsdCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoU3RhdGVtZW50V2l0aERlZmF1bHRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1Rocm93U3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJUaHJvd1N0YXRlbWVudFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVHJ5Q2F0Y2hTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIlRyeUNhdGNoU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNUcnlGaW5hbGx5U3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJUcnlGaW5hbGx5U3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XCIgfSk7XG5leHBvcnQgY29uc3QgaXNXaGlsZVN0YXRlbWVudCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiV2hpbGVTdGF0ZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1dpdGhTdGF0ZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIldpdGhTdGF0ZW1lbnRcIiB9KTtcblxuLy8gb3RoZXJcbmV4cG9ydCBjb25zdCBpc1ByYWdtYSA9IFIud2hlcmVFcSh7IHR5cGU6ICdQcmFnbWEnIH0pO1xuZXhwb3J0IGNvbnN0IGlzQmxvY2sgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkJsb2NrXCIgfSk7XG5leHBvcnQgY29uc3QgaXNDYXRjaENsYXVzZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiQ2F0Y2hDbGF1c2VcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0RpcmVjdGl2ZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRGlyZWN0aXZlXCIgfSk7XG5leHBvcnQgY29uc3QgaXNGb3JtYWxQYXJhbWV0ZXJzID0gUi53aGVyZUVxKHsgdHlwZTogXCJGb3JtYWxQYXJhbWV0ZXJzXCIgfSk7XG5leHBvcnQgY29uc3QgaXNGdW5jdGlvbkJvZHkgPSBSLndoZXJlRXEoeyB0eXBlOiBcIkZ1bmN0aW9uQm9keVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzRnVuY3Rpb25EZWNsYXJhdGlvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU2NyaXB0ID0gUi53aGVyZUVxKHsgdHlwZTogXCJTY3JpcHRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1NwcmVhZEVsZW1lbnQgPSBSLndoZXJlRXEoeyB0eXBlOiBcIlNwcmVhZEVsZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N1cGVyID0gUi53aGVyZUVxKHsgdHlwZTogXCJTdXBlclwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3dpdGNoQ2FzZSA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoQ2FzZVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3dpdGNoRGVmYXVsdCA9IFIud2hlcmVFcSh7IHR5cGU6IFwiU3dpdGNoRGVmYXVsdFwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVFbGVtZW50ID0gUi53aGVyZUVxKHsgdHlwZTogXCJUZW1wbGF0ZUVsZW1lbnRcIiB9KTtcbmV4cG9ydCBjb25zdCBpc1N5bnRheFRlbXBsYXRlID0gUi53aGVyZUVxKHsgdHlwZTogXCJTeW50YXhUZW1wbGF0ZVwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdGlvbiA9IFIud2hlcmVFcSh7IHR5cGU6IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiIH0pO1xuZXhwb3J0IGNvbnN0IGlzVmFyaWFibGVEZWNsYXJhdG9yID0gUi53aGVyZUVxKHsgdHlwZTogXCJWYXJpYWJsZURlY2xhcmF0b3JcIiB9KTtcbmV4cG9ydCBjb25zdCBpc0VPRiA9IFIud2hlcmVFcSh7IHR5cGU6ICdFT0YnIH0pO1xuZXhwb3J0IGNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb24gPSBSLmJvdGgoaXNWYXJpYWJsZURlY2xhcmF0aW9uLCBSLndoZXJlRXEoeyBraW5kOiAnc3ludGF4JyB9KSk7XG5leHBvcnQgY29uc3QgaXNTeW50YXhyZWNEZWNsYXJhdGlvbiA9IFIuYm90aChpc1ZhcmlhYmxlRGVjbGFyYXRpb24sIFIud2hlcmVFcSh7IGtpbmQ6ICdzeW50YXhyZWMnIH0pKTtcbmV4cG9ydCBjb25zdCBpc0Z1bmN0aW9uVGVybSA9IFIuZWl0aGVyKGlzRnVuY3Rpb25EZWNsYXJhdGlvbiwgaXNGdW5jdGlvbkV4cHJlc3Npb24pO1xuZXhwb3J0IGNvbnN0IGlzRnVuY3Rpb25XaXRoTmFtZSA9IFIuYW5kKGlzRnVuY3Rpb25UZXJtLCBSLmNvbXBsZW1lbnQoUi53aGVyZSh7IG5hbWU6IFIuaXNOaWwgfSkpKTtcbmV4cG9ydCBjb25zdCBpc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gUi53aGVyZUVxKHsgdHlwZTogJ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uJ30pO1xuZXhwb3J0IGNvbnN0IGlzRXhwb3J0U3ludGF4ID0gUi5ib3RoKGlzRXhwb3J0LCBleHAgPT4gUi5vcihpc1N5bnRheERlY2xhcmF0aW9uKGV4cC5kZWNsYXJhdGlvbiksIGlzU3ludGF4cmVjRGVjbGFyYXRpb24oZXhwLmRlY2xhcmF0aW9uKSkpO1xuZXhwb3J0IGNvbnN0IGlzU3ludGF4RGVjbGFyYXRpb25TdGF0ZW1lbnQgPSBSLmJvdGgoaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LCBkZWNsID0+IGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbihkZWNsLmRlY2xhcmF0aW9uKSk7XG5cblxuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbiA9IFIuZWl0aGVyKGlzU3ludGF4RGVjbGFyYXRpb24sIGlzU3ludGF4cmVjRGVjbGFyYXRpb24pO1xuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZXRpbWVTdGF0ZW1lbnQgPSB0ZXJtID0+IHtcbiAgcmV0dXJuICh0ZXJtIGluc3RhbmNlb2YgVGVybSkgJiYgaXNWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRlcm0pICYmIGlzQ29tcGlsZXRpbWVEZWNsYXJhdGlvbih0ZXJtLmRlY2xhcmF0aW9uKTtcbn07XG5leHBvcnQgY29uc3QgaXNJbXBvcnREZWNsYXJhdGlvbiA9IFIuZWl0aGVyKGlzSW1wb3J0LCBpc0ltcG9ydE5hbWVzcGFjZSk7XG4iXX0= \ No newline at end of file diff --git a/dist/token-expander.js b/dist/token-expander.js index 7bc2c5b9..20222231 100644 --- a/dist/token-expander.js +++ b/dist/token-expander.js @@ -12,21 +12,17 @@ var _termExpander = require("./term-expander.js"); var _termExpander2 = _interopRequireDefault(_termExpander); -var _bindingMap = require("./binding-map.js"); - -var _bindingMap2 = _interopRequireDefault(_bindingMap); - var _env = require("./env"); var _env2 = _interopRequireDefault(_env); -var _shiftReader = require("./shift-reader"); +var _ramda = require("ramda"); -var _shiftReader2 = _interopRequireDefault(_shiftReader); +var _ = _interopRequireWildcard(_ramda); var _terms = require("./terms"); -var _terms2 = _interopRequireDefault(_terms); +var T = _interopRequireWildcard(_terms); var _symbol = require("./symbol"); @@ -40,160 +36,239 @@ var _scope = require("./scope"); var _syntax = require("./syntax"); -var _syntax2 = _interopRequireDefault(_syntax); - var _astDispatcher = require("./ast-dispatcher"); var _astDispatcher2 = _interopRequireDefault(_astDispatcher); var _hygieneUtils = require("./hygiene-utils"); -var _ramda = require("ramda"); - -var _ = _interopRequireWildcard(_ramda); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function bindImports_1372(impTerm_1375, exModule_1376, context_1377) { - let names_1378 = []; - let phase_1379 = impTerm_1375.forSyntax ? context_1377.phase + 1 : context_1377.phase; - impTerm_1375.namedImports.forEach(specifier_1380 => { - let name_1381 = specifier_1380.binding.name; - let exportName_1382 = findNameInExports_1373(name_1381, exModule_1376.exportEntries); - if (exportName_1382 != null) { - let newBinding = (0, _symbol.gensym)(name_1381.val()); - context_1377.store.set(newBinding.toString(), new _transforms.VarBindingTransform(name_1381)); - context_1377.bindings.addForward(name_1381, exportName_1382, newBinding, phase_1379); - names_1378.push(name_1381); +function bindImports(impTerm, exModule, context) { + let names = []; + let phase = impTerm.forSyntax ? context.phase + 1 : context.phase; + impTerm.namedImports.forEach(specifier => { + let name = specifier.binding.name; + let exportName = findNameInExports(name, exModule.exportEntries); + if (exportName != null) { + let newBinding = (0, _symbol.gensym)(name.val()); + context.store.set(newBinding.toString(), new _transforms.VarBindingTransform(name)); + context.bindings.addForward(name, exportName, newBinding, phase); + names.push(name); } }); - return (0, _immutable.List)(names_1378); + return (0, _immutable.List)(names); } -function findNameInExports_1373(name_1383, exp_1384) { - let foundNames_1385 = exp_1384.reduce((acc_1386, e_1387) => { - if ((0, _terms.isExportFrom)(e_1387)) { - return acc_1386.concat(e_1387.namedExports.reduce((acc_1388, specifier_1389) => { - if (specifier_1389.exportedName.val() === name_1383.val()) { - return acc_1388.concat(specifier_1389.exportedName); + +function findNameInExports(name, exp) { + let foundNames = exp.reduce((acc, e) => { + if (T.isExportFrom(e)) { + return acc.concat(e.namedExports.reduce((acc, specifier) => { + if (specifier.exportedName.val() === name.val()) { + return acc.concat(specifier.exportedName); } - return acc_1388; + return acc; }, (0, _immutable.List)())); - } else if ((0, _terms.isExport)(e_1387)) { - return acc_1386.concat(e_1387.declaration.declarators.reduce((acc_1390, decl_1391) => { - if (decl_1391.binding.name.val() === name_1383.val()) { - return acc_1390.concat(decl_1391.binding.name); + } else if (T.isExport(e)) { + return acc.concat(e.declaration.declarators.reduce((acc, decl) => { + if (decl.binding.name.val() === name.val()) { + return acc.concat(decl.binding.name); } - return acc_1390; + return acc; }, (0, _immutable.List)())); } - return acc_1386; + return acc; }, (0, _immutable.List)()); - (0, _errors.assert)(foundNames_1385.size <= 1, "expecting no more than 1 matching name in exports"); - return foundNames_1385.get(0); + (0, _errors.assert)(foundNames.size <= 1, 'expecting no more than 1 matching name in exports'); + return foundNames.get(0); } -function removeNames_1374(impTerm_1392, names_1393) { - let namedImports_1394 = impTerm_1392.namedImports.filter(specifier_1395 => !names_1393.contains(specifier_1395.binding.name)); - return impTerm_1392.extend({ namedImports: namedImports_1394 }); + +function removeNames(impTerm, names) { + let namedImports = impTerm.namedImports.filter(specifier => !names.contains(specifier.binding.name)); + return impTerm.extend({ namedImports: namedImports }); } + +// function bindAllSyntaxExports(exModule, toSynth, context) { +// let phase = context.phase; +// exModule.exportEntries.forEach(ex => { +// if (isExportSyntax(ex)) { +// ex.declaration.declarators.forEach(decl => { +// let name = decl.binding.name; +// let newBinding = gensym(name.val()); +// let storeName = exModule.moduleSpecifier + ":" + name.val() + ":" + phase; +// let synthStx = Syntax.fromIdentifier(name.val(), toSynth); +// let storeStx = Syntax.fromIdentifier(storeName, toSynth); +// context.bindings.addForward(synthStx, storeStx, newBinding, phase); +// }); +// } +// }); +// } + class TokenExpander extends _astDispatcher2.default { - constructor(context_1396) { - super("expand", false); - this.context = context_1396; + constructor(context) { + super('expand', false); + this.context = context; } - expand(stxl_1397) { - let result_1398 = []; - if (stxl_1397.size === 0) { - return (0, _immutable.List)(result_1398); + + expand(stxl) { + let result = []; + if (stxl.size === 0) { + return (0, _immutable.List)(result); } - let prev_1399 = (0, _immutable.List)(); - let enf_1400 = new _enforester.Enforester(stxl_1397, prev_1399, this.context); - while (!enf_1400.done) { - result_1398.push(this.dispatch(enf_1400.enforest())); + let prev = (0, _immutable.List)(); + let enf = new _enforester.Enforester(stxl, prev, this.context); + + while (!enf.done) { + result.push(this.dispatch(enf.enforest())); } - return (0, _immutable.List)(result_1398); + + return (0, _immutable.List)(result); } - expandVariableDeclarationStatement(term_1401) { - return term_1401.extend({ declaration: this.registerVariableDeclaration(term_1401.declaration) }); + + expandVariableDeclarationStatement(term) { + return term.extend({ + declaration: this.registerVariableDeclaration(term.declaration) + }); } - expandFunctionDeclaration(term_1402) { - let registeredTerm_1403 = this.registerFunctionOrClass(term_1402); - let stx_1404 = registeredTerm_1403.name.name; - this.context.env.set(stx_1404.resolve(this.context.phase), new _transforms.VarBindingTransform(stx_1404)); - return registeredTerm_1403; + + expandFunctionDeclaration(term) { + let registeredTerm = this.registerFunctionOrClass(term); + let stx = registeredTerm.name.name; + this.context.env.set(stx.resolve(this.context.phase), new _transforms.VarBindingTransform(stx)); + return registeredTerm; } - expandImport(term_1405) { - let path_1406 = term_1405.moduleSpecifier.val(); - let mod_1407; - if (term_1405.forSyntax) { - mod_1407 = this.context.modules.getAtPhase(path_1406, this.context.phase + 1, this.context.cwd); - this.context.store = this.context.modules.visit(mod_1407, this.context.phase + 1, this.context.store); - this.context.store = this.context.modules.invoke(mod_1407, this.context.phase + 1, this.context.store); + + // TODO: think about function expressions + + expandImport(term) { + let path = term.moduleSpecifier.val(); + let mod; + if (term.forSyntax) { + mod = this.context.modules.getAtPhase(path, this.context.phase + 1, this.context.cwd); + this.context.store = this.context.modules.visit(mod, this.context.phase + 1, this.context.store); + this.context.store = this.context.modules.invoke(mod, this.context.phase + 1, this.context.store); } else { - mod_1407 = this.context.modules.getAtPhase(path_1406, this.context.phase, this.context.cwd); - this.context.store = this.context.modules.visit(mod_1407, this.context.phase, this.context.store); + mod = this.context.modules.getAtPhase(path, this.context.phase, this.context.cwd); + this.context.store = this.context.modules.visit(mod, this.context.phase, this.context.store); } - let boundNames_1408 = bindImports_1372(term_1405, mod_1407, this.context); - return removeNames_1374(term_1405, boundNames_1408); + let boundNames = bindImports(term, mod, this.context); + return removeNames(term, boundNames); } - expandExport(term_1409) { - if ((0, _terms.isFunctionDeclaration)(term_1409.declaration) || (0, _terms.isClassDeclaration)(term_1409.declaration)) { - return term_1409.extend({ declaration: this.registerFunctionOrClass(term_1409.declaration) }); - } else if ((0, _terms.isVariableDeclaration)(term_1409.declaration)) { - return term_1409.extend({ declaration: this.registerVariableDeclaration(term_1409.declaration) }); + + expandExport(term) { + if (T.isFunctionDeclaration(term.declaration) || T.isClassDeclaration(term.declaration)) { + return term.extend({ + declaration: this.registerFunctionOrClass(term.declaration) + }); + } else if (T.isVariableDeclaration(term.declaration)) { + return term.extend({ + declaration: this.registerVariableDeclaration(term.declaration) + }); } - return term_1409; + return term; } - registerFunctionOrClass(term_1410) { - let name_1411 = term_1410.name.removeScope(this.context.useScope, this.context.phase); - (0, _hygieneUtils.collectBindings)(term_1410.name).forEach(stx_1412 => { - let newBinding_1413 = (0, _symbol.gensym)(stx_1412.val()); - this.context.bindings.add(stx_1412, { binding: newBinding_1413, phase: this.context.phase, skipDup: false }); - this.context.env.set(newBinding_1413.toString(), new _transforms.VarBindingTransform(stx_1412)); + + // [isPragma, term => { + // let pathStx = term.items.get(0); + // if (pathStx.val() === 'base') { + // return term; + // } + // let mod = this.context.modules.loadAndCompile(pathStx.val()); + // store = this.context.modules.visit(mod, phase, store); + // bindAllSyntaxExports(mod, pathStx, this.context); + // return term; + // }], + + registerFunctionOrClass(term) { + let name = term.name.removeScope(this.context.useScope, this.context.phase); + (0, _hygieneUtils.collectBindings)(term.name).forEach(stx => { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: this.context.phase, + skipDup: false + }); + // the meaning of a function declaration name is a runtime var binding + this.context.env.set(newBinding.toString(), new _transforms.VarBindingTransform(stx)); }); - return term_1410.extend({ name: name_1411 }); + return term.extend({ name: name }); } - registerVariableDeclaration(term_1414) { - if ((0, _terms.isSyntaxDeclaration)(term_1414) || (0, _terms.isSyntaxrecDeclaration)(term_1414)) { - return this.registerSyntaxDeclaration(term_1414); + + registerVariableDeclaration(term) { + if (T.isSyntaxDeclaration(term) || T.isSyntaxrecDeclaration(term)) { + return this.registerSyntaxDeclaration(term); } - return term_1414.extend({ declarators: term_1414.declarators.map(decl_1415 => { - let binding_1416 = decl_1415.binding.removeScope(this.context.useScope, this.context.phase); - (0, _hygieneUtils.collectBindings)(binding_1416).forEach(stx_1417 => { - let newBinding_1418 = (0, _symbol.gensym)(stx_1417.val()); - this.context.bindings.add(stx_1417, { binding: newBinding_1418, phase: this.context.phase, skipDup: term_1414.kind === "var" }); - this.context.env.set(newBinding_1418.toString(), new _transforms.VarBindingTransform(stx_1417)); + return term.extend({ + declarators: term.declarators.map(decl => { + let binding = decl.binding.removeScope(this.context.useScope, this.context.phase); + (0, _hygieneUtils.collectBindings)(binding).forEach(stx => { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: this.context.phase, + skipDup: term.kind === 'var' + }); + // the meaning of a var/let/const declaration is a var binding + this.context.env.set(newBinding.toString(), new _transforms.VarBindingTransform(stx)); }); - return decl_1415.extend({ binding: binding_1416 }); - }) }); + return decl.extend({ binding: binding }); + }) + }); } - registerSyntaxDeclaration(term_1419) { - if ((0, _terms.isSyntaxDeclaration)(term_1419)) { - let scope = (0, _scope.freshScope)("nonrec"); - term_1419 = term_1419.extend({ declarators: term_1419.declarators.map(decl_1420 => { - let name_1421 = decl_1420.binding.name; - let nameAdded_1422 = name_1421.addScope(scope, this.context.bindings, _syntax.ALL_PHASES); - let nameRemoved_1423 = name_1421.removeScope(this.context.currentScope[this.context.currentScope.length - 1], this.context.phase); - let newBinding_1424 = (0, _symbol.gensym)(name_1421.val()); - this.context.bindings.addForward(nameAdded_1422, nameRemoved_1423, newBinding_1424, this.context.phase); - return decl_1420.extend({ init: decl_1420.init.addScope(scope, this.context.bindings, _syntax.ALL_PHASES) }); - }) }); + + registerSyntaxDeclaration(term) { + // syntax id^{a, b} = ^{a, b} + // -> + // syntaxrec id^{a,b,c} = function() { return <> } + // syntaxrec id^{a,b} = ^{a,b,c} + if (T.isSyntaxDeclaration(term)) { + let scope = (0, _scope.freshScope)('nonrec'); + term = term.extend({ + declarators: term.declarators.map(decl => { + let name = decl.binding.name; + let nameAdded = name.addScope(scope, this.context.bindings, _syntax.ALL_PHASES); + let nameRemoved = name.removeScope(this.context.currentScope[this.context.currentScope.length - 1], this.context.phase); + let newBinding = (0, _symbol.gensym)(name.val()); + this.context.bindings.addForward(nameAdded, nameRemoved, newBinding, this.context.phase); + return decl.extend({ + init: decl.init.addScope(scope, this.context.bindings, _syntax.ALL_PHASES) + }); + }) + }); } - return term_1419.extend({ declarators: term_1419.declarators.map(decl_1425 => { - let binding_1426 = decl_1425.binding.removeScope(this.context.useScope, this.context.phase); - let syntaxExpander_1427 = new _termExpander2.default(_.merge(this.context, { phase: this.context.phase + 1, env: new _env2.default(), store: this.context.store })); - let init_1428 = syntaxExpander_1427.expand(decl_1425.init); - let val_1429 = (0, _loadSyntax.evalCompiletimeValue)(init_1428.gen(), _.merge(this.context, { phase: this.context.phase + 1 })); - (0, _hygieneUtils.collectBindings)(binding_1426).forEach(stx_1430 => { - let newBinding_1431 = (0, _symbol.gensym)(stx_1430.val()); - this.context.bindings.add(stx_1430, { binding: newBinding_1431, phase: this.context.phase, skipDup: false }); - let resolvedName_1432 = stx_1430.resolve(this.context.phase); - this.context.env.set(resolvedName_1432, new _transforms.CompiletimeTransform(val_1429)); + + // for syntax declarations we need to load the compiletime value + // into the environment + return term.extend({ + declarators: term.declarators.map(decl => { + let binding = decl.binding.removeScope(this.context.useScope, this.context.phase); + // each compiletime value needs to be expanded with a fresh + // environment and in the next higher phase + let syntaxExpander = new _termExpander2.default(_.merge(this.context, { + phase: this.context.phase + 1, + env: new _env2.default(), + store: this.context.store + })); + let init = syntaxExpander.expand(decl.init); + let val = (0, _loadSyntax.evalCompiletimeValue)(init.gen(), _.merge(this.context, { + phase: this.context.phase + 1 + })); + (0, _hygieneUtils.collectBindings)(binding).forEach(stx => { + let newBinding = (0, _symbol.gensym)(stx.val()); + this.context.bindings.add(stx, { + binding: newBinding, + phase: this.context.phase, + skipDup: false + }); + let resolvedName = stx.resolve(this.context.phase); + this.context.env.set(resolvedName, new _transforms.CompiletimeTransform(val)); }); - return decl_1425.extend({ binding: binding_1426, init: init_1428 }); - }) }); + return decl.extend({ binding: binding, init: init }); + }) + }); } } exports.default = TokenExpander; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3Rva2VuLWV4cGFuZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0lBQWEsQzs7Ozs7O0FBQ2IsU0FBUyxnQkFBVCxDQUEwQixZQUExQixFQUF3QyxhQUF4QyxFQUF1RCxZQUF2RCxFQUFxRTtBQUNuRSxNQUFJLGFBQWEsRUFBakI7QUFDQSxNQUFJLGFBQWEsYUFBYSxTQUFiLEdBQXlCLGFBQWEsS0FBYixHQUFxQixDQUE5QyxHQUFrRCxhQUFhLEtBQWhGO0FBQ0EsZUFBYSxZQUFiLENBQTBCLE9BQTFCLENBQWtDLGtCQUFrQjtBQUNsRCxRQUFJLFlBQVksZUFBZSxPQUFmLENBQXVCLElBQXZDO0FBQ0EsUUFBSSxrQkFBa0IsdUJBQXVCLFNBQXZCLEVBQWtDLGNBQWMsYUFBaEQsQ0FBdEI7QUFDQSxRQUFJLG1CQUFtQixJQUF2QixFQUE2QjtBQUMzQixVQUFJLGFBQWEsb0JBQU8sVUFBVSxHQUFWLEVBQVAsQ0FBakI7QUFDQSxtQkFBYSxLQUFiLENBQW1CLEdBQW5CLENBQXVCLFdBQVcsUUFBWCxFQUF2QixFQUE4QyxvQ0FBd0IsU0FBeEIsQ0FBOUM7QUFDQSxtQkFBYSxRQUFiLENBQXNCLFVBQXRCLENBQWlDLFNBQWpDLEVBQTRDLGVBQTVDLEVBQTZELFVBQTdELEVBQXlFLFVBQXpFO0FBQ0EsaUJBQVcsSUFBWCxDQUFnQixTQUFoQjtBQUNEO0FBQ0YsR0FURDtBQVVBLFNBQU8scUJBQUssVUFBTCxDQUFQO0FBQ0Q7QUFDRCxTQUFTLHNCQUFULENBQWdDLFNBQWhDLEVBQTJDLFFBQTNDLEVBQXFEO0FBQ25ELE1BQUksa0JBQWtCLFNBQVMsTUFBVCxDQUFnQixDQUFDLFFBQUQsRUFBVyxNQUFYLEtBQXNCO0FBQzFELFFBQUks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QUFJLGtCQUFrQixvQkFBTyxTQUFTLEdBQVQsRUFBUCxDQUF0QjtBQUNBLGVBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsR0FBdEIsQ0FBMEIsUUFBMUIsRUFBb0MsRUFBQyxTQUFTLGVBQVYsRUFBMkIsT0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUEvQyxFQUFzRCxTQUFTLEtBQS9ELEVBQXBDO0FBQ0EsY0FBSSxvQkFBb0IsU0FBUyxPQUFULENBQWlCLEtBQUssT0FBTCxDQUFhLEtBQTlCLENBQXhCO0FBQ0EsZUFBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixpQkFBckIsRUFBd0MscUNBQXlCLFFBQXpCLENBQXhDO0FBQ0QsU0FMRDtBQU1BLGVBQU8sVUFBVSxNQUFWLENBQWlCLEVBQUMsU0FBUyxZQUFWLEVBQXdCLE1BQU0sU0FBOUIsRUFBakIsQ0FBUDtBQUNELE9BWnFDLENBQWQsRUFBakIsQ0FBUDtBQWFEO0FBaEdzRDtrQkFBcEMsYSIsImZpbGUiOiJ0b2tlbi1leHBhbmRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHtlbmZvcmVzdEV4cHIsIEVuZm9yZXN0ZXJ9IGZyb20gXCIuL2VuZm9yZXN0ZXJcIjtcbmltcG9ydCBUZXJtRXhwYW5kZXIgZnJvbSBcIi4vdGVybS1leHBhbmRlci5qc1wiO1xuaW1wb3J0IEJpbmRpbmdNYXAgZnJvbSBcIi4vYmluZGluZy1tYXAuanNcIjtcbmltcG9ydCBFbnYgZnJvbSBcIi4vZW52XCI7XG5pbXBvcnQgUmVhZGVyIGZyb20gXCIuL3NoaWZ0LXJlYWRlclwiO1xuaW1wb3J0IFRlcm0sIHtpc0VPRiwgaXNCaW5kaW5nSWRlbnRpZmllciwgaXNCaW5kaW5nUHJvcGVydHlQcm9wZXJ0eSwgaXNCaW5kaW5nUHJvcGVydHlJZGVudGlmaWVyLCBpc09iamVjdEJpbmRpbmcsIGlzQXJyYXlCaW5kaW5nLCBpc0Z1bmN0aW9uRGVjbGFyYXRpb24sIGlzRnVuY3Rpb25FeHByZXNzaW9uLCBpc0Z1bmN0aW9uVGVybSwgaXNGdW5jdGlvbldpdGhOYW1lLCBpc1N5bnRheERlY2xhcmF0aW9uLCBpc1N5bnRheHJlY0RlY2xhcmF0aW9uLCBpc1ZhcmlhYmxlRGVjbGFyYXRpb24sIGlzVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCwgaXNJbXBvcnQsIGlzRXhwb3J0LCBpc0V4cG9ydEZyb20sIGlzUHJhZ21hLCBpc0V4cG9ydFN5bnRheCwgaXNDbGFzc0RlY2xhcmF0aW9ufSBmcm9tIFwiLi90ZXJtc1wiO1xuaW1wb3J0IHtnZW5zeW19IGZyb20gXCIuL3N5bWJvbFwiO1xuaW1wb3J0IHtWYXJCaW5kaW5nVHJhbnNmb3JtLCBDb21waWxldGltZVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3Jtc1wiO1xuaW1wb3J0IHtleHBlY3QsIGFzc2VydH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQge2V2YWxDb21waWxldGltZVZhbHVlfSBmcm9tIFwiLi9sb2FkLXN5bnRheFwiO1xuaW1wb3J0IHtTY29wZSwgZnJlc2hTY29wZX0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCBTeW50YXgsIHtBTExfUEhBU0VTfSBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCBBU1REaXNwYXRjaGVyIGZyb20gXCIuL2FzdC1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge2NvbGxlY3RCaW5kaW5nc30gZnJvbSBcIi4vaHlnaWVuZS11dGlsc1wiO1xuaW1wb3J0ICAqIGFzIF8gZnJvbSBcInJhbWRhXCI7XG5mdW5jdGlvbiBiaW5kSW1wb3J0c18xMzcyKGltcFRlcm1fMTM3NSwgZXhNb2R1bGVfMTM3NiwgY29udGV4dF8xMzc3KSB7XG4gIGxldCBuYW1lc18xMzc4ID0gW107XG4gIGxldCBwaGFzZV8xMzc5ID0gaW1wVGVybV8xMzc1LmZvclN5bnRheCA/IGNvbnRleHRfMTM3Ny5waGFzZSArIDEgOiBjb250ZXh0XzEzNzcucGhhc2U7XG4gIGltcFRlcm1fMTM3NS5uYW1lZEltcG9ydHMuZm9yRWFjaChzcGVjaWZpZXJfMTM4MCA9PiB7XG4gICAgbGV0IG5hbWVfMTM4MSA9IHNwZWNpZmllcl8xMzgwLmJpbmRpbmcubmFtZTtcbiAgICBsZXQgZXhwb3J0TmFtZV8xMzgyID0gZmluZE5hbWVJbkV4cG9ydHNfMTM3MyhuYW1lXzEzODEsIGV4TW9kdWxlXzEzNzYuZXhwb3J0RW50cmllcyk7XG4gICAgaWYgKGV4cG9ydE5hbWVfMTM4MiAhPSBudWxsKSB7XG4gICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lXzEzODEudmFsKCkpO1xuICAgICAgY29udGV4dF8xMzc3LnN0b3JlLnNldChuZXdCaW5kaW5nLnRvU3RyaW5nKCksIG5ldyBWYXJCaW5kaW5nVHJhbnNmb3JtKG5hbWVfMTM4MSkpO1xuICAgICAgY29udGV4dF8xMzc3LmJpbmRpbmdzLmFkZEZvcndhcmQobmFtZV8xMzgxLCBleHBvcnROYW1lXzEzODIsIG5ld0JpbmRpbmcsIHBoYXNlXzEzNzkpO1xuICAgICAgbmFtZXNfMTM3OC5wdXNoKG5hbWVfMTM4MSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIExpc3QobmFtZXNfMTM3OCk7XG59XG5mdW5jdGlvbiBmaW5kTmFtZUluRXhwb3J0c18xMzczKG5hbWVfMTM4MywgZXhwXzEzODQpIHtcbiAgbGV0IGZvdW5kTmFtZXNfMTM4NSA9IGV4cF8xMzg0LnJlZHVjZSgoYWNjXzEzODYsIGVfMTM4NykgPT4ge1xuICAgIGlmIChpc0V4cG9ydEZyb20oZV8xMzg3KSkge1xuICAgICAgcmV0dXJuIGFjY18xMzg2LmNvbmNhdChlXzEzODcubmFtZWRFeHBvcnRzLnJlZHVjZSgoYWNjXzEzODgsIHNwZWNpZmllcl8xMzg5KSA9PiB7XG4gICAgICAgIGlmIChzcGVjaWZpZXJfMTM4OS5leHBvcnRlZE5hbWUudmFsKCkgPT09IG5hbWVfMTM4My52YWwoKSkge1xuICAgICAgICAgIHJldHVybiBhY2NfMTM4OC5jb25jYXQoc3BlY2lmaWVyXzEzODkuZXhwb3J0ZWROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjXzEzODg7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9IGVsc2UgaWYgKGlzRXhwb3J0KGVfMTM4NykpIHtcbiAgICAgIHJldHVybiBhY2NfMTM4Ni5jb25jYXQoZV8xMzg3LmRlY2xhcmF0aW9uLmRlY2xhcmF0b3JzLnJlZHVjZSgoYWNjXzEzOTAsIGRlY2xfMTM5MSkgPT4ge1xuICAgICAgICBpZiAoZGVjbF8xMzkxLmJpbmRpbmcubmFtZS52YWwoKSA9PT0gbmFtZV8xMzgzLnZhbCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY18xMzkwLmNvbmNhdChkZWNsXzEzOTEuYmluZGluZy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjXzEzOTA7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY18xMzg2O1xuICB9LCBMaXN0KCkpO1xuICBhc3NlcnQoZm91bmROYW1lc18xMzg1LnNpemUgPD0gMSwgXCJleHBlY3Rpbmcgbm8gbW9yZSB0aGFuIDEgbWF0Y2hpbmcgbmFtZSBpbiBleHBvcnRzXCIpO1xuICByZXR1cm4gZm91bmROYW1lc18xMzg1LmdldCgwKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzXzEzNzQoaW1wVGVybV8xMzkyLCBuYW1lc18xMzkzKSB7XG4gIGxldCBuYW1lZEltcG9ydHNfMTM5NCA9IGltcFRlcm1fMTM5Mi5uYW1lZEltcG9ydHMuZmlsdGVyKHNwZWNpZmllcl8xMzk1ID0+ICFuYW1lc18xMzkzLmNvbnRhaW5zKHNwZWNpZmllcl8xMzk1LmJpbmRpbmcubmFtZSkpO1xuICByZXR1cm4gaW1wVGVybV8xMzkyLmV4dGVuZCh7bmFtZWRJbXBvcnRzOiBuYW1lZEltcG9ydHNfMTM5NH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5FeHBhbmRlciBleHRlbmRzIEFTVERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0XzEzOTYpIHtcbiAgICBzdXBlcihcImV4cGFuZFwiLCBmYWxzZSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dF8xMzk2O1xuICB9XG4gIGV4cGFuZChzdHhsXzEzOTcpIHtcbiAgICBsZXQgcmVzdWx0XzEzOTggPSBbXTtcbiAgICBpZiAoc3R4bF8xMzk3LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBMaXN0KHJlc3VsdF8xMzk4KTtcbiAgICB9XG4gICAgbGV0IHByZXZfMTM5OSA9IExpc3QoKTtcbiAgICBsZXQgZW5mXzE0MDAgPSBuZXcgRW5mb3Jlc3RlcihzdHhsXzEzOTcsIHByZXZfMTM5OSwgdGhpcy5jb250ZXh0KTtcbiAgICB3aGlsZSAoIWVuZl8xNDAwLmRvbmUpIHtcbiAgICAgIHJlc3VsdF8xMzk4LnB1c2godGhpcy5kaXNwYXRjaChlbmZfMTQwMC5lbmZvcmVzdCgpKSk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0KHJlc3VsdF8xMzk4KTtcbiAgfVxuICBleHBhbmRWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHRlcm1fMTQwMSkge1xuICAgIHJldHVybiB0ZXJtXzE0MDEuZXh0ZW5kKHtkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybV8xNDAxLmRlY2xhcmF0aW9uKX0pO1xuICB9XG4gIGV4cGFuZEZ1bmN0aW9uRGVjbGFyYXRpb24odGVybV8xNDAyKSB7XG4gICAgbGV0IHJlZ2lzdGVyZWRUZXJtXzE0MDMgPSB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PckNsYXNzKHRlcm1fMTQwMik7XG4gICAgbGV0IHN0eF8xNDA0ID0gcmVnaXN0ZXJlZFRlcm1fMTQwMy5uYW1lLm5hbWU7XG4gICAgdGhpcy5jb250ZXh0LmVudi5zZXQoc3R4XzE0MDQucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfMTQwNCkpO1xuICAgIHJldHVybiByZWdpc3RlcmVkVGVybV8xNDAzO1xuICB9XG4gIGV4cGFuZEltcG9ydCh0ZXJtXzE0MDUpIHtcbiAgICBsZXQgcGF0aF8xNDA2ID0gdGVybV8xNDA1Lm1vZHVsZVNwZWNpZmllci52YWwoKTtcbiAgICBsZXQgbW9kXzE0MDc7XG4gICAgaWYgKHRlcm1fMTQwNS5mb3JTeW50YXgpIHtcbiAgICAgIG1vZF8xNDA3ID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuZ2V0QXRQaGFzZShwYXRoXzE0MDYsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMudmlzaXQobW9kXzE0MDcsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5zdG9yZSk7XG4gICAgICB0aGlzLmNvbnRleHQuc3RvcmUgPSB0aGlzLmNvbnRleHQubW9kdWxlcy5pbnZva2UobW9kXzE0MDcsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5zdG9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZF8xNDA3ID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuZ2V0QXRQaGFzZShwYXRoXzE0MDYsIHRoaXMuY29udGV4dC5waGFzZSwgdGhpcy5jb250ZXh0LmN3ZCk7XG4gICAgICB0aGlzLmNvbnRleHQuc3RvcmUgPSB0aGlzLmNvbnRleHQubW9kdWxlcy52aXNpdChtb2RfMTQwNywgdGhpcy5jb250ZXh0LnBoYXNlLCB0aGlzLmNvbnRleHQuc3RvcmUpO1xuICAgIH1cbiAgICBsZXQgYm91bmROYW1lc18xNDA4ID0gYmluZEltcG9ydHNfMTM3Mih0ZXJtXzE0MDUsIG1vZF8xNDA3LCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiByZW1vdmVOYW1lc18xMzc0KHRlcm1fMTQwNSwgYm91bmROYW1lc18xNDA4KTtcbiAgfVxuICBleHBhbmRFeHBvcnQodGVybV8xNDA5KSB7XG4gICAgaWYgKGlzRnVuY3Rpb25EZWNsYXJhdGlvbih0ZXJtXzE0MDkuZGVjbGFyYXRpb24pIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbih0ZXJtXzE0MDkuZGVjbGFyYXRpb24pKSB7XG4gICAgICByZXR1cm4gdGVybV8xNDA5LmV4dGVuZCh7ZGVjbGFyYXRpb246IHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybV8xNDA5LmRlY2xhcmF0aW9uKX0pO1xuICAgIH0gZWxzZSBpZiAoaXNWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm1fMTQwOS5kZWNsYXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB0ZXJtXzE0MDkuZXh0ZW5kKHtkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybV8xNDA5LmRlY2xhcmF0aW9uKX0pO1xuICAgIH1cbiAgICByZXR1cm4gdGVybV8xNDA5O1xuICB9XG4gIHJlZ2lzdGVyRnVuY3Rpb25PckNsYXNzKHRlcm1fMTQxMCkge1xuICAgIGxldCBuYW1lXzE0MTEgPSB0ZXJtXzE0MTAubmFtZS5yZW1vdmVTY29wZSh0aGlzLmNvbnRleHQudXNlU2NvcGUsIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgY29sbGVjdEJpbmRpbmdzKHRlcm1fMTQxMC5uYW1lKS5mb3JFYWNoKHN0eF8xNDEyID0+IHtcbiAgICAgIGxldCBuZXdCaW5kaW5nXzE0MTMgPSBnZW5zeW0oc3R4XzE0MTIudmFsKCkpO1xuICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChzdHhfMTQxMiwge2JpbmRpbmc6IG5ld0JpbmRpbmdfMTQxMywgcGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSwgc2tpcER1cDogZmFsc2V9KTtcbiAgICAgIHRoaXMuY29udGV4dC5lbnYuc2V0KG5ld0JpbmRpbmdfMTQxMy50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHhfMTQxMikpO1xuICAgIH0pO1xuICAgIHJldHVybiB0ZXJtXzE0MTAuZXh0ZW5kKHtuYW1lOiBuYW1lXzE0MTF9KTtcbiAgfVxuICByZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybV8xNDE0KSB7XG4gICAgaWYgKGlzU3ludGF4RGVjbGFyYXRpb24odGVybV8xNDE0KSB8fCBpc1N5bnRheHJlY0RlY2xhcmF0aW9uKHRlcm1fMTQxNCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyU3ludGF4RGVjbGFyYXRpb24odGVybV8xNDE0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm1fMTQxNC5leHRlbmQoe2RlY2xhcmF0b3JzOiB0ZXJtXzE0MTQuZGVjbGFyYXRvcnMubWFwKGRlY2xfMTQxNSA9PiB7XG4gICAgICBsZXQgYmluZGluZ18xNDE2ID0gZGVjbF8xNDE1LmJpbmRpbmcucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LnVzZVNjb3BlLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgY29sbGVjdEJpbmRpbmdzKGJpbmRpbmdfMTQxNikuZm9yRWFjaChzdHhfMTQxNyA9PiB7XG4gICAgICAgIGxldCBuZXdCaW5kaW5nXzE0MTggPSBnZW5zeW0oc3R4XzE0MTcudmFsKCkpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eF8xNDE3LCB7YmluZGluZzogbmV3QmluZGluZ18xNDE4LCBwaGFzZTogdGhpcy5jb250ZXh0LnBoYXNlLCBza2lwRHVwOiB0ZXJtXzE0MTQua2luZCA9PT0gXCJ2YXJcIn0pO1xuICAgICAgICB0aGlzLmNvbnRleHQuZW52LnNldChuZXdCaW5kaW5nXzE0MTgudG9TdHJpbmcoKSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0oc3R4XzE0MTcpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRlY2xfMTQxNS5leHRlbmQoe2JpbmRpbmc6IGJpbmRpbmdfMTQxNn0pO1xuICAgIH0pfSk7XG4gIH1cbiAgcmVnaXN0ZXJTeW50YXhEZWNsYXJhdGlvbih0ZXJtXzE0MTkpIHtcbiAgICBpZiAoaXNTeW50YXhEZWNsYXJhdGlvbih0ZXJtXzE0MTkpKSB7XG4gICAgICBsZXQgc2NvcGUgPSBmcmVzaFNjb3BlKFwibm9ucmVjXCIpO1xuICAgICAgdGVybV8xNDE5ID0gdGVybV8xNDE5LmV4dGVuZCh7ZGVjbGFyYXRvcnM6IHRlcm1fMTQxOS5kZWNsYXJhdG9ycy5tYXAoZGVjbF8xNDIwID0+IHtcbiAgICAgICAgbGV0IG5hbWVfMTQyMSA9IGRlY2xfMTQyMC5iaW5kaW5nLm5hbWU7XG4gICAgICAgIGxldCBuYW1lQWRkZWRfMTQyMiA9IG5hbWVfMTQyMS5hZGRTY29wZShzY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKTtcbiAgICAgICAgbGV0IG5hbWVSZW1vdmVkXzE0MjMgPSBuYW1lXzE0MjEucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LmN1cnJlbnRTY29wZVt0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlLmxlbmd0aCAtIDFdLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgICBsZXQgbmV3QmluZGluZ18xNDI0ID0gZ2Vuc3ltKG5hbWVfMTQyMS52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGRGb3J3YXJkKG5hbWVBZGRlZF8xNDIyLCBuYW1lUmVtb3ZlZF8xNDIzLCBuZXdCaW5kaW5nXzE0MjQsIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgICAgIHJldHVybiBkZWNsXzE0MjAuZXh0ZW5kKHtpbml0OiBkZWNsXzE0MjAuaW5pdC5hZGRTY29wZShzY29wZSwgdGhpcy5jb250ZXh0LmJpbmRpbmdzLCBBTExfUEhBU0VTKX0pO1xuICAgICAgfSl9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm1fMTQxOS5leHRlbmQoe2RlY2xhcmF0b3JzOiB0ZXJtXzE0MTkuZGVjbGFyYXRvcnMubWFwKGRlY2xfMTQyNSA9PiB7XG4gICAgICBsZXQgYmluZGluZ18xNDI2ID0gZGVjbF8xNDI1LmJpbmRpbmcucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LnVzZVNjb3BlLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgbGV0IHN5bnRheEV4cGFuZGVyXzE0MjcgPSBuZXcgVGVybUV4cGFuZGVyKF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7cGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSArIDEsIGVudjogbmV3IEVudiwgc3RvcmU6IHRoaXMuY29udGV4dC5zdG9yZX0pKTtcbiAgICAgIGxldCBpbml0XzE0MjggPSBzeW50YXhFeHBhbmRlcl8xNDI3LmV4cGFuZChkZWNsXzE0MjUuaW5pdCk7XG4gICAgICBsZXQgdmFsXzE0MjkgPSBldmFsQ29tcGlsZXRpbWVWYWx1ZShpbml0XzE0MjguZ2VuKCksIF8ubWVyZ2UodGhpcy5jb250ZXh0LCB7cGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSArIDF9KSk7XG4gICAgICBjb2xsZWN0QmluZGluZ3MoYmluZGluZ18xNDI2KS5mb3JFYWNoKHN0eF8xNDMwID0+IHtcbiAgICAgICAgbGV0IG5ld0JpbmRpbmdfMTQzMSA9IGdlbnN5bShzdHhfMTQzMC52YWwoKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kaW5ncy5hZGQoc3R4XzE0MzAsIHtiaW5kaW5nOiBuZXdCaW5kaW5nXzE0MzEsIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsIHNraXBEdXA6IGZhbHNlfSk7XG4gICAgICAgIGxldCByZXNvbHZlZE5hbWVfMTQzMiA9IHN0eF8xNDMwLnJlc29sdmUodGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmVudi5zZXQocmVzb2x2ZWROYW1lXzE0MzIsIG5ldyBDb21waWxldGltZVRyYW5zZm9ybSh2YWxfMTQyOSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGVjbF8xNDI1LmV4dGVuZCh7YmluZGluZzogYmluZGluZ18xNDI2LCBpbml0OiBpbml0XzE0Mjh9KTtcbiAgICB9KX0pO1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi1leHBhbmRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0lBQVksQzs7QUFDWjs7SUFBWSxDOztBQUNaOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLFNBQVMsV0FBVCxDQUFxQixPQUFyQixFQUE4QixRQUE5QixFQUF3QyxPQUF4QyxFQUFpRDtBQUMvQyxNQUFJLFFBQVEsRUFBWjtBQUNBLE1BQUksUUFBUSxRQUFRLFNBQVIsR0FBb0IsUUFBUSxLQUFSLEdBQWdCLENBQXBDLEdBQXdDLFFBQVEsS0FBNUQ7QUFDQSxVQUFRLFlBQVIsQ0FBcUIsT0FBckIsQ0FBNkIsYUFBYTtBQUN4QyxRQUFJLE9BQU8sVUFBVSxPQUFWLENBQWtCLElBQTdCO0FBQ0EsUUFBSSxhQUFhLGtCQUFrQixJQUFsQixFQUF3QixTQUFTLGFBQWpDLENBQWpCO0FBQ0EsUUFBSSxjQUFjLElBQWxCLEVBQXdCO0FBQ3RCLFVBQUksYUFBYSxvQkFBTyxLQUFLLEdBQUwsRUFBUCxDQUFqQjtBQUNBLGNBQVEsS0FBUixDQUFjLEdBQWQsQ0FBa0IsV0FBVyxRQUFYLEVBQWxCLEVBQXlDLG9DQUF3QixJQUF4QixDQUF6QztBQUNBLGNBQVEsUUFBUixDQUFpQixVQUFqQixDQUE0QixJQUE1QixFQUFrQyxVQUFsQyxFQUE4QyxVQUE5QyxFQUEwRCxLQUExRDtBQUNBLFlBQU0sSUFBTixDQUFXLElBQVg7QUFDRDtBQUNGLEdBVEQ7QUFVQSxTQUFPLHFCQUFLLEtBQUwsQ0FBUDtBQUNEOztBQUdELFNBQVMsaUJBQVQsQ0FBMkIsSUFBM0IsRUFBaUMsR0FBakMsRUFBc0M7QUFDcEMsTUFBSSxhQUFhLElBQUksTUFBSixDQUFXLENBQUMsR0FBRCxFQUFNLENBQU4sS0FBWTtBQUN0QyxRQUFJLEVBQUUsWUFBRixDQUFlLENBQWYsQ0FBSixFQUF1QjtBQUNyQixhQUFPLElBQUksTUFBSixDQUFXLEVBQUUsWUFBRixDQUFlLE1BQWYsQ0FBc0IsQ0FBQyxHQUFELEVBQU0sU0FBTixLQUFvQjtBQUMxRCxZQUFJLFVBQVUsWUFBVixDQUF1QixHQUF2QixPQUFpQyxLQUFLLEdBQUwsRUFBckMsRUFBaUQ7QUFDL0MsaUJBQU8sSUFBSSxNQUFKLENBQVcsVUFBVSxZQUFyQixDQUFQO0FBQ0Q7QUFDRCxlQUFPLEdBQVA7QUFDRCxPQUxpQixFQUtmLHNCQUxlLENBQVgsQ0FBUDtBQU1ELEtBUEQsTUFPTyxJQUFJLEVBQUUsUUFBRixDQUFXLENBQVgsQ0FBSixFQUFtQjtBQUN4QixhQUFPLElBQUksTUFBSixDQUFXLEVBQUUsV0FBRixDQUFjLFdBQWQsQ0FBMEIsTUFBMUIsQ0FBaUMsQ0FBQyxHQUFELEVBQU0sSUFBTixLQUFlO0FBQ2hFLFlBQUksS0FBSyxPQUFMLENBQWEsSUFBYixDQUFrQixHQUFsQixPQUE0QixLQUFLLEdBQUwsRUFBaEMsRUFBNEM7QUFDMUMsaUJBQU8sSUFBSSxNQUFKLENBQVcsS0FBSyxPQUFMLENBQWEsSUFBeEIsQ0FBUDtBQUNEO0FBQ0QsZUFBTyxHQUFQO0FBQ0QsT0FMaUIsRUFLZixzQkFMZSxDQUFYLENBQVA7QUFNRDtBQUNELFdBQU8sR0FBUDtBQUNELEdBakJnQixFQWlCZCxzQkFqQmMsQ0FBakI7QUFrQkEsc0JBQU8sV0FBVyxJQUFYLElBQW1CLENBQTFCLEVBQTZCLG1EQUE3QjtBQUNBLFNBQU8sV0FBVyxHQUFYLENBQWUsQ0FBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxXQUFULENBQXFCLE9BQXJCLEVBQThCLEtBQTlCLEVBQXFDO0FBQ25DLE1BQUksZUFBZSxRQUFRLFlBQVIsQ0FBcUIsTUFBckIsQ0FBNEIsYUFBYSxDQUFDLE1BQU0sUUFBTixDQUFlLFVBQVUsT0FBVixDQUFrQixJQUFqQyxDQUExQyxDQUFuQjtBQUNBLFNBQU8sUUFBUSxNQUFSLENBQWUsRUFBRSwwQkFBRixFQUFmLENBQVA7QUFDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWUsTUFBTSxhQUFOLGlDQUEwQztBQUN2RCxjQUFZLE9BQVosRUFBcUI7QUFDbkIsVUFBTSxRQUFOLEVBQWdCLEtBQWhCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEOztBQUVELFNBQU8sSUFBUCxFQUFhO0FBQ1gsUUFBSSxTQUFTLEVBQWI7QUFDQSxRQUFJLEtBQUssSUFBTCxLQUFjLENBQWxCLEVBQXFCO0FBQ25CLGFBQU8scUJBQUssTUFBTCxDQUFQO0FBQ0Q7QUFDRCxRQUFJLE9BQU8sc0JBQVg7QUFDQSxRQUFJLE1BQU0sMkJBQWUsSUFBZixFQUFxQixJQUFyQixFQUEyQixLQUFLLE9BQWhDLENBQVY7O0FBRUEsV0FBTSxDQUFDLElBQUksSUFBWCxFQUFpQjtBQUNmLGFBQU8sSUFBUCxDQUFZLEtBQUssUUFBTCxDQUFjLElBQUksUUFBSixFQUFkLENBQVo7QUFDRDs7QUFFRCxXQUFPLHFCQUFLLE1BQUwsQ0FBUDtBQUNEOztBQUVELHFDQUFtQyxJQUFuQyxFQUF5QztBQUN2QyxXQUFPLEtBQUssTUFBTCxDQUFZO0FBQ2pCLG1CQUFhLEtBQUssMkJBQUwsQ0FBaUMsS0FBSyxXQUF0QztBQURJLEtBQVosQ0FBUDtBQUdEOztBQUVELDRCQUEwQixJQUExQixFQUFnQztBQUM5QixRQUFJLGlCQUFpQixLQUFLLHVCQUFMLENBQTZCLElBQTdCLENBQXJCO0FBQ0EsUUFBSSxNQUFNLGVBQWUsSUFBZixDQUFvQixJQUE5QjtBQUNBLFNBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsSUFBSSxPQUFKLENBQVksS0FBSyxPQUFMLENBQWEsS0FBekIsQ0FBckIsRUFDcUIsb0NBQXdCLEdBQXhCLENBRHJCO0FBRUEsV0FBTyxjQUFQO0FBQ0Q7O0FBRUQ7O0FBRUEsZUFBYSxJQUFiLEVBQW1CO0FBQ2pCLFFBQUksT0FBTyxLQUFLLGVBQUwsQ0FBcUIsR0FBckIsRUFBWDtBQUNBLFFBQUksR0FBSjtBQUNBLFFBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2xCLFlBQU0sS0FBSyxPQUFMLENBQWEsT0FBYixDQUFxQixVQUFyQixDQUFnQyxJQUFoQyxFQUFzQyxLQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLENBQTNELEVBQThELEtBQUssT0FBTCxDQUFhLEdBQTNFLENBQU47QUFDQSxXQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLEtBQUssT0FBTCxDQUFhLE9BQWIsQ0FBcUIsS0FBckIsQ0FBMkIsR0FBM0IsRUFBZ0MsS0FBSyxPQUFMLENBQWEsS0FBYixHQUFxQixDQUFyRCxFQUF3RCxLQUFLLE9BQUwsQ0FBYSxLQUFyRSxDQUFyQjtBQUNBLFdBQUssT0FBTCxDQUFhLEtBQWIsR0FBcUIsS0FBSyxPQUFMLENBQWEsT0FBYixDQUFxQixNQUFyQixDQUE0QixHQUE1QixFQUFpQyxLQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLENBQXRELEVBQXlELEtBQUssT0FBTCxDQUFhLEtBQXRFLENBQXJCO0FBQ0QsS0FKRCxNQUlPO0FBQ0wsWUFBTSxLQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLFVBQXJCLENBQWdDLElBQWhDLEVBQXNDLEtBQUssT0FBTCxDQUFhLEtBQW5ELEVBQTBELEtBQUssT0FBTCxDQUFhLEdBQXZFLENBQU47QUFDQSxXQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLEtBQUssT0FBTCxDQUFhLE9BQWIsQ0FBcUIsS0FBckIsQ0FBMkIsR0FBM0IsRUFBZ0MsS0FBSyxPQUFMLENBQWEsS0FBN0MsRUFBb0QsS0FBSyxPQUFMLENBQWEsS0FBakUsQ0FBckI7QUFDRDtBQUNELFFBQUksYUFBYSxZQUFZLElBQVosRUFBa0IsR0FBbEIsRUFBdUIsS0FBSyxPQUE1QixDQUFqQjtBQUNBLFdBQU8sWUFBWSxJQUFaLEVBQWtCLFVBQWxCLENBQVA7QUFDRDs7QUFFRCxlQUFhLElBQWIsRUFBbUI7QUFDakIsUUFBSSxFQUFFLHFCQUFGLENBQXdCLEtBQUssV0FBN0IsS0FBNkMsRUFBRSxrQkFBRixDQUFxQixLQUFLLFdBQTFCLENBQWpELEVBQXlGO0FBQ3ZGLGFBQU8sS0FBSyxNQUFMLENBQVk7QUFDakIscUJBQWEsS0FBSyx1QkFBTCxDQUE2QixLQUFLLFdBQWxDO0FBREksT0FBWixDQUFQO0FBR0QsS0FKRCxNQUlPLElBQUksRUFBRSxxQkFBRixDQUF3QixLQUFLLFdBQTdCLENBQUosRUFBK0M7QUFDcEQsYUFBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixxQkFBYSxLQUFLLDJCQUFMLENBQWlDLEtBQUssV0FBdEM7QUFESSxPQUFaLENBQVA7QUFHRDtBQUNELFdBQU8sSUFBUDtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBLDBCQUF3QixJQUF4QixFQUE4QjtBQUM1QixRQUFJLE9BQU8sS0FBSyxJQUFMLENBQVUsV0FBVixDQUFzQixLQUFLLE9BQUwsQ0FBYSxRQUFuQyxFQUE2QyxLQUFLLE9BQUwsQ0FBYSxLQUExRCxDQUFYO0FBQ0EsdUNBQWdCLEtBQUssSUFBckIsRUFBMkIsT0FBM0IsQ0FBbUMsT0FBTztBQUN4QyxVQUFJLGFBQWEsb0JBQU8sSUFBSSxHQUFKLEVBQVAsQ0FBakI7QUFDQSxXQUFLLE9BQUwsQ0FBYSxRQUFiLENBQXNCLEdBQXRCLENBQTBCLEdBQTFCLEVBQStCO0FBQzdCLGlCQUFTLFVBRG9CO0FBRTdCLGVBQU8sS0FBSyxPQUFMLENBQWEsS0FGUztBQUc3QixpQkFBUztBQUhvQixPQUEvQjtBQUtBO0FBQ0EsV0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixXQUFXLFFBQVgsRUFBckIsRUFBNEMsb0NBQXdCLEdBQXhCLENBQTVDO0FBQ0QsS0FURDtBQVVBLFdBQU8sS0FBSyxNQUFMLENBQVksRUFBRSxVQUFGLEVBQVosQ0FBUDtBQUNEOztBQUVELDhCQUE0QixJQUE1QixFQUFrQztBQUNoQyxRQUFJLEVBQUUsbUJBQUYsQ0FBc0IsSUFBdEIsS0FBK0IsRUFBRSxzQkFBRixDQUF5QixJQUF6QixDQUFuQyxFQUFtRTtBQUNqRSxhQUFPLEtBQUsseUJBQUwsQ0FBK0IsSUFBL0IsQ0FBUDtBQUNEO0FBQ0QsV0FBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixtQkFBYSxLQUFLLFdBQUwsQ0FBaUIsR0FBakIsQ0FBcUIsUUFBUTtBQUN4QyxZQUFJLFVBQVUsS0FBSyxPQUFMLENBQWEsV0FBYixDQUF5QixLQUFLLE9BQUwsQ0FBYSxRQUF0QyxFQUFnRCxLQUFLLE9BQUwsQ0FBYSxLQUE3RCxDQUFkO0FBQ0EsMkNBQWdCLE9BQWhCLEVBQXlCLE9BQXpCLENBQWlDLE9BQU87QUFDdEMsY0FBSSxhQUFhLG9CQUFPLElBQUksR0FBSixFQUFQLENBQWpCO0FBQ0EsZUFBSyxPQUFMLENBQWEsUUFBYixDQUFzQixHQUF0QixDQUEwQixHQUExQixFQUErQjtBQUM3QixxQkFBUyxVQURvQjtBQUU3QixtQkFBTyxLQUFLLE9BQUwsQ0FBYSxLQUZTO0FBRzdCLHFCQUFTLEtBQUssSUFBTCxLQUFjO0FBSE0sV0FBL0I7QUFLQTtBQUNBLGVBQUssT0FBTCxDQUFhLEdBQWIsQ0FBaUIsR0FBakIsQ0FBcUIsV0FBVyxRQUFYLEVBQXJCLEVBQTRDLG9DQUF3QixHQUF4QixDQUE1QztBQUNELFNBVEQ7QUFVQSxlQUFPLEtBQUssTUFBTCxDQUFZLEVBQUUsZ0JBQUYsRUFBWixDQUFQO0FBQ0QsT0FiWTtBQURJLEtBQVosQ0FBUDtBQWdCRDs7QUFFRCw0QkFBMEIsSUFBMUIsRUFBZ0M7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFJLEVBQUUsbUJBQUYsQ0FBc0IsSUFBdEIsQ0FBSixFQUFpQztBQUMvQixVQUFJLFFBQVEsdUJBQVcsUUFBWCxDQUFaO0FBQ0EsYUFBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixxQkFBYSxLQUFLLFdBQUwsQ0FBaUIsR0FBakIsQ0FBcUIsUUFBUTtBQUN4QyxjQUFJLE9BQU8sS0FBSyxPQUFMLENBQWEsSUFBeEI7QUFDQSxjQUFJLFlBQVksS0FBSyxRQUFMLENBQWMsS0FBZCxFQUFxQixLQUFLLE9BQUwsQ0FBYSxRQUFsQyxxQkFBaEI7QUFDQSxjQUFJLGNBQWMsS0FBSyxXQUFMLENBQWlCLEtBQUssT0FBTCxDQUFhLFlBQWIsQ0FBMEIsS0FBSyxPQUFMLENBQWEsWUFBYixDQUEwQixNQUExQixHQUFtQyxDQUE3RCxDQUFqQixFQUFrRixLQUFLLE9BQUwsQ0FBYSxLQUEvRixDQUFsQjtBQUNBLGNBQUksYUFBYSxvQkFBTyxLQUFLLEdBQUwsRUFBUCxDQUFqQjtBQUNBLGVBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsVUFBdEIsQ0FBaUMsU0FBakMsRUFBNEMsV0FBNUMsRUFBeUQsVUFBekQsRUFBcUUsS0FBSyxPQUFMLENBQWEsS0FBbEY7QUFDQSxpQkFBTyxLQUFLLE1BQUwsQ0FBWTtBQUNqQixrQkFBTSxLQUFLLElBQUwsQ0FBVSxRQUFWLENBQW1CLEtBQW5CLEVBQTBCLEtBQUssT0FBTCxDQUFhLFFBQXZDO0FBRFcsV0FBWixDQUFQO0FBR0QsU0FUWTtBQURJLE9BQVosQ0FBUDtBQVlEOztBQUVEO0FBQ0E7QUFDQSxXQUFPLEtBQUssTUFBTCxDQUFZO0FBQ2pCLG1CQUFhLEtBQUssV0FBTCxDQUFpQixHQUFqQixDQUFxQixRQUFRO0FBQ3hDLFlBQUksVUFBVSxLQUFLLE9BQUwsQ0FBYSxXQUFiLENBQXlCLEtBQUssT0FBTCxDQUFhLFFBQXRDLEVBQWdELEtBQUssT0FBTCxDQUFhLEtBQTdELENBQWQ7QUFDQTtBQUNBO0FBQ0EsWUFBSSxpQkFBaUIsMkJBQWlCLEVBQUUsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQjtBQUMxRCxpQkFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLENBRDhCO0FBRTFELGVBQUssbUJBRnFEO0FBRzFELGlCQUFPLEtBQUssT0FBTCxDQUFhO0FBSHNDLFNBQXRCLENBQWpCLENBQXJCO0FBS0EsWUFBSSxPQUFPLGVBQWUsTUFBZixDQUFzQixLQUFLLElBQTNCLENBQVg7QUFDQSxZQUFJLE1BQU0sc0NBQXFCLEtBQUssR0FBTCxFQUFyQixFQUFpQyxFQUFFLEtBQUYsQ0FBUSxLQUFLLE9BQWIsRUFBc0I7QUFDL0QsaUJBQU8sS0FBSyxPQUFMLENBQWEsS0FBYixHQUFxQjtBQURtQyxTQUF0QixDQUFqQyxDQUFWO0FBR0EsMkNBQWdCLE9BQWhCLEVBQXlCLE9BQXpCLENBQWlDLE9BQU87QUFDdEMsY0FBSSxhQUFhLG9CQUFPLElBQUksR0FBSixFQUFQLENBQWpCO0FBQ0EsZUFBSyxPQUFMLENBQWEsUUFBYixDQUFzQixHQUF0QixDQUEwQixHQUExQixFQUErQjtBQUM3QixxQkFBUyxVQURvQjtBQUU3QixtQkFBTyxLQUFLLE9BQUwsQ0FBYSxLQUZTO0FBRzdCLHFCQUFTO0FBSG9CLFdBQS9CO0FBS0EsY0FBSSxlQUFlLElBQUksT0FBSixDQUFZLEtBQUssT0FBTCxDQUFhLEtBQXpCLENBQW5CO0FBQ0EsZUFBSyxPQUFMLENBQWEsR0FBYixDQUFpQixHQUFqQixDQUFxQixZQUFyQixFQUFtQyxxQ0FBeUIsR0FBekIsQ0FBbkM7QUFDRCxTQVREO0FBVUEsZUFBTyxLQUFLLE1BQUwsQ0FBWSxFQUFFLGdCQUFGLEVBQVcsVUFBWCxFQUFaLENBQVA7QUFDRCxPQXhCWTtBQURJLEtBQVosQ0FBUDtBQTJCRDtBQXBLc0Q7a0JBQXBDLGEiLCJmaWxlIjoidG9rZW4tZXhwYW5kZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaXN0IH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7ICBFbmZvcmVzdGVyIH0gZnJvbSBcIi4vZW5mb3Jlc3RlclwiO1xuaW1wb3J0IFRlcm1FeHBhbmRlciBmcm9tIFwiLi90ZXJtLWV4cGFuZGVyLmpzXCI7XG5pbXBvcnQgRW52IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwicmFtZGFcIjtcbmltcG9ydCAqIGFzIFQgZnJvbSBcIi4vdGVybXNcIjtcbmltcG9ydCB7IGdlbnN5bSB9IGZyb20gJy4vc3ltYm9sJztcbmltcG9ydCB7IFZhckJpbmRpbmdUcmFuc2Zvcm0sIENvbXBpbGV0aW1lVHJhbnNmb3JtIH0gZnJvbSAnLi90cmFuc2Zvcm1zJztcbmltcG9ydCB7ICBhc3NlcnQgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IGV2YWxDb21waWxldGltZVZhbHVlIH0gZnJvbSAnLi9sb2FkLXN5bnRheCc7XG5pbXBvcnQgeyAgZnJlc2hTY29wZSB9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgeyBBTExfUEhBU0VTIH0gZnJvbSAnLi9zeW50YXgnO1xuaW1wb3J0IEFTVERpc3BhdGNoZXIgZnJvbSAnLi9hc3QtZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBjb2xsZWN0QmluZGluZ3MgfSBmcm9tICcuL2h5Z2llbmUtdXRpbHMnO1xuXG5mdW5jdGlvbiBiaW5kSW1wb3J0cyhpbXBUZXJtLCBleE1vZHVsZSwgY29udGV4dCkge1xuICBsZXQgbmFtZXMgPSBbXTtcbiAgbGV0IHBoYXNlID0gaW1wVGVybS5mb3JTeW50YXggPyBjb250ZXh0LnBoYXNlICsgMSA6IGNvbnRleHQucGhhc2U7XG4gIGltcFRlcm0ubmFtZWRJbXBvcnRzLmZvckVhY2goc3BlY2lmaWVyID0+IHtcbiAgICBsZXQgbmFtZSA9IHNwZWNpZmllci5iaW5kaW5nLm5hbWU7XG4gICAgbGV0IGV4cG9ydE5hbWUgPSBmaW5kTmFtZUluRXhwb3J0cyhuYW1lLCBleE1vZHVsZS5leHBvcnRFbnRyaWVzKTtcbiAgICBpZiAoZXhwb3J0TmFtZSAhPSBudWxsKSB7XG4gICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lLnZhbCgpKTtcbiAgICAgIGNvbnRleHQuc3RvcmUuc2V0KG5ld0JpbmRpbmcudG9TdHJpbmcoKSwgbmV3IFZhckJpbmRpbmdUcmFuc2Zvcm0obmFtZSkpO1xuICAgICAgY29udGV4dC5iaW5kaW5ncy5hZGRGb3J3YXJkKG5hbWUsIGV4cG9ydE5hbWUsIG5ld0JpbmRpbmcsIHBoYXNlKTtcbiAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIExpc3QobmFtZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZpbmROYW1lSW5FeHBvcnRzKG5hbWUsIGV4cCkge1xuICBsZXQgZm91bmROYW1lcyA9IGV4cC5yZWR1Y2UoKGFjYywgZSkgPT4ge1xuICAgIGlmIChULmlzRXhwb3J0RnJvbShlKSkge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZS5uYW1lZEV4cG9ydHMucmVkdWNlKChhY2MsIHNwZWNpZmllcikgPT4ge1xuICAgICAgICBpZiAoc3BlY2lmaWVyLmV4cG9ydGVkTmFtZS52YWwoKSA9PT0gbmFtZS52YWwoKSkge1xuICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHNwZWNpZmllci5leHBvcnRlZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9IGVsc2UgaWYgKFQuaXNFeHBvcnQoZSkpIHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KGUuZGVjbGFyYXRpb24uZGVjbGFyYXRvcnMucmVkdWNlKChhY2MsIGRlY2wpID0+IHtcbiAgICAgICAgaWYgKGRlY2wuYmluZGluZy5uYW1lLnZhbCgpID09PSBuYW1lLnZhbCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZGVjbC5iaW5kaW5nLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBMaXN0KCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgTGlzdCgpKTtcbiAgYXNzZXJ0KGZvdW5kTmFtZXMuc2l6ZSA8PSAxLCAnZXhwZWN0aW5nIG5vIG1vcmUgdGhhbiAxIG1hdGNoaW5nIG5hbWUgaW4gZXhwb3J0cycpO1xuICByZXR1cm4gZm91bmROYW1lcy5nZXQoMCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzKGltcFRlcm0sIG5hbWVzKSB7XG4gIGxldCBuYW1lZEltcG9ydHMgPSBpbXBUZXJtLm5hbWVkSW1wb3J0cy5maWx0ZXIoc3BlY2lmaWVyID0+ICFuYW1lcy5jb250YWlucyhzcGVjaWZpZXIuYmluZGluZy5uYW1lKSk7XG4gIHJldHVybiBpbXBUZXJtLmV4dGVuZCh7IG5hbWVkSW1wb3J0cyB9KTtcbn1cblxuLy8gZnVuY3Rpb24gYmluZEFsbFN5bnRheEV4cG9ydHMoZXhNb2R1bGUsIHRvU3ludGgsIGNvbnRleHQpIHtcbi8vICAgbGV0IHBoYXNlID0gY29udGV4dC5waGFzZTtcbi8vICAgZXhNb2R1bGUuZXhwb3J0RW50cmllcy5mb3JFYWNoKGV4ID0+IHtcbi8vICAgICBpZiAoaXNFeHBvcnRTeW50YXgoZXgpKSB7XG4vLyAgICAgICBleC5kZWNsYXJhdGlvbi5kZWNsYXJhdG9ycy5mb3JFYWNoKGRlY2wgPT4ge1xuLy8gICAgICAgICBsZXQgbmFtZSA9IGRlY2wuYmluZGluZy5uYW1lO1xuLy8gICAgICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShuYW1lLnZhbCgpKTtcbi8vICAgICAgICAgbGV0IHN0b3JlTmFtZSA9IGV4TW9kdWxlLm1vZHVsZVNwZWNpZmllciArIFwiOlwiICsgbmFtZS52YWwoKSArIFwiOlwiICsgcGhhc2U7XG4vLyAgICAgICAgIGxldCBzeW50aFN0eCA9IFN5bnRheC5mcm9tSWRlbnRpZmllcihuYW1lLnZhbCgpLCB0b1N5bnRoKTtcbi8vICAgICAgICAgbGV0IHN0b3JlU3R4ID0gU3ludGF4LmZyb21JZGVudGlmaWVyKHN0b3JlTmFtZSwgdG9TeW50aCk7XG4vLyAgICAgICAgIGNvbnRleHQuYmluZGluZ3MuYWRkRm9yd2FyZChzeW50aFN0eCwgc3RvcmVTdHgsIG5ld0JpbmRpbmcsIHBoYXNlKTtcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfSk7XG4vLyB9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRva2VuRXhwYW5kZXIgZXh0ZW5kcyBBU1REaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgIHN1cGVyKCdleHBhbmQnLCBmYWxzZSk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIGV4cGFuZChzdHhsKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGlmIChzdHhsLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBMaXN0KHJlc3VsdCk7XG4gICAgfVxuICAgIGxldCBwcmV2ID0gTGlzdCgpO1xuICAgIGxldCBlbmYgPSBuZXcgRW5mb3Jlc3RlcihzdHhsLCBwcmV2LCB0aGlzLmNvbnRleHQpO1xuXG4gICAgd2hpbGUoIWVuZi5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmRpc3BhdGNoKGVuZi5lbmZvcmVzdCgpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIExpc3QocmVzdWx0KTtcbiAgfVxuXG4gIGV4cGFuZFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodGVybSkge1xuICAgIHJldHVybiB0ZXJtLmV4dGVuZCh7XG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlclZhcmlhYmxlRGVjbGFyYXRpb24odGVybS5kZWNsYXJhdGlvbilcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGFuZEZ1bmN0aW9uRGVjbGFyYXRpb24odGVybSkge1xuICAgIGxldCByZWdpc3RlcmVkVGVybSA9IHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybSk7XG4gICAgbGV0IHN0eCA9IHJlZ2lzdGVyZWRUZXJtLm5hbWUubmFtZTtcbiAgICB0aGlzLmNvbnRleHQuZW52LnNldChzdHgucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWYXJCaW5kaW5nVHJhbnNmb3JtKHN0eCkpO1xuICAgIHJldHVybiByZWdpc3RlcmVkVGVybTtcbiAgfVxuXG4gIC8vIFRPRE86IHRoaW5rIGFib3V0IGZ1bmN0aW9uIGV4cHJlc3Npb25zXG5cbiAgZXhwYW5kSW1wb3J0KHRlcm0pIHtcbiAgICBsZXQgcGF0aCA9IHRlcm0ubW9kdWxlU3BlY2lmaWVyLnZhbCgpO1xuICAgIGxldCBtb2Q7XG4gICAgaWYgKHRlcm0uZm9yU3ludGF4KSB7XG4gICAgICBtb2QgPSB0aGlzLmNvbnRleHQubW9kdWxlcy5nZXRBdFBoYXNlKHBhdGgsIHRoaXMuY29udGV4dC5waGFzZSArIDEsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMudmlzaXQobW9kLCB0aGlzLmNvbnRleHQucGhhc2UgKyAxLCB0aGlzLmNvbnRleHQuc3RvcmUpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuaW52b2tlKG1vZCwgdGhpcy5jb250ZXh0LnBoYXNlICsgMSwgdGhpcy5jb250ZXh0LnN0b3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMuZ2V0QXRQaGFzZShwYXRoLCB0aGlzLmNvbnRleHQucGhhc2UsIHRoaXMuY29udGV4dC5jd2QpO1xuICAgICAgdGhpcy5jb250ZXh0LnN0b3JlID0gdGhpcy5jb250ZXh0Lm1vZHVsZXMudmlzaXQobW9kLCB0aGlzLmNvbnRleHQucGhhc2UsIHRoaXMuY29udGV4dC5zdG9yZSk7XG4gICAgfVxuICAgIGxldCBib3VuZE5hbWVzID0gYmluZEltcG9ydHModGVybSwgbW9kLCB0aGlzLmNvbnRleHQpO1xuICAgIHJldHVybiByZW1vdmVOYW1lcyh0ZXJtLCBib3VuZE5hbWVzKTtcbiAgfVxuXG4gIGV4cGFuZEV4cG9ydCh0ZXJtKSB7XG4gICAgaWYgKFQuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKHRlcm0uZGVjbGFyYXRpb24pIHx8IFQuaXNDbGFzc0RlY2xhcmF0aW9uKHRlcm0uZGVjbGFyYXRpb24pKSB7XG4gICAgICByZXR1cm4gdGVybS5leHRlbmQoe1xuICAgICAgICBkZWNsYXJhdGlvbjogdGhpcy5yZWdpc3RlckZ1bmN0aW9uT3JDbGFzcyh0ZXJtLmRlY2xhcmF0aW9uKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChULmlzVmFyaWFibGVEZWNsYXJhdGlvbih0ZXJtLmRlY2xhcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHRlcm0uZXh0ZW5kKHtcbiAgICAgICAgZGVjbGFyYXRpb246IHRoaXMucmVnaXN0ZXJWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm0uZGVjbGFyYXRpb24pXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICAvLyBbaXNQcmFnbWEsIHRlcm0gPT4ge1xuICAvLyAgIGxldCBwYXRoU3R4ID0gdGVybS5pdGVtcy5nZXQoMCk7XG4gIC8vICAgaWYgKHBhdGhTdHgudmFsKCkgPT09ICdiYXNlJykge1xuICAvLyAgICAgcmV0dXJuIHRlcm07XG4gIC8vICAgfVxuICAvLyAgIGxldCBtb2QgPSB0aGlzLmNvbnRleHQubW9kdWxlcy5sb2FkQW5kQ29tcGlsZShwYXRoU3R4LnZhbCgpKTtcbiAgLy8gICBzdG9yZSA9IHRoaXMuY29udGV4dC5tb2R1bGVzLnZpc2l0KG1vZCwgcGhhc2UsIHN0b3JlKTtcbiAgLy8gICBiaW5kQWxsU3ludGF4RXhwb3J0cyhtb2QsIHBhdGhTdHgsIHRoaXMuY29udGV4dCk7XG4gIC8vICAgcmV0dXJuIHRlcm07XG4gIC8vIH1dLFxuXG5cbiAgcmVnaXN0ZXJGdW5jdGlvbk9yQ2xhc3ModGVybSkge1xuICAgIGxldCBuYW1lID0gdGVybS5uYW1lLnJlbW92ZVNjb3BlKHRoaXMuY29udGV4dC51c2VTY29wZSwgdGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICBjb2xsZWN0QmluZGluZ3ModGVybS5uYW1lKS5mb3JFYWNoKHN0eCA9PiB7XG4gICAgICBsZXQgbmV3QmluZGluZyA9IGdlbnN5bShzdHgudmFsKCkpO1xuICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChzdHgsIHtcbiAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgcGhhc2U6IHRoaXMuY29udGV4dC5waGFzZSxcbiAgICAgICAgc2tpcER1cDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgLy8gdGhlIG1lYW5pbmcgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBuYW1lIGlzIGEgcnVudGltZSB2YXIgYmluZGluZ1xuICAgICAgdGhpcy5jb250ZXh0LmVudi5zZXQobmV3QmluZGluZy50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHgpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGVybS5leHRlbmQoeyBuYW1lIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJWYXJpYWJsZURlY2xhcmF0aW9uKHRlcm0pIHtcbiAgICBpZiAoVC5pc1N5bnRheERlY2xhcmF0aW9uKHRlcm0pIHx8IFQuaXNTeW50YXhyZWNEZWNsYXJhdGlvbih0ZXJtKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJTeW50YXhEZWNsYXJhdGlvbih0ZXJtKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm0uZXh0ZW5kKHtcbiAgICAgIGRlY2xhcmF0b3JzOiB0ZXJtLmRlY2xhcmF0b3JzLm1hcChkZWNsID0+IHtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSBkZWNsLmJpbmRpbmcucmVtb3ZlU2NvcGUodGhpcy5jb250ZXh0LnVzZVNjb3BlLCB0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgICBjb2xsZWN0QmluZGluZ3MoYmluZGluZykuZm9yRWFjaChzdHggPT4ge1xuICAgICAgICAgIGxldCBuZXdCaW5kaW5nID0gZ2Vuc3ltKHN0eC52YWwoKSk7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZChzdHgsIHtcbiAgICAgICAgICAgIGJpbmRpbmc6IG5ld0JpbmRpbmcsXG4gICAgICAgICAgICBwaGFzZTogdGhpcy5jb250ZXh0LnBoYXNlLFxuICAgICAgICAgICAgc2tpcER1cDogdGVybS5raW5kID09PSAndmFyJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIHRoZSBtZWFuaW5nIG9mIGEgdmFyL2xldC9jb25zdCBkZWNsYXJhdGlvbiBpcyBhIHZhciBiaW5kaW5nXG4gICAgICAgICAgdGhpcy5jb250ZXh0LmVudi5zZXQobmV3QmluZGluZy50b1N0cmluZygpLCBuZXcgVmFyQmluZGluZ1RyYW5zZm9ybShzdHgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkZWNsLmV4dGVuZCh7IGJpbmRpbmcgfSk7XG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJTeW50YXhEZWNsYXJhdGlvbih0ZXJtKSB7XG4gICAgLy8gc3ludGF4IGlkXnthLCBifSA9IDxpbml0Pl57YSwgYn1cbiAgICAvLyAtPlxuICAgIC8vIHN5bnRheHJlYyBpZF57YSxiLGN9ID0gZnVuY3Rpb24oKSB7IHJldHVybiA8PGlkXnthfT4+IH1cbiAgICAvLyBzeW50YXhyZWMgaWRee2EsYn0gPSA8aW5pdD5ee2EsYixjfVxuICAgIGlmIChULmlzU3ludGF4RGVjbGFyYXRpb24odGVybSkpIHtcbiAgICAgIGxldCBzY29wZSA9IGZyZXNoU2NvcGUoJ25vbnJlYycpO1xuICAgICAgdGVybSA9IHRlcm0uZXh0ZW5kKHtcbiAgICAgICAgZGVjbGFyYXRvcnM6IHRlcm0uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAgICAgICAgIGxldCBuYW1lID0gZGVjbC5iaW5kaW5nLm5hbWU7XG4gICAgICAgICAgbGV0IG5hbWVBZGRlZCA9IG5hbWUuYWRkU2NvcGUoc2NvcGUsIHRoaXMuY29udGV4dC5iaW5kaW5ncywgQUxMX1BIQVNFUyk7XG4gICAgICAgICAgbGV0IG5hbWVSZW1vdmVkID0gbmFtZS5yZW1vdmVTY29wZSh0aGlzLmNvbnRleHQuY3VycmVudFNjb3BlW3RoaXMuY29udGV4dC5jdXJyZW50U2NvcGUubGVuZ3RoIC0gMV0sIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0obmFtZS52YWwoKSk7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRpbmdzLmFkZEZvcndhcmQobmFtZUFkZGVkLCBuYW1lUmVtb3ZlZCwgbmV3QmluZGluZywgdGhpcy5jb250ZXh0LnBoYXNlKTtcbiAgICAgICAgICByZXR1cm4gZGVjbC5leHRlbmQoe1xuICAgICAgICAgICAgaW5pdDogZGVjbC5pbml0LmFkZFNjb3BlKHNjb3BlLCB0aGlzLmNvbnRleHQuYmluZGluZ3MsIEFMTF9QSEFTRVMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmb3Igc3ludGF4IGRlY2xhcmF0aW9ucyB3ZSBuZWVkIHRvIGxvYWQgdGhlIGNvbXBpbGV0aW1lIHZhbHVlXG4gICAgLy8gaW50byB0aGUgZW52aXJvbm1lbnRcbiAgICByZXR1cm4gdGVybS5leHRlbmQoe1xuICAgICAgZGVjbGFyYXRvcnM6IHRlcm0uZGVjbGFyYXRvcnMubWFwKGRlY2wgPT4ge1xuICAgICAgICBsZXQgYmluZGluZyA9IGRlY2wuYmluZGluZy5yZW1vdmVTY29wZSh0aGlzLmNvbnRleHQudXNlU2NvcGUsIHRoaXMuY29udGV4dC5waGFzZSk7XG4gICAgICAgIC8vIGVhY2ggY29tcGlsZXRpbWUgdmFsdWUgbmVlZHMgdG8gYmUgZXhwYW5kZWQgd2l0aCBhIGZyZXNoXG4gICAgICAgIC8vIGVudmlyb25tZW50IGFuZCBpbiB0aGUgbmV4dCBoaWdoZXIgcGhhc2VcbiAgICAgICAgbGV0IHN5bnRheEV4cGFuZGVyID0gbmV3IFRlcm1FeHBhbmRlcihfLm1lcmdlKHRoaXMuY29udGV4dCwge1xuICAgICAgICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UgKyAxLFxuICAgICAgICAgIGVudjogbmV3IEVudigpLFxuICAgICAgICAgIHN0b3JlOiB0aGlzLmNvbnRleHQuc3RvcmVcbiAgICAgICAgfSkpO1xuICAgICAgICBsZXQgaW5pdCA9IHN5bnRheEV4cGFuZGVyLmV4cGFuZChkZWNsLmluaXQpO1xuICAgICAgICBsZXQgdmFsID0gZXZhbENvbXBpbGV0aW1lVmFsdWUoaW5pdC5nZW4oKSwgXy5tZXJnZSh0aGlzLmNvbnRleHQsIHtcbiAgICAgICAgICBwaGFzZTogdGhpcy5jb250ZXh0LnBoYXNlICsgMVxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbGxlY3RCaW5kaW5ncyhiaW5kaW5nKS5mb3JFYWNoKHN0eCA9PiB7XG4gICAgICAgICAgbGV0IG5ld0JpbmRpbmcgPSBnZW5zeW0oc3R4LnZhbCgpKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZGluZ3MuYWRkKHN0eCwge1xuICAgICAgICAgICAgYmluZGluZzogbmV3QmluZGluZyxcbiAgICAgICAgICAgIHBoYXNlOiB0aGlzLmNvbnRleHQucGhhc2UsXG4gICAgICAgICAgICBza2lwRHVwOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxldCByZXNvbHZlZE5hbWUgPSBzdHgucmVzb2x2ZSh0aGlzLmNvbnRleHQucGhhc2UpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5lbnYuc2V0KHJlc29sdmVkTmFtZSwgbmV3IENvbXBpbGV0aW1lVHJhbnNmb3JtKHZhbCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlY2wuZXh0ZW5kKHsgYmluZGluZywgaW5pdCB9KTtcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/transforms.js b/dist/transforms.js index 99a0b5c2..96034d4a 100644 --- a/dist/transforms.js +++ b/dist/transforms.js @@ -3,56 +3,56 @@ Object.defineProperty(exports, "__esModule", { value: true }); -class FunctionDeclTransform_1433 {} -class VariableDeclTransform_1434 {} -class NewTransform_1435 {} -class ThrowTransform_1436 {} -class LetDeclTransform_1437 {} -class ConstDeclTransform_1438 {} -class TryTransform_1439 {} -class WhileTransform_1440 {} -class IfTransform_1441 {} -class ForTransform_1442 {} -class SwitchTransform_1443 {} -class BreakTransform_1444 {} -class ContinueTransform_1445 {} -class DoTransform_1446 {} -class WithTransform_1447 {} -class DebuggerTransform_1448 {} -class SyntaxrecDeclTransform_1449 {} -class SyntaxDeclTransform_1450 {} -class SyntaxQuoteTransform_1451 {} -class ReturnStatementTransform_1452 {} -class VarBindingTransform_1453 { - constructor(id_1455) { - this.id = id_1455; +class FunctionDeclTransform {} +exports.FunctionDeclTransform = FunctionDeclTransform; +class VariableDeclTransform {} +exports.VariableDeclTransform = VariableDeclTransform; +class NewTransform {} +exports.NewTransform = NewTransform; +class ThrowTransform {} +exports.ThrowTransform = ThrowTransform; +class LetDeclTransform {} +exports.LetDeclTransform = LetDeclTransform; +class ConstDeclTransform {} +exports.ConstDeclTransform = ConstDeclTransform; +class TryTransform {} +exports.TryTransform = TryTransform; +class WhileTransform {} +exports.WhileTransform = WhileTransform; +class IfTransform {} +exports.IfTransform = IfTransform; +class ForTransform {} +exports.ForTransform = ForTransform; +class SwitchTransform {} +exports.SwitchTransform = SwitchTransform; +class BreakTransform {} +exports.BreakTransform = BreakTransform; +class ContinueTransform {} +exports.ContinueTransform = ContinueTransform; +class DoTransform {} +exports.DoTransform = DoTransform; +class WithTransform {} +exports.WithTransform = WithTransform; +class DebuggerTransform {} +exports.DebuggerTransform = DebuggerTransform; +class SyntaxrecDeclTransform {} +exports.SyntaxrecDeclTransform = SyntaxrecDeclTransform; +class SyntaxDeclTransform {} +exports.SyntaxDeclTransform = SyntaxDeclTransform; +class SyntaxQuoteTransform {} +exports.SyntaxQuoteTransform = SyntaxQuoteTransform; +class ReturnStatementTransform {} +exports.ReturnStatementTransform = ReturnStatementTransform; +class VarBindingTransform { + constructor(id) { + this.id = id; } } -class CompiletimeTransform_1454 { - constructor(value_1456) { - this.value = value_1456; +exports.VarBindingTransform = VarBindingTransform; +class CompiletimeTransform { + constructor(value) { + this.value = value; } } -exports.FunctionDeclTransform = FunctionDeclTransform_1433; -exports.VariableDeclTransform = VariableDeclTransform_1434; -exports.NewTransform = NewTransform_1435; -exports.ThrowTransform = ThrowTransform_1436; -exports.LetDeclTransform = LetDeclTransform_1437; -exports.ConstDeclTransform = ConstDeclTransform_1438; -exports.TryTransform = TryTransform_1439; -exports.WhileTransform = WhileTransform_1440; -exports.IfTransform = IfTransform_1441; -exports.ForTransform = ForTransform_1442; -exports.SwitchTransform = SwitchTransform_1443; -exports.BreakTransform = BreakTransform_1444; -exports.ContinueTransform = ContinueTransform_1445; -exports.DoTransform = DoTransform_1446; -exports.WithTransform = WithTransform_1447; -exports.DebuggerTransform = DebuggerTransform_1448; -exports.SyntaxrecDeclTransform = SyntaxrecDeclTransform_1449; -exports.SyntaxDeclTransform = SyntaxDeclTransform_1450; -exports.SyntaxQuoteTransform = SyntaxQuoteTransform_1451; -exports.ReturnStatementTransform = ReturnStatementTransform_1452; -exports.VarBindingTransform = VarBindingTransform_1453; -exports.CompiletimeTransform = CompiletimeTransform_1454; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3RyYW5zZm9ybXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxNQUFNLDBCQUFOLENBQWlDO0FBQ2pDLE1BQU0sMEJBQU4sQ0FBaUM7QUFDakMsTUFBTSxpQkFBTixDQUF3QjtBQUN4QixNQUFNLG1CQUFOLENBQTBCO0FBQzFCLE1BQU0scUJBQU4sQ0FBNEI7QUFDNUIsTUFBTSx1QkFBTixDQUE4QjtBQUM5QixNQUFNLGlCQUFOLENBQXdCO0FBQ3hCLE1BQU0sbUJBQU4sQ0FBMEI7QUFDMUIsTUFBTSxnQkFBTixDQUF1QjtBQUN2QixNQUFNLGlCQUFOLENBQXdCO0FBQ3hCLE1BQU0sb0JBQU4sQ0FBMkI7QUFDM0IsTUFBTSxtQkFBTixDQUEwQjtBQUMxQixNQUFNLHNCQUFOLENBQTZCO0FBQzdCLE1BQU0sZ0JBQU4sQ0FBdUI7QUFDdkIsTUFBTSxrQkFBTixDQUF5QjtBQUN6QixNQUFNLHNCQUFOLENBQTZCO0FBQzdCLE1BQU0sMkJBQU4sQ0FBa0M7QUFDbEMsTUFBTSx3QkFBTixDQUErQjtBQUMvQixNQUFNLHlCQUFOLENBQWdDO0FBQ2hDLE1BQU0sNkJBQU4sQ0FBb0M7QUFDcEMsTUFBTSx3QkFBTixDQUErQjtBQUM3QixjQUFZLE9BQVosRUFBcUI7QUFDbkIsU0FBSyxFQUFMLEdBQVUsT0FBVjtBQUNEO0FBSDRCO0FBSy9CLE1BQU0seUJBQU4sQ0FBZ0M7QUFDOUIsY0FBWSxVQUFaLEVBQXdCO0FBQ3RCLFNBQUssS0FBTCxHQUFhLFVBQWI7QUFDRDtBQUg2QjtRQUtNLHFCLEdBQTlCLDBCO1FBQzhCLHFCLEdBQTlCLDBCO1FBQ3FCLFksR0FBckIsaUI7UUFDdUIsYyxHQUF2QixtQjtRQUN5QixnQixHQUF6QixxQjtRQUMyQixrQixHQUEzQix1QjtRQUNxQixZLEdBQXJCLGlCO1FBQ3VCLGMsR0FBdkIsbUI7UUFDb0IsVyxHQUFwQixnQjtRQUNxQixZLEdBQXJCLGlCO1FBQ3dCLGUsR0FBeEIsb0I7UUFDdUIsYyxHQUF2QixtQjtRQUMwQixpQixHQUExQixzQjtRQUNvQixXLEdBQXBCLGdCO1FBQ3NCLGEsR0FBdEIsa0I7UUFDMEIsaUIsR0FBMUIsc0I7UUFDK0Isc0IsR0FBL0IsMkI7UUFDNEIsbUIsR0FBNUIsd0I7UUFDNkIsb0IsR0FBN0IseUI7UUFDaUMsd0IsR0FBakMsNkI7UUFDNEIsbUIsR0FBNUIsd0I7UUFDNkIsb0IsR0FBN0IseUIiLCJmaWxlIjoidHJhbnNmb3Jtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEZ1bmN0aW9uRGVjbFRyYW5zZm9ybV8xNDMzIHt9XG5jbGFzcyBWYXJpYWJsZURlY2xUcmFuc2Zvcm1fMTQzNCB7fVxuY2xhc3MgTmV3VHJhbnNmb3JtXzE0MzUge31cbmNsYXNzIFRocm93VHJhbnNmb3JtXzE0MzYge31cbmNsYXNzIExldERlY2xUcmFuc2Zvcm1fMTQzNyB7fVxuY2xhc3MgQ29uc3REZWNsVHJhbnNmb3JtXzE0Mzgge31cbmNsYXNzIFRyeVRyYW5zZm9ybV8xNDM5IHt9XG5jbGFzcyBXaGlsZVRyYW5zZm9ybV8xNDQwIHt9XG5jbGFzcyBJZlRyYW5zZm9ybV8xNDQxIHt9XG5jbGFzcyBGb3JUcmFuc2Zvcm1fMTQ0MiB7fVxuY2xhc3MgU3dpdGNoVHJhbnNmb3JtXzE0NDMge31cbmNsYXNzIEJyZWFrVHJhbnNmb3JtXzE0NDQge31cbmNsYXNzIENvbnRpbnVlVHJhbnNmb3JtXzE0NDUge31cbmNsYXNzIERvVHJhbnNmb3JtXzE0NDYge31cbmNsYXNzIFdpdGhUcmFuc2Zvcm1fMTQ0NyB7fVxuY2xhc3MgRGVidWdnZXJUcmFuc2Zvcm1fMTQ0OCB7fVxuY2xhc3MgU3ludGF4cmVjRGVjbFRyYW5zZm9ybV8xNDQ5IHt9XG5jbGFzcyBTeW50YXhEZWNsVHJhbnNmb3JtXzE0NTAge31cbmNsYXNzIFN5bnRheFF1b3RlVHJhbnNmb3JtXzE0NTEge31cbmNsYXNzIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybV8xNDUyIHt9XG5jbGFzcyBWYXJCaW5kaW5nVHJhbnNmb3JtXzE0NTMge1xuICBjb25zdHJ1Y3RvcihpZF8xNDU1KSB7XG4gICAgdGhpcy5pZCA9IGlkXzE0NTU7XG4gIH1cbn1cbmNsYXNzIENvbXBpbGV0aW1lVHJhbnNmb3JtXzE0NTQge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZV8xNDU2KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXzE0NTY7XG4gIH1cbn1cbmV4cG9ydCB7RnVuY3Rpb25EZWNsVHJhbnNmb3JtXzE0MzMgYXMgRnVuY3Rpb25EZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7VmFyaWFibGVEZWNsVHJhbnNmb3JtXzE0MzQgYXMgVmFyaWFibGVEZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7TmV3VHJhbnNmb3JtXzE0MzUgYXMgTmV3VHJhbnNmb3JtfTtcbmV4cG9ydCB7VGhyb3dUcmFuc2Zvcm1fMTQzNiBhcyBUaHJvd1RyYW5zZm9ybX07XG5leHBvcnQge0xldERlY2xUcmFuc2Zvcm1fMTQzNyBhcyBMZXREZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7Q29uc3REZWNsVHJhbnNmb3JtXzE0MzggYXMgQ29uc3REZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7VHJ5VHJhbnNmb3JtXzE0MzkgYXMgVHJ5VHJhbnNmb3JtfTtcbmV4cG9ydCB7V2hpbGVUcmFuc2Zvcm1fMTQ0MCBhcyBXaGlsZVRyYW5zZm9ybX07XG5leHBvcnQge0lmVHJhbnNmb3JtXzE0NDEgYXMgSWZUcmFuc2Zvcm19O1xuZXhwb3J0IHtGb3JUcmFuc2Zvcm1fMTQ0MiBhcyBGb3JUcmFuc2Zvcm19O1xuZXhwb3J0IHtTd2l0Y2hUcmFuc2Zvcm1fMTQ0MyBhcyBTd2l0Y2hUcmFuc2Zvcm19O1xuZXhwb3J0IHtCcmVha1RyYW5zZm9ybV8xNDQ0IGFzIEJyZWFrVHJhbnNmb3JtfTtcbmV4cG9ydCB7Q29udGludWVUcmFuc2Zvcm1fMTQ0NSBhcyBDb250aW51ZVRyYW5zZm9ybX07XG5leHBvcnQge0RvVHJhbnNmb3JtXzE0NDYgYXMgRG9UcmFuc2Zvcm19O1xuZXhwb3J0IHtXaXRoVHJhbnNmb3JtXzE0NDcgYXMgV2l0aFRyYW5zZm9ybX07XG5leHBvcnQge0RlYnVnZ2VyVHJhbnNmb3JtXzE0NDggYXMgRGVidWdnZXJUcmFuc2Zvcm19O1xuZXhwb3J0IHtTeW50YXhyZWNEZWNsVHJhbnNmb3JtXzE0NDkgYXMgU3ludGF4cmVjRGVjbFRyYW5zZm9ybX07XG5leHBvcnQge1N5bnRheERlY2xUcmFuc2Zvcm1fMTQ1MCBhcyBTeW50YXhEZWNsVHJhbnNmb3JtfTtcbmV4cG9ydCB7U3ludGF4UXVvdGVUcmFuc2Zvcm1fMTQ1MSBhcyBTeW50YXhRdW90ZVRyYW5zZm9ybX07XG5leHBvcnQge1JldHVyblN0YXRlbWVudFRyYW5zZm9ybV8xNDUyIGFzIFJldHVyblN0YXRlbWVudFRyYW5zZm9ybX07XG5leHBvcnQge1ZhckJpbmRpbmdUcmFuc2Zvcm1fMTQ1MyBhcyBWYXJCaW5kaW5nVHJhbnNmb3JtfTtcbmV4cG9ydCB7Q29tcGlsZXRpbWVUcmFuc2Zvcm1fMTQ1NCBhcyBDb21waWxldGltZVRyYW5zZm9ybX0iXX0= \ No newline at end of file +exports.CompiletimeTransform = CompiletimeTransform; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFuc2Zvcm1zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxxQkFBTixDQUE0QjtRQUF0QixxQixHQUFBLHFCO0FBQ04sTUFBTSxxQkFBTixDQUE0QjtRQUF0QixxQixHQUFBLHFCO0FBQ04sTUFBTSxZQUFOLENBQW1CO1FBQWIsWSxHQUFBLFk7QUFDTixNQUFNLGNBQU4sQ0FBcUI7UUFBZixjLEdBQUEsYztBQUNOLE1BQU0sZ0JBQU4sQ0FBdUI7UUFBakIsZ0IsR0FBQSxnQjtBQUNOLE1BQU0sa0JBQU4sQ0FBeUI7UUFBbkIsa0IsR0FBQSxrQjtBQUNOLE1BQU0sWUFBTixDQUFtQjtRQUFiLFksR0FBQSxZO0FBQ04sTUFBTSxjQUFOLENBQXFCO1FBQWYsYyxHQUFBLGM7QUFDTixNQUFNLFdBQU4sQ0FBa0I7UUFBWixXLEdBQUEsVztBQUNOLE1BQU0sWUFBTixDQUFtQjtRQUFiLFksR0FBQSxZO0FBQ04sTUFBTSxlQUFOLENBQXNCO1FBQWhCLGUsR0FBQSxlO0FBQ04sTUFBTSxjQUFOLENBQXFCO1FBQWYsYyxHQUFBLGM7QUFDTixNQUFNLGlCQUFOLENBQXdCO1FBQWxCLGlCLEdBQUEsaUI7QUFDTixNQUFNLFdBQU4sQ0FBa0I7UUFBWixXLEdBQUEsVztBQUNOLE1BQU0sYUFBTixDQUFvQjtRQUFkLGEsR0FBQSxhO0FBQ04sTUFBTSxpQkFBTixDQUF3QjtRQUFsQixpQixHQUFBLGlCO0FBQ04sTUFBTSxzQkFBTixDQUE2QjtRQUF2QixzQixHQUFBLHNCO0FBQ04sTUFBTSxtQkFBTixDQUEwQjtRQUFwQixtQixHQUFBLG1CO0FBQ04sTUFBTSxvQkFBTixDQUEyQjtRQUFyQixvQixHQUFBLG9CO0FBQ04sTUFBTSx3QkFBTixDQUErQjtRQUF6Qix3QixHQUFBLHdCO0FBQ04sTUFBTSxtQkFBTixDQUEwQjtBQUMvQixjQUFZLEVBQVosRUFBZ0I7QUFDZCxTQUFLLEVBQUwsR0FBVSxFQUFWO0FBQ0Q7QUFIOEI7UUFBcEIsbUIsR0FBQSxtQjtBQUtOLE1BQU0sb0JBQU4sQ0FBMkI7QUFDaEMsY0FBWSxLQUFaLEVBQW1CO0FBQ2pCLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDRDtBQUgrQjtRQUFyQixvQixHQUFBLG9CIiwiZmlsZSI6InRyYW5zZm9ybXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRnVuY3Rpb25EZWNsVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFZhcmlhYmxlRGVjbFRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBOZXdUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgVGhyb3dUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgTGV0RGVjbFRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBDb25zdERlY2xUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgVHJ5VHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFdoaWxlVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIElmVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIEZvclRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBTd2l0Y2hUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgQnJlYWtUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgQ29udGludWVUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgRG9UcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgV2l0aFRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBEZWJ1Z2dlclRyYW5zZm9ybSB7IH1cbmV4cG9ydCBjbGFzcyBTeW50YXhyZWNEZWNsVHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFN5bnRheERlY2xUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgU3ludGF4UXVvdGVUcmFuc2Zvcm0geyB9XG5leHBvcnQgY2xhc3MgUmV0dXJuU3RhdGVtZW50VHJhbnNmb3JtIHsgfVxuZXhwb3J0IGNsYXNzIFZhckJpbmRpbmdUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihpZCkge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBpbGV0aW1lVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/utils.js b/dist/utils.js index 19c170a1..3350a22f 100644 --- a/dist/utils.js +++ b/dist/utils.js @@ -3,15 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); -function mixin_1457(target_1458, source_1459) { - class F extends target_1458 {} - Object.getOwnPropertyNames(source_1459.prototype).forEach(name_1460 => { - if (name_1460 !== "constructor") { - let newProp = Object.getOwnPropertyDescriptor(source_1459.prototype, name_1460); - Object.defineProperty(F.prototype, name_1460, newProp); +exports.mixin = mixin; +function mixin(target, source) { + class F extends target {} + + Object.getOwnPropertyNames(source.prototype).forEach(name => { + if (name !== "constructor") { + let newProp = Object.getOwnPropertyDescriptor(source.prototype, name); + Object.defineProperty(F.prototype, name, newProp); } }); return F; } -exports.mixin = mixin_1457; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3N3ZWV0L3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsU0FBUyxVQUFULENBQW9CLFdBQXBCLEVBQWlDLFdBQWpDLEVBQThDO0FBQzVDLFFBQU0sQ0FBTixTQUFnQixXQUFoQixDQUE0QjtBQUM1QixTQUFPLG1CQUFQLENBQTJCLFlBQVksU0FBdkMsRUFBa0QsT0FBbEQsQ0FBMEQsYUFBYTtBQUNyRSxRQUFJLGNBQWMsYUFBbEIsRUFBaUM7QUFDL0IsVUFBSSxVQUFVLE9BQU8sd0JBQVAsQ0FBZ0MsWUFBWSxTQUE1QyxFQUF1RCxTQUF2RCxDQUFkO0FBQ0EsYUFBTyxjQUFQLENBQXNCLEVBQUUsU0FBeEIsRUFBbUMsU0FBbkMsRUFBOEMsT0FBOUM7QUFDRDtBQUNGLEdBTEQ7QUFNQSxTQUFPLENBQVA7QUFDRDtRQUNxQixLLEdBQWQsVSIsImZpbGUiOiJ1dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG1peGluXzE0NTcodGFyZ2V0XzE0NTgsIHNvdXJjZV8xNDU5KSB7XG4gIGNsYXNzIEYgZXh0ZW5kcyB0YXJnZXRfMTQ1OCB7fVxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VfMTQ1OS5wcm90b3R5cGUpLmZvckVhY2gobmFtZV8xNDYwID0+IHtcbiAgICBpZiAobmFtZV8xNDYwICE9PSBcImNvbnN0cnVjdG9yXCIpIHtcbiAgICAgIGxldCBuZXdQcm9wID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VfMTQ1OS5wcm90b3R5cGUsIG5hbWVfMTQ2MCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsIG5hbWVfMTQ2MCwgbmV3UHJvcCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIEY7XG59XG5leHBvcnQge21peGluXzE0NTcgYXMgbWl4aW59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQUFnQixLLEdBQUEsSztBQUFULFNBQVMsS0FBVCxDQUFlLE1BQWYsRUFBdUIsTUFBdkIsRUFBK0I7QUFDcEMsUUFBTSxDQUFOLFNBQWdCLE1BQWhCLENBQXVCOztBQUd2QixTQUFPLG1CQUFQLENBQTJCLE9BQU8sU0FBbEMsRUFBNkMsT0FBN0MsQ0FBcUQsUUFBUTtBQUMzRCxRQUFJLFNBQVMsYUFBYixFQUE0QjtBQUMxQixVQUFJLFVBQVUsT0FBTyx3QkFBUCxDQUFnQyxPQUFPLFNBQXZDLEVBQWtELElBQWxELENBQWQ7QUFDQSxhQUFPLGNBQVAsQ0FBc0IsRUFBRSxTQUF4QixFQUFtQyxJQUFuQyxFQUF5QyxPQUF6QztBQUNEO0FBQ0YsR0FMRDtBQU1BLFNBQU8sQ0FBUDtBQUNEIiwiZmlsZSI6InV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIG1peGluKHRhcmdldCwgc291cmNlKSB7XG4gIGNsYXNzIEYgZXh0ZW5kcyB0YXJnZXQge1xuICB9XG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlLnByb3RvdHlwZSkuZm9yRWFjaChuYW1lID0+IHtcbiAgICBpZiAobmFtZSAhPT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICBsZXQgbmV3UHJvcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLnByb3RvdHlwZSwgbmFtZSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5wcm90b3R5cGUsIG5hbWUsIG5ld1Byb3ApO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBGO1xufVxuIl19 \ No newline at end of file diff --git a/package.json b/package.json index ab5df4eb..c9dae427 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "bin": { "sjs": "bin/sjs" }, - "version": "2.2.0", + "version": "2.2.1", "engines": { "node": ">5.0.0" },